web-dev-qa-db-ja.com

Bash-サブシェルを作成せずに明示的な演算子を優先させる方法

これはどこかに投稿されていると思いますが、見つかりませんでした。

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が設定されていない場合は続行し、installChrubyCHRUBYまたはYの場合は関数yを呼び出し、die関数がfalseを返した場合にのみinstallChruby関数を呼び出すことです。

()のほかにこれを行う演算子がBashにありますか、それとも()内のコードにサブシェルで実行しないように指示する方法がありますか?

5
Freedom_Ben

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.
5
michas