web-dev-qa-db-ja.com

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

私はシェルスクリプトをbashするのが初めてで、難題に遭遇しました。私は単に「.profile」ファイルをリロードできることを知っています:

. .profile

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

ありがとう

114

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

source ~/.profile
173
kofriel

これを試して:

cd 
source .bash_profile
9
girardengo

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

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

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

広告。 1)

これをターミナルで直接実行すると、サブシェルは作成されません。したがって、次の2つのコマンドのいずれかを使用できます。

source ~/.bash_profile

または

. ~/.bash_profile

どちらの場合でも、これにより.profileファイルの内容で環境が更新されます。

広告2)次のいずれかの方法で、bashスクリプトを開始できます。

sh myscript.sh 

または

. myscript.sh

最初の場合、これはシステムの環境変数に影響を与えないサブシェルを作成し、サブシェルプロセスにのみ表示されます。サブシェルコマンドの終了後、エクスポートなどは適用されません。これはISよくある間違いであり、多くの開発者が多くの時間を失うことになります。

スクリプトに適用された変更をグローバル環境に有効にするには、スクリプトを実行する必要があります

.myscript.sh

コマンド。

スクリプトがサブシェルで実行されないようにするために、この関数を使用できます。 (また、Ubuntu Shellの例です)

#/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グッドラック!

2
twboc

試してください:

#!/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 "$@"
1
tilo