首页 > 解决方案 > 为什么 alias foo1="echo $1" 和 alias foo2="echo '$1'" 的行为如此?

问题描述

在我的.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?我希望只输出第一个参数。)

标签: bashechowhitespacealias

解决方案


如果在典型的交互式 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 '\'''\'''

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


因此,当您运行时:

foo2 hello world

...外壳调用的是:

echo '' hello world

因为echo在其参数之间放置了空格,所以打印为:

 hello world

然而,如果你运行:

foo1 hello world

...外壳调用的是:

echo hello world

...因为,正如您在foo1发出的别名中看到的那样alias -p,没有未引用$1左侧的记录;它在定义时被其当前值(一个空字符串)替换。


推荐阅读