Bash 中双引号和单引号中使用反引号的区别

Bash 中双引号和单引号中使用反引号的区别

为什么以下两次执行的输出不同?(我需要在最终命令中为变量加上双引号)

$ sudo su -c "echo `cat /root/root_file`"
cat: /root/root_file: Permission denied
$ sudo su -c 'echo `cat /root/root_file`'
Yay, highly classified content!

答案1

Bash 执行一系列扩张 命令被执行(sudo在本例中)。在第一种情况下,由于命令在双引号中,因此执行了命令替换——它会以您的身份执行,因此会出现错误。在第二种情况下,单引号会阻止扩展,因此直到 root 的 shell 运行后才会替换反引号。

也可以看看https://www.gnu.org/software/bash/manual/bashref.html#Quoting

答案2

在第一个示例中,反引号由您的 shell 进行评估(您本人,而非 root 用户)。尝试使用

sudo su -c "echo `whoami`"

在第二个带有单引号的字符串中,'整个字符串echo `cat /root/root_file`被传递给根 shell。

相关内容