Unix tcsh - 使用命令行参数$ 1与\!:1的别名

itc*_*ack 10 unix tcsh

在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
Run Code Online (Sandbox Code Playgroud)

当$ 1用于存储值时,$ x的回显没有显示任何内容.这是什么原因?

sup*_*gra 20

$1返回传递包含该alias命令的脚本的第一个参数.因此,如果您从命令行调用它,它将不返回任何内容.

\!:1返回传递给别名命令的第一个参数,这显然是你应该使用的.


Lod*_*ijk 5

supergra已经回答了主要观点,但它可能会让你想知道为什么你看到你的文字回应给你,即使变量没有设置.也就是说,你echo $x的别名结尾了,确实你看到了no什么时候进入oh no,但这并不意味着echo回应变量.

正在发生的事情有是echo被打印(空)变量,但随后echo也被抓了"不"的一部分单独.如果你这样做alias tmp 'echo $1'并尝试tmp hi打印"hi",因为它就好像你做了"echo $ 1 hi".

为了更清楚地看到这一点,试着alias tmp 'echo abc $1 def 'tmp hi一遍,你会打印"ABC DEF喜".同样,如果您alias tmp 'echo $1 & which '再次尝试使用它,除非您有一个命名命令,否则应该hi看到"hi:Command not found"之类的内容.或者,如果你这样做,tmp ls你会看到输出which ls.

还有一个例子:尝试alias tmp 'echo $1 & 'tmp hi看到它实际上尝试执行hi就好像它是一个命令,如果你不期望那样,这可能是危险的.