# Set 組込みコマンド

Set 組込みコマンドはシェルのオプションの設定と​位置パラメータの変更を行います。

## 構文

- `set [オプション…] [オペランド…]`

- `set -o`

- `set +o`

Set コマンドでは、​POSIX 準拠モードであるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。最初のオペランドより後にあるコマンドライン引数は全てオペランドとして解釈します。

## 説明

コマンドライン引数を一切与えずに set コマンドを実行すると、現在シェルに設定されている全ての​変数の一覧をアルファベット順で (コマンドとして解釈可能な形式で) 標準出力に出力します。

`-o` を唯一のコマンドライン引数として与えた場合は現在のシェルのオプション設定を一覧にして標準出力に出力します。`+o` を唯一のコマンドライン引数として与えた場合も同様ですが、この場合はコマンドとして解釈可能な形式で出力します。

これ以外の場合は、set コマンドは以下のようにシェルのオプションの設定と​位置パラメータの変更のどちらかまたは両方の動作を行います。

## オプション

オプションが一つ以上与えられている場合、set コマンドはそれらの有効・無効を切り替えます。通常の形式でオプションを与えると、そのオプションは有効になります。オプションの先頭のハイフン (`-`) の代わりにプラス (`+`) を付けて指定すると、そのオプションは無効になります。例えば `-m` や `-o monitor` や `--monitor` はシェルのジョブ制御を有効にし、逆に `+m` や `+o monitor` や `++monitor` はジョブ制御を無効にします。

長いオプションの名前に含まれる英数字以外の文字は無視され、大文字と小文字の区別はありません。例えば `--Le-Comp-Debug` は `--lecompdebug` に同じです。また長いオプションの名前の先頭に `no` を付けることで、オプションの有効・無効を逆転することができます。例えば `--noallexport` は `++allexport` に同じく、また `++nonotify` は `--notify` に同じです。

オプションは以下に挙げる形式で指定することができます:

- 長いオプション (例: `--allexport`)

- 引数としてオプション名を指定した `-o` オプション (例: `-o allexport`)

- 一文字のオプション (例: `-a`)

ただし全てのオプションが一文字のオプションで指定できるわけではありません。

利用可能なオプションは以下のとおりです:

all-export (`-a`)

  このオプションが有効な時、​変数に代入をするとその変数は自動的に​エクスポート対象になります。

brace-expand

  このオプションは​ブレース展開を有効にします。

case-glob

  このオプションが有効な時、​パス名展開におけるパターンマッチングは大文字と小文字を区別して行います。このオプションはシェルの起動時に最初から有効になっています。

clobber (`+C`)

  このオプションを無効にすると、 `>` 演算子による​リダイレクトで既存のファイルを上書きすることはできなくなります。このオプションはシェルの起動時に最初から有効になっています。

cur-async
cur-bg
cur-stop

  これらのオプションは現在のジョブの選択の仕方に影響します。(ジョブ ID 参照)。これらのオプションはシェルの起動時に最初から有効になっています。

dot-glob

  このオプションが有効な時、​パス名展開においてファイル名の先頭のピリオドを特別に扱いません。

emacs

  このオプションは emacs 風​行編集を有効にします。

empty-last-field

  このオプションが有効な時、​単語分割で最後の単語が空になっても削除しません。

err-exit (`-e`)

  このオプションが有効な時、実行した​パイプラインの終了ステータスが 0 でなければ、シェルは直ちに終了します。ただし、以下の抑止条件に当てはまる場合を除きます。

  - そのコマンドが if 文の分岐や while/until 文のループ条件の判定に使われる場合

  - パイプラインの先頭に `!` が付いている場合

  - パイプラインがサブシェル​グルーピング以外の単独の​複合コマンドから構成される場合

err-return

  このオプションは err-exit オプションと同様ですが、終了ステータスが 0 でないときにシェルが終了する代わりに return 組込みコマンドが発動します。 Err-exit オプションと異なり、抑止条件は​関数・サブシェル​グルーピング・​スクリプトファイルの中では無視されます。

exec (`+n`)

  このオプションが無効な時、シェルはコマンドの解釈だけを行い、実際にはコマンドを実行しません。このオプションはシェルスクリプトの文法チェックをするのに便利です。このオプションはシェルの起動時に最初から有効になっています。​対話モードでは、このオプションに関わらずコマンドは常に実行されます。

extended-glob

  このオプションは​パス名展開における拡張機能を有効にします。

