私が知る限り、角かっこはコマンドをサブシェルで実行し、中括弧はコマンドをグループ化しますが、サブシェルで実行しないようにします。
かっこを使用して実行する場合:
no_func || (
echo "there is nothing"
exit 1
)
echo $?
これにより終了ステータスが返されます。
/Users/myname/bin/ex5: line 34: n_func: command not found
there is nothing
1
しかし、中かっこを使用すると、次のようになります。
no_func || {
echo "there is nothing"
exit 1
}
echo $?
終了ステータスを返しません。
/Users/myname/bin/ex5: line 34: no_func: command not found
there is nothing
しかし、なぜ1つは終了ステータスを返し、もう1つは返しませんか?
答え1
コマンド実行トレース(set -x
)を確認してください。校正器を含む:
+ no_func
./a: line 3: no_func: command not found
+ echo 'there is nothing'
there is nothing
+ exit 1
exit
(サブ)シェルを終了します。中かっこはサブシェルを生成しないため、デフォルトのexit
シェルプロセスが終了するため、実行ポイントに到達しませんecho $?
。
答え2
中かっこを使用すると、スクリプトはecho $?
スクリプトに到達する前に状態 1 で終了します。
ストラップシェルの変形:
$ ./script1.sh
./script1.sh: line 3: no_func: command not found
there is nothing
1 # <-- exit status of subshell
$ echo $?
0 # <-- exit status of script
中かっこ付きのバリエーション:
$ ./script2.sh
./script2.sh: line 3: no_func: command not found
there is nothing # <-- the script exits with 1 after this line
$ echo $?
1 # <-- exit status of script