`(反引号/反引号)在命令中意味着什么?

`(反引号/反引号)在命令中意味着什么?

我遇到了以下命令:

sudo chown `id -u` /somedir

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

sudo chown 'id -u' /somedir

答案1

这是一个反引号反引号不是引号。它有着非常特殊的意义。您在反引号之间键入的所有内容都由 shell 在主命令之前评估(执行)(如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

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

顺便说一句,如果你想从字面上使用反引号,例如在字符串中,您可以通过在其前放置反斜杠 ( \) 来将其转义。

答案2

我想在这里补充几点。

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

命令替换可以通过两种方式完成,一种是使用$(…),另一种是`…`.两者的工作原理相同,但$(…)形式是现代的方式,并且更加清晰和可读。

所以

sudo chown $(id -u) /somedir

可以优先于其他。

您还需要注意的一件事是命令替换与的关系bash 引用规则正如bash中提到的文档

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

答案3

一项很少涉及的澄清说明:

反引号(有时也称为 Graves,因为它兼作法语和其他语言中的常见口音)替换仅标准输出,但不是标准误差。

继续前面的例子:

file `which hostname`

将按预期工作,但在:

file `which hostnameX`

whichfile将返回一个错误,并且该输出将转到标准错误,而不是替换到;旁边的命令行上根本不会有标准输出,您可以通过运行来确认:

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

这个符号意味着它里面的任何内容都被解释为该命令的结果。

例如:

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

上述结果导致该three目录被复制到我的/home目录中。

相关内容