linux shell 调试核心是 set 命令:set -x 显示实际执行命令并支持行号标记,set -u 捕获未定义变量,set -e 和 pipefail 确保错误立即终止;shell 无原生断点,但可用 read、trap 或 set -x/+x 组合实现等效暂停与聚焦调试。

Linux Shell 脚本调试不靠猜,靠“让 shell 自己说话”。set 是最轻量、最可靠、无需额外安装的核心手段;而所谓“断点”,Shell 原生不支持传统 IDE 那样的行级断点,但可通过 set -x + 局部控制 + trap 实现等效效果。
用 set -x 看清每一步真实执行什么
它不是显示你写的代码,而是打印 shell 实际执行的命令——变量已展开、通配符已匹配、命令替换已完成。比如 cp "$SRC" "$DST",若 $SRC 为空,你会直接看到 + cp "" "/dest/",立刻定位问题。
- 脚本开头加
set -x,或运行时用bash -x script.sh - 只对当前 shell 生效,子 shell 或
source的文件需单独加 - 想临时关闭?在关键段前后写
set -x和set +x - 加
PS4='+ [${LINENO}] '可在每行调试输出前标出行号,对照源码更直观
用 set -u 捕获未定义变量
很多静默失败源于拼错变量名,比如把 CONF_DIR 写成 CONG_DIR。启用 set -u 后,只要引用未赋值变量,脚本立即报错退出,不让你糊弄过去。
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- 脚本开头加
set -u或set -o nounset - 允许空值的地方,改用
${VAR:-}或${VAR:-default}安全展开 - 避免用
set +u临时绕过,优先修复变量逻辑
用 set -e 和 pipefail 让错误不被掩盖
默认情况下,一条 curl 失败了,脚本仍会继续执行后续的 tar -xf,结果是“文件不存在”报错,真正原因却被掩盖。set -e 让脚本在任意命令失败时立刻终止。
-
set -e(或set -o errexit)生效于普通命令,但if、while条件判断内的命令不受影响 -
set -o pipefail补齐管道短板:cmd1 | cmd2 | cmd3中任意一环失败都触发退出,而非只看cmd3的返回值 - 推荐组合:
set -euo pipefail—— 开发阶段开全,上线后保留-euo pipefail,仅关掉-x
模拟“断点”的实用技巧
Shell 没有内置断点,但你可以用以下方式实现类似效果:
- 在想暂停的位置插入
read -p "Paused. Press Enter to continue...",手动控制流程 - 用
trap 'echo "Break at line $LINENO"; read' USR1,然后另起终端执行kill -USR1 $(pidof bash)触发中断 - 结合
set -x与set +x把调试范围缩到几行内,相当于“聚焦断点” - 配合
bash -n script.sh先做语法检查,排除基础错误再进逻辑调试










