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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// vim: set filetype=asciidoc expandtab:
