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

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

sh構文上有効なbashコードではないコードがあります(構文を放棄せずに)?

いくつかのコマンドshでオーバーライドしようとしています。bash

答え1

ここにいくつかのコードがあります何か他のことをしなさいPOSIX shとBashでは:

hello &> world

これがあなたに「働かない」かどうかはわかりません。

バッシュでは標準出力と標準エラーリダイレクトhelloファイルを入力してくださいworld。 POSIXでは、バックグラウンドで実行され、次にnullリダイレクトを実行してshそれを切り捨てます(つまり、そのように処理されます)。helloworld& >

Bash拡張が実行時に機能bashし、純粋なPOSIXで異なる効果を持つ他の多くのケースがありますsh。例えば、支柱の拡張BashのPOSIXモードでも実行される別のモードですが、そうではありません。


静的構文エラーの観点から、Bashには、[[などのPOSIX指定されていない予約語があります。たとえば、これは有効なPOSIXシェルコードですが、Bash構文エラーとさまざまな履歴があります。time[[ xPOSIXの非互換性エラーが原因で、この質問などの構文エラーが発生する可能性があります。:

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

単純な構文エラーは、重要な状況では「間違っている」という非常に危険な定義ですが、存在します。

答え2

簡単な例:

time()(:)

timeBashは予約語であり、プログラムとは異なる動作をしますtimetimeBashを使用して結果を解析しようとすると、一部の実際のスクリプトが破損する可能性があります。しかし、技術的にはこれは構文エラーではありません。time関数でオーバーライドすることはまれですが、この質問で指定されているとおりに構文エラーが発生する可能性があります。

より短い例:

a():

では有効ですdashが、POSIXと互換性がありません。

関連情報