Answers:
这是一个倒钩。反引号不是引号。它具有非常特殊的含义。您在反引号之间键入的所有内容都会在主命令之前(如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
看一下这个问题,以了解为什么在很多情况下使用反引号不是一个好主意。
顺便说一句,如果您想直接使用反引号,例如在字符串中使用反引号,可以通过在反引号(\
)之前加上反斜杠()来对其进行转义。
$()
在大多数情况下使用该方法都是一种很好的做法,也不会使反引号变得更糟。出于实际目的,必须承认它们在命令行上键入的速度要快得多(两次击键相比,至少要击键5次,包括Shift
)。
$( )
绝对比` `
至少在法语键盘上更容易键入。
很少有澄清说明:
反引号(有时也称为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 :)
$(your expression)
是更好的方法$()
。例如:cd $(dirname $(type -P touch))
将您touch