2019/05/07

GNU grep 的 exit code 會因結果而不同

昨天寫了類似以下這樣一段 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。

沒有留言:

張貼留言

除非必要,請不要在回覆時留下您的敏感資訊 (電話、email、地址等)