次のように宣言されたbash関数があります。
function foo {
echo "this is foo";
}
私はそれを呼び出しませんでしたが、export -f foo
まだサブシェルで動作します。
ただし、一般的に次の関数を宣言するとき:
foo(){
echo "this is foo";
}
その後、電話する必要があります。
export -f foo;
他の宣言構文でエクスポート動作に違いがあると思いますか?
私が知っている限り、関数をエクスポートする必要はありません。
. my_script_with_foo_in_it.sh # this is in ~/.bash_profile/.bashrc
その後、bashシェルを呼び出すことができます。
foo
機能をエクスポートしなくても問題ありません。
答え1
source
スクリプトを使用または取得すると、.
スクリプトの内容は現在のシェルのコンテキストで実行されます。ソーススクリプトで定義されているすべての関数とシェル変数(エクスポートを除く)は、ソーススクリプトの後の現在のシェルで使用できます。これは目的スクリプトを探しています。
/etc/profile
たとえば、これはファイルまたは対話型/ログインシェルのデフォルト環境を設定する/etc/bash.bashrc
方法です。
また、一部のコマンドは、シェル環境を複製するサブシェル環境で実行されます。これらの環境では、シェル変数と関数を使用できます。 POSIX標準も参照してください。シェル実行環境(私のハイライト):
サブシェル環境コピーとして作成する必要がある無視されないシグナルトラップをデフォルトのジョブとして設定する必要があるという点で、シェル環境は異なります。サブシェル環境に対する変更は、シェル環境に影響を与えてはいけません。コマンドの置換、括弧でグループ化されたコマンド、および非同期のリストは、サブシェル環境で実行する必要があります。さらに、マルチコマンドパイプラインの各コマンドはサブシェル環境にありますが、拡張機能によってパイプラインの一部またはすべてのコマンドを現在の環境で実行できます。他のすべてのコマンドは、現在のシェル環境内で実行する必要があります。
サブシェルはサブプロセスと同じではありません。
変数のエクスポートは、環境変数を作成するときにのみ必要です。環境変数はすべての子プロセスによって継承されます。
また目次シェルが次のことを試みるので、呼び出しは~/.bash_profile
少し混乱します。bash
一般ファイル ~/.bash_profile
ログインシェルを起動するとき。シェル初期化ファイルを別の場所に移動するには、ディレクトリ名をまたは~/.bash_profile
同じ名前に変更することをお勧めします。これらのファイルを自動的にインポートするには、 とそのファイルを呼び出す必要があります。~/.shell
~/.shell_startup
~/.bash_profile
~/.bashrc