bash - 为什么 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
?我希望只输出第一个参数。)
解决方案
如果在典型的交互式 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
s 根本不存在——因为你在双引号字符串中定义了别名,它们被替换为当前值$1
——当前 shell 上下文中存在的值,对于交互式 shell 来说启动时为空。
因此,当您运行时:
foo2 hello world
...外壳调用的是:
echo '' hello world
因为echo
在其参数之间放置了空格,所以打印为:
hello world
然而,如果你运行:
foo1 hello world
...外壳调用的是:
echo hello world
...因为,正如您在foo1
发出的别名中看到的那样alias -p
,没有未引用$1
左侧的记录;它在定义时被其当前值(一个空字符串)替换。
推荐阅读
- visual-studio - 每个用户是否有 Visual Studio 订阅(早期的 MSDN 订阅)?
- php - 使用 $this->db->count_all_results() 时出错;as 在布尔值上调用成员函数 num_rows()
- algorithm - n阶乘时间函数的正确时间复杂度是多少?
- java - 创建用户存储目录以存储租户的配置时出错
- api - 一键登录WHM
- python - 指定功能
- java - RestTemplate postForEntity 返回空响应,但邮递员给出了预期的正文
- r - 无法在数据帧 r 闪亮中转置 1 行的 excel 文件
- reactjs - 自定义 'react-datepicker' css
- amazon-web-services - 为什么 AWS lambda 执行在调用 PutObject 操作时给我一个错误(AccessDenied)?