12

在 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 的回显上没有显示任何内容。这是什么原因?

4

2 回答 2

25

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

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

于 2013-12-15T22:21:44.457 回答
7

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 hi”。同样,如果您再次尝试alias tmp 'echo $1 & which '使用它,除非您有一个名为 的命令,否则您应该hi看到类似“hi: Command not found”的内容。或者,如果您这样做tmp ls,您将看到which ls.

alias tmp 'echo $1 & '再举一个例子:试着tmp hi看看它是否真的像一个命令一样尝试执行hi,如果你没有预料到这可能会很危险。

于 2016-06-10T14:33:18.963 回答