我遇到了以下命令:
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
答案3
一项很少涉及的澄清说明:
反引号(有时也称为 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
这个符号意味着它里面的任何内容都被解释为该命令的结果。
例如:
$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three
上述结果导致该three
目录被复制到我的/home
目录中。