2013-10-19 12 views
6

Unix(tcsh)では、別名2つの異なる表記 - $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 

値を格納するために$ 1を使用すると、$ xのエコーに何も表示されません。これの理由は何ですか?

答えて

14

$1は、を渡したaliasコマンドを含む最初の引数を返します。コマンドラインから呼び出すと、何も返されません。

\!:1は、をエイリアス化されたコマンドに返します。これは、使用する必要があることを明確に示しています。

5

supergraveが主な回答に答えていますが、変数が設定されていないのにあなたのテキストが返されているのがなぜ分かりませんか。つまり、エイリアスの末尾にecho $xがあり、oh noと入力すると実際にnoと表示されますが、エコーが変数をエコーし​​ているとは限りません。 echoは(空の)変数を印刷しているが、その後echoも個別に「ノー」の部分をキャッチしていることがある何が起こっている

alias tmp 'echo $1'を実行してtmp hiを試してみると、 "echo $ 1 hi"のように表示されるので、 "hi"と表示されます。

これをより明確に見るには、alias tmp 'echo abc $1 def 'をもう一度試してください。tmp hiをもう一度実行すると、「abc def hi」と表示されます。繰り返しますが、hiというコマンドがないかぎり、alias tmp 'echo $1 & which 'を試してもう一度使用すると、「hi:Command not found」のような文字列が表示されます。 tmp lsを入力すると、出力はwhich lsになります。

もう一つの例:それはあなたがそれを予想していなかった場合は危険なことができコマンド、あたかもそれが実際にhiを実行しようとしていることを確認するためにalias tmp 'echo $1 & 'tmp hiを試してみてください。

+0

奇妙なことに、私は受け入れられた答えを読んだ後、その質問をしました。 –

関連する問題