指令替代: 随附的反勾或美元符号/括号?

在 bash 中做指令替代的首选方法是什么?

我一直是这么做的:

echo "Hello, `whoami`."

但最近,我经常看到这样的文字:

echo "Hello, $(whoami)."

首选的语法是什么? 为什么? 或者它们几乎是可互换的?

我倾向于第一种,因为我的文本编辑器似乎知道它是什么,而且语法突显恰当。

我读过 给你,在每种情况下转义字符的行为都有所不同,但我不清楚哪种行为更好,或者仅仅取决于具体情况。

附带问题: 在一个脚本中使用 都有表单是不是不好的做法,例如在嵌套命令替换时?

56043 次浏览

你可以从 Bash 手册中读出差异。在大多数情况下,它们是可以互换的。


需要提到的一点是,您应该从 backquote转换为嵌套命令:

$ echo $(echo hello $(echo word))
hello word


$ echo `echo hello \`echo word\``
hello word

这里有几个问题/问题,所以我将重复海报文本的每个部分,块引用,然后是我的回应。

首选的语法是什么? 为什么? 或者它们几乎是可互换的?

我想说的是,$(some_command)形式优于 `some_command`形式。第二种形式,使用一对反引号(“’”字符,也称为反勾和严重的口音) ,是历史上的做法。第一个表单使用了美元符号和圆括号,它是一个较新的 POSIX 表单,这意味着它可能是一种更标准的方法。反过来,我认为这意味着它更有可能在不同的 shell 和不同的 * nix 实现中正确工作。

选择第一种(POSIX)形式的另一个原因是它更容易阅读,特别是当命令替换是嵌套的时候。另外,对于反撇号形式,在嵌套(内部)命令替换中,反撇号字符必须是反斜杠转义的。

对于 POSIX 表单,您不需要这样做。

至于它们是否可以互换,那么,我想说,一般来说,它们是可以互换的,除了您提到的转义字符的例外。但是,我不知道也不能说是否所有现代 shell 和所有现代 * nixes 都支持这两种形式。我对此表示怀疑,尤其是较老的 shell/old * nix。如果我是你,我不会依赖于互换性,除非首先在任何你计划运行完成的脚本的 shell/* nix 实现上对每个表单运行几个快速、简单的测试。

我倾向于第一种,因为我的文本编辑器似乎知道它是什么,而且语法突显恰当。

不幸的是,您的编辑器似乎不支持 POSIX 表单; 也许您应该检查是否有对编辑器的更新支持 POSIX 的方式。也许希望渺茫,但谁知道呢?或者,也许你甚至应该考虑尝试另一个编辑器。

GGG,你用的是什么文本编辑器? ? ?

我在这里读到,转义字符在每种情况下的行为都有所不同,但我不清楚哪种行为更可取,或者仅仅取决于具体情况。

我认为这取决于您想要完成的任务,换句话说,您是否使用了转义字符和指令替代。

附带问题: 在一个脚本中同时使用这两种形式是不是不好的做法,例如在嵌套命令替换时?

好吧,它可能会使脚本稍微容易阅读(从排版的角度来说) ,但更难理解!有人在读你的剧本(或者你,六个月后再读!)可能会奇怪为什么你不坚持一种或另一种形式——除非你在评论中写下你为什么这样做。另外,在一个脚本中混合使用两种形式会降低脚本的可移植性: 为了让脚本正常工作,正在执行脚本的 shell 必须支持两种形式,而不是只支持一种形式或另一种形式。

为了使 shell 脚本易于理解,我个人更喜欢在任何一个脚本中坚持使用一种形式或另一种形式,除非有很好的技术原因需要这样做。此外,我更喜欢 POSIX 表单,而不是旧的表单; 同样,除非有很好的技术原因,否则不这样做。

如果想了解更多关于指令替代的话题,以及两种不同形式的指令替代,我建议你参考奥赖利的书《经典的外壳脚本》第二版中关于外壳脚本的部分,该书由罗宾斯和毕比合著。在这一部分,作者指出,POSIX 表单的指令替代“推荐用于所有新的开发”我对这本书没有任何经济上的兴趣; 它只是我在 shell 脚本编程方面的一本书,虽然它更适合中级或高级的 shell 脚本编程,而不是真正的初级 shell 脚本编程。

B.

反勾与古老的 shell 兼容,因此需要可移植的脚本(比如 GNU autoconf 片段)应该更喜欢它们。

$()的形式是一个有点容易的眼睛,尤其是经过几个层次的逃避。