bash - 命令替换 : backticks or dollar sign/paren enclosed?

标签 bash shell command substitution

<分区>

在 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.

关于bash - 命令替换 : backticks or dollar sign/paren enclosed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405478/

相关文章:

java - 如何从 Java 程序中运行 .jar 文件?

linux - Bash 脚本 - Bash 脚本 - 编辑文件中文本的行

linux - expect 中\n 和\r 的区别?

bash: `set -e` 在 if 表达式中使用时不起作用?

shell - 如何从命令提示符运行一系列 vim 命令

python - 如果远程服务器上的 python 脚本停止,如何重新启动它?

javascript - wkhtmltoimage - 有时获取整个页面,有时不获取

kendo-ui - 如何从窗口更新 Kendo Grid 行

bash - `sudo -i -u user` 和 `sudo su - user` 有什么区别?

java - 如何运行 jar 文件分配给变量并在 shell 脚本中回显它