2013-10-19 9 views
6

W systemie Unix (tcsh) odwoływałam się do argumentów wiersza poleceń w moich aliasach z dwoma różnymi oznaczeniami - $1 i \!:1.

Ale zauważyłem, że jeśli spróbuję zapisać $1 do zmiennej środowiskowej, to nie zostanie zapisane. Jednak \!:1 zostanie zapisany.

alias hear 'setenv x \!:1 && echo $x' 
--> hear that 
that 
--> echo $x 
that 

alias oh 'setenv x $1 && echo $x' 
--> oh no 
no 
--> echo $x 

Nic nie pokazuje się na echo $ x, gdy $ 1 jest używane do przechowywania wartości. Jaki jest tego powód?

Odpowiedz

14

$1 zwraca pierwszy argument przekazany do skryptu zawierający polecenie alias. Więc jeśli wywołasz go z wiersza poleceń, to nic nie zwróci.

\!:1 zwraca pierwszy argument przekazany do aliasing polecenia, więc jest to wyraźnie, co należy używać.

5

supergra odpowiedział na główny punkt, ale może cię zastanawiać, dlaczego widzisz, że twój tekst powrócił do ciebie, mimo że zmienna nie została ustawiona. Oznacza to, że na końcu swojego aliasu masz echo $x i rzeczywiście widzisz no po wpisaniu oh no, ale to nie znaczy, że echo odtwarza tę zmienną.

Co się tam dzieje jest to, że echo drukuje zmienną (pusty), ale potem echo jest także łowienie „nie” część oddzielnie. Jeśli wykonasz alias tmp 'echo $1' i wypróbujesz tmp hi, wydrukujesz "hi", ponieważ brzmi to tak, jakbyś zrobił "echo 1 hi".

Aby zobaczyć to jaśniej, spróbuj ponownie alias tmp 'echo abc $1 def ' i wykonaj tmp hi, a wydrukujesz "abc def hi". Ponownie, jeśli spróbujesz alias tmp 'echo $1 & which ' i użyjesz go ponownie, powinieneś, chyba że masz komendę o nazwie hi, zobaczyć coś takiego jak "hi: Command not found." lub jeśli wykonasz tmp ls zobaczysz wyjście which ls.

Jeszcze jeden przykład: try alias tmp 'echo $1 & ' i tmp hi, aby zobaczyć, że rzeczywiście próbuje wykonać hi jakby to było polecenie, które mogą być niebezpieczne, jeśli nie spodziewaliśmy się tego.

+0

O dziwo, zadałem to pytanie po przeczytaniu zaakceptowanej odpowiedzi. –

Powiązane problemy