在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的回显没有显示。这是什么原因?
答案 0 :(得分:17)
$1
返回传递到包含alias
命令的脚本的第一个参数。因此,如果您从命令行调用它,它将不返回任何内容。
\!:1
返回将传递给别名命令的第一个参数,这显然是你应该使用的。
答案 1 :(得分:5)
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
,就好像它是一个命令一样,如果您没有预料到这可能会很危险。