Yash マニュアル: set 組込みコマンド
Author: magicant
Description: Yash の set 組込みコマンドについて

# Set 組込みコマンド

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

## 構文

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

## 説明

コマンドライン引数を一切与えずに set コマンドを実行すると、現在シェルに設定されている全ての変数の一覧をアルファベット順で (コマンドとして解釈可能な形式で) 標準出力に出力します。`-o` を唯一のコマンドライン引数として与えた場合は現在のシェルのオプション設定を一覧にして標準出力に出力します。`+o` を唯一のコマンドライン引数として与えた場合も同様ですが、この場合はコマンドとして解釈可能な形式で出力します。これ以外の場合は、set コマンドは以下のようにシェルのオプションの設定と位置パラメータの変更のどちらかまたは両方の動作を行います。

## オプション

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

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

以下にオプションの一覧を示します。オプションは、`--allexport` のように長いオプションとして指定するか、`-o allexport` のように一文字のオプション `o` の引数として指定することができます (このときオプションの名前に大文字・小文字の区別はありません)。また一部のオプションは `-a` のように対応する一文字のオプションで直接指定できます。

Allexport
  このオプションが有効な時、変数に代入をするとその変数は自動的にエクスポート対象になります。
  `-a` は `--allexport` と同じです。
Braceexpand
  このオプションはブレース展開を有効にします。
Caseglob
  このオプションが有効な時、パス名展開におけるパターンマッチングは大文字と小文字を区別して行います。このオプションはシェルの起動時に最初から有効になっています。
Clobber
  このオプションを無効にすると、> 演算子によるリダイレクトで既存のファイルを上書きすることはできなくなります。このオプションはシェルの起動時に最初から有効になっています。
  `-C` は `--noclobber` と同じです。
Curasync
Curbg
Curstop
  これらのオプションは現在のジョブの選択の仕方に影響します。(ジョブ ID 参照)。これらのオプションはシェルの起動時に最初から有効になっています。
Dotglob
  このオプションが有効な時、パス名展開においてファイル名の先頭のピリオドを特別に扱いません。
Emacs
  このオプションは emacs 風行編集を有効にします。
Errexit
  このオプションが有効な時、実行した単純コマンド (またはパイプライン) の終了ステータスが 0 でなければ、シェルは直ちに終了します。ただし、そのコマンドが while/until 文のループ条件の判定に使われる場合や if 文の分岐の判定に使われる場合やパイプラインの先頭に `!` が付いている場合を除きます。
  `-e` は `--errexit` と同じです。
Exec
  このオプションが無効な時、シェルはコマンドの解釈だけを行い、実際にはコマンドを実行しません。このオプションはシェルスクリプトの文法チェックをするのに便利です。このオプションはシェルの起動時に最初から有効になっています。対話モードでは、このオプションに関わらずコマンドは常に実行されます。
  `-n` は `--noexec` と同じです。
Extendedglob
  このオプションはパス名展開における拡張機能を有効にします。
Glob
  このオプションが有効なときはシェルはパス名展開を行います。このオプションはシェルの起動時に最初から有効になっています。
  `-f` は `--noglob` と同じです。
Hashondef
  このオプションが有効なとき関数を定義するとその関数内で使われる各コマンドの PATH 検索を行います。
  `-h` は `--hashondef` と同じです。
Histspace
  このオプションが有効な時は空白で始まる行はコマンド履歴に自動的に追加しません。
Ignoreeof
  このオプションが有効な時、対話モードのシェルに EOF (入力の終わり) が入力されてもシェルはそれを無視してコマンドの読み込みを続けます。これにより、誤って Ctrl-D を押してしまってもシェルは終了しなくなります。
Lealwaysrp
Lecompdebug
Leconvmeta
Lenoconvmeta
Lepromptsp
Levisiblebell
  これらのオプションは行編集の動作に影響します。行編集のオプションを参照してください。
Markdirs
  このオプションが有効な時、パス名展開の展開結果においてディレクトリを表すものの末尾にスラッシュを付けます。
Monitor
  このオプションはジョブ制御を有効にします。シェルを対話モードで起動したときこのオプションは自動的に有効になります。
  `-m` は `--monitor` と同じです。
Notify
  このオプションが有効な時は、バックグラウンドのジョブの実行状態が変化するとシェルは直ちにそれを標準エラーに報告します。このオプションは notifyle オプションより優先します。
  `-b` は `--notify` と同じです。
Notifyle
  このオプションは notify オプションとほぼ同じですが、行編集を行っている最中のみジョブの状態変化を報告します。
Nullglob
  このオプションが有効な時、パス名展開でマッチするパス名がないとき元のパターンは残りません。
Posixlycorrect
  このオプションは POSIX 準拠モードを有効にします。
Unset
  このオプションが有効な時、パラメータ展開で存在しない変数を展開するとエラーにはならず空文字列に展開されます。このオプションはシェルの起動時に最初から有効になっています。
  `-u` は `--nounset` と同じです。
Verbose
  このオプションが有効な時、シェルは読み込んだコマンドをそのまま標準エラーに出力します。
  `-v` は `--verbose` と同じです。
Vi
  このオプションは vi 風行編集を有効にします。対話モードが有効で標準入力と標準エラーがともに端末ならばこのオプションはシェルの起動時に自動的に有効になります。
Xtrace
  このオプションが有効な時、コマンドを実行する前に展開の結果を標準エラーに出力します。この出力は、各行頭に `PS4` 変数の値を展開した結果を付けて示されます。
  `-x` は `--xtrace` と同じです。

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

## オペランド

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

## 終了ステータス

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

## 補足

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

ここに挙げたオプションのうち POSIX に規定されているのは以下のものだけです。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 vi`

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