概要
基本的にはパイプの途中でエラーになるとそれが終了コードとなります
環境
- macOS 11.7.10
テストコード
ls | lsa | ls
echo $?
echo "ls 1回目"
ls
echo "ls 2回目"
echo $?
結果
こんな感じでパイプのラストがステータスコードになります
test.sh: line 5: lsa: command not found
test.sh
0
ls 1回目
test.sh
ls 2回目
0
set -o pipefail を使う
set -o pipefail
ls | lsa | ls
echo $?
echo "ls 1回目"
ls
echo "ls 2回目"
echo $?
結果
1つ目のパイプの結果が 127 になります
パイプの途中でコマンドがエラーになっているのでそれがステータスコードになっています
test.sh: line 5: lsa: command not found
test.sh
127
ls 1回目
test.sh
ls 2回目
0
set -e -o pipefail にする
今度は -e オプションも追加します
set -e -o pipefail
ls | lsa | ls
echo $?
echo "ls 1回目"
ls
echo "ls 2回目"
echo $?
結果
パイプの途中でコマンドが失敗するとシェルスクリプト全体も途中で終了します
test.sh: line 5: lsa: command not found
test.sh
set -e だけにする
set -e
ls | lsa | ls
echo $?
echo "ls 1回目"
ls
echo "ls 2回目"
echo $?
結果
pipefail がないのでパイプの途中で失敗していますがステータスコードが 0 になるので最後まで実行されます
test.sh: line 5: lsa: command not found
test.sh
0
ls 1回目
test.sh
ls 2回目
0
最後に
set -o pipefail はパイプの途中でエラーになった場合それをステータスコードにする
set -e -o pipefail はパイプの途中でエラーになった場合そこで全体も終了する
set -e は途中でエラーになった場合に全体も終了するが、パイプの途中のステータスコードは無視する
0 件のコメント:
コメントを投稿