私は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" )}
サブシェルの実行(ほとんどのシェルでは高価なプロセスフォークが含まれています)も、さまざまな理由で間違っています。
- 拡張子は
${FOO...}
引用されていないため、分割+グローブの影響を受けて、少なくともDoSの脆弱性になります(これは提供された例の1つです)。bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク)。 echo "false"
[
echo true
または、失敗した場合に実行し、失敗した場合にのみ実行したいです。適切に交換できません。[
a && b || c
if a; then b; else c; fi
ksh93 シェルでは、次のサブシェルとこれらの問題を回避できます。
: "${FOO:=${
if [ "$VAR" = baz ]; then
echo true
else
echo false
fi
}}"
しかし、これは上記の標準的で明確な説明と比較してif
利点がほとんどありません。
答え2
不思議な一行の場合は、サブシェルなしで必要な結果が得られると思います。
[[ "$BAR" = "baz" ]] && FOO=${FOO-true} || FOO=${FOO-false}
しかし、私は選択します。if....