set -x 可开启命令执行追踪,每条命令及其展开参数带+前缀打印,适用于排查变量、路径等问题;用set +x关闭,常与set -e组合、局部启用、重定向过滤,但需防范敏感信息泄露。

在 Linux 运维脚本中,用 set -x 可以开启命令执行的详细追踪,每条实际运行的命令及其展开后的参数都会被打印到终端(或日志),非常适用于排查逻辑错误、变量未赋值、路径拼接异常等问题。
如何启用 set -x 调试模式
在脚本开头或需要调试的代码段前加上:
-
set -x—— 开启调试,后续每条命令执行前都会先打印(带 + 前缀) -
set +x—— 关闭调试,停止打印命令跟踪
例如:
#!/bin/bash echo "开始处理" set -x ls /tmp/$USER-* cp /tmp/data.txt /backup/ set +x echo "完成"
set -x 的实际输出效果
启用后,类似这样的输出会出现在终端或重定向的日志中:
+ ls '/tmp/alex-*' + cp /tmp/data.txt /backup/
注意:变量已展开、通配符未展开(除非执行时匹配成功)、单引号/双引号影响明显。这能帮你一眼看出变量是否为空、路径是否如预期。
常用搭配技巧
- 与
set -e(遇错退出)组合使用,避免错误被掩盖:set -ex - 只对关键区块调试,避免全程输出干扰,比如只包裹 if 判断块或循环体
- 通过
set -o xtrace达到和set -x相同效果,语义更清晰 - 调试时可重定向输出:
./deploy.sh 2>&1 | grep '^+'快速过滤跟踪行
注意事项和避坑点
- 敏感信息(如密码、token)若在命令中直接出现,
set -x会明文打印,切勿在生产环境全量开启 - 命令替换、管道、子 shell 中的
set -x不会自动继承,需显式设置 - 函数内默认不继承父 shell 的 xtrace 状态,可在函数开头加
set -x单独开启 - 临时调试建议用
bash -x script.sh启动,无需修改源码











