2024年8月2日金曜日

set -o pipefail の挙動を確認する

set -o pipefail の挙動を確認する

概要

基本的にはパイプの途中でエラーになるとそれが終了コードとなります

環境

  • 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 件のコメント:

コメントを投稿