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 準拠モードを有効にすると以下のような挙動の変化があります。

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

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

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

- For ループで展開した単語はグローバル変数として代入します。

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

- 予約語 `function` を用いる形式の関数定義構文は使えません。

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

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

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

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

- パラメータ展開の入れ子はできません。またインデックスの指定はできません。

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

- 数式展開で小数が使えません。

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

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

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

- コマンドの検索において通常の組込みコマンドは対応する外部コマンドがないと見つかりません。

- ジョブ制御が有効でも、非同期コマンドは SIGINT と SIGQUIT を無視します。また非同期コマンドの標準入力を /dev/null にリダイレクトする条件が変わります (ジョブ制御が無効のときではなく、対話モードが無効なときにリダイレクト)。

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

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

- 対話モードのプロンプトを出す前に `PROMPT_COMMAND` 変数の値を実行しません。`PS1` 変数・`PS2` 変数・`PS4` 変数の値の解釈の仕方が違います。

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