初期化ファイルとそれにまつわる運用方法について説明します。ありますが、どこに何を定義すべきかについては色々な意見が散見され、結果ぼんやりしてしまうことがあります。色々な意見が散見されるのは、唯一の正解などといったものは無いからなのですが、ここでは改めてシェルの初期化ファイルについて整理し、管理方針についての判断材料を提供したいと思います。起動時には以下のような判定で読み込む初期化ファイルが変化します。青塗りの四角が読み込む設定ファイルを表しています。大きくは、ログインシェルかそうではないか、インタラクティブかそうではないかで読み込むファイルが別れます。順番で最初に見つかったものだけを読みます。このようなファイルの検索順序が影響するためです。指定されたファイルを初期化ファイルとして読み込みます。設定されたファイルを初期化ファイルとして読みます。読むケースは、主にシェルスクリプトを実行する場合に該当します。何かについて見ていきましょう。ログインシェルとはログインシェルとはデスクトップ画面や仮想コンソールでログインしたときに起動されるシェルを指します。抜粋すると以下のように説明されています。オプション付きで起動されたシェルのことです。渡されたコマンドライン引数の最初の要素を意味します。通常この引数にはプログラム起動時のコマンド名が入ります。ログインシェルとして起動することになります。おけるログインコマンドのソースファイル(login.c)は以下のようになっています。エントリを参照しています。ファイルは以下のような構成になっています。定義され、このエントリからログインシェルとして使うシェルを取得しています。ように指定されることが分かります。ログインシェルとして起動することになります。具体的には以下のようなケースでログインシェルが起動します。SSHログインシステムへログイン、再ログインするような、ユーザセッションの開始時に起動するシェルがログインシェルになります。抜粋すると以下のように説明されています。オプション付きで起動されたシェルのことです。シェルスクリプトや起動ファイルの内部で調べられます。まとめると、以下の状態で起動したシェルがインタラクティブシェル(対話的)となります。場合にインタラクティブシェルとなります。具体的には以下のケースでインタラクティブシェルになります。シェルスクリプトを実行インタラクティブ(対話的)ではない場合には、非インタラクティブ(非対話的)シェルとなります。場合の起動は以下のように説明されています。そこからコマンドの読み込みと実行を行います。デスクトップ画面にログインしたときや、シェルスクリプトを通常実行した際に起動されたシェルは非インタラクティブです。シェル起動時に指定されたフラグの一覧を表す特殊変数です。このように、インタラクティブかそうでは無いかを分別するのは、シェルの2面性が影響します。コマンドインタプリタとしてユーザインターフェースを担う側面と、スクリプト言語としてプログラムの実行を担う側面です。2面性が別の機能として提供されていれば、インタラクティブかそうではないかなどを場合分ける必要もなかったはずですが、シェルがこの2面性を抱えて機能拡張されてきた歴史上、このようになっています。インタラクティブ/非インタラクティブについては一つ注意点があります。あるように、ネットワーク経由の場合はインタラクティブ扱いになります。状態で実行されたかどうかを調べます。コマンドをこのファイルから読み込んで実行します。ログインシェルとインタラクティブシェルの分類ここまで見てきたログインシェルとインタラクティブシェルはそれぞれ直行しており、ログインシェルでありインタラクティブシェルであったり、非ログインシェルであり、非インタラクティブシェルであったり組み合わせがあります。ログインシェルとインタラクティブシェルの組み合わせを具体例にすると以下のようになります。場合、デスクトップ画面からターミナルを起動した場合はインタラクティブな非ログインシェルとなります(~/bashrc読み込み)。いうコマンド名が指定されるため、インタラクティブなログインシェルが起動します(~/bash_profile読み込み)。初期化ファイルの読み込みが場合分けされるケースがわかったところで、各種環境においてデフォルトで用意される初期化ファイルがどのようになっているかを見てみましょう。各種環境における初期化ファイル設定ファイルはディストリビューション毎に様々です。例に、設定ファイルの読み込み部分を抜粋して見て行きます。以下のように定義されています。以下にあるスクリプトを読み込んでいます。以下に設定ファイルを追加してカスタマイズするようになっています。除いたものを返します。比較することで、インタラクティブモードで起動したかどうかを判定しています。して捨てています(非インタラクティブの場合は定石です)。インポートしています。以下のようになっています。いう変数でチェックを行っています。オプションを得られるので、ログインシェルかどうかの判定を行っています。配下の内容をインポートしています。配下のファイルの読み込みは行われません。以上でシステムワイドな設定が終わり、続いてユーザ設定の読み込みが行われます。以下のように用意されています。読み込みと、PATH変数のエクスポートをしているだけです。以下のようになっています。