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

时间:2013-10-19 20:11:19

标签: 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

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

2 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:5)

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

正在发生的事情是echo正在打印(空)变量,但是echo也正在捕捉" no"部分分开。如果您执行alias tmp 'echo $1'并尝试tmp hi,则会打印" hi"因为它好像你做了" echo $ 1 hi"。

要更清楚地看到这一点,请尝试alias tmp 'echo abc $1 def '并再次执行tmp hi,然后打印" abc def hi"。同样,如果您尝试alias tmp 'echo $1 & which '并再次使用它,除非您有一个名为hi的命令,否则应该看到" hi:找不到命令。"或者,如果您执行tmp ls,则会看到which ls的输出。

还有一个示例:尝试alias tmp 'echo $1 & 'tmp hi,看看它实际上是否尝试执行hi,就好像它是一个命令一样,如果您没有预料到这可能会很危险。