为什么 alias foo1="echo " 和 alias foo2="echo ''" 的行为与它们一样?

Why do alias foo1="echo $1" and alias foo2="echo '$1'" behave as they do?

在我的 .bashrc 文件中,我放入了以下两行:

alias foo1="echo "
alias foo2="echo ''"

然后,在终端中,我得到以下输出:

$ foo1 hello world
hello world
$ foo2 hello world
 hello world

为什么 foo2 产生了额外的 space?

如果我只是在终端中执行以下操作,输出如下所示:

$ echo hello world
hello world
$ echo 'hello world'
hello world

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

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

别名不接受位置参数。 </code> 将在别名内计算为空。 <code>foo2 实际上是将您在 foo2 之后键入的内容附加到空字符串 '',其中包括 foo2 之后的 space。 foo1 没有附加到任何东西,因为 的计算结果为空,所以 space 没有显示。

如果在典型的交互 shell 中,您 运行:

$ set --             # this clears the argument list; it's empty by default, but make sure.
$ alias foo1="echo "
$ alias foo2="echo ''"
$ alias -p 

alias -p的输出结果如下:

$ alias -p
alias foo1='echo '
alias foo2='echo '\'''\'''

值得注意的是,</code> 根本不存在——因为您在双引号字符串中定义了别名,它们被替换为 <code> 的当前值——值存在于当前 shell 的上下文中,对于交互式 shell 在启动时将为空。


因此,当您 运行:

foo2 hello world

...shell 调用的是:

echo '' hello world

因为 echo 在它的参数之间放置了空格,这打印出来:

 hello world

然而,如果您 运行:

foo1 hello world

...shell 调用的是:

echo hello world

...因为,正如您在 alias -p 发出的 foo1 别名中看到的那样,没有留下未加引号的 的记录;它在定义时被替换为当前值——一个空字符串。