91
90

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

`set -e` しているときにコマンドの戻り値を得る

Last updated at Posted at 2013-05-16

次の書き方だと ./xxx.sh が 0 以外のときにそこで終了してしまうので case の後が実行されることはありません。

set -e

./xxx.sh $1

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

一時的に set +e して戻り値を変数に入れてから set -e に戻す方法が考えられますがイマイチです。

set -e

set +e
./xxx.sh $1
ret=$?
set -e

case $ret in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

次のようにすると上手くいきます。

set -e

./xxx.sh $1 &&:

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

解説

set -e&&|| でコマンドが繋げられた場合、リストの最後のコマンドが非 0 を返した場合だけ終了します。

./xxx.sh が 0 を返した場合、&& の後ろの : が実行されます。
: は何もせずに成功する組み込みコマンドなので、戻り値は 0 です。
よって $? は 0 です。

./xxx.sh が非 0 を返した場合、リストの最後ではないので set -e でも終了しません。
さらに && で繋がっているので : は実行されません。
よって $?./xxx.sh の戻り値そのままです。

91
90
3

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
91
90

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?