私はこの質問を見つけました[ブログ]: 。bashrcと.bash_profileの違い 非常に便利ですが、最も投票された回答(ちなみに非常に良い)を見た後、さらに質問があります。最も投票された正しい答えの終わりに向かって、私は次のように述べています:
環境変数の定義を〜/ .bashrcに置くか、常にターミナルでログインシェルを起動するかの推奨がこことそこにあることに注意してください。どちらも悪い考えです。
なぜそれが悪い考えなのですか(私は戦うつもりはありません。ただ理解したいだけです)。
環境変数を設定し、それをPATHに追加する場合(たとえば、Java_HOME)、エクスポートエントリを配置するのに最適な場所はどこですか? 〜/ .bash_profileまたは〜/ .bashrc?
質問番号2の答えが〜/ .bash_profileの場合、さらに2つの質問があります。
3.1。 〜/ .bashrcの下に何を置きますか?エイリアスだけですか?
3.2。非ログインシェルでは、〜/ .bash_profileが「選択」されていないようです。 Java_HOMEエントリのエクスポートがbash_profileにあった場合、javac&Javaコマンド? PATHでそれらを見つけますか?それが、いくつかの投稿やフォーラムがJava_HOMEなどを〜/ .bashrcに設定することを提案する理由ですか?
前もって感謝します。
最近のシステムでは、重要なケースに遭遇することは特に一般的ではありませんが、それは起こります。 (特に、:r !command
やインライン!<motion>command
フォームなどのvim
でシェル操作を使用する場合。)
〜/ .bashrcの下に何を入れますか?エイリアスだけですか?
サブシェルに自動的に継承されないものを~/.bashrc
に入れます。これは、ほとんどの場合、エイリアスと関数を意味しますが、シェルの外に表示したくない変数設定がある場合があります(これは非常にまれです)。どういうわけかそれらをエクスポートする必要があると主張することができますが、さまざまな実験的な試みが環境内でそれらを非表示にしようとすると互換性の問題に遭遇し、ほとんど放棄されました。
環境変数を設定し、それをPATHに追加する場合(たとえば、Java_HOME)、エクスポートエントリを配置するのに最適な場所はどこですか? 〜/ .bash_profileまたは〜/ .bashrcにありますか?
環境設定を~/.bash_profile
に入れて、適切な初期設定が与えられるようにします。これらをオーバーライドしたい場合があります(多くの場合、これはMatlabやCadenceなどの複雑な環境で行われます)。環境設定を~/.bashrc
に配置すると、それらの環境内から実行されたシェルは環境のカスタマイズを失い、結果として正常に機能しない可能性があります。これは、 modules 、 virtualenv 、 rvm などのパッケージを使用して複数の開発環境を管理する場合にも当てはまります。設定を~/.bashrc
に置くと、エディター内から目的の環境を実行できなくなり、代わりにシステムのデフォルトに強制されます。
非ログインシェルでは、〜/ .bash_profileが「選択」されていないようです。
これは正しいです;通常、最初のシェルをログインシェルにして、そのシェルの下で起動したすべてのシェルがログインシェルにならないようにします。最初のシェルがログインシェルでない場合、デフォルトのPATH
やその他のさまざまな設定(Java_HOME
の例を含む)はありません。
ディスプレイマネージャーから起動されたほとんどのデスクトップ環境(つまり、グラフィカルログインの大部分)はデスクトップ全体のログイン環境を設定しないため、ターミナルで初期シェルをログインシェルとして実行する必要があります。これはいくつかの問題を引き起こします(特に、パネルが端末ではなく~/.bash_profile
を実行していないため、パネルなどから実行されるプログラムで使用できるPATH
などが正しく設定されていません)が、妥当な妥協案です。内容によっては、ディスプレイマネージャーによって開始されたセッションの開始時に、非インタラクティブ環境で~/.bash_profile
を正常に実行できるとは限りません。ログインシェルを設定する代わりに、環境設定を~/.bashrc
に配置することが推奨される場合があります。上で説明したように、これはその環境をオーバーライドする必要がない限り機能し、doを実行する必要があると奇妙な破損を引き起こします。
私は最近、OS Xでこのような問題を診断するのを手伝いました。~/.bashrc
に設定を配置し、その後rvm
を使用し始めたユーザーが perlbrew を使用すると、2つの環境によって設定された環境が奇妙な動作をするようになりましたエディター内の~/.bashrc
とSudo
によって「取り消されました」(OS Xでは、Linuxとは異なり、ユーザーの$HOME
を伝搬して、~/.bashrc
がルートシェルによって実行されるようにします)。これらの環境を使用する前は、問題はありませんでした。それらの使用を開始すると、設定が予期せず失われることに戸惑いました。
正直なところ、グルが言っていたにもかかわらず、最近はほとんど違いがありません。
この背後にある問題は、現在、ログインシェルではなくグラフィカルにログインしていることです。以前は、UNIXユーザーはログイン直後にサーバーで何が起こっているかについての短いレポートを見たいと思っていました。次に、コマンドラインからXを起動します。これらのレポートは、生成に時間がかかることがよくあります(例:10〜20秒)。そして、私たちは私たちが開始したときに同じことを見たくありません。 xterm。したがって、違い。
最近では、その区別は重要ではないと思います。私は最近、bash_profileでbashrcを入手した場合、誰もあなたを責めることはできないと思います。
これはmacos xには適用されないことに注意してください(開始されたすべてのterminal.appはログインシェルです)
さて、「グラフィカルログイン」については、使用する* 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/shではなく/ bin/bashを使用してログイン時にソースを取得します
2つのケースがあります
したがって、/ bin/shプロファイルは〜/ .profileであり、〜/ .bash_profile、〜/ .zprofileではありません
このファイルは、パスや環境変数などの "Shell agnostic"設定に使用する必要があります。
[〜#〜] no [〜#〜]ログインのみのユーザー操作用の実行可能プログラムはここにあるはずです(メールチェック、フォーチュンなど...)
〜/.* rcは、「インタラクティブ」セッション(エイリアスなど)のみを対象としています。
対話型loginシェルのbashとzshには違いがあります
bashソースは.bash_profileのみですが、zshソースは次の順序です。
正しい方法〜/ .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に移動する必要があります。
しかし、これは機能しない、ときどき...
たとえば、virualenvwrapperは、Xsessionを実行するシェルが「元の」bashである場合にのみ機能します(BASH_VERSIONをエクスポート)
dashシステムを使用している場合、環境変数とパス設定は機能しますが、virualenvwrapper関数定義は機能しません。 POSIXに準拠していません。
スクリプトはエラーを出しませんが、 "workon"定義なしで終了します。
したがって、手元の環境を〜/ .profileで設定して、正しいpython Xから直接開始されたクライアントからの実行を有効にすることができます。
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つの選択肢があります。
つまり、Xクライアント(emacsなど)は、グラフィカルシェルからではなく、ターミナルシェルから起動する必要があります。
「満足感が出ない…」