为什么 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
这使我认为 foo1
和 foo2
应该做完全相同的事情。为什么它们实际上并没有输出完全相同的东西,为什么它们只相差一个 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
别名中看到的那样,没有留下未加引号的
的记录;它在定义时被替换为当前值——一个空字符串。
在我的 .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
这使我认为 foo1
和 foo2
应该做完全相同的事情。为什么它们实际上并没有输出完全相同的东西,为什么它们只相差一个 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
别名中看到的那样,没有留下未加引号的 的记录;它在定义时被替换为当前值——一个空字符串。