命令中的$()是什么?


18

什么是$()在Linux的shell命令?

例如:

chmod 777 $(pwd)

1
注意,没有line shell命令之类的东西。有许多可用于Linux的Shell应用程序。
斯特凡Chazelas

Answers:


21

这与反引号``非常相似。

这称为命令替换posix规范),它调用一个子shell。$()反引号(``)或之间的命令在子shell中执行,然后将输出放置在原始命令中。

与反引号不同,$(...)表单可以嵌套。因此,您可以在另一个替换中使用命令替换。

替换中的转义字符也存在差异。我喜欢$(...)表格。


4
反引号也可以嵌套。请注意,尾随换行符将从命令的输出中删除。
斯特凡Chazelas

2
@StéphaneChazelas如何将反引号嵌套?你是指逃避吗?
2014年

3
是:喜欢echo `echo \`echo foo\`` bar
–StéphaneChazelas 2014年

1
有官方引用说反引号已弃用吗?
vinc17 2014年

1
找到了这个答案:unix.stackexchange.com/questions/126927/…似乎它们不被弃用。改变了我的回答,谢谢
混乱

5

在POSIX或POSIX状壳(kshbashashzshyash...),它就像``:命令内部$()被执行,并在它的标准输出代替。除非$()在双引号中,否则将完成单词拆分和文件名生成。从而

chmod 777 $(pwd)

应替换为:

chmod 777 "$(pwd)"

避免在当前工作目录路径上进行单词拆分和文件名生成。

甚至更好(如果目录已重命名,则在某些shell下(例如zsh)除外):

chmod 777 "$PWD"

因为$PWD是一个特殊变量,用于保存POSIX shell中当前工作目录的路径。

甚至更好:

chmod 777 .

由于.当前目录中的条目是指向该目录本身的硬链接。


2

$()主要用于在其他命令中执行命令。

chmod 777 $(pwd)

pwd命令给出当前的工作目录。因此,当执行整个操作时,pwd的输出将替换其位置并用作to的参数chmod,结果是您当前的所有工作目录都获得了777我认为永远不应在生产环境中使用的许可;)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.