GNU/Linux >> Linux の 問題 >  >> Linux

Osxログインシェルのインタラクティブシェルがデフォルトであるのはなぜですか?

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を実行する必要があります (シェルにログインシェルであることを通知することで)、そうしないと、シェルが機能しなくなる可能性があります。

関連:cronシェルを変更する方法(shからbash)?

さて、他のほとんどのシェルでは共有されていない、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が機能し、そのような問題がなくても正しいことを実行できます。


Linux
  1. ログインシェルと非ログインシェルの違いは?

  2. シェルがログイン/インタラクティブ/バッチであるかどうかを確認する方法は?

  3. Nullglobがデフォルトではないのはなぜですか?

  1. 「sudo-i」ログインシェルがヒアドキュメントのコマンド文字列引数を壊すのはなぜですか?

  2. Linuxの特定のTtynにログインした後、デフォルトのシェルを(永続的に)変更するにはどうすればよいですか?

  3. ユーザーのデフォルトのログイン シェルを表示する *nix コマンドは何ですか

  1. Linux でのデフォルト シェルの変更

  2. SSH ログインが遅いのはなぜですか?

  3. 「bin」ユーザーにログインシェルが必要なのはなぜですか?