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

Unix tcsh-使用命令行参数$1与\!的别名:1.,unix,tcsh,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

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

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


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

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

这里发生的情况是,
echo
正在打印(空)变量,但是
echo
也在分别捕获“否”部分。如果您使用
别名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:command not found”的命令,或者如果您执行
tmp ls
,您将看到
which ls
的输出


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

奇怪的是,我在阅读了公认的答案后确实遇到了这个问题。