web-dev-qa-db-ja.com

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

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/shbin/bashへのシンボリックリンクであり、スクリプトが#!/bin/shを使用し、スクリプトにbashismが含まれている場合、bashはshモードになりたいので、実行されません。

8
user1115057

いいえ、/bin/shがbashへのシンボリックリンクである場合、bashはposixモードになります man bash

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

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

したがって、/bin/sh/bin/bashへのシンボリックリンクである場合、すべての一般的なバシシュムは引き続き機能します。

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

16
Ulrich Dangel

ボーンシェルの周りには混乱があるようです。 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 ...)に当てはまります。

8