for-local

  For ループが​関数の中で実行されるとき、このオプションが有効ならばループの変数は​ローカル変数として代入されます。このオプションはシェルの起動時に最初から有効になっています。​POSIX 準拠モードではこのオプションに関係なく for ループの変数は通常の変数として代入されます。

glob (`+f`)

  このオプションが有効なときはシェルは​パス名展開を行います。このオプションはシェルの起動時に最初から有効になっています。

hash-on-def (`-h`)

  このオプションが有効なとき​関数を定義すると、直ちにその関数内で使われる各コマンドの PATH 検索を行いコマンドのパス名を記憶します。

hist-space

  このオプションが有効な時は空白で始まる行は​コマンド履歴に自動的に追加しません。

ignore-eof

  このオプションが有効な時、​対話モードのシェルに EOF (入力の終わり) が入力されてもシェルはそれを無視してコマンドの読み込みを続けます。これにより、誤って Ctrl-D を押してしまってもシェルは終了しなくなります。

le-always-rp
le-comp-debug
le-conv-meta
le-no-conv-meta
le-predict
le-predict-empty
le-prompt-sp
le-visible-bell
le-trim-right

  これらのオプションは​行編集の動作に影響します。​行編集のオプションを参照してください。

mark-dirs

  このオプションが有効な時、​パス名展開の展開結果においてディレクトリを表すものの末尾にスラッシュを付けます。

monitor (`-m`)

  このオプションは​ジョブ制御を有効にします。シェルを​対話モードで起動したときこのオプションは自動的に有効になります。

notify (`-b`)

  このオプションが有効な時は、バックグラウンドの​ジョブの実行状態が変化するとシェルは直ちにそれを標準エラーに報告します。このオプションは notifyle オプションより優先します。

notify-le

  このオプションは notify オプションとほぼ同じですが、​行編集を行っている最中のみジョブの状態変化を報告します。

null-glob

  このオプションが有効な時、​パス名展開でマッチするパス名がないとき元のパターンは残りません。

pipe-fail

  このオプションが有効な時、​パイプラインの全てのコマンドの終了ステータスが 0 の時のみパイプラインの終了ステータスが 0 になります。

posixly-correct

  このオプションは POSIX 準拠モードを有効にします。

trace-all

  このオプションは、補助コマンド実行中も x-trace オプションを機能させるかどうかを指定します。補助コマンドとは、 `COMMAND_NOT_FOUND_HANDLER`、 `PROMPT_COMMAND`、および `YASH_AFTER_CD` 変数の値として定義され、特定のタイミングで解釈・実行されるコマンドです。 このオプションはシェルの起動時に最初から有効になっています。

unset (`+u`)

  このオプションが有効な時、​パラメータ展開で存在しない変数を展開すると空文字列に展開され、数式展開で存在しない変数を使用すると 0 とみなされます。オプションが無効な時、存在しない変数を使用するとエラーになります。このオプションはシェルの起動時に最初から有効になっています。

verbose (`-v`)

  このオプションが有効な時、シェルは読み込んだコマンドをそのまま標準エラーに出力します。

vi

  このオプションは vi 風​行編集を有効にします。​対話モードが有効で標準入力と標準エラーがともに端末ならばこのオプションはシェルの起動時に自動的に有効になります。

x-trace (`-x`)

  このオプションが有効な時、コマンドを実行する前に​展開の結果を標準エラーに出力します。この出力は、各行頭に `PS4` 変数の値を​展開した結果を付けて示されます。 Trace-all オプションも参照してください。

## オペランド

Set コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (`--`, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の​位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。

## 終了ステータス

オプションの指定が間違っている場合を除き、set コマンドの終了ステータスは 0 です。

## 補足

Set コマンドは​特殊組込みコマンドです。

POSIX 規格に定義されているオプションは限られています。規格の定義では、

- `--allexport` などの長いオプションは使えません。

- オプション名に `no` を付けてオプションを無効にすることはできません。

- オプション名に大文字や英字でない記号は使えません。

規格に定義されているオプションは以下のとおりです:

- `-a`, `-o allexport`

- `-e`, `-o errexit`

- `-m`, `-o monitor`

- `-C`, `-o noclobber`

- `-n`, `-o noexec`

- `-f`, `-o noglob`

- `-b`, `-o notify`

- `-u`, `-o nounset`

- `-v`, `-o verbose`

- `-x`, `-o xtrace`

- `-h`

- `-o ignoreeof`

- `-o nolog`

- `-o vi`

POSIX ではこのほかに、​関数定義を​コマンド履歴に登録しないようにする `-o nolog` オプションを規定していますが、yash はこれをサポートしていません。