web-dev-qa-db-ja.com

ターミナルを開くときに〜/ .bash_profileが取得されないのはなぜですか?

問題

Ubuntu 11.04の仮想マシンがあり、Java開発環境をセットアップしたかった。私は次のようにしました

  1. Sudo apt-get install openjdk-6-jdk
  2. 次のエントリを〜/ .bash_profileに追加しました

    export Java_HOME=/usr/lib/jvm/Java-6-openjdk
    
    export PATH=$PATH:$Java_HOME/bin
    
  3. 変更を保存して終了

  4. ターミナルを再度開き、次を入力します

    echo $Java_HOME   (blank)
    echo $PATH        (displayed, but not the Java_HOME value)
    
  5. Java_HOMEのエクスポートとPATHへの追加が行われなかった場合など、何も起こりませんでした。

解決

〜/ .bashrcに移動し、次のエントリをファイルの最後に追加する必要がありました

#Source bash_profile to set Java_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

ご質問

  1. なぜ私はそれをしなければならなかったのですか? bashrcの前に、bash_profile、bash_login、またはこれらの2つの不在のプロファイルが最初に実行されると考えました。
  2. この場合、私の端末はnon-login shellでしたか?
  3. もしそうなら、なぜ端末の後にsuを実行してパスワードを入力したときに、上記のエクスポートを設定したプロファイルを実行しなかったのですか?
175
Viriato

~/.bash_profileは、対話型ログインモードで起動した場合にのみbashから取得されます。これは通常、コンソールでログインするときのみです(Ctrl+Alt+F1..F6)、またはsshを介して接続します。

グラフィカルにログインすると、~/.profileは、gnome-session(または使用しているデスクトップ環境)を起動するスクリプトによって具体的に取得されます。したがって、グラフィカルにログインしたときに、~/.bash_profileはまったくソースされません。

ターミナルを開くと、ターミナルは(非ログイン)インタラクティブモードでbashを開始します。つまり、~/.bashrcをソースします。

これらの環境変数を配置する適切な場所は~/.profileであり、次回ログインしたときに効果が明らかになります。

~/.bash_profileから~/.bashrcを調達するのは間違った解決策です。それは逆になるはずです。 ~/.bash_profile~/.bashrcをソースする必要があります。

DotFiles を参照して、そのような理由の歴史を含む、より詳細な説明を確認してください。

(補足として、aptを介してopenjdkをインストールする場合、シンボリックリンクはパッケージで設定する必要があります。したがって、Java_HOMEを設定したり、PATHを変更したりする必要はありません。

222
geirha

Bashシェルがログインシェルとして起動されているかどうかを確認するには、次を実行します。

shopt login_Shell

返信がoffの場合、ログインシェルを実行していません。

Bashマニュアルのinvocationセクションを読んで、Bashがさまざまな構成ファイルを読み取る(または読み取らない)方法を確認してください。

man bashからの抜粋:

Bashが対話型ログインシェルとして、または--loginオプション付きの非対話型シェルとして呼び出されると、bashはまず、ファイル/etc/profileからコマンドを読み取り、実行します(そのファイルが存在する場合)。そのファイルを読み取った後、~/.bash_profile~/.bash_login、および~/.profileをこの順序で探し、存在し、読み取り可能な最初のコマンドからコマンドを読み取り、実行します。

一方、suはデフォルトではログインシェルを起動しません。--loginオプションを使用して、ログインシェルを起動するように指示する必要があります。

46
lgarzo

プロファイル設定を編集することにより、ログインシェル(つまりbash -l)を使用するようにgnome-terminalのデフォルトを変更できることに言及する価値があると思います。

[編集]-> [プロファイル設定]-> [タイトルとコマンド]タブに移動して、[コマンドをログインシェルとして実行]オプションをチェックします。

26
kisoku

ターミナルを開くかsuを実行すると、シェルはログインシェルとしてではなく、通常のインタラクティブシェルとして実行されます。したがって、~/.bashrcは読み取りますが、~/.bash_profileは読み取りません。 -lオプションを指定してsuを実行すると、シェルをログインシェルとして実行できます。

GUIで作業しているとき、シェルは通常ログインシェルとして実行されることはないので、通常はすべてのyoutを~/.bashrcに入れても問題ありません。

14
Florian Diesch

TL; DR

古典的な推奨Ubuntu設定では、~/.bash_profileは特定の場合にのみ評価されます。そして、それは理にかなっています。

自分のものを~/.bashrcに入れると、毎回評価されます。

OK、理解したい、なぜこれが理にかなっているのか?

何が起こっているかを理解するためのキーポイント:

  • すべてのprocesses Linuxではhaveおよびses environment変数
  • 環境変数はinheritedです
  • したがって、それらを設定する父親に1回すべてのプロセスで十分です(特に、計算時間が必要な場合)。
  • すべてのプロセスの父は通常、デバイスでlog inの後に起動されます(資格情報を提供します)。
  • コンピューターにログインしたときに一度だけやりたいことがあるかもしれません(たとえば、新しいメールをチェックしてください...)。

したがって、「ログイン」時間は通常次のとおりです。

  • コンソールモードでは、(Ctrl-Alt F1を使用して)ログインするとき、またはsshを介してログインすると、シェルがすべてのプロセスの親になるため、~/.bash_profileがロードされます。
  • グラフィックモードでは、セッションを開いたときに、最初のプロセス(gnome-sessionクラシックubuntuの場合)が読み取りを担当します
    .profile

OK、だから私のものを置く場所?

詳細はこちら という、かなり複雑なものです。しかし、ここでは、ubuntuユーザーにとって非常に一般的なランダウンがあります。それを考慮して:

  • bash Shellを使用します。
  • ~/.bash_profileがあり、推奨に従って~/.bashrc~/.bash_profileの読み込みを追加して、少なくとも取得する1つのファイル呼び出しメカニズムとは何でも評価された

これは、物を置く場所の簡単な提案です。

  • 〜/ .bashrc(推奨事項に従う場合は、すべての機会で評価を取得)

    fast-evaluation環境変数とser-onlyおよびbash-onlyのコードの場合(エイリアスなど)。 bashismは大歓迎です。

    それは次のときにロードされます:

    • グラフィカルセッションで新しいシェルウィンドウ/ペインを作成します。
    • bashの呼び出し
    • screen新しいペインまたはタブ。 (tmuxではありません!)
    • チェックしないオプション「ログインシェルとしてコマンドを実行する」の場合、グラフィカルコンソールクライアントの任意のbashインスタンス(terminator/gnome-terminal...).

    また、以前の推奨事項のおかげで、他のすべての機会にロードされます。

  • 〜/ .bash_profile(取得特定の状況でのみ評価

    slow-evaluation環境変数とser-onlyおよびconsole-sessionプロセスのコード。 bashismは大歓迎です。ロードされます:

    • コンソールログイン(Ctrl-Alt F1)、
    • このマシンへのsshログイン、
    • tmux新しいペインまたはウィンドウ(デフォルト設定)、(screenではありません!)
    • bash -lの明示的な呼び出し、
    • グラフィカルコンソールクライアントの任意のbashインスタンス(terminator/gnome-terminal...)if ifオプション「コマンドをログインシェルとして実行」にチェックを付けます。
  • 〜/ .profile(グラフィカルセッションでのみ評価されます)

    slow-evaluation環境変数およびno-bashismの場合ser-onlyおよびすべてのgraphical-sessionプロセス。ログイン時にグラフィカルUIにロードされます。

4
vaab