Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Shell 腳本調試技術大全:trap、tee、set -x、DEBUG/ERR/EXIT 信號捕獲實戰

編輯:Linux 教學

核心調試手段分類

  1. 輸出調試信息 (echo/tee/trap)
  2. 語法檢查 (bash -n)
  3. 逐語句跟蹤 (bash -x/set -x)
  4. 內置變量增強跟蹤輸出 (LINENO/BASH_SOURCE/FUNCNAME)

1. trap 捕獲偽信號 (Shell 級調試神器)

信號觸發時機典型用途
EXIT腳本結束或函數返回清理臨時文件、打印最終變量狀態
ERR命令返回非 0 (失敗)自動定位失敗行號、打印錯誤上下文
DEBUG每條命令執行**前**全程跟蹤變量變化、執行路徑

ERR 陷阱示例

err_trap() {
    echo "[LINE:$1] Error: Command exited with status $?"
}
trap 'err_trap $LINENO' ERR

foo() { return 1; }
abc          # 不存在的命令
foo          # 返回 1

輸出:

./test.sh: line 10: abc: command not found
[LINE:10] Error: Command exited with status 127
[LINE:11] Error: Command exited with status 1

DEBUG 陷阱示例 (全程變量跟蹤)

trap 'echo "LINE:$LINENO a=$a b=$b c=$c"' DEBUG
a=1
if [ "$a" -eq 1 ]; then b=2; else b=1; fi
c=3
echo "end"

輸出每行執行前的變量值,清晰展示分支走向。

2. tee 管道中間結果可視化

cmd1 | tee /tmp/step1.log | cmd2 | tee /tmp/step2.log | cmd3

同時將中間結果寫入日誌文件並繼續管道流,調試複雜管道鏈必備。

3. 語法檢查 (-n)

bash -n script.sh   # 僅檢查語法,不執行
# 配合語法高亮編輯器 (vim/shfmt) 事前消除語法錯誤

4. 逐語句跟蹤 (-x / set -x)

bash -x script.sh           # 全腳本跟蹤
set -x                      # 從此處開始跟蹤
set +x                      # 關閉跟蹤
# 進函數內部跟蹤需在函數開頭 set -x

增強輸出格式 (PS4)

export PS4='+[$(date "+%H:%M:%S")] ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
set -x

輸出含時間戳、文件名、行號、函數名,極大提升可讀性。

5. 內置調試變量速查

變量含義
$LINENO當前行號
${BASH_SOURCE[0]}當前腳本路徑
${FUNCNAME[0]}當前函數名
$BASH_SUBSHELL子 Shell 嵌套層級
$?上一條命令退出碼
$PIPESTATUS[@]管道中各命令退出碼數組

調試最佳實踐清單

  1. 開發期:set -euo pipefail (遇錯即停、未定義變量報錯、管道失敗傳遞)
  2. 關鍵邏輯處植入 trap '...' DEBUG 變量快照
  3. 複雜管道必加 tee 留存中間態
  4. 提交前跑 bash -n + shellcheck (靜態分析工具)
  5. 生產環境關閉 set -x,改用日誌級別控制輸出

總結

Shell 調試核心是「信號捕獲 + 輸出可視化 + 靜態檢查」。掌握 trap DEBUG/ERR/EXIT、tee、PS4 強化輸出、set -euo pipefail 防禦性編程,可將調試效率提升數倍。

Copyright © Windows教程網 All Rights Reserved