= シェルの起動
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - シェルの起動
:description: Yash の起動時の初期化処理について

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

[[arguments]]
== 起動時のコマンドライン引数

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

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

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

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

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

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

+-i+ (+--interactive+) オプションが指定されている場合、シェルは対話モードになります。逆に `+i` (`++interactive`) オプションが指定されている場合、シェルは対話モードになりません。
+-i+ (+--interactive+) オプションが指定されていない場合でも、シェルは以下の条件をすべて満たすときに自動的に対話モードになります:

- `+i` (`++interactive`) オプションが指定されていない
- `-s` (`--stdin`) オプションが指定されているか自動的に有効になった
- 標準入力が端末である
- 標準エラーが端末である

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

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

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

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

[[init]]
== シェルの初期化処理

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

. Yash はまず、(コマンドライン引数の前に渡される) それ自身の起動時の名前を解析します。その名前が +-+ で始まる場合は、シェルはログインシェルとして動作します。また名前が +sh+ である場合 (+/bin/sh+ のように +sh+ で終わる場合を含む) は、シェルは link:posix.html[POSIX 準拠モード]になります。
. オペランドが一つもなく、かつ標準入力と標準エラーがどちらも端末ならば、シェルは自動的に{zwsp}link:interact.html[対話モード]になります。ただし `+i` (`++interactive`) オプションが指定されている場合はそちらを優先します。
. 対話モードのシェルでは自動的に{zwsp}link:job.html[ジョブ制御]が有効になります。ただし `+m` (`++monitor`) オプションが指定されている場合はそちらを優先します。
. シェルは以下の初期化スクリプトを読み込んで解釈・実行します。(ただしシェルプロセスの実ユーザ ID と実効ユーザ ID が異なっているか、実グループ ID と実効グループ ID が異なっている場合を除く)
 .. シェルがログインシェルとして動作している場合は、 +--profile={{ファイル名}}+ オプションで指定したファイルを読み込んで実行します。(ただし +--noprofile+ オプションが指定されているか link:posix.html[POSIX 準拠モード]の場合を除く)
    +
    +--profile={{ファイル名}}+ オプションが指定されていない場合は、デフォルトとして link:params.html#sv-xdg_config_home[$XDG_CONFIG_HOME]/yash/profile もしくは link:expand.html#tilde[~]/.yash_profile を読み込みます。
 .. シェルが対話モードの場合は、 +--rcfile={{ファイル名}}+ オプションで指定したファイルを読み込んで実行します。(ただし +--norcfile+ オプションが指定されている場合を除く)
    +
    +--rcfile+ オプションが指定されていない場合は、非 POSIX 準拠モードではファイル link:params.html#sv-xdg_config_home[$XDG_CONFIG_HOME]/yash/rc がデフォルトのファイルとして使われます。それが見付からない場合は、{zwsp}link:expand.html#tilde[~]/.yashrc を読み込みます。&#x7e;/.yashrc も読み込めない場合は、ファイル initialization/default を link:params.html#sv-yash_loadpath[+YASH_LOADPATH+] から探して読み込みます。POSIX 準拠モードでは、{zwsp}link:params.html#sv-env[+ENV+ 環境変数]の値が{zwsp}link:expand.html#params[パラメータ展開]され、その結果をファイル名と見なしてファイルを読み込みます。

link:params.html#sv-xdg_config_home[+XDG_CONFIG_HOME+ 環境変数]が設定されていない場合、その値の代わりに link:expand.html#tilde[~]/.config を使用します。

[NOTE]
Yash は /etc/profile や /etc/yashrc や link:expand.html#tilde[~]/.profile を自動的に読むことはありません。

// vim: set filetype=asciidoc expandtab:
