構文的に有効なbashコードではないsh
コードはありますか(構文でbarfしません)?
特定のコマンドについて、sh
をbash
で上書きすることを考えています。
以下は、POSIX shとBashで何か異なることを行うコードです。
hello &> world
それが「無効」かどうかはわかりません。
Bashでは 標準出力と標準エラーの両方をリダイレクトします をhello
からファイルworld
にリダイレクトします。 POSIX sh
では、バックグラウンドでhello
を実行してから、world
への空のリダイレクトを行い、切り捨てます(つまり、& >
として扱われます)。
Bash拡張機能がbash
の下で実行されたときに機能する他の多くのケースがあり、純粋なPOSIX sh
では異なる効果があります。たとえば、 ブレース展開 は別のものであり、BashのPOSIXモードでも同じように動作します。
静的な構文エラーに関する限り、BashにはPOSIXで指定されていない予約語([[
やtime
など)があり、[[ x
は有効なPOSIXシェルコードですが、Bash構文エラーです。 、およびさまざまな履歴 この質問のような構文エラーを引き起こす可能性のあるPOSIXの非互換性バグ :
x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file
Syntax-errors-onlyは、重要な状況では「無効」のかなり危険な定義ですが、実際にはあります。
短い例:
time()(:)
Bashのtime
は予約語であり、time
プログラムとは異なる動作をします。 bashを使用してtime
の結果を解析しようとするいくつかの実用的なスクリプトを壊す可能性が非常に高いです。しかし、技術的には構文エラーではありません。 time
を関数として再定義することはまれですが、この質問で指定されているように構文エラーが発生します。
短い例:
a():
dash
で有効ですが、POSIXに準拠していません。