命令replace:反引号或美元符号/ paren封闭?

在bash中进行命令replace的首选方法是什么?

我一直这样做:

echo "Hello, `whoami`." 

但是最近我经常看到这样写:

 echo "Hello, $(whoami)." 

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

我倾向于赞成第一个,只是因为我的文本编辑器似乎知道它是什么,并适当地进行语法高亮显示。

我在这里读到,逃跑的angular色在每种情况下都会有所不同,但是我不清楚哪种行为更可取,或者仅仅取决于情况。

侧面的问题:在一个脚本中使用这两种forms是不好的做法,例如在嵌套命令replace时?

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

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

我会说$(some_command)表单比`some_command`表单更`some_command` 。 第二种forms是使用一对反引号(“”“字符,也被称为反音符和一个重音符号),是这样做的历史方式。 第一种forms是使用美元符号和括号,是一种较新的POSIXforms,这意味着它可能是一种更为标准的做法。 反过来,我认为这意味着更有可能正确地使用不同的shell和不同的* nix实现。

给出第一个(POSIX)表单的另一个原因是它更容易阅读,尤其是当命令replace嵌套时更是如此。 此外,使用反引号forms,反引号字符必须在嵌套(内部)命令replace中反斜线转义。

使用POSIX表单,你不需要这样做。

至于它们是否可以互换,我想说,除了你提到的逃脱angular色的例外之外,总的来说,它们是可以互换的。 但是,我不知道也不能说所有的现代炮弹和所有的现代火箭都支持这两种forms。 我怀疑他们做的,特别是旧的炮弹/旧的* nixes。 如果我是你的话,我不会依赖于互换性,而不需要在任何你计划运行你的脚本的shell / * nix实现上运行几个快速,简单的testing。

我倾向于赞成第一个,只是因为我的文本编辑器似乎知道它是什么,并适当地进行语法高亮显示。

不幸的是,你的编辑似乎不支持POSIXforms; 也许你应该检查一下,看看你的编辑器是否支持POSIX的更新方式。 也许远投,但是谁知道呢? 或者,也许你应该考虑尝试一个不同的编辑器。

GGG,你正在使用什么文本编辑器?

我在这里读到,逃跑的angular色在每种情况下都会有所不同,但是我不清楚哪种行为更可取,或者仅仅取决于情况。

我想说这取决于你想要完成的事情; 换句话说,不pipe你是否在使用转义字符以及命令replace。

侧面的问题:在一个脚本中使用这两种forms是不好的做法,例如在嵌套命令replace时?

那么,这可能会使脚本更容易阅读(排版),但更难以理解! 有人读你的脚本(或者六个月后读你的脚本!)可能会奇怪你为什么不坚持一种forms或另一种forms – 除非你在评论中为什么要这么做。 另外,在一个脚本中混合使用这两种forms将使脚本不太可能是可移植的:为了使脚本正常工作,执行它的shell必须支持这两种forms,而不仅仅是一种forms或另一种forms。

为了使shell脚本可以理解,我个人更喜欢在任何一个脚本中都坚持一种forms,除非有一个很好的技术理由否则。 而且,我比较老的forms更喜欢POSIXforms; 再说一遍,除非有很好的技术理由否则。

有关命令replace的主题以及两种不同的forms,我build议您参考Robbins和Beebe在O'Reilly出版的“经典Shell脚本”第二版中关于命令replace的部分。 在这一节中,作者声明POSIXforms的命令replace“被推荐用于所有新的开发”。 我对这本书没有经济利益。 这只是我在shell脚本中的一个(而且很喜欢),尽pipe它更适合于中级或高级shell脚本,而不适用于初始shell脚本。

-B。

你可以阅读bash手册的不同之处。 大多数情况下,它们是可以互换的。


有一件事要提的是,你应该避免backquote巢命令:

 $ echo $(echo hello $(echo word)) hello word $ echo `echo hello \`echo word\`` hello word 

反引号与古代的shell兼容,所以需要可移植的脚本(比如GNU autoconf snippets)应该更喜欢它们。

$()表单在眼睛上更容易一些,尤其是。 经过几个级别的逃跑。