为什么别名foo1 =“ echo $ 1”和别名foo2 =“ echo'$ 1'”的行为相同?

时间:2018-06-25 16:52:38

标签: bash echo whitespace alias

在我的.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

这使我认为foo1foo2应该做完全相同的事情。它们为什么实际上没有输出完全相同的东西,为什么它们仅以一个空格字符不同?

(此外,为什么它们中的任何一个都输出world?我希望只输出第一个参数。)

2 个答案:

答案 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的计算结果为空,因此不会显示空格。