**ログイン**シェルが**非ログイン**シェルよりも優れているのはなぜですか?


24

* nixシステムのドットファイルの基本的な理解があります。しかし、ログインシェルと非ログインシェルのこの違いについて、私はまだかなり混乱していますか?

多数の異なる回答(複数の重複を含む)は、すでに次の箇条書きに対処しています。

  • どのようにするために呼び出すログインまたは非ログインシェルを
  • ログインまたは非ログインシェルを検出する方法
  • どのようなファイルが起動によって消費される、ログインまたは非ログインシェル
  • man bash詳細については、ドキュメントを参照(例:)

答えが教えてくれなかったのは(そして、私もまだ混乱していることです):

  • 何がユースケースログインまたは非ログインシェルは?(たとえば、ほとんどの個人的な開発要件に合わせて設定zshrcするzshだけで十分であり、何vimrcをするほど単純ではないことがわかりますvim

  • (異なるスタートアップファイルとライフサイクルを消費する以外に)非ログインシェルでログインを使用する理由は何ですか?

回答:


15

ユーザーには、ホストごとに(最大で)1つのログインシェルが必要です。(おそらく、私は、ターミナルごとにホストごとに1つのログインシェルを言う必要があります-あなたは、同時に複数の端末を介してホストにログインしている場合、あなたは複数のログインシェルを持つことが予想されます。)これは、一般的に(常に?)になる最初のあなたが得るシェルログインすると(名前の由来)。そのため、このスキームでは、ログインごとに1回だけ実行するアクションと、新しい(対話型)シェルを起動するたびに実行するアクションを指定できます。

通常、ログイン後に実行する他のすべてのシェルはログインシェルの子孫(子の子の子…)であるため、ログインシェルから多くの設定(環境変数umaskなど)を継承します。そして、それに応じて、アイデアは、ログイン初期化ファイル(ということで.login.profile継承されている設定値を設定し、聞かせなければならない、など).bashrc(または任意の他使用)(でないものを扱うsetshopt非エクスポートされたシェル変数など)

もう1つの概念は、ログイン初期化ファイル(およびそれらのみ)が「重いリフティング」、つまりリソー​​スを集中的に使用するアクションを実行する必要があるということです。たとえば、ログインするたびにバックグラウンドで特定のプロセスを実行したい場合があります(ただし、それらの1つのコピー(インスタンス)のみ)。ログイン時にステータス情報(dfまたはなどwho)を表示することもできますが、新しいインタラクティブシェルを起動するたびに表示する必要はありません。特にインタラクティブな場合ログインするたびに実行したいプログラム/ダイアログ(つまり、ユーザーからの入力を要求するもの)。新しいシェルを起動するたびに実行したくないでしょう。極端な例として、20年前にSolarisが単一の非グラフィカル、非ウィンドウシェルにログインしました。(私はそれはそれ以来変更されたことを信じています。)それはの仕事はした.login.profile(または何でも)のようなコマンドを使用して、ウィンドウシステムを起動しますstartx。(これは、複数のウィンドウシステムが利用可能であったため、一部役に立ちました。ユーザーごとに異なる設定がありました。一部のユーザーは、さまざまな状況で異なるシステム.profileを使用し、「今日どのウィンドウシステムを使用しますか?」明らかに、新しいウィンドウを開いたり、タイプしたりするたびに実行したくないでしょうsh

bash エッジケース以外を使用してからずっと経ちます。(例えば、私はスクリプトを書く#!/bin/shので、いくつかのシステムでは、私のスクリプトがで実行、dashし、他人に彼らがで実行bashPOSIXモードで。年に数回、私は実行するcsh/ tcshそれが何かをどのように処理するかを見るために数分間、またはに質問に答えてください。)毎日複数のシェル(bashおよびなどzsh)を使用する場合、パターンは異なる場合があります。プライマリシェル(で定義されている/etc/passwd)がのbash場合、zshログインシェルを呼び出してから、それにzsh従属するインタラクティブな非ログインシェルを呼び出すことができます。おそらく、同じタイプの別のログインシェルに従属するログインシェルを持つことは避けてください。

ログインシェルと非ログインシェルの違いで述べたように、OS Xターミナルアプリケーションはログインシェルを実行するため、通常、一般的なユーザーは複数の「ログインシェル」を同時に実行します。これは私が上で説明したものとは多少異なるモデルであり、彼は彼に何を再考するようユーザに要求することができます.loginか、.profile(または何でも)ファイル。OS X開発者がこの設計決定の根拠を文書化したかどうかはわかりません。しかし、これが役立つ状況は想像できます。ログイン時に習慣的にいくつかのシェルウィンドウを開いたときがあり、それらを異なるテキストと背景色に設定して(画面にANSIエスケープシーケンスを書き込むことで)、どのウィンドウを追跡できるようにしました。ターミナルの色は、子供の子供には継承されないが、ウィンドウ内に保持されるものの例です。したがって、これは新しいターミナルウィンドウを起動するたびに実行したいことですが、新しい対話型シェルを起動するたびに実行することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.