shがbashまたはdashへのシンボリックリンクである場合、bashはそれ自体をPOSIX準拠に制限するため、shと100%互換でなければなりませんか?


8

bashとshの違いから:

質問への同意:/bin/shbashへのリンクとして持っている場合、bashは、/bin/shとして呼び出されたときと同じように呼び出された場合と同じように動作しません/bin/bash。として呼び出されるとsh、ほとんどの場合POSIX準拠と限定された拡張セットに制限されます。

Linuxでshへのシバンがあるシェルスクリプトに出くわしたときはいつでも#!/bin/sh、そのディストリビューション上であってもbin/sh、ダッシュやbashなどの別のシェルへのシンボリックリンクである場合、ボーンシェルと100%互換性があるはずです。それはそれ自体を限られた拡張セットに制限しますか?それで、私はそれらをFreeBSDで実行できますか?例外はありますか?それとも私はそれがうまくいくと仮定しても安全でしょうか?

したがって、ディストリビューションで、bin/shへのシンボリックリンクbin/bashであり、スクリプトの使用#!/bin/shとスクリプトにbashismが含まれている場合、bashはshモードのようになるため、実行されません。

回答:


16

いいえ、/bin/shbashへのシンボリックリンクの場合、bashはposixモードに入ります-man bashから:

shとして呼び出されると、bashは起動ファイルが読み込まれた後にposixモードに入ります。

bashのマンページでposixモードを検索すると、一部のシェルビルトインの動作が異なるtimeか、source動作が異なることがわかります。以上です。function関数を宣言する前に書くか、source代わりに使用するようなbashishms は機能.しますが、コマンドの動作が異なる場合があります。

したがって、すべての典型的なバシシュム/bin/shへのシンボリックリンクが/bin/bashまだ機能します。

Posixモードの違いのかなり広範なリストについては、bashリファレンスマニュアルをご覧ください


だから私がすべき最も良いことは、checkbashismツールですべてのスクリプトをテストすることだと思います。DebianやUbuntu(これの確認が必要)などの一部のディストリビューションでは、bin / shがダッシュにシンボリックリンクされていると聞きました。ダッシュはボーンシェルと互換性がありますか?はいの場合、少なくともすべてのDebianおよびUbuntuシェルスクリプトはFreeBSDで問題ありません。
user1115057 2012

@ user1115057は/bin/sh、shebangを持つシェルスクリプトのみです。シェルスクリプトは引き続き明示的にを使用できます/bin/bash。とにかく、ほとんどのシェルスクリプトはおそらく/ bin / shで正常に動作しますが、問題はユーザーツールになります。たとえば、ほとんどのシェルスクリプトはGNUユーザーランドを想定しています。また、posixモードでの異なる動作をリストするbashリファレンスへのリンクを追加しました
Ulrich Dangel

私が読んだことからわかるように、BSDはbin / shとしてashを使用していますが、DebianとUbuntuはダッシュを使用しています。これらのシェルに互換性がある場合は、シバン#!/ bin / shで問題が発生しないことを意味します。しかし、あなたが言ったように、ユーザーランドに関連する他の問題があります...
user1115057

@ user1115057ダッシュも完璧ではありません。例:wiki.ubuntu.com/DashAsBinSh/#echoとにかくほとんどのシェルスクリプトはかなり単純で、非常に簡単に移植できます…幸運
Ulrich Dangel

しかし、ダッシュとアッシュは互換性がありますよね?
user1115057 2012

8

ボーンシェルの周りに混乱があるようです。Bourneシェルは、数十年前、POSIX以前の時代のUnixシェルでした。現在、「sh」はPOSIX仕様を実装するシェルの実装または別のものであり、その中にはbash、pdksh、AT&T ksh、新しいAlmquistシェル、およびPOSIX準拠にされたそれらの派生物(一部のBSDの「sh」を含む)があります。 、他のBSD shはpdkshおよびDebian ash(ダッシュ)に基づいています。zshにも、ほとんどがPOSIX準拠のモードがあります。

BourneシェルはPOSIXに準拠していないため、現在の多くのシステムでは見つかりません。Bourneシェルが見つかるか、見つからない場合、POSIX準拠の「sh」が常に存在します(Bourneシェルではありません/bin)。ただし、注目すべき(煩わしい)例外はSolarisです。

Bourneシェルの前で、30年以上前に話しているように、「sh」はThompsonシェルでした。Thompsonシェルと互換性のあるスクリプトはもう作成していません。同様に、「sh」をボーンシェルと考えるのをやめるべきです。

現在、「sh」は仕様であり、実装の互換性のないバリアントはあまりありません。これにより、移植可能なスクリプトを簡単に作成できます。仕様に従ってください。

それは「sh」とすべての標準ユーティリティ(sed、cut、tr ...)に当てはまります。


「仕様に書き込む」の場合は+1。しかし、残念ながら、それだけでは移植性を十分に発揮できないことがよくあります。たとえば、sedでegrepスタイルのパターンを使用したい場合はどうでしょうか。仕様ではこれを規定していません。Gnuベースのユーティリティ(またはBusyBox)を備えたシステムでは、を使用しますsed -r。BSDベースのユーティリティを備えたシステムでは、を使用しますsed -E。FreeBSDのsedは両方を受け入れますが、Mac OS Xはのみを受け入れます-E。などなど。
dubiousjim 2012

それは要点の外です。仕様はそれを提供していないので、それを移植可能/ POSIXlyで使用することはできません。BREを使用する場合、それはすべてのPOSIX準拠システムで機能します。これはPOSIXによって提供される保証であるため、便利です。あなたが言うようにPOSIXの外では、sedはEREをサポートしていないか、別のオプションまたは別のERE構文でサポートしているため、希望はありません。。のEREは(構文のみがあなたにいくつかの入力を保存するためのEREに拡張されBREでは未満能力があるのEREは、BREではに変換することができ、逆は真ではありません(BREのことに注意してください\(...\)\1)標準のEREには訳がありません。
ステファンChazelas

1
(POSIX)EREには後方参照がないことに気づきました。実際、私は規格のその部分の編集に参加しました。現在の標準ではBREの代替が定義されていないため、POSIX EREがBREよりも厳密に能力が低いことは正しくありません。ただし、\|BREを尊重しない正規表現エンジンについては知りません。私はすべて、できるだけ移植性のある方法で書くことにしました。私は(これは広く評価されていると思いますが)これは苦痛であり、POSIXへの書き込みがまったく不可能である可能性があることを確認するだけでした。どこかにそのような倒錯を示すリンクがあります。それらを探します。
dubiousjim 2012

交替についての良い点、私はそれを忘れて、修正された立場です。sedを使用すると、いくつかの式を使用して代替正規表現に一致させることができるため、ブロックされる可能性は低くなります。EREが必要な場合に使用できるawkが標準ツールチェストにあります。私は標準のツールチェストで自分自身を見つけることはめったにありません、そして私がそうするとき、それは一般にperlのような別の言語がより適切であるケースですが、私はあなたの要点を見ています
ステファンChazelas

オフハンドで考えた例:シバン行(すべてのシェルスクリプトの最上部)はPOSIXでは指定されていません。また、100%POSIX準拠のシステムを使用したことがあるかどうかもわかりません。たとえば、POSIXでは内部に改行を含めることはできます${VAR:=stuff...here}が、多くのシェルでは許可されていないため、引用符で囲む必要がありますstuff...here
dubiousjim 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.