ログイン、非ログイン、インタラクティブ、および非インタラクティブbashシェルがあるのはなぜですか?


23

そのため、bashのマニュアルページでは、ログインシェルとインタラクティブシェルについて説明しています。

ログインシェルは、引数ゼロの最初の文字が-であるシェル、または--loginオプションで開始されたシェルです。

対話型シェルは、非オプション引数なしで起動され、標準入力とエラーの両方が端末に接続されている(isatty(3)によって決定される)-cオプションなしで起動されるシェル、または-iオプションで起動されるシェルです。PS1が設定され、bashが対話型の場合は$-にiが含まれ、シェルスクリプトまたはスタートアップファイルでこの状態をテストできます。

これは、4種類のシェルを使用できることを意味すると思います。

  • 対話型ログインシェル、
  • 非対話型ログインシェル、
  • 対話型の非ログインシェル、
  • 非対話型の非ログインシェル

しかし、そもそもなぜ対話型/非対話型およびログイン/非ログインシェルがあるのでしょうか?なぜさまざまなのですか?シェルが1種類しかない場合、何が失われますか?

また、実行してログインシェルにいるかどうかを判断しようとするとecho $-、次のように出力されます。

himBH

これらのフラグのいくつかは説明されているここでは、しかしhHm説明されていません。これらすべてのフラグを説明する場所はありますか?

回答:


21

これらはシェルのさまざまな「タイプ」に関する私の考えです-残念ながら、私は最初からUn * xの台頭を目撃していませんでした(この概念は歴史的に十分に拡張されていると思います)。

  • システムにログインすると(最近はグラフィカルXログイン経由で)、一度実行する必要のあるタスクがあります。たとえば、ある種のサーバーへの接続の確立、今日のToDoリストの提示、コマンドの自動起動などです。私が新しいターミナルを開くたびにハップするべきではありません。そのため、ログインシェルのみをソースとする一連の構成ファイル(/etc/profileなど~/.bash_login、正確なリストについてはマニュアルを参照)があります
  • したがって、接続を閉じるには、いくつかのプログラムを強制終了~/.bash_logoutし、ログインシェルが存在するときにバックアップスクリプトを実行します
  • したがって、端末で使用する「通常の」シェルはログインシェルではありませんが~/.bashrc、キーバインドがシェルと対話するようにするため、個人設定を読み取る必要があります。したがって、これは対話型で、ログインシェル。
  • 最後になりますが、特にbashをスクリプトに使用する場合は、どちらも重要ではありません。bashできるだけ早く起動する必要があります。つまり、設定ファイルを読み取らないでください。これは、非対話型、非ログインシェルです。

だから、あなたの質問への私の答えは、シェルの種類が1つだけだったら何を失うでしょうか?一言で言えば「柔軟性」です。


2番目の質問への答えは簡単です。

$-オプションの現在のセットをリストします。これらは、コマンドラインパラメーターによって、bashまたはset組み込みを介して設定できます。したがって、マニュアルの2つの場所を確認する必要があります。

  • OPTIONS セクション:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSセクション、サブセクションset

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.

1
うーん、OPの明確に定式化された質問に対する@mpyの回答は、かなり有用な定義を明確に曖昧にすることができると信じています。それについて:では、非ログインシェルはログインシェルのサブセットにすぎませんか?
tuk0z
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.