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
をファイル名として表示します。 -
グローバルエイリアスの置換を行いません。
-
For ループで展開した単語は for-local オプションに関係なくグローバル変数として代入します。変数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。
-
Case 文の最初のパターンを
esac
にすることはできません。 -
予約語
!
の直後に空白を置かずに(
を置くことはできません。 -
二重ブラケットコマンドは使えません。
-
予約語
function
を用いる形式の関数定義構文は使えません。関数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。 -
シェル実行中に
LC_CTYPE
変数の値が変わっても、それをシェルのロケール情報に反映しません。 -
RANDOM
変数は使えません。 -
チルダ展開で
~
と~ユーザ名
以外の形式の展開が使えません。 -
$(
と)
で囲んだコマンド置換に含まれるコマンドは、コマンド置換が実行される時に毎回解析されます。 -
数式展開で小数ならびに
++
および--
演算子が使えません。数値でない変数は常にエラーになります。 -
リダイレクトの対象を示すトークンは次のリダイレクトのファイル記述子を示す整数と紛らわしくないようにしなければなりません。
-
ファイルのリダイレクトで、パス名展開の結果が一つでない場合、すぐにはエラーにせず、パス名展開を行わなかったときと同様に扱います。
-
<&
および>&
リダイレクト演算子の対象となるファイル記述子はそれぞれ読み込み可能および書き込み可能でなければなりません。 -
ソケットリダイレクト・ヒアストリング・パイプリダイレクト・プロセスリダイレクトは使用できません。
-
単純コマンドの実行時、コマンドが見つからなくても
COMMAND_NOT_FOUND_HANDLER
変数の値は実行しません。 -
任意組込みコマンドおよび拡張組込みコマンドは実行できません。
-
いくつかの組込みコマンドで特定のオプションが使えなくなるなど挙動が変わります。特に、長いオプションは使えなくなります。
-
対話モードでないとき、特殊組込みコマンドのオプションやオペランドの使い方が間違っているとシェルは直ちに終了します。また特殊組込みコマンドで代入エラーやリダイレクトエラーが発生したときも直ちに終了します。
-
対話モードのプロンプトを出す前後に
PROMPT_COMMAND
変数およびPOST_PROMPT_COMMAND
変数の値を実行しません。PS1
変数・PS2
変数・PS4
変数の値の解釈の仕方が違います。YASH_PS1
などYASH_
で始まる名前のプロンプト変数は使用されません。 -
メールチェックにおいて、ファイルが更新されている場合はファイルが空でも新着メールメッセージを出力します。