2013-10-19 175 views
6

在Unix(tcsh)中,我在別名中引用了帶有兩種不同符號的命令行參數 - $1\!:1

但我注意到如果我試圖將$1保存到環境變量中,它不會被保存。但\!:1確實得到保存。

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 

什麼也不顯示上$ x的回波時$ 1用來存儲該值。這是什麼原因?

回答

14

$1將通過傳遞的第一個參數返回到包含alias命令的腳本。所以如果你從命令行調用它,它將不會返回任何內容。

\!:1將通過傳遞的第一個參數返回到別名命令,這顯然是您應該使用的。

5

supergra回答了主要問題,但它可能會讓您想知道爲什麼即使未設置變量,您也會看到文字回顯給您。也就是說,您在別名末尾有echo $x,當您輸入oh no時的確可以看到no,但這並不意味着回顯會回顯變量。

正在發生的事情有是echo被打印(空)變量,但隨後echo也趕上了「無」的一部分分別。如果你這樣做alias tmp 'echo $1'並嘗試tmp hi你會打印「嗨」,因爲它就像你做了「回聲$ 1嗨」。

要更清楚地看到此問題,請嘗試alias tmp 'echo abc $1 def '並再次執行tmp hi,然後您將打印「abc def hi」。再次,如果您嘗試alias tmp 'echo $1 & which '並再次使用它,除非您有一個名爲hi的命令,否則請參閱「hi:Command not found」之類的內容。或者如果你做tmp ls你會看到which ls的輸出。

再舉一個例子:嘗試alias tmp 'echo $1 & 'tmp hi地看到,它實際上試圖執行hi就好像它是一個命令,如果你沒有想到的是這會非常危險。

+0

奇怪的是,我在閱讀接受的答案後確實有這個問題。 –