Description: Yash の POSIX 準拠モードの動作について

# POSIX 準拠モード

Yash は基本的に POSIX.1-2008 のシェルの規定に従って動作しますが、利便性や分かりやすさのために POSIX の規定とは異なる動作をする点もあります。そのため標準状態の yash は POSIX の規定するシェルとして供するには向きません。POSIX 準拠モードを有効にすると、yash はできる限り POSIX の規定通りに動作するようになります。POSIX 準拠シェルとしての互換性が必要な場面では、POSIX 準拠モードを有効にしてください。

シェルの起動時の起動時の名前が `sh` ならばシェルは自動的に POSIX 準拠モードになります。また起動時に `-o posixlycorrect` オプションが指定されている場合も POSIX 準拠モードになります。また起動後は、`set -o posixlycorrect` を実行することで POSIX 準拠モードを有効にできます。

POSIX 準拠モードを有効にすると、yash は POSIX の規定にできるだけ従うようになるだけでなく、POSIX が未定義や未規定と定めている場合のほとんどをエラーにするようになります。すなわち、yash 独自の拡張機能の多くは使えなくなります。具体的には、POSIX 準拠モードを有効にすると以下のような挙動の変化があります。

- シェルの起動時の​初期化で読み込むスクリプトファイルが異なります。

- シェルが `-c` オプションで起動された場合、構文エラー時に `yash -c` の代わりに `sh -c` をファイル名として表示します。

- グローバル​エイリアスの置換を行いません。

- 複合コマンドの​グルーピングや if 文の内容が空の場合エラーになります。

- For ループで展開した単語は for-local オプションに関係なくグローバル変数として代入します。変数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。

- Case 文の最初のパターンを `esac` にすることはできません。

- 予約語 `!` の直後に空白を置かずに `(` を置くことはできません。

- 二重ブラケットコマンドは使えません。

- 予約語 `function` を用いる形式の​関数定義構文は使えません。関数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。

- 単純コマンドでの​配列の代入はできません。

- シェル実行中に `LC_CTYPE` 変数の値が変わっても、それをシェルのロケール情報に反映しません。

- `RANDOM` 変数は使えません。

- チルダ展開で `~` と `~ユーザ名` 以外の形式の展開が使えません。

- パラメータ展開の​入れ子はできません。また​インデックスおよび単語2のある​加工指定は使用できません。

- `$(` と `)` で囲んだ​コマンド置換に含まれるコマンドは、コマンド置換が実行される時に毎回解析されます。

- 数式展開で小数ならびに `++` および `--` 演算子が使えません。数値でない変数は常にエラーになります。

- リダイレクトの対象を示すトークンは次のリダイレクトのファイル記述子を示す整数と紛らわしくないようにしなければなりません。

- リダイレクトを伴う​複合コマンドの直後に `}` や `fi` などの予約語を置くことはできません。

- ファイルのリダイレクトで、​パス名展開の結果が一つでない場合、すぐにはエラーにせず、パス名展開を行わなかったときと同様に扱います。

- `<&` および `>&` リダイレクト演算子の対象となるファイル記述子はそれぞれ読み込み可能および書き込み可能でなければなりません。

- ソケットリダイレクト・​ヒアストリング・​パイプリダイレクト・​プロセスリダイレクトは使用できません。

- 単純コマンドの実行時、コマンドが見つからなくても `COMMAND_NOT_FOUND_HANDLER` 変数の値は実行しません。

- 任意組込みコマンドおよび拡張組込みコマンドは実行できません。

- いくつかの​組込みコマンドで特定のオプションが使えなくなるなど挙動が変わります。特に、長いオプションは使えなくなります。

- 対話モードでないとき、​特殊組込みコマンドのオプションやオペランドの使い方が間違っているとシェルは直ちに終了します。また特殊組込みコマンドで代入エラーやリダイレクトエラーが発生したときも直ちに終了します。

- 対話モードのプロンプトを出す前に `PROMPT_COMMAND` 変数の値を実行しません。​`PS1` 変数・​`PS2` 変数・​`PS4` 変数の値の解釈の仕方が違います。​`YASH_PS1` など `YASH_` で始まる名前のプロンプト変数は使用されません。

- メールチェックにおいて、ファイルが更新されている場合はファイルが空でも新着メールメッセージを出力します。