命令中的`(反引号/反引号)是什么意思?


159

我遇到以下命令:

sudo chown `id -u` /somedir

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

sudo chown 'id -u' /somedir

Answers:


199

这是一个倒钩反引号不是引号。它具有非常特殊的含义。您在反引号之间键入的所有内容都会在主命令之前(如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

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

顺便说一句,如果您想直接使用反引号,例如在字符串中使用反引号,可以通过在反引号(\)之前加上反斜杠()来对其进行转义。


36
这可以很好地解释反引号,但是使用嵌套嵌套$(your expression)是更好的方法$()。例如:cd $(dirname $(type -P touch))将您touch
引导

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

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

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

66

我想在这里补充几点。

反引号`…`实际上称为命令替换。命令替换的目的是评估放置在反引号内的命令,并提供其结果作为实际命令的参数。

可以通过两种方式完成命令替换:一种正在使用$(…),另一种是使用`…`。两者的工作原理相同,但$(…)形式是现代方式,具有更高的清晰度和可读性。

所以

sudo chown $(id -u) /somedir

可以优先于其他。

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

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


8
此外,$(...)巢更好。
库沙兰丹

$()并且"``"不能以相同的方式工作

10

很少有澄清说明:

反引号(有时也称为Graves,因为它在法语和其他语言中作为普通口音兼有双重功能)替代标准输出,而不替代标准错误。

因此,继续前面的示例:

file `which hostname`

将按预期工作,但是在:

file `which hostnameX`

which将返回错误,并且输出将变为标准错误,而不是替换为file; 旁边的命令行。完全没有标准输出,您可以通过运行以下命令进行确认:

which hostnameX

which hostnameX 2>/dev/null

在这种情况下,

file `which hostnameX` 

会产生两个错误消息(第一个是由于which hostnameX文件本身,第二个是由于文件本身,第二个错误消息是由于文件本身而丢失),因此,整个命令

本质上将减少为:

file

当然,这是错误的用法,并且会返回“用法”错误。

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

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

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

file `which hostname`

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

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


2

该符号表示其内部的任何内容都将解释为该命令的结果。

例如:

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

以上结果将three目录复制到我的/home目录中。


1

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

什么是命令替换?

命令替换是具有专用语法的单个操作,既可以执行命令,又可以将其输出存储到变量中以备后用。

日期示例:

thedate=$(date)

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

  1. 命令替换语法为$()
  2. 该命令本身是date
  3. 结合两者,我们得到$(date)其输出是替代品。
  4. printf根据上面的命令,使用来显示变量保留的输出值。
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.