これはどこかに投稿されていると思いますが、見つかりませんでした。
Bashでは、サブシェルを作成せずに、どのようにして演算子の優先順位(別名コマンドグループ化)を指定しますか?他のほとんどの言語では、()
がこれを行いますが、Bashでは、環境の変更を「破棄」するサブシェルでコマンドを実行します。環境の変化を失わずに演算子の優先順位を指定したい。
具体的には、このようなことを行い、()
のサブシェルだけでなく、スクリプト全体を終了させたいと思います。
die ()
{
echo "[DIE]: $1"
exit 1
}
# When installChruby returns an error, print the error message and exit
[[ $CHRUBY =~ [Yy] ]] && (installChruby || die "Error installing chruby")
これを行うことで「回避策」を見つけましたが、それは私が望むようなきれいなワンライナーではありません。
if [[ $CHRUBY =~ [Yy] ]]; then installChruby || die "Error installing Chruby"; fi
望ましい結果は、何もせずにCHRUBY
が設定されていない場合は続行し、installChruby
がCHRUBY
またはY
の場合は関数y
を呼び出し、die
関数がfalseを返した場合にのみinstallChruby
関数を呼び出すことです。
()
のほかにこれを行う演算子がBashにありますか、それとも()
内のコードにサブシェルで実行しないように指示する方法がありますか?
man bash
から:
{ list; }
list is simply executed in the current Shell environment. list must be terminated with a newline or semicolon.
This is known as a group command. The return status is the exit status of list. Note that unlike the metachar‐
acters ( and ), { and } are reserved words and must occur where a reserved Word is permitted to be recognized.
Since they do not cause a Word break, they must be separated from list by whitespace or another Shell metacharac‐
ter.