在我的.bashrc
文件中,我输入了以下两行:
alias foo1="echo $1"
alias foo2="echo '$1'"
然后,在终端中,我得到以下输出:
$ foo1 hello world
hello world
$ foo2 hello world
hello world
为什么foo2
会产生多余的空间?
如果我只是在终端中执行以下操作,则输出如下所示:
$ echo hello world
hello world
$ echo 'hello world'
hello world
这使我认为foo1
和foo2
应该做完全相同的事情。它们为什么实际上没有输出完全相同的东西,为什么它们仅以一个空格字符不同?
(此外,为什么它们中的任何一个都输出world
?我希望只输出第一个参数。)
答案 0 :(得分:8)
如果在典型的交互式shell中运行:
$ set -- # this clears the argument list; it's empty by default, but make sure.
$ alias foo1="echo $1"
$ alias foo2="echo '$1'"
$ alias -p
alias -p
的输出如下:
$ alias -p
alias foo1='echo '
alias foo2='echo '\'''\'''
值得注意的是,$1
根本不存在-因为您在双引号字符串中定义了别名,所以它们被替换为$1
的当前值-当前的值当前shell的上下文,对于交互式shell,启动时将为空。
因此,当您运行时:
foo2 hello world
... shell调用的是:
echo '' hello world
由于echo
在其参数之间放置空格,因此打印为:
hello world
如果运行,则:
foo1 hello world
... shell调用的是:
echo hello world
...因为,正如您在foo1
发出的alias -p
别名中看到的那样,没有记录未引用的$1
;在定义时将其替换为其当前值-一个空字符串。
答案 1 :(得分:3)
别名不接受位置参数。 $1
在别名中将没有任何结果。 foo2
实际上是将您在foo2
之后键入的内容追加到空字符串''
,其中包括foo2
之后的空格。 foo1
不会追加任何内容,因为$1
的计算结果为空,因此不会显示空格。