~からbashとshの違い:
質問に答えるには:
/bin/sh
asからbashへのリンクがある場合、bashは/bin/sh
呼び出されたときと呼び出されたときと同じようには機能しません/bin/bash
。呼び出されると、sh
制限された拡張セットを使用して、主にPOSIX互換に制限されます。
これは、Linuxでsh:というシェルスクリプトを持つシェルスクリプトに会うたび#!/bin/sh
に、dashやbashなどの他のシェルへのシンボリックリンクであるそのディストリビューションでも、bin/sh
Bourneシェルと100%互換性がなければならないことを意味しますか?制限された拡張セットに制限されますか?では、FreeBSDで実行できますか?例外がありますか?それとも、それがうまくいくと安全に想定できるべきですか?
したがって、ディストリビューションでbin/sh
はい、シンボリックリンクがbin/bash
使用され#!/bin/sh
、スクリプトにbashismが含まれている場合、bashはshモードにあるため実行されませんか?
答え1
いいえ、/bin/sh
bashは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 ...)で機能します。