web-dev-qa-db-ja.com

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

bashのmanページ は、ログインシェルとインタラクティブシェルの概要を示しています。

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

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

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

  • 対話型ログインシェル
  • 非対話型ログインシェル
  • インタラクティブな非ログインシェル
  • 非インタラクティブな非ログインシェル

しかし、そもそもなぜインタラクティブ/非インタラクティブシェルとログイン/非ログインシェルがあるのでしょうか。なぜ変種なのか?シェルのタイプが1つだけの場合、何を失うでしょうか?

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

himBH

これらのフラグの一部は説明されています ここ ですが、hH、およびmは説明されていません。これらすべてのフラグを説明する場所はありますか?

23

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

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

だから、あなたの質問への私の答えシェルの種類が1つしかない場合、何が失われるでしょうか?は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.
    
21
mpy