在 CentOS(以及所有类 Unix/Linux 系统、包括 Bash/Sh shell)里,反引号(` `)是“命令替换(Command Substitution)”的一种写法。它的作用和执行原理如下:
反引号:
`命令`
作用是:先执行反引号里面的命令,再把命令的输出结果,替换到原来的位置。
例如:
echo "当前时间是 `date`"
等价于:
echo "当前时间是 $(date)"
当你在 Shell 中输入一条命令,Shell 会先扫描整行命令。
遇到反引号时,Shell 知道:
“这里面是一个子命令,需要先执行”
Shell 会:
例如:
`ls`
实际过程是:
ls⚠️ 注意:
例如:
echo `ls /not_exist`
错误会直接打印到终端,而不会进入 echo。
命令输出的结尾换行符会被去掉(或压缩),方便嵌入字符串。
例如:
echo "结果:`echo hello`"
输出:
结果:hello
执行完反引号里的内容后,Shell 会把输出“贴回去”,再执行整条命令。
$()现代 Shell 更推荐使用:
$(命令)
对比:
echo `date`
echo $(date)
✅ $(...) 优点:
反引号嵌套很痛苦:
echo `echo \`date\``
而:
echo $(echo $(date))
CentOS 默认 Shell 是 bash,因此:
/bin/sh(有时是 dash)中也支持,但细节略有差异FILE=`ls -1 | head -n 1`
echo "第一个文件是:$FILE"
执行流程:
ls -1 | head -n 1 在子 Shell 执行echo `echo \`pwd\``
容易写错。
VAR=`ls`
echo $VAR
可能会单词拆分。
✅ 建议:
VAR=$(ls)
echo "$VAR"
CentOS 中反引号的本质是:Shell 先 fork 子进程执行其中的命令,再把 stdout 输出替换回原命令行位置。
如果你愿意,我也可以:
strace 给你看底层系统调用$( ) 和 ` ` 的源码级差异