Linuxと、私の知る限り、すべてのUnixシステムでは、ターミナルエミュレーターは、デフォルトで対話型の非ログインシェルを実行します。これは、bashの場合、開始されたシェルが次のようになることを意味します。
ログインシェルではないインタラクティブシェルが開始されると、bashは
/etc/bash.bashrc
からコマンドを読み取って実行します。 および~/.bashrc
、これらのファイルが存在する場合。これは、--norc
を使用することで禁止できます。 オプション。
--rcfile
fileオプションは、bashに/etc/bash.bashrc
ではなくファイルからコマンドを読み取って実行するように強制します および~/.bashrc
。
ログインシェルの場合:
bashが対話型ログインシェルとして、または
--login
を使用して非対話型シェルとして呼び出された場合 オプションの場合、最初にファイル/etc/profile
からコマンドを読み取って実行します。 、そのファイルが存在する場合。そのファイルを読み取った後、~/.bash_profile
を探します 、~/.bash_login
、および~/.profile
、この順序で、存在し、読み取り可能な最初のコマンドからコマンドを読み取って実行します。
--noprofile
この動作を禁止するために、シェルの起動時にオプションを使用できます。
ただし、OSXでは、デフォルトのターミナル(Terminal.app)で開始されたデフォルトのシェル(bash)は、実際には~/.bash_profile
をソースします。 または~.profile
つまり、ログインシェルのように機能します。
主な質問 :デフォルトのインタラクティブシェルがOSXのログインシェルであるのはなぜですか? OSXがこれを選択したのはなぜですか?これは、~/.bashrc
の変更について言及しているシェルベースのもののすべての手順/チュートリアルを意味します ~/.profile
の場合、OSXでは失敗します。その逆も同様です。 。それでも、Appleでは多くの非難を平準化することができますが、無能な開発者やばかげた開発者を雇うことはその1つではありません。おそらく、彼らにはこれには正当な理由があったので、なぜですか?
サブ質問:Terminal.appは実際にインタラクティブログインシェルを実行しますか、それともbashの動作を変更しましたか?これはTerminal.appに固有ですか、それともターミナルエミュレータから独立していますか?
承認された回答:
想定される方法 動作は、シェルプロンプトが表示された時点で、両方の.profile
および.bashrc
実行されました。その時点に到達する方法の具体的な詳細は二次的な関連性がありますが、いずれかのファイルがまったく実行されなかった場合は、設定が不完全なシェルになります。
Linux(およびその他のXベースのシステム)上のターミナルエミュレータが必要ない理由 .profile
を実行するには Xにログインしたときに、通常はすでに実行されているということです。.profile
の設定 ログイン時に一度実行される限り(たとえば、.Xsession
を介して)、サブプロセスで継承できる種類のものであると想定されています。 )、それ以降のサブシェルは再実行する必要はありません。
AlanShutkoによってリンクされたDebianwikiページが説明しているように:
「なぜ
.bashrc
なのか.bash_profile
とは別のファイル 、 それから?これは主に歴史的な理由で行われ、マシンは今日のワークステーションに比べて非常に低速でした。.profile
のコマンドを処理する または.bash_profile
特に、外部コマンド(pre-bash)によって多くの作業を実行する必要があるマシンでは、かなり長い時間がかかる可能性があります。そのため、子プロセスに渡すことができる環境変数を作成する難しい初期設定コマンドは、.bash_profile
に配置されます。 。継承されない一時的な設定とエイリアスは、.bashrc
に配置されます。 すべてのサブシェルで再読み取りできるようにします。」
OSXにも同じルールが適用されますが、1つだけ例外があります。OSXGUIは.profile
を実行しません。 ログインすると、明らかにグローバル設定をロードする独自の方法があるためです。ただし、これは、OSXのターミナルエミュレータが実行することを意味します。 .profile
を実行する必要があります (シェルにログインシェルであることを通知することで)、そうしないと、シェルが機能しなくなる可能性があります。
さて、他のほとんどのシェルでは共有されていない、bashの一種のばかげた特徴は、.bashrc
が自動的に実行されないことです。 ログインシェルとして開始された場合。そのための標準的な回避策は、.bash_profile
に次のコマンドのようなものを含めることです。 :
[[ -e ~/.profile ]] && source ~/.profile # load generic profile settings
[[ -e ~/.bashrc ]] && source ~/.bashrc # load aliases etc.
または、.bash_profile
がない可能性があります まったく、そして一般的な.profile
にいくつかのbash固有のコードを含めるだけです .bashrc
を実行するファイル 必要に応じて。
OSXのデフォルトの.bash_profile
の場合 または.profile
しません これを行うと、それは間違いなくバグです。いずれの場合も、適切な回避策は、これらの行を.bash_profile
に追加することです。 。
編集: strugeeが指摘しているように、OSXのデフォルトシェルはtcshでしたが、その動作はこの点で非常に賢明です。インタラクティブログインシェルとして実行すると、tcshは両方の.profile
を自動的に読み取ります。 および .tcshrc
/ .cshrc
、したがって、.bash_profile
のような回避策は必要ありません。 上に示したトリック。
これに基づいて、OSXが適切なデフォルトの.bash_profile
を提供できないことを99%確信しています。 なぜなら、彼らがtcshからbashに切り替えたとき、Appleの人々はbashの起動動作におけるこの小さな疣贅に単に気づかなかったからです。 tcshを使用すると、そのようなトリックは必要ありませんでした。OSXターミナルエミュレータからログインシェルとしてtcshを起動すると、Just Plain Worksが機能し、そのような問題がなくても正しいことを実行できます。