ユーザーには、ホストごとに(最大で)1つのログインシェルが必要です。(おそらく、私は、ターミナルごとにホストごとに1つのログインシェルを言う必要があります-あなたは、同時に複数の端末を介してホストにログインしている場合、あなたは複数のログインシェルを持つことが予想されます。)これは、一般的に(常に?)になる最初のあなたが得るシェルログインすると(名前の由来)。そのため、このスキームでは、ログインごとに1回だけ実行するアクションと、新しい(対話型)シェルを起動するたびに実行するアクションを指定できます。
通常、ログイン後に実行する他のすべてのシェルはログインシェルの子孫(子の子の子…)であるため、ログインシェルから多くの設定(環境変数umask
など)を継承します。そして、それに応じて、アイデアは、ログイン初期化ファイル(ということで.login
、.profile
継承されている設定値を設定し、聞かせなければならない、など).bashrc
(または任意の他使用)(でないものを扱うset
、shopt
非エクスポートされたシェル変数など)
もう1つの概念は、ログイン初期化ファイル(およびそれらのみ)が「重いリフティング」、つまりリソースを集中的に使用するアクションを実行する必要があるということです。たとえば、ログインするたびにバックグラウンドで特定のプロセスを実行したい場合があります(ただし、それらの1つのコピー(インスタンス)のみ)。ログイン時にステータス情報(df
またはなどwho
)を表示することもできますが、新しいインタラクティブシェルを起動するたびに表示する必要はありません。特にインタラクティブな場合ログインするたびに実行したいプログラム/ダイアログ(つまり、ユーザーからの入力を要求するもの)。新しいシェルを起動するたびに実行したくないでしょう。極端な例として、20年前にSolarisが単一の非グラフィカル、非ウィンドウシェルにログインしました。(私はそれはそれ以来変更されたことを信じています。)それはの仕事はした.login
か.profile
(または何でも)のようなコマンドを使用して、ウィンドウシステムを起動しますstartx
。(これは、複数のウィンドウシステムが利用可能であったため、一部役に立ちました。ユーザーごとに異なる設定がありました。一部のユーザーは、さまざまな状況で異なるシステム.profile
を使用し、「今日どのウィンドウシステムを使用しますか?」明らかに、新しいウィンドウを開いたり、タイプしたりするたびに実行したくないでしょうsh
。
bash
エッジケース以外を使用してからずっと経ちます。(例えば、私はスクリプトを書く#!/bin/sh
ので、いくつかのシステムでは、私のスクリプトがで実行、dash
し、他人に彼らがで実行bash
POSIXモードで。年に数回、私は実行するcsh
/ tcsh
それが何かをどのように処理するかを見るために数分間、またはに質問に答えてください。)毎日複数のシェル(bash
およびなどzsh
)を使用する場合、パターンは異なる場合があります。プライマリシェル(で定義されている/etc/passwd
)がのbash
場合、zsh
ログインシェルを呼び出してから、それにzsh
従属するインタラクティブな非ログインシェルを呼び出すことができます。おそらく、同じタイプの別のログインシェルに従属するログインシェルを持つことは避けてください。
ログインシェルと非ログインシェルの違いで述べたように?、OS Xターミナルアプリケーションはログインシェルを実行するため、通常、一般的なユーザーは複数の「ログインシェル」を同時に実行します。これは私が上で説明したものとは多少異なるモデルであり、彼は彼に何を再考するようユーザに要求することができます.login
か、.profile
(または何でも)ファイル。OS X開発者がこの設計決定の根拠を文書化したかどうかはわかりません。しかし、これが役立つ状況は想像できます。ログイン時に習慣的にいくつかのシェルウィンドウを開いたときがあり、それらを異なるテキストと背景色に設定して(画面にANSIエスケープシーケンスを書き込むことで)、どのウィンドウを追跡できるようにしました。ターミナルの色は、子供の子供には継承されないが、ウィンドウ内に保持されるものの例です。したがって、これは新しいターミナルウィンドウを起動するたびに実行したいことですが、新しい対話型シェルを起動するたびに実行することはできません。