(UNIXの)bashシェルスクリプトで.profileをリロードしますか?


130

私はbashシェルスクリプトを初めて使用するので、問題に直面しました。「.profile」ファイルをリロードできることはわかっています。

. .profile

しかし、私が書いているbashスクリプトで同じことを実行しようとしていますが、機能していません。何か案は?明確にするために他に提供できることはありますか?

ありがとう


Ignacioが以下に指摘するように、スクリプトはサブシェルで実行されています。サブシェルはメインシェルを変更できません(子プロセスは親を変更できません)。したがって、「。」を使用してスクリプトを「ソース」する必要があります。コマンド(「ソース」と表記することもできます)。したがって、スクリプトで環境変数を変更する場合は、「ソースmyscript」や「。myscript」などを実行する必要があります(どちらも同じ意味です)。これにより、メインシェルの環境が変更されます。(私があなたがしようとしていることだと思いますが、これが間違っているかどうかを知らせてください。)
bstpierre 2010

1
私はあなたの質問から私の回答を得ました:)
Kolob Canyon

回答:


195

これを試して現在のシェルをリロードしてください:

source ~/.profile

1
代替ソリューションはありますか?使用しているのでsource、誰かが同じよう変数代入を使用している場合、コマンドは、最悪の場合には、そのファイルをスクリプトとして...実行するMyVar="$foo$MyVar"彼らのbash_profileに、そしてsource ~/.profile最終的な結果を与えるだろうMyVar="$foo$MyVar$MyVar"、したがって、$MyVarその後の誤った値を持っているでしょう。(悪い習慣に関係なく、代わりの解決策を求めてください)
Jeffrey Mvutu Mabilama 2018年


5

〜/ .profileファイルをリロード/ソースしようとすると、いくつかの問題が発生します。[これはUbuntu linuxを指します-場合によっては、コマンドの詳細が異なる場合があります]

  1. これをターミナルまたはスクリプトで直接実行していますか?
  2. これをスクリプトでどのように実行しますか?

広告。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グッドラック!


4

bashスクリプトは別のサブシェルで実行されます。この作業を行うためには、この他のスクリプトも入手する必要があります。


他のスクリプトを "ソース化"することによって正確に何を意味するのか(まだこれまでに知らないまま)はわかりません。少し拡大してください。しかし、私は試しました:$。〜/ .profile $。/ etc / profileは成功しませんでした。どうもありがとうございます。
アミールRustamzadeh 2010

1
@amirrustan:スクリプトは、.profile次のようなファイルをソースに. $HOME/.profileする必要があります。また、スクリプトをソースから開始する必要があります。次のようなもの. /path/to/yourscript
追って通知があるまで一時停止。

1
@amirrustamは、superuser.com
questions

1

試してください:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.