echo/tee/trap)bash -n)bash -x/set -x)LINENO/BASH_SOURCE/FUNCNAME)| 信號 | 觸發時機 | 典型用途 |
|---|---|---|
| EXIT | 腳本結束或函數返回 | 清理臨時文件、打印最終變量狀態 |
| ERR | 命令返回非 0 (失敗) | 自動定位失敗行號、打印錯誤上下文 |
| DEBUG | 每條命令執行**前** | 全程跟蹤變量變化、執行路徑 |
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
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"
輸出每行執行前的變量值,清晰展示分支走向。
cmd1 | tee /tmp/step1.log | cmd2 | tee /tmp/step2.log | cmd3
同時將中間結果寫入日誌文件並繼續管道流,調試複雜管道鏈必備。
bash -n script.sh # 僅檢查語法,不執行
# 配合語法高亮編輯器 (vim/shfmt) 事前消除語法錯誤
bash -x script.sh # 全腳本跟蹤
set -x # 從此處開始跟蹤
set +x # 關閉跟蹤
# 進函數內部跟蹤需在函數開頭 set -x
export PS4='+[$(date "+%H:%M:%S")] ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
set -x
輸出含時間戳、文件名、行號、函數名,極大提升可讀性。
| 變量 | 含義 |
|---|---|
$LINENO | 當前行號 |
${BASH_SOURCE[0]} | 當前腳本路徑 |
${FUNCNAME[0]} | 當前函數名 |
$BASH_SUBSHELL | 子 Shell 嵌套層級 |
$? | 上一條命令退出碼 |
$PIPESTATUS[@] | 管道中各命令退出碼數組 |
set -euo pipefail (遇錯即停、未定義變量報錯、管道失敗傳遞)trap '...' DEBUG 變量快照tee 留存中間態bash -n + shellcheck (靜態分析工具)set -x,改用日誌級別控制輸出Shell 調試核心是「信號捕獲 + 輸出可視化 + 靜態檢查」。掌握 trap DEBUG/ERR/EXIT、tee、PS4 強化輸出、set -euo pipefail 防禦性編程,可將調試效率提升數倍。
CentOS 6.x 手動安裝 Oracle JDK 7 全流程:RPM 包部署、環境變量配置、生效驗證
Linux 密碼暴力破解工具實測:fcrackzip、pdfcrack、Ophcrack
Linux 管道命令實戰大全:grep、cut、sort、uniq 核心技巧
Linux 超級使用者 (root) 權限控制完整解析:UID 0、su、sudo 與最小權限原則
Linux C 語言操作 MySQL 完整指南:API 核心函數、編譯鏈接與實戰範例
Linux 核心中斷機制深度分析:從 IDT 到裝置驅動 ISR