次のレシピをtime
false
アンダーにset -e
成功させます (time
出力が見えるという意味での成功):
(
set +e
time { ( set -e; false; echo no0; ); }
echo yes0 $?
)
ただし、次のレシピは失敗します。
(
set -e
time false
echo no1
)
同じように:
(
set -e
time { false; echo no2; }
echo no2
)
同様に (驚くべきことに、bash3 では yes3 を出力し、bash4 では何も出力しません):
(
set -e
time ( false; echo no3; )
echo yes3 $?
)
同様に(それほど驚くべきことではありません):
(
set +e
time { set -e; false; echo no4; }
echo no4
)
同様に(驚き):
(
set +e
time ( set -e; false; echo no5; )
echo yes5 $?
)
以下は bash3 では成功し、bash4 ではまったく異なることを行います。
(
set -e
time { ( false; echo no7; ); echo yes6 $?; }
echo yes6 $?
)
echo
「いいえ」は出力されませんが、「はい」はbash3によって出力されることに注意してください(ただし、すべてがbash4によって出力されるわけではありません)。
これを(...)
下のサブシェル処理と比較すると、この場合、ビルトインはサブシェル コンテキストで実行されているset -e
ように見えます。なんてこと?time
time (...)
でテスト済み
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
出力
real 0m0.000s
user 0m0.001s
sys 0m0.000s
yes0 1
yes3 1
yes5 1
yes6 1
real 0m0.000s
user 0m0.000s
sys 0m0.001s
yes6 0
と
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
出力
real 0m0.001s
user 0m0.000s
sys 0m0.004s
yes0 1
yes5 1
「yes3」と「yes6」のケースでは、bash3 と bash4 の処理方法が大きく異なることに注意してくださいset -e
。
しかし、「yes5」のケースは混乱を招きます。「時間」は、外部シェルではなくサブシェルによって何らかの形で処理されているようです。
この動作は POSIX によって強制されますか、bash の 1 つにバグがありますか、それとも単なるbash
特別な動作ですか?
ありがとう ;)
PS: なぜこれがアカデミックではないのか不思議に思っている方のために: 以前set -e
("yes3" without time
) の下でスクリプトが実行されていました。いくつかのタイミング情報をログに記録するように変更されました。ハックは「yes6」のように見えます。しかし、現在 bash4 が登場しており、再度修正が必要です。