LoginSignup
1
1

More than 3 years have passed since last update.

ShellScript Bash 終了コード で 詰まったところ

Last updated at Posted at 2019-08-16

目的

  • パイプを使用したときのコマンドの終了コードについて詳しく知る。
    ※本記事の内容はbashの環境に依存します。同じbashでもこの方法だと解決しないことがあります。

この記事のターゲット

  • ログを出力しているShellScriptの終了コードが欲しい方
  • パイプより前の処理の終了コードが欲しい方

自分が困ったエピソード

  • test.shという名前のShellScriptのファイルを書いた。
  • 実行するときのコンソールログと終了コードが欲しかった。
  • 下記の様に当該スクリプトを実行した。
    ./test.sh 2>&1 | tee result.txt
  • 実行後にtest.shが正常終了したか知りたかったため下記の終了コードを返すコマンドを実行
    echo $?
  • 終了コードは0が返ってきた。
  • しかしresult.txtを確認したところ、エラー終了していた。
  • パイプを用いたコマンドを使用した場合にecho $?を実行するとtee result.txtの終了コードが返ってきてしまう。

解決方法

  • パイプで区切られた範囲の処理の終了コードが特定の配列に入るようになっているらしい。
    ${PIPESTATUS}という配列に結果が入っている。
  • その配列から欲しい処理の終了コードを抜き取ってあげればOK

詳細

  • 下記の様なパイプを多用した処理を例にする。
$ 処理1 | 処理2 | 処理3
  • 一連の処理の終了コードはそれぞれ下記の様に配列${PIPESTATUS}に格納されている。

    • 処理1の終了コード → 配列${PIPESTATUS}の0番目に格納
    • 処理2の終了コード → 配列${PIPESTATUS}の1番目に格納
    • 処理3の終了コード → 配列${PIPESTATUS}の2番目に格納
  • 一連の処理の終了コードを出力したいときは下記の様に出力する。

    • 処理1の終了コードをコンソールに表示 → echo "${PIPESTATUS[0]}"
    • 処理2の終了コードをコンソールに表示 → echo "${PIPESTATUS[1]}"
    • 処理3の終了コードをコンソールに表示 → echo "${PIPESTATUS[2]}"

まとめ

  • パイプを使用した処理の終了コードについてまとめた。
  • パイプで区切られた処理の終了コードは配列${PAPESTATUS}に順に格納される。
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1