昨天寫了類似以下這樣一段 script:
#!/usr/bin/env bash
set -e
R=`ls /dev/ | grep sd`
echo "Results found:"
echo $R
照理來說,不管 grep 是有有撈到資料,至少會印出「Results found」字樣,但實際執行時卻什麼資料都沒有輸出。
後來使用「bash -xv」來執行,監視值流程,才發現 script 執行到一半就中斷了:
$ bash -xv qwe.sh
#!/usr/bin/env bash
set -e
+ set -e
R=`ls /dev/ | grep sd`
++ ls /dev/
++ grep sd
+ R=
追蹤後發現二個結果交互影響導致 script 中斷:
- set -e 的設定
- grep 的 exit code
在 bash 中「set -e」代表遇到錯誤立即中斷執行;而 grep 的 exit code 比較令人意外,當 grep 有找到資料時,則 exit code 為 0 (正常結束),若 grep 都沒有找到指定的字串,則會回傳 1 (錯誤)。這二件事情同時發生,所以就導致了上面的 script 在 grep 執行後就中斷執行。
// ——
shell script 好像沒什麼 debug 的工具,不過在執行時可以透過 bash 的參數,來提供執行時的一些狀態,例如: -xv。