カスタム環境変数を使用して別のプログラムを実行するためのbashスクリプトを作成しました。これは私の最初のスクリプトですrun-hello.sh
。/home/user
#!/bin/bash
export PATH=$PATH":/home/user/cool/path"
hello.sh
exit 0
私はスクリプトを/home/user/cool/path
持っていますhello.sh
:
#\!/bin/bash
echo Hello from $(pwd)
最初のスクリプト(run-hello.sh)を実行すると、次のようになります。
Hello from /home/user
私の質問:
最初のスクリプトの呼び出しは、
export
スクリプトがアクティブなときにのみ機能しますか?スクリプトの実行後にecho $PATH
スクリプトによって追加されたパスが表示されない場合...これは予想される動作ですか?少なくとも端末期間中に存在させるにはどうすればよいですか?結果が
/home/user
代わりに印刷されるのはなぜですか/home/user/cool/path
?
答え1
まず、シェルの下でシェルスクリプトを起動するときに、シェルがスクリプトのコマンドを実行するために新しいシェル(サブシェルと呼ばれる)を作成することを考慮する必要があります。
その後、man bashは次のように言います。
環境
プログラムが呼び出されると、環境と呼ばれる文字列の配列が提供されます。これは形式の名前と値のペアのリストですname=value
。シェルは環境を運営するためのさまざまな方法を提供します。呼び出されると、シェルは環境をスキャンし、見つかった各名前の引数を生成して自動的に子プロセスにエクスポートできるようにします。実行されたコマンドは環境を継承します。
export
コマンドを使用すると、declare -x
環境でパラメーターと機能を追加および削除できます。環境のパラメーター値が変更されると、新しい値が環境の一部になり、古い値を置き換えます。実行されたコマンドによって継承された環境は、シェルから変更できる値からコマンドによって削除されたペアと、コマンドによって追加されたすべての項目を引いたunset
シェルexport
のdeclare -x
初期環境で構成されます。
したがって、初めてエクスポートすると、PATH
新しい値はサブシェル環境の一部になり、トリガーされるすべてのサブプロセスで使用できます。 (例:hello.sh)
したがって、echo $PATH
hello.shを実行した直後に実行すると、更新された値が表示されるはずです。
ただし、シェルを終了します。! (run-hello.shを実行しているサブシェルは終了します。)一部の祖先(run-hello.shを起動したシェルである可能性が高い)は、run-hello.sh環境の干渉をまったく認識していないまま制御を取り戻しました。
はい。これは実際に予想される動作です。
ジョブが開始されると、現在の作業ディレクトリは親ディレクトリから継承されます。プログラムが配置されているディレクトリに自動的に変更されません。だから私はあなたの電話がその登録簿からかかってきたと
疑わなければなりません。run-hello.sh
/home/user
要約すると、エクスポートされた変数の寿命はエクスポートを担当するタスクの寿命と同じであり、タスク自体とその子孫(開始時)の有効性が保証されます。