在 CentOS(以及所有 Linux/Unix Shell 环境中),反引号(` `)用于命令替换(Command Substitution),例如:
echo `date`
虽然功能上和 $(...) 一样,但反引号存在若干风险和缺陷,这也是现代 Shell 脚本更推荐使用 $(...) 的原因。
反引号不支持直观嵌套,需要转义:
# 错误示例
echo `echo `date``
# 正确但难读
echo `echo \`date\``
而 $(...) 可以自然嵌套:
echo $(echo $(date))
✅ 风险:脚本可读性差,易写错,维护困难
反引号内部:
\、` 都需要转义例如:
echo `echo \$HOME`
不同写法结果可能出人意料。
✅ 风险:安全性和可维护性下降
在复杂脚本或字符串中,反引号容易被忽视:
result=`ls -l`
如果漏写或写错,可能导致:
✅ 风险:调试困难
如果反引号中使用了不可信输入:
input="; rm -rf /"
echo `echo $input`
可能导致命令注入(尤其在 CGI、定时任务、日志处理中)。
✅ 风险:严重安全问题
反引号(`)常和单引号(')或重音符号混淆,尤其在:
✅ 风险:人为错误
now=$(date)
now=`date`
| 项目 | 反引号 | $(...) |
|---|---|---|
| 可读性 | 差 | 好 |
| 嵌套 | 难 | 易 |
| 安全性 | 较低 | 较高 |
| 推荐程度 | ❌ | ✅ |
结论:
在 CentOS 及任何 Shell 脚本中,尽量避免使用反引号,统一使用 $(...)。
如果你愿意,我也可以帮你把一段“反引号脚本”改写成更安全的版本。