在 bash 中执行命令替换的首选方法是什么?
我一直都是这样做的:
echo "Hello, `whoami`."
但是最近经常看到这样写:
echo "Hello, $(whoami)."
首选语法是什么,为什么?或者它们几乎可以互换?
我倾向于第一个,因为我的文本编辑器似乎知道它是什么,并且会适本地突出显示语法。
我读了here转义字符在每种情况下的行为都略有不同,但我不清楚哪种行为更可取,或者它是否仅取决于情况。
附带问题:在一个脚本中使用两种形式是否是一种不好的做法,例如在嵌套命令替换时?
这里有几个问题/问题,所以我将重复发帖人文本的每个部分,并在后面加上我的回复。
What's the preferred syntax, and why? Or are they pretty much interchangeable?
我会说 $(some_command)
形式优于 `some_command`
形式。第二种形式,使用一对反引号(“`”字符,也称为反引号和重音符),是历史上的做法。第一种形式使用美元符号和圆括号,是一种较新的 POSIX 形式,这意味着它可能是一种更标准的实现方式。反过来,我认为这意味着它更有可能在不同的 shell 和不同的 *nix 实现中正常工作。
首选第一种 (POSIX) 形式的另一个原因是它更易于阅读,尤其是在嵌套命令替换时。另外,对于反引号形式,反引号字符必须在嵌套(内部)命令替换中进行反斜杠转义。
使用 POSIX 表单,您不需要这样做。
至于它们是否可以互换,嗯,我想说的是,一般来说,它们是可以互换的,除了你提到的转义字符的异常(exception)情况。但是,我不知道也不能说是否所有现代 shell 和所有现代 *nixes 都支持这两种形式。我怀疑他们是否这样做,尤其是较旧的 shell/较旧的 *nixes。如果我是你,我不会依赖可互换性,而无需首先在你计划运行完成的脚本的任何 shell/*nix 实现上对每种形式运行几个快速、简单的测试。
I tend to favor the first, simply because my text editor seems to know what it is, and does syntax highlighting appropriately.
很遗憾,您的编辑器似乎不支持 POSIX 形式;也许您应该检查一下您的编辑器是否有支持 POSIX 方式的更新。也许远射,但谁知道呢?或者,也许您甚至应该考虑尝试使用不同的编辑器。
GGG,你用的是什么文本编辑器???
I read here that escaped characters act a bit differently in each case, but it's not clear to me which behavior is preferable, or if it just depends on the situation.
我会说这取决于您要完成的任务;换句话说,无论您是否将转义字符与命令替换一起使用。
Side question: Is it bad practice to use both forms in one script, for example when nesting command substitutions?
好吧,这可能会使脚本更容易阅读(从打印上讲),但更难理解!阅读您脚本的人(或您,六个月后阅读它!)可能会想知道为什么您不只坚持一种形式或另一种形式——除非您在评论中对您这样做的原因进行了某种注释。另外,在一个脚本中混合这两种形式会降低该脚本的可移植性:为了使脚本正常工作,执行它的 shell 必须支持两种形式,而不仅仅是一种形式或另一种形式。
为了使 shell 脚本易于理解,我个人更喜欢在任何一个脚本中坚持使用一种形式或另一种形式,除非有充分的技术理由不这样做。此外,我更喜欢 POSIX 形式而不是旧形式;同样,除非有充分的技术理由不这样做。
有关命令替换主题以及执行命令替换的两种不同形式的更多信息,我建议您引用 O'Reilly 书籍“经典 Shell 脚本”第二版中的命令替换部分,作者 Robbins 和 Beebe .在那个部分,作者声明命令替换的 POSIX 形式“被推荐用于所有新开发”。我对这本书没有经济利益;它只是我在 shell 脚本方面拥有(并且喜欢)的一个,尽管它更适用于中级或高级 shell 脚本,而不是真正的初级 shell 脚本。
-B.