bash_profileまたはbashrcの環境変数?

Apr 05 2012

私はこの質問を見つけました[ブログ] :. bashrcと.bash_profileの違いは非常に便利ですが、最も投票された回答(ちなみに非常に良い)を見た後、さらに質問があります。最も投票された正解の終わりに向かって、私は次のようにステートメントを見る:

環境変数の定義を〜/ .bashrcに配置するか、常にターミナルでログインシェルを起動するための推奨事項が、あちこちで見られる場合があることに注意してください。どちらも悪い考えです。

  1. なぜそれは悪い考えですか(私は戦おうとはしていません、私はただ理解したいだけです)?

  2. 環境変数を設定してPATH(JAVA_HOMEなど)に追加したい場合は、エクスポートエントリを配置するのに最適な場所になりますか?中〜/ .bash_profileファイルまたは〜/ .bashrcの

  3. 質問番号2の答えが〜/ .bash_profileの場合、さらに2つの質問があります。

    3.1。〜/ .bashrcの下に何を置きますか?エイリアスのみ?

    3.2。ログインしていないシェルでは、〜/ .bash_profileが「ピックアップ」されていないと思います。JAVA_HOMEエントリのエクスポートがbash_profileにある場合、javacおよびjavaコマンドを実行できますか?PATHでそれらを見つけますか?一部の投稿やフォーラムでJAVA_HOMEなどを〜/ .bashrcに設定することを提案しているのはそのためですか?

    前もって感謝します。

回答

28 geekosaur Apr 06 2012 at 04:36

現代のシステムでは、それが重要な場合に遭遇することは特に一般的ではありませんが、それは起こります。(具体的には、シェルの操作を使用している場合vimなど:r !command、またはインライン!<motion>command形。)

〜/ .bashrcの下に何を置きますか?エイリアスのみ?

~/.bashrcサブシェルによって自動的に継承されないものを入れます。これは、ほとんどの場合、エイリアスと関数を意味しますが、シェルの外部に表示したくない変数設定がある場合もあります(これは非常にまれです)。それらはどういうわけかエクスポートされるべきであると主張することができますが、さまざまな実験的試みは、環境内にそれらを隠そうとすることで互換性の問題に遭遇し、ほとんど放棄されました。

環境変数を設定してPATH(JAVA_HOMEなど)に追加したい場合は、エクスポートエントリを配置するのに最適な場所になりますか?〜/ .bash_profileまたは〜/ .bashrcで?

環境設定を入れ~/.bash_profileて、適切な初期設定が与えられるようにします。これらをオーバーライドしたい場合があります(多くの場合、これはMatlabやCadenceなどの複雑な環境で実行されます)。環境設定をに入れると、~/.bashrcそれらの環境内から実行されたシェルは環境のカスタマイズを失い、結果として物事が正しく機能しない可能性があります。これは、modules、virtualenv、rvmなどのパッケージを使用して複数の開発環境を管理する場合にも当てはまります。設定を入れると、~/.bashrcエディター内から必要な環境を実行できなくなりますが、代わりにシステムのデフォルトに強制されます。

ログインしていないシェルでは、〜/ .bash_profileが「ピックアップ」されていないと思います。

これは正しいです; 通常、最初のシェルをログインシェルにし、そのシェルの下で開始されたシェルをログインシェルにしないようにします。初期シェルがログインシェルでない場合、デフォルトPATHまたはその他のさまざまな設定(JAVA_HOME例を含む)はありません。

ディスプレイマネージャから起動されるほとんどのデスクトップ環境(つまり、グラフィカルログインの大部分)は、デスクトップ全体のログイン環境をセットアップしないため、ターミナルで初期シェルをログインシェルとして実行する必要があります。これは多くの問題を引き起こします(特にPATH、パネルが端末ではなく、実行されていないため、パネルなどから実行されるプログラムで使用できるものが適切に設定されていないこと~/.bash_profile)が、常に可能であるとは限らないことを考えると、妥当な妥協案です。~/.bash_profile内容に応じて、ディスプレイマネージャによって開始されたセッションの開始時に非対話型環境で正常に実行されます。~/.bashrcログインシェルを構成する代わりに、環境設定を配置することが推奨される場合があります。上述したように、この作品は長い間、あなたはその環境をオーバーライドする必要はありませんようとして、あなたは一度奇妙な破損の原因とやるそうする必要性を。

私は最近、OS Xでこのような問題を診断するのを手伝いました。この問題では、設定を行ったユーザーが~/.bashrc後で使用rvmを開始し、perlbrewで奇妙な動作が見られました。これは、2人が設定した環境が~/.bashrc内部のエディターによって「元に戻された」ためですsudo(OS Xでは、Linuxとは異なり、ルートシェルによって実行される$HOMEようにユーザーを伝播します~/.bashrc)。これらの環境を使用する前は、問題はありませんでした。それらを使い始めると、彼らは彼らの設定の予期せぬ喪失に当惑しました。

