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。

2019/05/06

在 bash 看指令執行後的 exit status code

老題目了,做個筆記。

Linux 底下,所有程式、指令結束都會有個 exit code,有點像是執行成功、或失敗的狀態。一般來說,正常執行的 exit code 都會是 0。

如果要看前一個指令執行後的 exit code,可以使用「echo $?」來看:
$ cd .
$ echo $?
0
$ mkdir app
mkdir: cannot create directory ‘app’: File exists
echo $?
1

2019/05/03

幾個清空 docker 資料的好用指定

中斷所有正在運作的 container:
docker kill $(docker ps -q)


刪除所有已中止的 container:
docker rm $(docker ps -a -q)


刪除所有的 images:
docker rmi $(docker images -q)


節錄自:Top 10 Docker CLI commands you can’t live without