質問: bash /ダッシュ、インタラクティブ/非インタラクティブ、ログイン/非ログインのすべての組み合わせがそれを取得するように、環境変数をどこにエクスポートする必要がありますか? 質問の動機は次のとおりです。unityデスクトップでubuntu12.04 lts2を使用しています。 .bashrcファイルで、path変数にいくつかのディレクトリを追加し、java_homeなどのいくつかの環境変数を定義します。ターミナル(bash、デフォルトのシェルを実行)からアプリケーションを起動すると、これはうまく機能しますが、unityランチャーを使用するいくつかのショートカットでは、#!/ bin/shを使用するように定義されているように見えるアプリを実行します。は/ bin/dashのエイリアスであり、〜/ .bashrcまたは〜/ .profileのいずれのコンテンツも取得しません。これらのショートカットをすべて変更して、/ bin/shの代わりに/ bin/bashを使用して、.bashrcの変更を強制的に取得できると思いますが、それは本当にハッキーなようです。ubuntu12.04(デフォルト)が/ bin/shを/ bin/dashにエイリアスし、デフォルトのシェルが/ bin/bashであるとすると、pathを変更し、必要に応じて環境変数を定義できる場所が1つあります。これらの状況のallの下に存在すること: ログインしていないbashシェルを作成するときはいつでも(ターミナルを1つに使用して) ログインbashシェルを作成するときはいつでも(たとえば、sshを介してリモートでログインする) unityアプリケーションランチャーを使用するときはいつでも(ランチャーが/ bin/shを使用する場合)。 cronジョブが実行されるときはいつでも(/ etc/crontabのshell =/bin/shの場合)。 私が正しく理解していれば、私はそれを推測しています: (1)/(2)はbashであり、(3)/(4)はダッシュであるため、(1)/(2)と(3)/(4)は異なります。 (1)と(2)は、bashがロードすることを選択するファイルが、ログインシェルであるかどうかによって異なるため異なります。 (3)と(4)は異なります。なぜなら、(3)はある時点で来るからです後ログインしました(したがって、〜/ .profileはその親プロセスの1つによって供給されますが、 (4)私がログインしているときのある時点でnotになります。したがって、〜/ .profileは読み取られません。 (シェルがインタラクティブであるかどうかなど、他の要因も重要であるとしても驚かないので、おそらく私が予想していなかった組み合わせがもっとあるでしょう...私の質問が改善されてうれしいです。 「その場合。)ある時点で、シェルに依存しない方法(または少なくともダッシュ/ bash互換の方法)で環境変数を変更する方法/場所を説明する何らかのガイドを誰かが作成したに違いないと思います...私はただできます 'そのようなガイドを見つけるための適切な検索用語を見つけているようです。ソリューションまたはソリューションへのポインタは大歓迎です!更新しました: 明確化:これは12.04のインストールプロセスによって作成されたデフォルトのubuntuユーザーであるため、特別なことは何もありません。 does〜/ .profile(明示的に〜/ .bashrcをソースする)があり、存在する〜/ .bash *ファイルは.bashrc、.bash_history、および.bash_logout ...だけです。 .bash_profileはありません。 スコープの強調:デフォルトのインタラクティブシェル(bash)と/ bin/sh(ダッシュと呼ばれる)を使用するスクリプト以外のシェルはあまり気にしないので、これを何かで複雑にする必要はありません- extra tcsh/ksh/zsh/etcの場合。サポート。
回答: シェルの呼び出しは少し複雑です。 bashとdashのmanページには、これに関するinvocationセクションがあります。要約すると、彼らは言います(manページに詳細があります、あなたはそれを読むべきです):when bash is | it reads -------------------------------|---------- login shell | /etc/profile and then the first of ~/.bash_profile, ~/.bash_login or ~/.profile that exists. | interactive non-login shell | /etc/bash.bashrc then ~/.bashrc | non-interactive shell | the contents of $bash_env (if it exists) | interactive (as "sh") | the contents of $env (if it exists) -when dash is | it reads -------------------------------|--------- login shell | /etc/profile then .profile | interactive shell | the contents of env (it it exists, can be set in .profile as well as in initial environment) 私は他のシェルを使用したことがないので、他のシェルについては知りません。最善の策は、共通の場所のスクリプトを指すようにいくつかの環境変数を設定し、カバーされていないいくつかのケースで(適切な場合は)手動でそれを調達することです。