web-dev-qa-db-ja.com

構文的に有効なbashコードではないshコードはありますか?

構文的に有効なbashコードではないshコードはありますか(構文でbarfしません)?

特定のコマンドについて、shbashで上書きすることを考えています。

31
Alexander Mills

以下は、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は、重要な状況では「無効」のかなり危険な定義ですが、実際にはあります。

48
Michael Homer

短い例:

time()(:)

Bashのtimeは予約語であり、timeプログラムとは異なる動作をします。 bashを使用してtimeの結果を解析しようとするいくつかの実用的なスクリプトを壊す可能性が非常に高いです。しかし、技術的には構文エラーではありません。 timeを関数として再定義することはまれですが、この質問で指定されているように構文エラーが発生します。

短い例:

a():

dashで有効ですが、POSIXに準拠していません。

16
user23013