~によるとグループを開く、
returnユーティリティは、シェルに現在の関数またはドットスクリプトの実行を停止させる必要があります。シェルが現在関数またはドットスクリプトを実行していない場合、結果は指定されません。
しかし、次のコードスニペットを実行すると
func () {
( return 1 )
return 0
}
func
echo $?
出力は次のようになります0
(bashとdashを試しましたが、結果は同じです)。そのため、return
シェルは現在の関数の実行を停止するようには見えず、これはPOSIX標準に違反します。私は何を逃したことがありませんか?
ベストアンサー1
( return 1 )
サブシェルで実行されます。これはシェルの戻りコードをキャプチャした後、サブシェルをすぐに終了します1
。0
その後、関数自体がその行を返します。
(望むよりグループ化コマンドシェルコマンド言語仕様。 )
{}
サブシェルを導入せずにフォームと比較します。
#! /bin/sh
func () {
( return 42 )
echo "One: $?"
{ return 1; }
echo "Two: $?"
return 2
}
func
echo "Three: $?"
出力(「2つ」なし):
One: 42
Three: 1