旧的刻度与括号问题:混淆

旧的刻度与括号问题:混淆

自从多年前被纠正以来,我从反引号切换到 $() 来进行命令扩展。

但我还是更喜欢反引号。击键次数较少,且不涉及Shift按键。

我知道括号是更好的选择,因为它不太容易出现反引号容易出现的错误,但是该规则的原因是什么绝不使用反引号?

答案1

Bash 常见问题解答给出了许多原因更喜欢括号到反引号,但没有通用规则不应该使用反引号。

在我看来,更喜欢括号的主要原因是内部解析$()与外部执行的解析一致,而反引号则不然。这意味着您可以"$()"毫不费力地获取 shell 命令并将其包装起来;如果您使用反引号来代替,则情况并非如此。这是级联的,因此使用 可以轻松包装本身包含替换的命令"$()",而不是使用反引号。

归根结底,我认为这是一个习惯问题。如果您选择对简单情况使用反引号,对其他情况使用括号,则每次想要替换命令时都必须做出该选择。如果您选择始终使用括号,则无需再考虑它。

后者可以解释某些编码指南中存在的“不要使用反引号”规则:它简化了开发,并消除了开发人员和审阅者的错误来源。它还解释了为什么即使对于单行文字也可以推荐使用括号:如果不到处应用括号,就很难养成脚本编写的习惯。

(就键控而言,这取决于键盘布局;在我的 AZERTY 键盘上,$()不涉及任何移位,而反引号写起来非常痛苦。)

答案2

就我个人而言,我会始终使用$(...), ,只是因为它在嵌套引号和扩展的极端情况下更加一致,而且我喜欢扩展以美元符号一致开始的想法,并且括号比反引号更明显,因为反引号相当轻在某些字体中,可能会与单引号混淆,例如评论中提到。但除了第一个之外,这些都与外观和美学有关,所以您的观点可能会有所不同。

基于中的讨论*sh shell 中的反引号(即“cmd”)是否已被弃用?,似乎对反引号的支持不会被删除,所以这不是说“从不”的理由。

但是,请注意,在某些情况下,反引号的解析工作会很奇怪。为嵌套扩展添加额外的反引号非常简单:

echo `echo \`echo foo\` `

但这还不是全部。正如斯特凡在书中指出的那样一个答案如何像普通字符一样使用特殊字符?,例如,即使在 ksh 中嵌套带有反引号的双引号也会失败(我将在此处重现这一点以便于访问):

ksh$ echo "`date +"%F %T"`"  
ksh: : cannot execute [Is a directory]
2020-10-01 %T

而且你也必须转义内部双引号,即使这样好像即使没有它们,解析也不会含糊:

ksh$ echo "`date +\"%F %T\"`"  
2020-10-01 14:14:27

(由于命令替换,命令替换周围的引号是相关的,但与echo此处无关。)

因此,虽然这看起来确实像是“永不言败”的情况,而且反引号在简单的情况下工作得很好,但我认为这已经足够了强烈建议只是使用$()代替。 :)

相关内容