Description: Yash の起動時の初期化処理について

# シェルの起動

Yash がプログラムとして起動されると、yash はいくつかの初期化処理を行った後、コマンドを読み取って実行する処理に移ります。これらの処理の内容は、主に起動時のコマンドライン引数によって決まります。

## 起動時のコマンドライン引数

Yash の起動時のコマンドライン引数は POSIX に準拠しています。POSIX で定められているとおり、引数は オプション と オペランド に分類されます。引数の書式に関する一般的な説明についてはコマンドの引数の構文を参照してください。オプションはオペランドより前に指定する必要があります。

オプションに `-c` (`--cmdline`) オプションが含まれている場合、オペランドを少なくとも一つ与える必要があります。シェルは、この最初のオペランドをコマンドとして解釈・実行します。二つ目のオペランドがある場合は、特殊パラメータ `0` がそれに初期化されます。三つ目以降のオペランドは、位置パラメータになります。 `-c` (`--cmdline`) オプションを指定した場合は、ファイルや標準入力からコマンドを読み込むことはありません (ドット組込みコマンドを使用したときを除く)。

オプションに `-s` (`--stdin`) オプションが含まれている場合、シェルは標準入力から一行ずつコマンドを読み取って、解釈・実行します。オペランドはすべて位置パラメータの初期化に使われます。特殊パラメータ `0` はこのシェルが起動されたときに元のプログラムから受け取った最初の引数に初期化されます。

`-c` (`--cmdline`) オプションも `-s` (`--stdin`) オプションも指定されなかった場合は、シェルはファイルからコマンドを読み取って解釈・実行します。最初のオペランドが読み込むファイル名と見なされ、特殊パラメータ `0` の値となります。残りのオペランドは位置パラメータになります。オペランドが一つもない場合は、 `-s` (`--stdin`) オプションを指定したときと同様に標準入力からコマンドを読み込みます。

`-c` (`--cmdline`) オプションと `-s` (`--stdin`) オプションを同時に使用することはできません。

`--help` オプションまたは `--version` オプションが指定されている場合は、通常の初期化処理やコマンドの解釈・実行は一切行いません。それぞれシェルのコマンドライン引数の簡単な説明とバージョン情報を標準出力に出力した後、そのままシェルは終了します。 `--version` オプションを `--verbose` オプションと共に使用すると、シェルで利用可能な機能の一覧も出力されます。

`-i` (`--interactive`) オプションが指定されている場合、シェルは対話モードになります。逆に `+i` (`++interactive`) オプションが指定されている場合、シェルは対話モードになりません。

`-l` (`--login`) オプションが指定されている場合、シェルはログインシェルとして動作します。

`--noprofile`, `--norcfile`, `--profile`, `--rcfile` 各オプションは、シェルの初期化処理の動作を指定します (後述)。

その他のオプションとして、set 組込みコマンドで指定可能な各種オプションをシェルの起動時に指定することができます。(`+` で始まるオプションを含む)

最初のオペランドが `-` であり、かつオプションとオペランドが `--` で区切られていない場合、そのオペランドは特別に無視されます。

## シェルの初期化処理

シェルの初期化処理は以下のように行われます。

1. Yash はまず、(コマンドライン引数の前に渡される) それ自身の起動時の名前を解析します。その名前が `-` で始まる場合は、シェルはログインシェルとして動作します。また名前が `sh` である場合 (`/bin/sh` のように `sh` で終わる場合を含む) は、シェルは POSIX 準拠モードになります。

2. オペランドが一つもなく、かつ標準入力と標準エラーがどちらも端末ならば、シェルは自動的に対話モードになります。ただし `+i` (`++interactive`) オプションが指定されている場合はそちらを優先します。

3. 対話モードのシェルでは自動的にジョブ制御が有効になります。ただし `+m` (`++monitor`) オプションが指定されている場合はそちらを優先します。

4. シェルは以下の初期化スクリプトを読み込んで解釈・実行します。(ただしシェルプロセスの実ユーザ ID と実効ユーザ ID が異なっているか、実グループ ID と実効グループ ID が異なっている場合を除く)

   1. シェルがログインシェルとして動作している場合は、 `--profile=ファイル名` オプションで指定したファイルを読み込んで実行します。(ただし `--noprofile` オプションが指定されているか POSIX 準拠モードの場合を除く)
      `--profile=ファイル名` オプションが指定されていない場合は、 ~/.yash_profile がデフォルトのファイルとして使われます。

   2. シェルが対話モードの場合は、 `--rcfile=ファイル名` オプションで指定したファイルを読み込んで実行します。(ただし `--norcfile` オプションが指定されている場合を除く)
      `--rcfile` オプションが指定されていない場合は、非 POSIX 準拠モードではファイル ~/.yashrc がデフォルトのファイルとして使われます。POSIX 準拠モードでは、 `ENV` 環境変数の値がパラメータ展開され、その結果をファイル名と見なしてファイルを読み込みます。

注 | Yash は /etc/profile や /etc/yashrc や ~/.profile を自動的に読むことはありません。