後で使用するために終了コードを保存


15

そのため、いくつかのテストを実行するための小さなスクリプトがあります。

javac *.java && java -ea Test
rm -f *.class

ここでの問題は、スクリプトを実行する./testと、テストがrm -f *.class成功したために失敗した場合でも、成功の終了コードを返すことです。

私が望んでいることを実現することを考えることができる唯一の方法は、私にとってい感じです:

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi

しかし、これは一般的な問題のように見えます-タスクを実行し、クリーンアップしてから、元のタスクの終了コードを返します。

これを行う最も慣用的な方法は何ですか(bashまたは一般的なシェルのみ)?

回答:


5

次のようにexitrmコマンドとコマンドを1つの単純なコマンドにまとめることができますeval

java ... && java ...
eval "rm -f *.class; exit $?"

そのよう$?に渡されるときの値は、実行のexit直前に割り当てられるものevalです。


eval常にファンのお気に入りです。
mikeserv

23

私は一緒に行きます:

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
exit "$test_exit_code"

なぜexit利用できるのに飛び回るのですか?


以下を使用できますtrap

trap 'last_error_code=$?' ERR

例えば:

$ trap 'last_error_code=$?' ERR
$ false
$ echo $?
1
$ echo $last_error_code $?
1 0

ああ、私はそれが私のオリジナルよりも優れていることに同意します。しかし、終了コードを変数に明示的に保存しなければならないことは、まだ満足のいくものではありません。終了コードを「プッシュ」して後で「ポップ」する方法はありませんか?
math4tots

@ math4totsアップデートをお試しください。
ムル

あなたの更新では、last_error_codeをゼロに初期化してから最後に戻る必要があるため、コマンドがエラーをスローした場合はゼロ以外の終了コードがありますか?それはクールなトリックですが、私の2行のハックスクリプトでは、@ mikeservの答えを好むと思います。
math4tots

@ math4totsいつでもできますexit ${last_error_code:=0}
ムル

何でも@avip?すでに一重引用符で囲まれているため、変数はトラップが呼び出されたときにのみ評価されます。
ムル

9

私が知る限り、bashがよりtry...finallyCに似たプログラミング言語のブロックに最も近いもの(利用可能であればおそらく望んでいるものです)は、次のtrapような構造です。

trap "rm -f *.class" EXIT
javac *.java && java -ea Test

これにより、スクリプトの終了時に「rm -f * .class」が実行されます。もっと複雑なことがあれば、関数に入れることができます:

cleanup() {
    ...
}
trap cleanup EXIT
javac *.java && java -ea Test

あなたがそんなに傾いているなら、これをtry...catch...finallyCのブロックのように機能するかなり一般的なイディオムに変えることができます。このようなもの:

(
  trap "catch_block; exit" ERR
  trap finally_block EXIT
  # contents of try goes here
)

括弧がサブシェルを区切ることに注意してください。この構造では、スクリプト全体ではなく、コマンドが失敗した場合にサブシェルのみが終了します。サブシェルはやや計算コストが高いため、あまり多く(数百)使用しないでください。スクリプトによっては、シェル関数とtrap ... RETURNで同じ効果をより効率的に達成できる場合がありますが、調査するのはあなた次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.