shがbashまたはdashへのシンボリックリンクの場合、bashはPOSIX準拠に制限されているため、shと100%互換性があるべきですか?

shがbashまたはdashへのシンボリックリンクの場合、bashはPOSIX準拠に制限されているため、shと100%互換性があるべきですか?

~からbashとshの違い:

質問に答えるには:/bin/shasからbashへのリンクがある場合、bashは/bin/sh呼び出されたときと呼び出されたときと同じようには機能しません/bin/bash。呼び出されると、sh制限された拡張セットを使用して、主にPOSIX互換に制限されます。

これは、Linuxでsh:というシェルスクリプトを持つシェルスクリプトに会うたび#!/bin/shに、dashやbashなどの他のシェルへのシンボリックリンクであるそのディストリビューションでも、bin/shBourneシェルと100%互換性がなければならないことを意味しますか?制限された拡張セットに制限されますか?では、FreeBSDで実行できますか?例外がありますか?それとも、それがうまくいくと安全に想定できるべきですか?

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

答え1

いいえ、/bin/shbashはbashへのシンボリックリンクの場合にのみposixモードに入ります。男乱交:

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

今posixパターンを検索するとバッシュマンページ一部のシェル組み込み機能は類似timeまたはsource異なる動作をすることがわかります。それはすべてです。function関数を宣言する前に作成したり、source代わりに使用したりするようなBashishは機能しますが、.コマンドは異なる動作をする可能性があります。

したがって、/bin/shすべての一般的なbashishmへのシンボリックリンクはまだ機能します。/bin/bash

Posixモードの違いの非常に広範なリストについては、以下を確認してください。バッシュリファレンスマニュアル

答え2

Bourneシェルは少し混乱しているようです。 BourneシェルはPOSIX以前の数十年前のUnixシェルです。今日、「sh」は、bash、pdksh、AT&T ksh、最新のAlmquistシェル、POSIX準拠の派生(一部のBSD「sh」を含む)、その他のBSD shベースを含むPOSIX仕様を実装する1つ以上のシェル実装です。 pdkshとDebian ash(ダッシュ) - 例:Ubuntu)。 zshにもほとんどPOSIX互換モードがあります。以下を実行して確認できます。

# check what sh really is on Ubuntu 22.04
$ ls -nd -- /bin/sh
lrwxrwxrwx 1 0 0 4 Mar 23  2022 /bin/sh -> dash

Bourne シェルは POSIX と互換性がなく、今日多くのシステムで見つけることができません。 Bourneシェルが見つかるかどうかにかかわらず、常にPOSIX互換の「sh」があります(Bourneシェルではありません)。ただし、/bin注目すべき(そして迷惑な)Solaris例外はありません。

Bourneシェル以前は、30年前に「sh」がThompsonシェルでした。私たちはもはやThompsonシェルと互換性のあるスクリプトを書いていません。同様に、「sh」をBourneシェルとして考えるのをやめるべきです。

今日、「sh」は時々互換性のないさまざまな実装バリアントではない仕様です。これにより、移植可能なスクリプトをはるかに簡単に作成できます。ただフォローしてください仕様

これは「sh」およびすべての標準ユーティリティ(sed、cut、tr ...)で機能します。

関連情報