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


175

問題

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. この場合、私の端末は非ログインシェルでしたか?
  3. もしそうなら、端末の後にsuを実行してパスワードを入力したときに、上記のエクスポートを設定したプロファイルが実行されなかったのはなぜですか?

回答:


224

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

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

ターミナルを開くと、ターミナルは(非ログイン)対話モードでbashを開始します~/.bashrc。つまり、sourceになります。

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

ソーシング~/.bash_profileからは、~/.bashrc間違ったソリューションです。それは逆になるはずです。~/.bash_profileソースする必要があります~/.bashrc

なぜそうなのかの歴史を含む、より完全な説明については、DotFilesを参照してください。

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


6
Ubuntu 12のサイドバーからターミナルを開くと、〜/ .profileファイルがロードされないことがわかりました。
jcollum

3
@jcollumいいね。.profileログイン時にのみソースする必要があります。
geirha13年

2
ああ、ターミナルを開くことはログインすることと同じではありません...私はターミナルにログインすることを考えていました
jcollum

2
心に留めておい.profileた場合はbashによって無視される.bash_profile存在。こちら と私のman bash詳細をご覧ください。
テルドン

3
@terdon、はい。ただし、グラフィカルにログインする場合、bashは関係ないため、に進み.profileます。
ガイラ14年

48

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

shopt login_shell

応答がoffログインシェルを実行していない場合。

Bashがさまざまな構成ファイルを読み取る(または読み取らない)方法については、Bashマニュアルの呼び出しセクションをお読みください。

からの抜粋man bash

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

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


9
shotp login_shellコマンドをありがとう。驚くばかり!!
ビリアート

27

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

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


1
この設定を有効にすることの欠点は何ですか?
chrish

2
@chrisは、多くの場合、必要なコードよりも少し多くコードをロードしています。あなた~/.bash_profileが本当に迅速に評価するかどうかはおそらく問題ではありません。チェックする良いことは、通常非常にコストのかかる他のプロセスへの呼び出しを追い出すことです。
-vaab

14

ターミナルを開くか実行するとsu、シェルはログインシェルとしてではなく、通常のインタラクティブシェルとして実行されます。だからそれは読む~/.bashrcが、そうではない~/.bash_profile。あなたは実行することができますsu-l、それはログインシェルとしてシェルを実行させるためのオプション。

GUIを使用している場合、シェルは通常ログインシェルとして実行されることはないため、通常はすべてのyoutを入れても問題ありません~/.bashrc


1
それは私がやったことであり、うまくいきましたが、下の男が言っていることを確認して、bashrcに入れて代わりにプロファイルに置くことは悪い考えだと彼は示唆しています。....どちらの方法でも機能します、どうもありがとう。
-Viriato

4

TL; DR

古典的な推奨されるubuntuセットアップで~/.bash_profileは、特定の状況でのみ評価されます。そして、それは理にかなっています。

あなたのものを入れて~/.bashrc、それは毎回評価されます。

わかりました、なぜこれが理にかなっていますか?

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

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

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

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

わかりましたので、私のものをどこに置くのですか?

それはかなり複雑です、完全な物語はここにあります。しかし、ここでは、ubuntuユーザーにとって非常に一般的なランダウンがあります。それを考慮して:

  • bashシェルを使用します
  • あなたが持っている~/.bash_profileとフォロー推奨の読み込みに追加する~/.bashrcあなたの中を~/.bash_profile少なくとも取得するように呼び出しmecanismは何でも評価されます一つのファイルを

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

  • 〜/ .bashrcすべての場合評価されますが、推奨事項に従う場合)

    以下のための高速評価ご使用の環境変数とコード のユーザーのみbashの専用コマンドラインの使用方法(インスタンスの別名)。バシズムは大歓迎です。

    次の場合に自身にロードされます。

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

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

  • 〜/ .bash_profile特定の機会にのみ評価されます)

    以下のためのスロー評価ご使用の環境変数とコードのユーザーのみのコンソールセッションのプロセス。 バシズムは大歓迎です。ロードされます:

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

    以下のためのスロー評価環境変数として無bashism あなたのための専用のユーザーとすべてのグラフィカル・セッションのプロセス。グラフィカルUIでのログイン時にロードされます。


bashがプロファイルファイルをロードする.profile場合.bash_profile、存在しない場合はロードされます。
ムル

明確な説明をありがとうございます。それは私のような初心者を助けます。Mac Mojaveでは、変数を〜/ .bashrcに入れてソースを実行した場合、envenv変数が設定されていないことがわかります(iTermを閉じて、再度開いてみました)。しかし、Androidスタジオや他のアプリをインストールしたとき、それらのすべてのenv変数はに設定されていました/.bash_profile。それで私が/.bash_profileそれに追加したとき、魅力のように働きました。何故ですか?
sofs1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.