bash_profileまたはbashrcの環境変数?
私はこの質問を見つけました[ブログ] :. 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に設定することを提案しているのはそのためですか?
前もって感謝します。
回答
現代のシステムでは、それが重要な場合に遭遇することは特に一般的ではありませんが、それは起こります。(具体的には、シェルの操作を使用している場合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
)。これらの環境を使用する前は、問題はありませんでした。それらを使い始めると、彼らは彼らの設定の予期せぬ喪失に当惑しました。
正直なところ、教祖が言わなければならなかったにもかかわらず、最近はほとんど違いがありません。
この背後にある問題は、最近ではログインシェルではなくグラフィカルにログインすることです。これまで、UNIXユーザーは、ログイン直後にサーバーで何が起こっているかについての短いレポートを見たいと思っていました。その後、コマンドラインでXを起動します。これらのレポートは、生成に時間がかかることがよくあります(たとえば、10〜20秒)。そして、例えばxtermを起動するときに、同じものを見たくありません。したがって、違い。
今日では、区別は重要ではないと思います。最近、bash_profileでbashrcを入手した場合、誰もあなたを責めることはできないと思います。
これはmacosxには適用されないことに注意してください(開始されたすべての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 / bashではなく/ bin / shを使用してログイン時に取得されます。
2つのケースがあります
- / bin / shは/ bin / bashにリンクされていますが、「POSIX / Bourne」モードで実行されます
- / bin / shは/ bin / dash(debian / ubuntu)です。最速ですが機能が少ない(ShellShockサポート;))
したがって、/ bin / shプロファイルは〜/ .profileであり、〜/ .bash_profileではなく〜/ .zprofile
このファイルは、パスや環境変数などの「シェルにとらわれない」設定に使用する必要があります。
NOのログインのみのユーザーとの対話のための実行可能プログラムはしないが、ここでなければならない(メールチェック、占い、など...)
〜/。*rcは、「対話型」セッション(たとえばエイリアス...)のみを対象としています。
インタラクティブログインシェルのbashとzshには違いがあります
bashは.bash_profileのみをソースし、zshは次の順序でソースします。
- 〜/ .zprofile
- 〜/ .zshrc
- 〜/ 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つの選択肢があります。
- 端末がログインシェルとして機能する場合は、〜/ .bash_profileまたは〜/ .zprofile(または〜/ .zlogin)でソースします
- スクリプトを〜/ .bashrcまたは〜/ zshrcに含めます
つまり、Xクライアント(たとえばemacs)は、グラフィカルシェルからではなく、ターミナルシェルから起動する必要があります。
「私は満足を得ることができません...」