set -eコマンドは、いずれかのコマンドがゼロ以外の終了コードを返すと、bashスクリプトをすぐに失敗させます。
スクリプト内の個々のコマンドに対してこの動作を無効にする簡単でエレガントな方法はありますか?
この機能はBashリファレンスマニュアル(http://www.gnu.org/software/bash/manual/bashref.html)に記載されていますか?
set -eコマンドは、いずれかのコマンドがゼロ以外の終了コードを返すと、bashスクリプトをすぐに失敗させます。
スクリプト内の個々のコマンドに対してこの動作を無効にする簡単でエレガントな方法はありますか?
この機能はBashリファレンスマニュアル(http://www.gnu.org/software/bash/manual/bashref.html)に記載されていますか?
回答:
このようなもの:
#!/usr/bin/env bash
set -e
echo hi
# disable exitting on error temporarily
set +e
aoeuidhtn
echo next line
# bring it back
set -e
ao
echo next line
実行:
$ ./test.sh
hi
./test.sh: line 7: aoeuidhtn: command not found
next line
./test.sh: line 11: ao: command not found
set
組み込みヘルプで説明されています:
$ type set
set is a shell builtin
$ help set
(...)
Using + rather than - causes these flags to be turned off.
同じことがhttps://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtinに記載されています。
エラー時に保釈を解除する別の方法は、何であれ成功を強制することです。次のようなことができます:
cmd_to_run || true
これは0(true)を返すため、セット-eはトリガーされません。
faulty_cmd || :
これのもう一つの人気のイディオムです。(:
は、と同義のコマンドtrue
です)。
「すぐにシェルを終了する」オプションが適用されるか無視されるかは、実行されたコマンドのコンテキストによって異なります(ビルトインセットのBashリファレンスマニュアルのセクションを参照してください-Arkadiusz Drabczykに感謝します)。
特に、コマンドがifステートメントのテストの一部である場合、オプションは無視されます。したがって、次のようなifステートメントを使用して、コマンドを実行し、「すぐに終了するコンテキスト」内でコマンドの成功または失敗を確認することができます。
#!/bin/bash
set -e
# Uncomment next line to see set -e effect:
#blubb
if blubb; then
echo "Command blubb was succesful."
else
echo "Command blubb failed. Exit code: $?"
fi
echo "Script exited normally."
「then」ステートメントを省略して、使用する行を減らすことができます。
if blubb; then :;
else echo "Command blubb failed. Exit code: $?"; fi
私は実際に最近似たような質問をしました(投稿しなかったが、私はそれに回りました)、そして私が見ることができることから、それはコマンドの前にset + eを使用し、その後で最もエレガントにset -eを使用しているようです。以下に例を示します。コマンドの応答を取得し、エラーがそれを捨てないようにします。
#!/bin/sh
args=""
for argcol in $*
do
args="${args} ${argcol}"
done
fortunevar=""
fortfail=""
{
set +e
fortunevar=`fortune $args`
fortfail=$?
set -e
} &> /dev/null
if [ $fortfail == 0 ]
then
echo ${fortunevar}
say ${fortunevar}
else
echo misfortune: an illegal option was detected!
echo misfortune: usage: misfortune [-afilosw] [-m pattern][ [#%] file/directory/all]
fi
これは 'fortune'の出力を取得し、その終了ステータスを確認し、それをエコーして言います。これはあなたが求めていたもの、または少なくとも似たようなものだと思いますか?とにかく、これが役立つことを願っています。