bash機能は現在のシェルまたはサブシェルで実行されていますか?

bash機能は現在のシェルまたはサブシェルで実行されていますか?

端末を開き、bash関数を呼び出します。

change_path

どこ:

change_path(){
 export PATH="foobar:$PATH";
}

change_path常に現在のシェルで実行され、常に現在のシェルの$ PATHを変更しますか?今までのテストではそうなのですが、確かにわかりにくいです。

答え1

はい、呼び出された関数は現在シェルで実行されています。
現在、シェルから関数をインポートした(定義した)とします。これは、いくつかのファイル(〜/ .bashrcなど)をインポートするか、現在のシェルに手動で関数を作成することによって実行できます。次のコマンドを実行して、この前提を確認できます。

$ type -a change_path

関数定義を印刷すると、関数は現在のシェルで定義されており、変更可能な現在のシェル変数にアクセスできます。

(...)これは、変数が適切に制限されている場合(たとえば、代わりに次のものを使用する場合)、関数が常に変数を変更するという意味ではありません{...}

$ change_path()(
    export PATH="foobar:$PATH";
)

しかし、関数は実際には現在のシェルで実行され続けており、単にサブシェルを起動します。(...)

これを確認するには、bashのマニュアルを読んでください(強調表示):

機能
上記のSHELL GRAMMARで説明されているように定義されたシェル関数は、後で実行するための一連のコマンドを保存します。シェル関数の名前を単純なコマンド名として使用すると、その関数名に関連付けられたコマンドのリストが実行されます。関数は現在のシェルのコンテキストで実行されます。;これを解釈するための新しいプロセスは作成されません(シェルスクリプトの実行と比較)。

関連情報