条件付き割り当てにサブシェルを使用しないでください

条件付き割り当てにサブシェルを使用しないでください

私はLinuxシェルの初心者ですが、このコマンドがサブシェルを生成することを知っています。

サブシェルは通常、サブシェル演算子や角括弧()、バックティック、または$()構文などのコマンドを使用して生成されます。

: ${FOO:=$([ "$BAR" = "baz" ] && echo "true" || echo "false" )}

たとえば、ループ(ここではそうではありません)しかし、私はそれを避ける方法を学ぶのが好きです。通常、上記の課題でサブシェルを回避するために、次のものを使用できますか?

if [ -z "$FOO" ]; then
  if [ "$BAR" = "baz" ]; then
    FOO=true
  else
    FOO=false
  fi
fi

ベストアンサー1

通常、上記の課題でサブシェルを回避するために、次のものを使用できますか?

if [ -z "$FOO" ]; then
  if [ "$BAR" = "baz" ]; then
    FOO=true
  else
    FOO=false
  fi
fi

はい、こう書くのが正しいです。

: ${FOO:=$([ "$BAR" = "baz" ] && echo "true" || echo "false" )}

サブシェルの実行(ほとんどのシェルでは高価なプロセスフォークが含まれています)も、さまざまな理由で間違っています。

ksh93 シェルでは、次のサブシェルとこれらの問題を回避できます。

: "${FOO:=${
  if [ "$VAR" = baz ]; then
    echo true
  else
    echo false
  fi
}}"

しかし、これは上記の標準的で明確な説明と比較してif利点がほとんどありません。

おすすめ記事