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


31

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

特定のコマンドで上書きshすることbashを考えています。


1
有効だとは構文的に有効であると思うので、構文が乱れることはありません
Alexander Mills

2
別のトークン化?例えば((、頭に浮かぶ。
ccorn

1
一部のディストリビューションで/usr/bin/shは、単なるシンボリックリンク/usr/bin/bashです(CentOS 7.3を使用しています)。ディストリビューションにsh本当にbash適しているかどうかを確認する必要があります。
Centimane

1
数年前、bashで何かが「アップグレード」されたとき、私のプロジェクト全体が壊れました。すべてのシバンラインをからに変更する必要があり#!/bin/shました#!/bin/bash。その後、すべてが再び機能したので、本当に注意する必要があります。shでbashの代わりにdashを使用し始めたときに発生した可能性があります。
ジョー

1
@Joe、それはOPが求めているものの反対です-あなたはshコードであると誤ってラベル付けされたbashコードを持っていましたが、そうではありませんでした。OPは、shで実行すると破損するbashコードを使用できるのではなく、bashで実行すると破損する(実際の、誤ったラベルのない)shコードを使用できるかどうかを尋ねています(これは明らかです-bash拡張機能がそうでなかった場合利用可能な言語機能に影響を与えますが、拡張機能ではありません)。
チャールズダフィー

回答:


49

POSIX shとBashで異なることを行うコードを次に示します。

hello &> world

それがあなたにとって「無効」であるかどうかはわかりません。

バッシュでは、標準出力と標準エラー出力の両方をリダイレクトからhelloファイルにworld。POSIXではshhelloバックグラウンドで実行されworld、空のリダイレクトをに行い、切り捨てます(つまり、として処理されます& >)。

Bash拡張機能が実行されると、Bash拡張機能が機能bashし、純粋なPOSIXでは異なる効果を持つ他の多くのケースがありshます。たとえば、ブレース展開は別のものであり、BashのPOSIXモードでも同じように動作しますが、そうではありません。


静的な構文エラーに関する限り、BashにはPOSIXで指定されていない予約語([[andなど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は、それが重要なあらゆる状況での「無効」のかなり危険な定義ですが、そこにはあります。


3
現在、ブレース拡張はbash(およびzsh、pdksh、ksh93)を非準拠にしますが、POSIXはブレース拡張(および{fd}>file同様の問題)を許可するために仕様に規定を追加することに取り組んでいます。未指定のままだろうが、対応のスクリプトが実行する必要がありますecho "{a,b}"彼らが望むれる{a,b})を出力します。参照してください。それを開始した議論
ステファンChazelas


2
POSIXでスクリプトを書く人は、このようなコマンドを書くでしょうか?OPはshからbashに移行していますが、私の理解では、これは逆方向の問題のようです。
リッチ

1
@リッチ:もちろん。私/bin/shはbashのシステムを使用していません。したがって、このbashismを積極的に認識していなければ、コマンドラインを記述することは簡単に起こります。答えの間隔は、見かけ上はありそうにありませんが、hello&>worldそれほど遠くないものです。
R ..

2
先月の違いによるバグ&>を実際に見ました!
ゴードンデイヴィ

16

短い例:

time()(:)

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

より短い例:

a():

で有効ですがdash、POSIX準拠ではありません。


3
より一般的には、非標準のキーワードまたはBashの組み込みコマンドである単語は同じ効果をもたらします。加えてtime、もののようにありますdeclarefunctionselect、とcoproc。それらのいくつかは標準で明示的に未指定としてマークされていますが(キーワードおよびbuiltins / utilities)、たとえば、timeまたはcoprocリストに表示されません。また、使用--posixしても効果がないようです。
-ilkkachu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.