From bashとshの違い :
質問への回答:bashへのリンクとして
/bin/sh
がある場合、bashは/bin/sh
として呼び出されたときと、/bin/bash
として呼び出されたときと同じように動作しません。sh
と呼ばれると、ほとんどがPOSIX準拠に加えて、拡張機能のセットが制限されます。
Linuxでシェルスクリプトを使用してshを実行するシェルスクリプトに遭遇したときはいつでも、#!/bin/sh
は、そのディストリビューション上であっても、bin/sh
がダッシュやbashのような別のシェルへのシンボリックリンクであっても、限られた拡張セットに制限されているため、Bourne Shellと100%互換性がありますか?それで、私はそれらをFreeBSDで実行できますか?例外はありますか?それとも私はそれがうまくいくと仮定しても安全でしょうか?
したがって、ディストリビューションでbin/sh
がbin/bash
へのシンボリックリンクであり、スクリプトが#!/bin/sh
を使用し、スクリプトにbashismが含まれている場合、bashはshモードになりたいので、実行されません。
いいえ、/bin/sh
がbashへのシンボリックリンクである場合、bashはposixモードになります man bash :
Shとして呼び出されると、bashは起動ファイルが読み取られた後にposixモードに入ります。
bashのマンページ でposixモードを検索すると、time
やsource
などの一部のShellビルトインの動作が異なることがわかります。以上です。関数を宣言する前にfunction
を書くようなbashishmsや、.
の代わりにsource
を使用しても機能しますが、コマンドの動作が異なる場合があります。
したがって、/bin/sh
が/bin/bash
へのシンボリックリンクである場合、すべての一般的なバシシュムは引き続き機能します。
Posixモードの違いのかなり広範なリストについては、 bashリファレンスマニュアル を参照してください。
ボーンシェルの周りには混乱があるようです。 Bourne Shellは、数十年前のPOSIX以前の時代のUnixShellでした。現在、「sh」はPOSIX仕様を実装するシェルの実装または別のものであり、その中にはbash、pdksh、AT&T ksh、新しいAlmquistシェル、およびPOSIX準拠になっているそれらの派生物(一部のBSDの「sh」を含む)があります。 、他のBSDはpdkshとDebian ash(ダッシュ)に基づいています)。 zshでさえ、ほとんどPOSIXに準拠しているモードがあります。
Bourne ShellはPOSIXに準拠しておらず、現在多くのシステムで見つけることができません。 Bourne Shellが見つかった場合と見つからなかった場合は、POSIX準拠の「sh」が常に存在します(Bourne Shellにはなりません)。通常は/bin
にありますが、注目すべき(迷惑な)例外はSolarisです。
Bourne Shellの前、そして30年以上前に話していたのは、「sh」がThompsonShellであったことに注意してください。 ThompsonShellと互換性のあるスクリプトはもう作成していません。同様に、「sh」をボーンシェルと考えるのをやめるべきです。
現在、「sh」は仕様であり、実装の互換性のないバリアントは多くありません。これにより、ポータブルスクリプトの作成がはるかに簡単になります。 仕様 に従ってください。
これは「sh」とすべての標準ユーティリティ(sed、cut、tr ...)に当てはまります。