2 bubu Apr 06 2012 at 04:28

正直なところ、教祖が言わなければならなかったにもかかわらず、最近はほとんど違いがありません。

この背後にある問題は、最近ではログインシェルではなくグラフィカルにログインすることです。これまで、UNIXユーザーは、ログイン直後にサーバーで何が起こっているかについての短いレポートを見たいと思っていました。その後、コマンドラインでXを起動します。これらのレポートは、生成に時間がかかることがよくあります(たとえば、10〜20秒)。そして、例えばxtermを起動するときに、同じものを見たくありません。したがって、違い。

今日では、区別は重要ではないと思います。最近、bash_profileでbashrcを入手した場合、誰もあなたを責めることはできないと思います。

これはmacosxには適用されないことに注意してください(開始されたすべてのterminal.appはログインシェルです)

1 hute37 Nov 20 2015 at 10:14

さて、「グラフィカルログイン」については、使用する* DMによって異なります...

GDM(Gnome 3.18)では、次のようになります。

/ etc / gdm / Xsession

#!/bin/sh   <= *important*

...

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

したがって、〜/ .profileは、/ bin / bashではなく/ bin / shを使用してログイン時に取得されます。

2つのケースがあります

  1. / bin / sh/ bin / bashにリンクされていますが、「POSIX / Bourne」モードで実行されます
  2. / bin / sh/ bin / dash(debian / ubuntu)です。最速ですが機能が少ない(ShellShockサポート;)

したがって、/ bin / shプロファイルは〜/ .profileであり、〜/ .bash_profileではなく〜/ .zprofile

このファイルは、パスや環境変数などの「シェルにとらわれない」設定に使用する必要があります。

NOのログインのみのユーザーとの対話のための実行可能プログラムはしないが、ここでなければならない(メールチェック、占い、など...)

〜/。*rcは、「対話型」セッション(たとえばエイリアス...)のみを対象としています。

インタラクティブログインシェルのbashとzshには違いがあります

bashは.bash_profileのみをソースし、zshは次の順序でソースします。

  1. 〜/ .zprofile
  2. 〜/ .zshrc
  3. 〜/ zlogin(ここでは〜/ .zshrcで定義されたエイリアスが利用可能です。「インタラクティブ」+「ログイン」シェルの場合

〜/ .bash_profileを実行する正しい方法は、ここで回答されました。

.bashrcと.bash_profileの違い

if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

テスト(およびプロファイリング)を有効にするには、これを使用できます

〜/ .bash_profile:

#!/bin/bash

# ------------------------------------------------
export _DOT_BASH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# ------------------------------------------------
export _DOT_BASH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

〜/ .zprofile:

#!/bin/zsh

# ------------------------------------------------
export _DOT_ZSH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

# no need to source, zsh already handle ~/.zshrc

###case "$-" in *i*) if [ -r ~/.zshrc ]; then . ~/.zshrc; fi;; esac

# ------------------------------------------------
export _DOT_ZSH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

次に、テストします。

chsh -s /bin/bash

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env


chsh -s /bin/zsh

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env

したがって、RVM / virtualenvは〜/ .profile、IMHOに配置する必要があります

しかし、これは機能しません時々 ...

たとえば、virualenvwrapperは、Xsessionを実行しているシェルが「元の」bash(BASH_VERSIONのエクスポート)である場合にのみ機能します。

あなたが上にある場合はダッシュシステム、環境変数とパスの設定作業が、virualenvwrapperスクリプトはPOSIXに準拠していないため、関数定義がない作業を行います。

スクリプトはエラーを出しませんが、「workon」定義なしで終了します。

したがって、Xから直接開始されたクライアントからの正しいPython実行を有効にするために、〜/ .profileで手元の環境を設定できます。

export VIRTUAL_ENV="/home/mike/var/virtualenvs/myvirtualenv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME

https://gist.github.com/datagrok/2199506

https://www.bountysource.com/issues/9061991-setting-up-your-computer-virtualenvwrapper-linux-all

しかし、virualenvwrapperには、2つの選択肢があります。

  1. 端末がログインシェルとして機能する場合は、〜/ .bash_profileまたは〜/ .zprofile(または〜/ .zlogin)でソースします
  2. スクリプトを〜/ .bashrcまたは〜/ zshrcに含めます

つまり、Xクライアント(たとえばemacs)は、グラフィカルシェルからではなく、ターミナルシェルから起動する必要があります。

「私は満足を得ることができません...」