将命令放在单引号中对bash脚本有什么影响吗?

问题描述 投票:0回答:3

我偶然发现了一个脚本,其中的作者将每个外部命令(不是内置函数或函数)都放在单引号中。因为我以前从未见过这种编码样式,所以我想知道,以下两个示例之间是否有任何区别:

'cat' $myfile

vs。

cat $myfile

[请忽略以下事实:作者选择不引用包含文件名的变量。我肯定会将其用双引号引起来,并且我知道变量周围引号的作用。我只对命令周围的引号是否有效感兴趣。两个示例都可以正常工作,但是据我了解,此处单引号是多余的。正确吗?

谢谢!

bash shell quotes
3个回答
2
投票

是的,它有作用,尽管主要是出于真正不可思议的原因:

考虑这个奇怪的构造

alias cat='echo x'
cat foo # would output x foo
'cat' foo # Would output the content of the file foo

将其放在引号内会导致bash不运行别名。也可以通过

达到此效果。
command cat foo # Also outputs the file foo

区别在于,将命令放在引号中只会跳过别名定义,而使用command也会跳过函数定义。由于脚本中通常不启用别名,因此很少使用引号。


0
投票

单引号被外壳删除,因此这两个命令是等效的。手册在Shell Operation部分中对此进行了描述:

  1. 遵循Quoting中描述的引用规则,将输入分为单词和运算符。这些标记用metacharacters分隔。别名扩展通过此步骤执行(请参见Aliases)。

  2. 将标记解析为简单的复合命令(请参见Shell Commands)。

引号在步骤2之后消失了。

Bash的维护者Chet Ramey在“开源应用程序的体系结构”一书的[​​C0]中详细描述了解析。


0
投票

[在大多数情况下,引用没有空格或特殊字符的字符串严格等同于完全不引用。

© www.soinside.com 2019 - 2024. All rights reserved.