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
看看这个问题,以了解为什么在很多情况下使用反引号不是一个好主意。
如果想要使用,字面上的反引号,例如在字符串中,可以通过在其前面放置反斜杠(
\
)来使其转义。#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
的输出值显示出来。
评论
这可以很好地解释反引号,但是使用$(您的表达式)是更好的方法,因为$()允许您嵌套表达式。例如: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