シェルスクリプトは通常、バイナリ、Pythonスクリプト、Perlスクリプト、その他の種類のスクリプトなど、その他の種類の実行可能ファイルと同じであるかのように扱われます。それらは、シェルを介してそれらを実行するようにカーネルに指示する上部にシバンがあります。これらは、他のコマンドと同じ方法で呼び出されることが期待されています。
そのため、スクリプトが呼び出されるたびに新しいシェルが開始さset -f
れ、起動中のシェルやシステム内の他のシェルインスタンスに存在する設定などは関係ありません。
もちろん、ユーザーがスクリプトを実行する代わりに、たとえば次のようにソースを入手することは可能です。
. /path/to/your/script
または、次のようなデフォルト以外の設定を持つシェルで実行するには:
sh -f /path/to/your/script
しかし、これらは通常の方法やスクリプトの呼び出しとは見なされず、それを行うユーザーは、結果として得られるものをすべて期待する必要があります。
実行されるのではなく、供給されることを目的とするいくつかのスクリプトがあることに注意してください。それらの目的は、ソースシェルの環境に反映する必要があるcwdの変更や環境変数の設定などにあるためですが、これらは少数派ですそしてそれは通常、合意されたプロトコルの一部として行われます。これらのファイルは、独立したスクリプトとしてではなく、ソースとして提供されることが期待されているシステムにとって「プラグイン」のようなものと考えることができます。たとえば、/etc/rc*.d
名前がで終わるファイルは、.sh
実行されずに起動スクリプトサブシステムによって供給されます。このような名前のファイルを/etc/rc*.d
そしてそれが行われるとき、それは故意に行われます。この方法で実行するのではなく、ソースを提供することを目的としたファイルの命名規則は、他の場所でも適用されますが、普遍的ではありません。
この方法で取得することを目的としたファイルは、シェルの動作に影響を与える可能性のある呼び出し元の環境に存在する可能性のある設定に注意する必要がありますが、合意されたプロトコルは予測可能な実行環境を約束するのが理想的です。
shell_state=$(set +o)
... スクリプト ...eval "$shell_state"