温馨提示×

centos反引号执行原理是什么

小樊
45
2026-09-30 11:47:32
栏目: 智能运维

在 CentOS(以及所有类 Unix/Linux 系统、包括 Bash/Sh shell)里,反引号(` `)是“命令替换(Command Substitution)”的一种写法。它的作用和执行原理如下:


一、反引号是什么

反引号:

`命令`

作用是:先执行反引号里面的命令,再把命令的输出结果,替换到原来的位置。

例如:

echo "当前时间是 `date`"

等价于:

echo "当前时间是 $(date)"

二、执行原理(核心)

1️⃣ Shell 解析阶段

当你在 Shell 中输入一条命令,Shell 会先扫描整行命令。

遇到反引号时,Shell 知道:

“这里面是一个子命令,需要先执行”


2️⃣ 创建子 Shell(或子进程)

Shell 会:

  • 创建一个子 Shell(subshell)
  • 在子 Shell 中执行反引号里的命令

例如:

`ls`

实际过程是:

  1. 父 Shell 发现反引号
  2. fork 一个子 Shell
  3. 子 Shell 执行 ls
  4. 子 Shell 把标准输出返回给父 Shell

3️⃣ 捕获标准输出(stdout)

⚠️ 注意:

  • 只有 stdout 会被替换
  • stderr(错误输出)不会被替换

例如:

echo `ls /not_exist`

错误会直接打印到终端,而不会进入 echo。


4️⃣ 去除尾部换行

命令输出的结尾换行符会被去掉(或压缩),方便嵌入字符串。

例如:

echo "结果:`echo hello`"

输出:

结果:hello

5️⃣ 替换回原命令

执行完反引号里的内容后,Shell 会把输出“贴回去”,再执行整条命令。


三、等价写法:$()

现代 Shell 更推荐使用:

$(命令)

对比:

echo `date`
echo $(date)

✅ $(...) 优点:

  • 可嵌套
  • 可读性更好
  • 转义少坑

反引号嵌套很痛苦:

echo `echo \`date\``

而:

echo $(echo $(date))

四、CentOS 中的实际情况

CentOS 默认 Shell 是 bash,因此:

  • 反引号行为完全遵循 bash 规则
  • 在 /bin/sh(有时是 dash)中也支持,但细节略有差异

五、一个完整例子

FILE=`ls -1 | head -n 1`
echo "第一个文件是:$FILE"

执行流程:

  1. ls -1 | head -n 1 在子 Shell 执行
  2. 得到文件名
  3. 赋值给 FILE
  4. echo 输出

六、常见坑

❌ 反引号里再反引号

echo `echo \`pwd\``

容易写错。

❌ 输出带空格

VAR=`ls`
echo $VAR

可能会单词拆分。

✅ 建议:

VAR=$(ls)
echo "$VAR"

七、一句话总结

CentOS 中反引号的本质是:Shell 先 fork 子进程执行其中的命令,再把 stdout 输出替换回原命令行位置。

如果你愿意,我也可以:

  • 用 strace 给你看底层系统调用
  • 对比 $( ) 和 ` ` 的源码级差异
  • 讲 bash 源码中如何处理命令替换

0 踩