私はbashシェルスクリプトを初めて使用するので、問題に直面しました。「.profile」ファイルをリロードできることはわかっています。
. .profile
しかし、私が書いているbashスクリプトで同じことを実行しようとしていますが、機能していません。何か案は?明確にするために他に提供できることはありますか?
ありがとう
私はbashシェルスクリプトを初めて使用するので、問題に直面しました。「.profile」ファイルをリロードできることはわかっています。
. .profile
しかし、私が書いているbashスクリプトで同じことを実行しようとしていますが、機能していません。何か案は?明確にするために他に提供できることはありますか?
ありがとう
回答:
これを試して現在のシェルをリロードしてください:
source ~/.profile
source
、誰かが同じよう変数代入を使用している場合、コマンドは、最悪の場合には、そのファイルをスクリプトとして...実行するMyVar="$foo$MyVar"
彼らのbash_profileに、そしてsource ~/.profile
最終的な結果を与えるだろうMyVar="$foo$MyVar$MyVar"
、したがって、$MyVar
その後の誤った値を持っているでしょう。(悪い習慣に関係なく、代わりの解決策を求めてください)
〜/ .profileファイルをリロード/ソースしようとすると、いくつかの問題が発生します。[これはUbuntu linuxを指します-場合によっては、コマンドの詳細が異なる場合があります]
広告。1)
これをターミナルで直接実行すると、サブシェルは作成されません。したがって、次の2つのコマンドを使用できます。
source ~/.bash_profile
または
. ~/.bash_profile
どちらの場合も、.profileファイルの内容で環境が更新されます。
広告2)を呼び出すことで、bashスクリプトを開始できます。
sh myscript.sh
または
. myscript.sh
最初のケースでは、これはシステムの環境変数に影響を与えないサブシェルを作成し、それらはサブシェルプロセスにのみ表示されます。サブシェルコマンドの終了後、エクスポートなどは適用されません。これは一般的な間違いであり、多くの開発者が多くの時間を失う原因となります。
スクリプトに適用した変更をグローバル環境に適用するには、スクリプトを実行する必要があります
.myscript.sh
コマンド。
スクリプトがサブシェルで実行されないようにするために、この関数を使用できます。(これもUbuntuシェルの例です)
#/bin/bash
preventSubshell(){
if [[ $_ != $0 ]]
then
echo "Script is being sourced"
else
echo "Script is a subshell - please run the script by invoking . script.sh command";
exit 1;
fi
}
これにより、よくある誤解が解消されることを願っています!:Dグッドラック!
bashスクリプトは別のサブシェルで実行されます。この作業を行うためには、この他のスクリプトも入手する必要があります。
.profile
次のようなファイルをソースに. $HOME/.profile
する必要があります。また、スクリプトをソースから開始する必要があります。次のようなもの. /path/to/yourscript