sh
構文上有効なbashコードではないコードがあります(構文を放棄せずに)?
いくつかのコマンドsh
でオーバーライドしようとしています。bash
答え1
ここにいくつかのコードがあります何か他のことをしなさいPOSIX shとBashでは:
hello &> world
これがあなたに「働かない」かどうかはわかりません。
バッシュでは標準出力と標準エラーリダイレクトでhello
ファイルを入力してくださいworld
。 POSIXでは、バックグラウンドで実行され、次にnullリダイレクトを実行してsh
それを切り捨てます(つまり、そのように処理されます)。hello
world
& >
Bash拡張が実行時に機能bash
し、純粋なPOSIXで異なる効果を持つ他の多くのケースがありますsh
。例えば、支柱の拡張BashのPOSIXモードでも実行される別のモードですが、そうではありません。
静的構文エラーの観点から、Bashには、[[
などのPOSIX指定されていない予約語があります。たとえば、これは有効なPOSIXシェルコードですが、Bash構文エラーとさまざまな履歴があります。time
[[ x
POSIXの非互換性エラーが原因で、この質問などの構文エラーが発生する可能性があります。:
x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file
単純な構文エラーは、重要な状況では「間違っている」という非常に危険な定義ですが、存在します。
答え2
簡単な例:
time()(:)
time
Bashは予約語であり、プログラムとは異なる動作をしますtime
。time
Bashを使用して結果を解析しようとすると、一部の実際のスクリプトが破損する可能性があります。しかし、技術的にはこれは構文エラーではありません。time
関数でオーバーライドすることはまれですが、この質問で指定されているとおりに構文エラーが発生する可能性があります。
より短い例:
a():
では有効ですdash
が、POSIXと互換性がありません。