我遇到以下命令:

sudo chown `id -u` /somedir


,我想知道:`符号的含义是什么。例如,我注意到虽然上面的命令运行良好,但下面的命令却不起作用:

sudo chown 'id -u' /somedir


#1 楼

这是一个倒钩。反引号不是引号。它具有非常特殊的含义。您在反引号之间键入的所有内容都会在主命令之前被外壳程序评估(执行)(例如您的示例中的chown),并且该命令使用该执行的输出,就像您在命令行。



sudo chown `id -u` /somedir


有效运行(取决于您的用户ID)是:

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges


看看这个问题,以了解为什么在很多情况下使用反引号不是一个好主意。

如果想要使用,字面上的反引号,例如在字符串中,可以通过在其前面放置反斜杠(\)来使其转义。

评论


这可以很好地解释反引号,但是使用$(您的表达式)是更好的方法,因为$()允许您嵌套表达式。例如:cd $ {dirname $ {type -P touch))会将您cd进入包含touch命令的目录

–卡贾·敏哈朱丁(Khaja Minhajuddin)
2011-12-27 1:10

@KhajaMinhajuddin您绝对正确的嵌套-上面提到的问题详细介绍了它。但是,即使我认为在大多数情况下使用$()是一种好的做法,也不会使反引号变得更糟。出于实际目的,必须承认它们在命令行上键入的速度要快得多(两次击键比起至少5次,包括Shift)。

–rozcietrzewiacz
2012年10月23日在13:14



@rozcietrzewiacz您的后面的评论对大多数键盘可能都是正确的,但是$()至少比法语键盘上的``更容易键入。

– jlliagre
13年5月19日在20:38

@KhajaMinhajuddin您可以嵌套反引号,但是您需要转义第二级反引号,而第二级嵌套则需要3个反引号,第三级嵌套5个反引号,第四级为7,等等。

– JustinCB
18年7月18日在14:49

图真的很棒:)

–李文成
19/12/4在7:02

#2 楼

我想在这里再添加一些要点。命令替换的目的是评估放置在反引号内的命令,并将其结果作为实际命令的参数提供。另一个是`…`。两者的工作原理相同,但是$(…)形式是现代方法,具有更高的清晰度和可读性。

另外需要注意的是bash文档中提到的bash引用规则与命令替换关系。


如果替换出现在双引号中,不对结果进行单词拆分和
文件名扩展。


评论


而且,$(...)嵌套更好。

– Kusalananda♦
16年6月28日在11:56

$()和“''”的工作方式不同

–坤
18年6月21日在22:31

#3 楼

很少有澄清说明:

反引号(有时也称为Graves,因为它在法语和其他语言中作为常见的重音符号加倍)仅替代标准输出,而不替代标准错误。

因此,继续前面的示例: br />
which将返回错误,并且输出变为标准错误,而不是替换为file旁边的命令行;根本没有标准输出,可以通过运行以下命令确认:

file `which hostname`


在这种情况下,

file `which hostnameX`


将产生两个错误消息(由于which hostnameX,第一个错误消息,由于文件本身,第二个错误消息紧随前一个错误消息后,发现文件名丢失,因此整个命令
br基本上会减少为:

which hostnameX

which hostnameX 2>/dev/null


当然是不好的用法,并且会返回用法错误。

(如果您要自己检查,可以尝试:

file `which hostnameX` 


#4 楼

反引号`将运行包含的字符串的内容,因此类似这样的内容

file `which hostname`


将找出hostname命令的路径,然后告诉您它是如何构建的。

输入问题的命令将运行id -u以获取有效的用户ID,然后将/ somedir的所有权更改为该用户。

#5 楼

此符号意味着其中的任何内容都将解释为该命令的结果。例如,

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three


上面的结果在three中目录正在复制到我的/home目录。

#6 楼

反引号类似于命令替换。这种反引号语法很陈旧,并且知道带两个括号的美元符号是很常见的:$()

什么是命令替换?都执行命令并将其输出存储到变量中以备后用。

带有日期的示例:

thedate=$(date)


然后打印结果:'日期为%s \ n'“ $ thedate”`。


命令替换语法为$()
命令本身为date
将两者结合起来,得到$(date),它的输出是替代品。
根据上面的命令,我们将变量printf的输出值显示出来。