YASH(1) | YASH(1) |
yash - POSIX 準拠コマンドラインシェル
yash [オプション...] [--] [オペランド...]
Yet another shell (yash) は Unix 系 OS 用コマンドラインシェルです。POSIX.1-2008 規格に (一部の例外を除いて) 準拠しています。POSIX 準拠を謳う他のシェルよりも精確な準拠を目指しています。また、コマンド履歴やコマンドライン編集など、対話シェルとして標準的な機能も備えています。
このプログラムは GNU General Public License (Version 2) の元で自由に再配布・変更などができます。ただし、プログラムの利用は全て各自の自己責任の下で行っていただくことになります。作者はプログラムの瑕疵に対して一切責任を取りません。また、このマニュアルはクリエイティブ・コモンズの表示-継承 2.1 日本ライセンスの下で自由に再配布・変更などができます。
Yash は渡邊裕貴 (通称まじかんと) という一人の開発者によって開発されています。Yash の開発プロジェクトおよび ホームページは OSDN がホストしています。
Yash がプログラムとして起動されると、yash はいくつかの初期化処理を行った後、コマンドを読み取って実行する処理に移ります。これらの処理の内容は、主に起動時のコマンドライン引数によって決まります。
Yash の起動時のコマンドライン引数は POSIX に準拠しています。POSIX で定められているとおり、引数は オプション と オペランド に分類されます。引数の書式に関する一般的な説明についてはコマンドの引数の構文を参照してください。オプションはオペランドより前に指定する必要があります。
オプションに -c (--cmdline) オプションが含まれている場合、オペランドを少なくとも一つ与える必要があります。シェルは、この最初のオペランドをコマンドとして解釈・実行します。二つ目のオペランドがある場合は、特殊パラメータ 0 がそれに初期化されます。三つ目以降のオペランドは、位置パラメータになります。 -c (--cmdline) オプションを指定した場合は、ファイルや標準入力からコマンドを読み込むことはありません (ドット組込みコマンドを使用したときを除く)。
オプションに -s (--stdin) オプションが含まれている場合、シェルは標準入力から一行ずつコマンドを読み取って、解釈・実行します。オペランドはすべて位置パラメータの初期化に使われます。特殊パラメータ 0 はこのシェルが起動されたときに元のプログラムから受け取った最初の引数に初期化されます。
-c (--cmdline) オプションも -s (--stdin) オプションも指定されなかった場合は、シェルはファイルからコマンドを読み取って解釈・実行します。最初のオペランドが読み込むファイル名と見なされ、特殊パラメータ 0 の値となります。残りのオペランドは位置パラメータになります。オペランドが一つもない場合は、 -s (--stdin) オプションを指定したときと同様に標準入力からコマンドを読み込みます。
-c (--cmdline) オプションと -s (--stdin) オプションを同時に使用することはできません。
--help オプションまたは -V (--version) オプションが指定されている場合は、通常の初期化処理やコマンドの解釈・実行は一切行いません。それぞれシェルのコマンドライン引数の簡単な説明とバージョン情報を標準出力に出力した後、そのままシェルは終了します。 -V (--version) オプションを -v (--verbose) オプションと共に使用すると、シェルで利用可能な機能の一覧も出力されます。
-i (--interactive) オプションが指定されている場合、シェルは対話モードになります。逆に +i (++interactive) オプションが指定されている場合、シェルは対話モードになりません。
-l (--login) オプションが指定されている場合、シェルはログインシェルとして動作します。
--noprofile, --norcfile, --profile, --rcfile 各オプションは、シェルの初期化処理の動作を指定します (後述)。
その他のオプションとして、set 組込みコマンドで指定可能な各種オプションをシェルの起動時に指定することができます。(+ で始まるオプションを含む)
最初のオペランドが - であり、かつオプションとオペランドが -- で区切られていない場合、そのオペランドは特別に無視されます。
シェルの初期化処理は以下のように行われます。
--profile=ファイル名 オプションが指定されていない場合は、~/.yash_profile がデフォルトのファイルとして使われます。
--rcfile オプションが指定されていない場合は、非 POSIX 準拠モードではファイル ~/.yashrc がデフォルトのファイルとして使われます。~/.yashrc が読み込めない場合は、ファイル initialization/default を YASH_LOADPATH から探して読み込みます。POSIX 準拠モードでは、ENV 環境変数の値がパラメータ展開され、その結果をファイル名と見なしてファイルを読み込みます。
Yash は /etc/profile や /etc/yashrc や ~/.profile を自動的に読むことはありません。
シェルはコマンドを一行ずつ読み込んで解釈し、実行します。一行に複数のコマンドがある場合は、それら全てを解釈してから実行します。一つのコマンドが複数行にまたがっている場合は、そのコマンドを解釈し終えるのに必要なだけ後続の行が読み込まれます。コマンドを正しく解釈できない場合は、文法エラーとなり、コマンドは実行されません。
非対話モードで文法エラーが発生した時は、シェルはコマンドの読み込みを中止するため、それ以降のコマンドは一切読み込まれません。
コマンドは、いくつかのトークンによって構成されます。トークンとは、シェルの文法における一つ一つの単語のことを言います。トークンは原則として空白 (空白文字またはタブ文字) によって区切られます。ただしコマンド置換などに含まれる空白はトークンの区切りとは見なしません。
以下の記号は、シェルの文法において特別な意味を持っています。これらの記号も多くの場合他の通常のトークンの区切りとなります。
; & | < > ( ) [newline]
以下の記号はトークンの区切りにはなりませんが、文法上特別な意味を持っています。
$ ` \ " ' * ? [ # ~ = %
以下のトークンは特定の場面において予約語と見なされます。予約語は複合コマンドなどを構成する一部となります。
! { } [[ case do done elif else esac fi for function if in then until while
これらのトークンは以下の場面において予約語となります。
トークンが # で始まる場合、その # から行末まではコメントと見なされます。コマンドの解釈においてコメントは完全に無視されます。
空白や上記の区切り記号・予約語などを通常の文字と同じように扱うには、適切な引用符でクォートする必要があります。引用符は、それ自体をクォートしない限り通常の文字としては扱われません。シェルでは以下の三種類の引用符が使えます。
例外として、バックスラッシュの直後に改行がある場合、それは改行をクォートしているのではなく、行の連結と見なされます。バックスラッシュと改行が削除され、バックスラッシュがあった行とその次の行が元々一つの行であったかのように扱われます。
コマンドを構成する各トークンは、それが予め登録されたエイリアスの名前に一致するかどうか調べられます。一致するものがあれば、そのトークンはそのエイリアスの内容に置き換えられて、その後コマンドの解析が続けられます。これをエイリアス置換といいます。
エイリアスの名前に引用符を含めることはできないので、引用符を含むトークンはエイリアス置換されません。また、予約語やコマンドを区切る記号もエイリアス置換されません。
エイリアスには通常のエイリアスとグローバルエイリアスの二種類があります。通常のエイリアスは、コマンドの最初のトークンにのみ一致します。グローバルエイリアスはコマンド内の全てのトークンが一致の対象です。グローバルエイリアスは POSIX 規格にはない拡張機能です。
通常のエイリアスで置換された部分の最後の文字が空白の場合、特例としてその直後のトークンにも通常のエイリアスの置換が行われます。
エイリアス置換の結果がさらに別のエイリアスに一致して置換される場合もあります。しかし、同じエイリアスに再び一致することはありません。
エイリアスを登録するには alias 組込みコマンドを、登録を削除するには unalias 組込みコマンドを使用します。
最初のトークンが予約語でないコマンドは、単純コマンドです。単純コマンドは単純コマンドの実行のしかたに従って実行されます。
単純コマンドの初めのトークンが 名前=値 の形式になっている場合は、それは変数代入と見なされます。ただしここでの名前は、一文字以上のアルファベット・数字または下線 (_) で、かつ最初が数字でないものです。変数代入ではない最初のトークンはコマンドの名前と解釈されます。それ以降のトークンは (たとえ変数代入の形式をしていたとしても) コマンドの引数と解釈されます。
名前=(トークン列) の形になっている変数代入は、配列の代入となります。括弧内には任意の個数のトークンを書くことができます。またこれらのトークンは空白・タブだけでなく改行で区切ることもできます。
パイプラインは、一つ以上のコマンド (単純コマンド、複合コマンド、または関数定義) を記号 | で繋いだものです。
二つ以上のコマンドからなるパイプラインの実行は、パイプラインに含まれる各コマンドをそれぞれ独立したサブシェルで同時に実行することで行われます。この時、各コマンドの標準出力は次のコマンドの標準入力にパイプで受け渡されます。最初のコマンドの標準入力と最後のコマンドの標準出力は元のままです。
Pipe-fail オプションが無効な時は、最後のコマンドの終了ステータスがパイプラインの終了ステータスになります。有効な時は、終了ステータスが 0 でなかった最後のコマンドの終了ステータスがパイプラインの終了ステータスになります。全てのコマンドの終了ステータスが 0 だった時は、パイプラインの終了ステータスも 0 になります。
パイプラインの先頭には、記号 ! を付けることができます。この場合、パイプラインの終了ステータスが逆転します。つまり、最後のコマンドの終了ステータスが 0 のときはパイプラインの終了ステータスは 1 になり、それ以外の場合は 0 になります。
Korn シェルでは構文 !(...) は POSIX で定義されていない独自のパス名展開パターンと見做されます。POSIX 準拠モードでは ! と ( の二つのトークンは一つ以上の空白で区切る必要があります。
最後のコマンドの終了ステータスがパイプラインの終了ステータスになるため、パイプラインの実行が終了するのは少なくとも最後のコマンドの実行が終了した後です。しかしそのとき他のコマンドの実行が終了しているとは限りません。また、最後のコマンドの実行が終了したらすぐにパイプラインの実行が終了するとも限りません。(シェルは、他のコマンドの実行が終わるまで待つ場合があります)
POSIX 規格では、パイプライン内の各コマンドはサブシェルではなく現在のシェルで実行してもよいことになっています。
And/or リストは一つ以上のパイプラインを記号 && または || で繋いだものです。
And/or リストの実行は、and/or リストに含まれる各パイプラインを条件付きで実行することで行われます。最初のパイプラインは常に実行されます。それ以降のパイプラインの実行は、前のパイプラインの終了ステータスによります。
最後に実行したパイプラインの終了ステータスが and/or リストの終了ステータスになります。
構文上、and/or リストの直後には原則として記号 ; または & が必要です (コマンドの区切りと非同期コマンド参照)。
シェルが受け取るコマンドの全体は、and/or リストを ; または & で区切ったものです。行末、 ;; または ) の直前にある ; は省略できますが、それ以外の場合は and/or リストの直後には必ず ; と & のどちらかが必要です。
And/or リストの直後に ; がある場合は、その and/or リストは同期的に実行されます。すなわち、その and/or リストの実行が終わった後に次の and/or リストが実行されます。And/or リストの直後に & がある場合は、その and/or リストは非同期的に実行されます。すなわち、その and/or リストの実行を開始した後、終了を待たずに、すぐさま次の and/or リストの実行に移ります。非同期な and/or リストは常にサブシェルで実行されます。また終了ステータスは常に 0 です。
ジョブ制御を行っていないシェルにおける非同期な and/or リストでは、標準入力が自動的に /dev/null にリダイレクトされるとともに、SIGINT と SIGQUIT を受信したときの動作が 『無視』 に設定されこれらのシグナルを受けてもプログラムが終了しないようにします。
ジョブ制御を行っているかどうかにかかわらず、非同期コマンドを実行するとシェルはそのコマンドのプロセス ID を記憶します。特殊パラメータ ! を参照すると非同期コマンドのプロセス ID を知ることができます。非同期コマンドの状態や終了ステータスは jobs や wait 組込みコマンドで知ることができます。
複合コマンドは、より複雑なプログラムの制御を行う手段を提供します。
グルーピング
グルーピングを使うと、複数のコマンドを一つのコマンドとして扱うことができます。
通常のグルーピングの構文
サブシェルのグルーピングの構文
{ と } は予約語なので、他のコマンドのトークンとくっつけて書いてはいけません。一方 ( と ) は特殊な区切り記号と見なされるので、他のトークンとくっつけて書くことができます。
通常のグルーピング構文 ({ と } で囲む) では、コマンドは (他のコマンドと同様に) 現在のシェルで実行されます。サブシェルのグルーピング構文 (( と ) で囲む) では、括弧内のコマンドは新たなサブシェルで実行されます。
POSIX 準拠モードでは括弧内に少なくとも一つのコマンドが必要ですが、非 POSIX 準拠モードではコマンドは一つもなくても構いません。
グルーピングの終了ステータスは、グルーピングの中で実行された最後のコマンドの終了ステータスです。グルーピング内にコマンドが一つもない場合、グルーピングの終了ステータスはグルーピングの直前に実行されたコマンドの終了ステータスになります。
If 文
If 文は条件分岐を行います。分岐の複雑さに応じていくつか構文のバリエーションがあります。
If 文の基本構文
Else がある場合
Elif がある場合
Elif と else がある場合
If 文の実行では、どの構文の場合でも、if の直後にある条件コマンドがまず実行されます。条件コマンドの終了ステータスが 0 ならば、条件が真であると見なされて then の直後にある内容コマンドが実行され、if 文の実行はそれで終了します。終了ステータスが 0 でなければ、条件が偽であると見なされます。ここで else も elif もなければ、if 文の実行はこれで終わりです。else がある場合は、else の直後の内容コマンドが実行されます。elif がある場合は、elif の直後の条件コマンドが実行され、その終了ステータスが 0 であるかどうか判定されます。その後は先程と同様に条件分岐を行います。
elif ...; then ...; は一つの if 文内に複数あっても構いません。
If 文全体の終了ステータスは、実行された内容コマンドの終了ステータスです。内容コマンドが実行されなかった場合 (どの条件も偽で、else がない場合) は 0 です。
While および until
ループ
While ループと until ループは単純なループ構文です。
While ループの構文
Until ループの構文
非 POSIX 準拠モードでは 条件コマンド...; および 内容コマンド...; は省略可能です。
While ループの実行ではまず条件コマンドが実行されます。そのコマンドの終了ステータスが 0 ならば、内容コマンドが実行されたのち、再び条件コマンドの実行に戻ります。この繰り返しは条件コマンドの終了ステータスが 0 でなくなるまで続きます。
条件コマンドの終了ステータスが最初から 0 でないときは、内容コマンドは一度も実行されません。
Until ループは、ループを続行する条件が逆になっている以外は while ループと同じです。すなわち、条件コマンドの終了ステータスが 0 でなければ内容コマンドが実行されます。
While/until ループ全体の終了ステータスは、最後に実行した内容コマンドの終了ステータスです。(内容コマンドが存在しないか、一度も実行されなかったときは 0)
For ループ
For ループは指定されたそれぞれの単語について同じコマンドを実行します。
For ループの構文
for 変数名 do コマンド...; done
in の直後の単語は一つもなくても構いませんが、do の直前の ; (または改行) は必要です。これらの単語トークンは予約語としては認識されませんが、& などの記号を含めるには適切なクォートが必要です。非 POSIX 準拠モードでは コマンド...; がなくても構いません。
POSIX 準拠モードでは、変数名はポータブルな (すなわち ASCII 文字のみからなる) 名前でなければなりません。
For ループの実行ではまず単語が単純コマンド実行時の単語の展開と同様に展開されます (in ...; がない構文を使用している場合は、in "$@"; が省略されているものと見なされます)。続いて、展開で生成されたそれぞれの単語について順番に一度ずつ以下の処理を行います。
単語はローカル変数として代入されます (POSIX 準拠モードのときを除く)。展開の結果単語が一つも生成されなかった場合は、コマンドは一切実行されません。
For ループ全体の終了ステータスは、最後に実行したコマンドの終了ステータスです。コマンドがあるのに一度も実行されなかったときは 0 です。コマンドがない場合、for ループの終了ステータスは for ループの一つ前に実行されたコマンドの終了ステータスになります。
変数が読み取り専用の場合、for ループの実行は 0 でない終了ステータスで中断されます。
Case 文
Case 文は単語に対してパターンマッチングを行い、その結果に対応するコマンドを実行します。
Case 文の構文
Caseitem の構文
case と in の間の単語はちょうど一トークンでなければなりません。この単語トークンは予約語としては認識されませんが、& などの記号を含めるには適切なクォートが必要です。in と esac の間には任意の個数の caseitem を置きます (0 個でもよい)。Caseitem の最初の ( と esac の直前の ;; は省略できます。またコマンドが ; で終わる場合はその ; も省略できます。Caseitem の ) と ;; との間にコマンドが一つもなくても構いません。
Caseitem のパターンにはトークンを指定します。各トークンを | で区切ることで複数のトークンをパターンとして指定することもできます。
Case 文の実行では、まず単語が四種展開されます。その後、各 caseitem に対して順に以下の動作を行います。
Case 文全体の終了ステータスは、実行したコマンドの終了ステータスです。コマンドが実行されなかった場合 (どのパターンもマッチしなかったか、caseitem が一つもないか、マッチしたパターンの後にコマンドがない場合) は、終了ステータスは 0 です。
POSIX 準拠モードでは、(| で区切られた最初の) パターントークンを esac にすることはできません。
二重ブラケットコマンド
二重ブラケットコマンドは test コマンドに近い動作をする構文です。ブラケットに囲まれた式を展開して評価します。
二重ブラケットコマンド構文
式は単一の原子式とすることも原子式や演算子の組み合わせとすることもできます。式の構文解析は、コマンドの実行時ではなく構文解析時に行われます。演算子 (原子式の演算子もそうでないものも) はクォートしてはなりません。クォートすると通常の単語と見なされます。
コマンドが実行されるとき、被演算子となる単語は四種展開されます。ブレース展開・単語分割・パス名展開は行われません。
二重ブラケットコマンドでは test コマンドと同様に以下の原子式が使用できます:
単項原子式
二項原子式
さらに、文字列を比較するための三つの二項原子式が使用できますが、test コマンドとは動作が異なります: = および == 原子式は右辺をパターンとして扱い、左辺がそれにマッチするかどうかを判定します。 != 原子式は同様の判定を行い、逆の結果を返します。
原子式の被演算子となる単語が ]] であるか他の演算子と紛らわしい場合は、クォートする必要があります。
将来新しい種類の原子式が導入される可能性があります。ハイフンで始まる単語は全てクォートすることをお勧めします。
<= および >= 二項原子式は二重ブラケットコマンド内においては正しく構文解析できないため使用できません。
以下の演算子を使用して原子式を組み合わせることができます (ここでは演算子の結合順位が高い順に示します):
( 式 )
! 式
expression && expression
expression || expression
二重ブラケットコマンドでは、test コマンドの様に -a および -o を連言・選言演算子として使用することはできません。
二重ブラケットコマンドの終了ステータスは、式が真ならば 0、偽ならば 1、展開エラーやその他の理由で判定が行えない場合は 2 です。
二重ブラケットコマンドは bash, ksh, mksh, zsh にもありますが、POSIX にはない拡張機能です。シェルによって多少動作が異なります。移植性を高めるには二重ブラケットコマンドよりも test コマンドを使用することをお勧めします。
関数定義コマンドは、関数を定義します。
関数定義コマンドの構文
function 関数名 複合コマンド
function 関数名 ( ) 複合コマンド
予約語 function を用いない一つ目の形式では、関数名には引用符などの特殊な記号を含めることはできません。予約語 function を用いる二つ目または三つ目の形式では、関数名は実行時に四種展開されます。(POSIX 準拠モードでは、予約語 function を用いる形式の関数定義は使えません。また関数名はポータブルな (すなわち ASCII 文字のみからなる) 名前でなければなりません。)
関数定義コマンドを実行すると、指定した関数名の関数が複合コマンドを内容として定義されます。
関数定義コマンドに対して直接リダイレクトを行うことはできません。関数定義コマンドの最後にあるリダイレクトは、関数の内容である複合コマンドに対するリダイレクトと見なされます。例えば func() { cat; } >/dev/null と書いた場合、リダイレクトされるのは func() { cat; } ではなく { cat; } です。
関数定義コマンドの終了ステータスは、関数が正しく定義された場合は 0、そうでなければ非 0 です。
パラメータとは、パラメータ展開で値に置き換えられるデータを言います。パラメータには位置パラメータ・特殊パラメータ・変数の三種類があります。
位置パラメータは 1 以上の自然数によって識別されるパラメータです。例えば位置パラメータが三つある場合、それらは順に 1, 2, 3 という名称で識別されます。位置パラメータの個数は特殊パラメータ # で取得できます。また全ての位置パラメータを表す特殊パラメータとして * と @ があります。
位置パラメータは、シェルの起動時に、シェルのコマンドライン引数を元に初期化されます (起動時のコマンドライン引数参照)。引数のうち、位置パラメータの値として与えられたオペランドが順に一つずつ位置パラメータとなります。
シェルのコマンド実行中に関数が呼び出されるとき、位置パラメータはその関数の呼び出しに対する引数に変更されます。すなわち、関数の実行中は位置パラメータによって関数の引数を参照できます。関数呼び出しの直前の位置パラメータの値は保存されており、関数の実行が終了する際に元の値に戻ります。
位置パラメータは、set や shift などの組込みコマンドによって変更できます。
0 は位置パラメータとは見なされません (特殊パラメータの一つです)。
特殊パラメータは一文字の記号によって識別されるパラメータです。特殊パラメータにはユーザが明示的に値を代入することはできません。
Yash では以下の特殊パラメータが利用可能です。
0
#
$
-
?
!
*
このパラメータの展開結果に対して単語分割が行われる場合、値はまず元の位置パラメータに一致するように分割されさらに変数 IFS の値に従って分割されます。この最初の分割は IFS が空文字列でも行います。
@
例えば位置パラメータが一つもないとき、コマンドライン echo 1 "$@" 2 は echo、1、2 という三つの単語に展開されます。位置パラメータが 1、2 2、3 の三つのとき、コマンドライン echo "$@" は echo、1、2 2、3 という四つの単語に展開され、コマンドライン echo "a$@b" は echo、a1、2 2、3b という四つの単語に展開されます。
変数とはユーザが自由に代入可能なパラメータです。各変数は名前で区別され、それぞれが文字列の値を持ちます。
変数の名前は、英数字と下線 (_) から構成されます。ただし変数名の頭文字を数字にすることはできません。環境によってはこれ以外の文字も変数名に使用できます。
シェルが扱う変数のうち、エクスポートの対象となっているものは環境変数といいます。これらの変数はシェルが外部コマンドを起動する際に外部コマンドに渡されます。シェルが起動されたときにシェルを起動したプログラムから渡された変数は自動的に環境変数になります。
変数は、単純コマンドによって代入できます。また typeset 組込みコマンドなどでも変数に代入することができます。変数を削除するには unset 組込みコマンドを使います。
シェルが使用する変数
以下の名前の変数は、yash の実行において特別な意味を持っています。
CDPATH
COLUMNS
COMMAND_NOT_FOUND_HANDLER
この機能は POSIX 準拠モードでは働きません。
DIRSTACK
ECHO_STYLE
ENV
FCEDIT
HANDLED
HISTFILE
HISTRMDUP
例えばこの変数の値が 1 のときは、履歴に追加されるコマンドが一つ前のコマンドと同じならばそれは削除されます。それより古い履歴のコマンドは、(履歴に追加されるコマンドと同じでも) 削除されません。もしこの変数の値が HISTSIZE 変数の値と同じなら、履歴の中で重複するコマンドはすべて削除されます。あるいはもしこの変数の値が 0 なら、重複する履歴は一切削除されません。
HISTSIZE
HOME
IFS
LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME
LC_CTYPE 変数の値はシェルの起動時にのみ反映されます。シェルの実行中にこの変数を変更してもシェルのロケールは変わりません (シェルが非 POSIX 準拠モードで対話モードの場合を除く)。
LINENO
一度この変数に代入したり変数を削除したりすると、この変数を用いて行番号を取得することはできなくなります。
LINES
MAILCHECK
MAILPATH
NLSPATH
OLDPWD
OPTARG
OPTIND
PATH
PPID
PROMPT_COMMAND
PS1
この変数はシェルの起動時に実効ユーザ ID が 0 かどうかによって $ と # のどちらかに初期化されます。
PS1R
PS1S
PS2
PS2R
PS2S
PS4
この変数はシェルの起動時に + に初期化されます。
PS4S
PWD
RANDOM
この変数に非負整数を代入すると乱数を生成する種を再設定できます。
一度この変数を削除すると、この変数を用いて乱数を取得することはできなくなります。またシェルが POSIX 準拠モードで起動された場合、この変数で乱数を取得することはできません。
TERM
YASH_AFTER_CD
YASH_LOADPATH
YASH_LE_TIMEOUT
YASH_PS1, YASH_PS1R, YASH_PS1S, YASH_PS2, YASH_PS2R, YASH_PS2S, YASH_PS4, YASH_PS4S
YASH_VERSION
配列
配列とは、一つの変数に複数の値 (文字列) を持たせたものです。一つの配列の複数の値は位置パラメータと同様に 1 以上の自然数で識別されます。
配列は、単純コマンドによって代入できます。また array 組込みコマンドなどでも配列に代入することができます。配列を削除するには変数と同様に unset 組込みコマンドを使います。
配列を配列のままエクスポートすることはできません。配列をエクスポートしようとすると、配列の各値をコロンで区切って繋いだ一つの文字列の値を持つ変数としてエクスポートされます。
POSIX 準拠モードでは配列は使えません。
コマンドを構成する各単語は、そのコマンドが実行されるときに展開されます。展開とは単語に含まれるパラメータやパターンを処理して具体的な文字列値に置き換えることです。展開には以下の七種類があります。
これらの展開は上に挙げた順序で行われます。特に最初の四つ (チルダ展開・パラメータ展開・コマンド置換・数式展開) を四種展開といいます。
チルダ展開は、~ で始まる単語を特定のパス名に置き換える展開です。単語の先頭にある ~ から最初の / まで (/ がない場合は単語全体) が指定されたパス名に変換されます。ただし、置き換えられる部分が一文字でもクォートされている場合は、チルダ展開は行われません。
展開される内容は、置き換えられる部分の書式によって以下のように決まります。
~
~ユーザ名
~+
~-
~+n, ~-n
変数代入の値に対してチルダ展開が行われる際、値がコロンで区切ってある場合は、コロンで区切ってある各部分をそれぞれ単語とみなしてチルダ展開します。例えば HOME 変数の値が /home/foo のとき、
VAR=~/a:~/b:~/c
は
VAR=/home/foo/a:/home/foo/b:/home/foo/c
と等価です。
チルダ展開に失敗した場合 (指定されたパス名が何らかの原因で得られなかった場合) の動作は POSIX では規定されていませんが、yash では何事もなかったかのように処理を続行します (置き換えられるはずだった部分はそのまま残され、エラーメッセージなどは出ません)。
POSIX 準拠モードでは ~ と ~ユーザ名 の形式の展開のみが有効です。
パラメータ展開は、単語の一部をパラメータの値に置き換える展開です。
よく使われる単純なパラメータ展開の形式は ${パラメータ名} です。これはパラメータ名で指定されたパラメータの値に展開されます。さらに、以下の場合にはパラメータ名を囲む括弧を省略して $パラメータ名 のように書くこともできます。
パラメータ名として特殊パラメータでも位置パラメータでも変数名でもないものを指定した場合は、構文エラーになります。(Yash 以外のシェルでは構文エラーではなく展開エラーになるものもあります)
シェルの unset オプションが無効な場合、パラメータ名に存在しない変数を指定すると展開エラーになります。Unset オプションが有効な場合は、存在しない変数は空文字列に展開されます。
より複雑なパラメータ展開の形式では、パラメータの値を加工することができます。パラメータ展開の一般形は以下の通りです。
パラメータ展開
ここでは便宜上パラメータ名やインデックスの周りに空白を入れましたが、実際には空白を入れてはいけません。パラメータ名以外の部分はいずれも省略可能です。
前置詞
前置詞としてパラメータ名の直前に記号 # を置くことができます。この場合、このパラメータ展開はいま展開しようとしている値の文字数を表す整数に展開されます。展開しようとしているのが配列変数の場合、各要素がそれぞれ文字数を表す整数に置き換えられます。
パラメータ名
パラメータ名には、特殊パラメータ・位置パラメータ・変数を指定することができます。この場合、パラメータ展開は指定されたパラメータの値に展開されます。指定したパラメータ名が配列変数の場合、配列の各要素が特殊パラメータ @ の場合と同様に単語分割されます (インデックス [*] が指定された場合を除く)。
パラメータ名としてパラメータ展開・コマンド置換・数式展開を指定することもできます。これは特に展開の入れ子と言います。この場合、パラメータ展開は内側の展開の展開結果に展開されます。なお、内側のパラメータ展開の括弧 { } は省略できません。また展開の入れ子は POSIX 準拠モードでは使えません。
インデックス
インデックスは展開する値の一部を抜き出すのに使います。インデックスは以下の書式をしています。
インデックス
[単語1,単語2]
ここでの単語1および単語2は通常のトークンと同様に解釈されますが、, と ] で強制的に区切られます。また空白やタブはトークンの区切りとはみなしません。
インデックスは、以下のように解釈されます。
パラメータ名が配列変数の場合または特殊パラメータ * または @ の場合、インデックスは配列の要素または位置パラメータの一部を指定しているものとみなされます。パラメータ名が上記以外の場合は、パラメータの値の一部を指定しているものとみなされます。インデックスで選択された配列の要素またはパラメータの値の一部のみが、パラメータ展開の結果として展開結果に残ります。インデックスによる選択について以下の規則が適用されます。
インデックスが [単語1] の書式をしていて、単語1の展開結果が *、@、# のいずれかだった場合は、パラメータは以下のように処理されます。
*
@
#
パラメータ展開にインデックスが指定されていない場合は、インデックスとして [@] が指定されたものとみなされます。インデックスはPOSIX 準拠モードでは一切使えません。
例1 通常の変数の展開
以下のコマンドは文字列 ABC を出力します:
var='123ABC789' echo "${var[4,6]}"
例2 位置パラメータの展開
以下のコマンドは文字列 2 3 4 を出力します:
set 1 2 3 4 5 echo "${*[2,-2]}"
例3 配列の展開
以下のコマンドは文字列 2 3 4 を出力します:
array=(1 2 3 4 5) echo "${array[2,-2]}"
加工指定
加工指定はパラメータの値を加工します。加工された後の値がパラメータ展開の結果として展開されます。加工指定には以下の形式があります。
-単語
+単語
=単語
?単語
:-単語, :+単語, :=単語, :?単語
#単語
##単語
%単語
%%単語
/単語1/単語2
この加工指定は POSIX 準拠モードでは使えません。
/#単語1/単語2
/%単語1/単語2
//単語1/単語2
:/単語1/単語2
いずれの形式においても、加工指定に含まれる単語は (それが使用されるときのみ) 四種展開されます。
展開しようとしているパラメータ名が配列変数または特殊パラメータ @ または * の場合、加工指定は配列の各要素または各位置パラメータに対してそれぞれ作用します。
コマンド置換は、指定されたコマンドを実行してその出力をコマンドラインに展開します。コマンド置換の書式は以下の通りです。
コマンド置換
`コマンド`
コマンド置換では、コマンドがサブシェルで実行されます。このときコマンドの標準出力がパイプを通じてシェルに送られます。結果として、コマンド置換はコマンドの出力結果に置き換えられます。ただし、コマンドの出力の末尾にある改行は除きます。
$( と ) で囲んだコマンド置換のコマンドは、コマンド置換の入れ子やリダイレクトなどを考慮して予め解析されます。従って、$( と ) の間には基本的に通常通りコマンドを書くことができます。ただし、数式展開との混同を避けるため、中のコマンドが ( で始まる場合はコマンドの最初に空白を挿し挟んでください。
` で囲むコマンド置換では、コマンド置換の入れ子などは考慮せずに、コマンドの中に最初に (バックスラッシュでクォートしていない) ` が現れたところでコマンド置換の終わりとみなされます。` で囲んだコマンド置換の中に ` で囲んだコマンド置換を書く場合は、内側の ` をバックスラッシュでクォートする必要があります。その他、コマンドの一部として ` を入れたいときは、(それがコマンド内部で一重または二重引用符でクォートされていても) バックスラッシュでクォートする必要があります。コマンドの中ではバックスラッシュは $・`・バックスラッシュ・改行の直前にある場合のみ引用符として扱われます。また、` で囲んだコマンド置換が二重引用符の中で使われる場合は、コマンドの中に現れる二重引用符もバックスラッシュでクォートする必要があります。これらのバックスラッシュはコマンドが解析される前に削除されます。
$( と ) で囲んだコマンド置換の中のコマンドは、そのコマンド置換を含むコマンドを解析する時に一緒に解析されます (POSIX 準拠モードを除く)。` で囲んだコマンド置換の中のコマンドは、POSIX 準拠モードであるかどうかに関わらず、そのコマンド置換が実行される時に毎回解析されます。
数式展開は、文字列を数式として解釈して、その計算結果を表す数値に展開します。数式展開の書式は以下の通りです。
数式展開
数式展開では、まず式に対してパラメータ展開・コマンド置換・(入れ子の) 数式展開が行われます。その結果得られた文字列を以下のように数式として解釈し、その計算結果を表す数値に展開されます。
Yash では、数式の中で整数 (C 言語の long 型) と浮動小数点数 (C 言語の double 型) を扱うことができます。ただし POSIX 準拠モードでは浮動小数点数は使えません。整数同士の演算の結果は整数に、浮動小数点数を含む演算の結果は浮動小数点数になります。
数式では C 言語と (ほぼ) 同様に以下の演算子が使えます。
++ および -- 演算子は POSIX 準拠モードでは使えません。
原子式としては整数リテラル・浮動小数点数リテラル・変数が使用できます。数リテラルの書式は C 言語に準じます。0 で始まる整数リテラルは八進数、0x で始まる整数リテラルは十六進数とみなされます。浮動小数点数リテラルでは指数表記も使えます (例えば 1.23×106 は 1.23e+6)。変数の値が計算で使われるとき、その値が数値でない場合はエラーになります。未定義の変数は 0 と見做します。
POSIX 準拠モードでは、変数は必ず数値として解釈されます。 POSIX 準拠モードでないときは、計算で使われる変数のみが数値として解釈され、他の変数はそのまま残ります。
set +o posixly-correct foo=bar echo $((0 ? foo : foo)) # 「bar」を出力 echo $((foo + 0)) # エラー
ブレース展開は、ブレース ({ }) で囲んだ部分をいくつかの単語に分割します。ブレース展開は brace-expand オプションが有効な時のみ行われます。ブレース展開には二種類の形式があります。
カンマ区切りのブレース展開
連続した数値のブレース展開
{始点..終点..差分}
一つ目の形式は、ブレースで囲んだ部分を一つ以上のカンマ (,) で区切ったものです。区切られたそれぞれの部分がブレース展開の前後の部分と結合されて、それぞれ単語として展開されます。例えば a{1,2,3}b は a1b、a2b、a3b という三つの単語に展開されます。
二つ目の形式は {始点..終点} または {始点..終点..差分} です。始点・終点・差分は全て整数である必要があります。この形式のブレース展開では、始点から終点までの各整数がブレース展開の前後の部分と結合されて、それぞれ単語として展開されます。差分は整数の間隔を指定します。例えば a{1..3}b は a1b、a2b、a3b という三つの単語に展開され、a{1..7..2}b は a1b、a3b、a5b、a7b という四つの単語に展開されます。始点が終点より大きい場合は整数は降順に展開されます。
複数のブレース展開を組み合わせたり、入れ子にしたりすることもできます。ブレースをブレース展開としてでなく通常の文字として扱うには、ブレースをクォートしてください。またカンマを区切りとしてでなく通常の文字として扱うには、カンマをクォートしてください。
ブレース展開では展開エラーは発生しません。ブレース展開が正しくできない場合は、単にそれはブレース展開ではなかったものとして、そのまま残されます。
単語分割は、展開の結果をいくつかの単語に分割します。
単語分割で分割の対象となるのは、パラメータ展開・コマンド置換・数式展開で展開された結果の部分だけです。また、二重引用符によるクォートの中で展開された部分は、(特殊パラメータ @ の展開を除いて) 分割の対象となりません。
単語分割は IFS 変数の値に従って行われます。IFS 変数が存在しない場合は、空白文字・タブ・改行の三文字が IFS 変数の値として使われます。
IFS 変数の値に含まれている文字を IFS 文字といいます。IFS 文字のうち空白文字またはタブまたは改行であるものを IFS 空白類といいます。IFS 空白類以外の IFS 文字を IFS 非空白類といいます。
分割は以下の規則に従って行われます。
最後に、以下の条件がすべて成り立つならば、分割された最後の単語が結果から削除されます。
IFS 変数の値が空文字列の場合は、単語は一切分割されません。
パス名展開は、単語をパターンとみなしてファイルを検索し、パターンにマッチする実在のファイルへのパス名に展開します。 パス名展開は glob オプションが無効な時は行われません。
パス名展開においてパターンがマッチするには、検索の対象となるディレクトリの読み込み権限が必要です。検索しようとしたディレクトリがシェルにとって読み込み可能でなければ、シェルはそのディレクトリは空であるとみなします。
以下のオプションがパス名展開の結果に影響します。
null-glob
case-glob
dot-glob
mark-dirs
extended-glob
パス名展開ではエラーは発生しません。マッチするファイルがない場合またはパターンが不正な場合は、展開は行われずパターンはそのまま残ります (null-glob オプションが有効な時を除く)。
ファイルの検索とパターンマッチングは / で区切られたパス名の構成要素ごとに行われます。ワイルドカードやブラケット記法を全く含まない構成要素はパターンとはみなされず、検索とマッチングは行われません。従って、case-glob オプションが無効な時、/*/foo と /*/fo[o] の展開結果が異なる可能性があります (前者では foo の部分がパターンとはみなされないので、例えば /bar/FOO というファイルがあってもマッチしません。)。
パス名展開の拡張機能
Extended-glob オプションが有効な時は、以下の特殊なパターンが使えるようになります。
**
この特殊なパターンは、 foo/bar/** のようにパターン全体の最後にある場合には効果がありません。
.**
***
.***
パターンマッチング記法は特定の文字列の集合を表すパターンの書式と意味の定義です。ある文字列があるパターンの表す文字列の集合に含まれる時、その文字列はそのパターンにマッチするといいます。文字列がパターンに当てはまるかどうかは、以下に示す定義に従って判定されます。
クォートしてある文字および以下に示す特殊な意味を持つ文字以外のすべての文字は、通常の文字として扱われます。パターンに含まれる通常の文字は、その文字自身に当てはまります。
例えば abc というパターンは abc という文字列に当てはまります。(そしてこれ以外の文字列には一切当てはまりません)
文字 ? は任意の一文字に当てはまります。
例えば a?c というパターンは aac、abc、a;c など、a で始まり c で終わる任意の 3 文字の文字列に当てはまります。
文字 * は任意の文字列に当てはまります。ここでいう任意の文字列には空文字列も含まれます。 例えば a*c というパターンは ac、abc、a;xyz;c など、a で始まり c で終わる任意の文字列に当てはまります。
括弧 [ と ] で囲まれた部分はブラケット記法とみなされます。ただし、括弧の間には少なくとも一文字挟まれている必要があります。括弧の間にある文字は以下に示すブラケット記法のための特殊なパターン (ブラケット記法パターン) として解釈されます。ブラケット記法は、括弧の間にあるブラケット記法パターンが示す文字のどれか一つに当てはまります。
最初の括弧 [ の直後に記号 ! がある場合、ブラケット記法に当てはまる文字と当てはまらない文字とが逆転します (そしてこの ! はブラケット記法パターンの一部とはみなされません)。Yash では [ の直後に ^ がある場合も同様に当てはまる文字と当てはまらない文字とが逆転します (が、他のシェルでは ^ の扱いが異なることもあります)。
最初の括弧 [ の直後 (あるいは上述の ! または ^ がある場合はその直後) に括弧 ] がある場合は、それはブラケット記法の終わりを示す括弧としてではなくブラケット記法パターンの一部とみなされます。ブラケット記法パターンの解釈はクォートの処理の後に行われるので、クォートによってブラケット記法パターン内の文字を通常の文字として扱わせることはできません。
パターンの中に [ が含まれていても、それが正しいブラケット記法の形式になっていない場合は、その [ はブラケット記法ではなく通常の文字として扱われます。
以下に示す特殊な意味を持つ記号以外の文字はすべて通常の文字として扱われます。通常の文字はその文字自身を表します。
例えば [abc] というブラケット記法は a、b、c のどれかの文字に当てはまります。従って a[abc]c というパターンは aac、abc、acc という三つの文字列に当てはまります (そしてこれ以外の文字列には当てはまりません)。
二つの文字 (または照合シンボル) をハイフン (-) でつないだものは範囲指定とみなされます。範囲指定は、その二つの文字と照合順序上その間にある全ての文字を表します。照合順序とは文字を辞書順に並べるためにロケールデータに定義される文字の順序関係です。使用中のロケールに定義されている照合順序に従って二つの文字の間にある文字が決まります。
ハイフンの後に ] を置いた場合は、この ] はブラケット記法の終わりを示す括弧とみなされ、ハイフンは通常の文字として扱われます。
例えば [1-5] というブラケット記法は 1、2、3、4、5 という五つの文字のどれか一つに当てはまります。
照合シンボルを用いることで複数の文字からなる照合要素を一つの文字として扱うことができます。(照合要素とは複数の文字をまとめて一つの文字として扱うことができるようにするために考えられた、より一般的な文字の概念です。パターンマッチングにおいて全ての文字は実際には照合要素として扱われています。) 照合シンボルは括弧 [. .] の中に照合要素を挟んだものとして表します。括弧内に書ける照合要素は使用中のロケールデータにおいて照合要素として登録されているものに限ります。
例えば従来スペイン語では 『ch』 という二文字を合わせて一文字として扱っていました。この二文字の組み合わせが照合要素としてロケールに登録されているならば、[[.ch.]df] というブラケット記法は ch、d、f のどれかに当てはまります。もしここで [chdf] というブラケット記法を使うと、これは c、h、d、f のどれかに当てはまり、ch には当てはまりません。
等価クラスを用いることで、ある文字と等価であるとみなされる文字を指定することができます。等価クラスは括弧 [= =] の中に文字を挟んだものとして表します。括弧の間には照合シンボルのように複数の文字からなる照合要素を書くこともできます (上記参照)。等価クラスは、括弧で挟んだ文字そのものの他に、その文字と同じ第一等価クラスに属する全ての文字を表します。どの文字が第一等価クラスに属するかの定義は使用中のロケールデータに従います。
例えばロケールデータにおいて a, à, á, â, ã, ä の 6 文字が同じ第一等価クラスに属すると定義されているとき、[[=a=]] というブラケット記法はこれら六つの文字のどれか一つに当てはまります。[[=à=]] や [[=á=]] も同様です。
文字クラスは特定の種類の文字の集合を表します。文字クラスは括弧 [: :] の間に文字クラスの名前を囲んだものとして表します。文字クラスの名前としては、以下に挙げる共通の文字クラスの他に、使用中のロケールで定義された独自の文字クラスが使用できます。いずれの文字クラスの場合も、文字クラスにどの文字が含まれるのかは使用中のロケールにおける文字クラスの定義に従います。
[:lower:]
[:upper:]
[:alpha:]
[:digit:]
[:xdigit:]
[:alnum:]
[:blank:]
[:space:]
[:punct:]
[:print:]
[:cntrl:]
例えば [[:lower:][:upper:]] というブラケット記法は一文字の小文字または大文字に当てはまります。
リダイレクトはコマンドのファイル記述子を変更する機能です。リダイレクトを使用すると、コマンドの標準入力や標準出力を通常とは異なるファイルに繋ぎ換えた状態でコマンドを実行することができます。
リダイレクトはコマンド (単純コマンドまたは複合コマンド) にリダイレクト演算子を付することで行います。単純コマンドでは (他のトークンとくっつかない限り) どこでもリダイレクト演算子を置くことができます。複合コマンドではコマンドの最後にリダイレクト演算子を付けます。
リダイレクトはコマンドの実行が始まる前に処理されます。一つのコマンドに複数のリダイレクトがある場合は、リダイレクト演算子が書いてある順序で処理されます。オペランドなしの exec 組込みコマンドを実行する場合を除き、リダイレクトは対象となっているコマンドに対してのみ働きます。すなわち、対象のコマンドの実行が終わるとリダイレクトによって変更されたファイル記述子は元の状態に戻ります。
リダイレクト演算子は、< または > で始まります。< で始まるリダイレクト演算子はデフォルトでは標準入力 (ファイル記述子 0) に作用します。> で始まるリダイレクト演算子はデフォルトでは標準出力 (ファイル記述子 1) に作用します。どちらの種類の演算子でも、演算子の直前に非負整数を指定することでデフォルト以外のファイル記述子に作用させることができます (このとき整数と演算子との間に一切空白などを入れてはいけません。また整数をクォートしてもいけません)。
最もよく使われるリダイレクトは、ファイルへのリダイレクトです。
入力のリダイレクト
出力のリダイレクト
>| トークン
>> トークン
入出力のリダイレクト
リダイレクトに含まれるトークンは四種展開されます。対話シェルではさらにパス名展開も行われます (パス名展開の結果が一つのファイルでなければエラーです)。トークンの展開結果がリダイレクト対象のファイル名として使われます。
入力のリダイレクトでは標準入力が対象ファイルからの読み込み専用ファイル記述子に置き換えられます。対象ファイルを開くことができなければエラーになります。
出力のリダイレクトでは標準出力が対象ファイルへの書き込み専用ファイル記述子に置き換えられます。対象ファイルが存在しなければ空の通常ファイルが作成されます。対象ファイルが既にある場合はそのファイルが開かれます。ただし演算子の種類によって以下のように挙動が異なります。
入出力のリダイレクトでは標準入力が対象ファイルへの読み書き両用ファイル記述子に置き換えられます。対象ファイルが存在しなければ空の通常ファイルが作成されます。
ソケットリダイレクト
ファイルのリダイレクトにおいて、対象ファイル名が /dev/tcp/ホスト名/ポート または /dev/udp/ホスト名/ポート の形式をしていて、そのファイルを開くことができない場合、ファイル名に含まれるホスト名とポートに対して通信を行うためのソケットが開かれます。
/dev/tcp/ホスト名/ポート が対象の場合はストリーム通信ソケットを、/dev/udp/ホスト名/ポート が対象の場合はデータグラム通信ソケットを開きます。典型的には、前者は TCP を、後者は UDP をプロトコルとして使用します。
ソケットリダイレクトはどのリダイレクト演算子を使っているかにかかわらず常に読み書き両用のファイル記述子を開きます。
ソケットリダイレクトは POSIX 規格にはない yash の独自拡張です。ただし、bash にも同様の機能があります。
ファイル記述子の複製のリダイレクトでは、既存のファイル記述子をコピーしたり閉じたりできます。
ファイル記述子の複製
>& トークン
トークンはファイルのリダイレクトの場合と同様に展開されますが、これはファイル名ではなくファイル記述子として解釈されます。すなわち、トークンの展開結果はファイル記述子を表す非負整数となる必要があります。
演算子 <& はトークンの展開結果で示されたファイル記述子を標準入力に複製します。演算子 >& はトークンの展開結果で示されたファイル記述子を標準出力に複製します。演算子の直前に非負整数を指定することで、複製先のファイル記述子を変更できます。
トークンの展開結果が非負整数ではなくハイフン (-) となった場合は、ファイル記述子を複製する代わりに閉じます。演算子 <& では標準入力が、演算子 >& では標準出力がデフォルトで閉じられますが、演算子の直前に非負整数を指定することで、閉じるファイル記述子を変更できます。
POSIX 準拠モードでは、<& で複製するファイル記述子は読み込み可能でなければならず、>& で複製するファイル記述子は書き込み可能でなければなりません。
ヒアドキュメント・ヒアストリングを使うとコマンドに直接テキストを渡すことができます。
ヒアドキュメント
<<- トークン
ヒアストリング
ヒアドキュメント・ヒアストリングでは、標準入力がヒアドキュメント・ヒアストリングの内容を読み込み可能なファイル記述子に置き換えられます。
ヒアドキュメント演算子 (<< または <<-) がコマンド中に現れると、その演算子のある行の次の行からはヒアドキュメントの内容とみなされます。ヒアドキュメントの内容の部分は、シェルのコマンドとしては解釈されません。演算子の後にあるトークンはヒアドキュメントの内容の終わりを表します。(トークンでは展開は行われませんが、クォートは認識されます。) 演算子のある行より後の行でトークンだけからなる行が現れた時点でヒアドキュメントの内容は終わりだと判断されます。終わりを表す行はヒアドキュメントの内容には含まれません。演算子 <<- を使っている場合は、ヒアドキュメントの内容の各行頭にあるタブはすべて削除されます。このときトークンの前にタブがあっても (その行に他の余計な文字がなければ) ヒアドキュメントの内容の終わりとして認識します。
一行のコマンドに複数のリダイレクト演算子がある場合は、リダイレクトの内容は順番に処理されます。すなわち、その行の次の行からは最初のリダイレクトの内容として扱われ、その内容が終わったら、その次の行からは次のリダイレクトの内容として扱われます。最後のリダイレクトの内容が終わったら、その次の行からは再びコマンドとして解釈されます。
リダイレクトの内容は基本的に単なる文字列として扱われます。内容に含まれる空白やタブ、その他の記号はそのままコマンドに渡されます。ただし、トークンが全くクォートされていない場合は、ヒアドキュメントの内容はパラメータ展開・コマンド置換・数式展開され、$, `, ", \ の直前にある場合および行の連結を行う場合にのみバックスラッシュを引用符として扱えます。
ヒアストリングでは、演算子の後にあるトークンはファイルのリダイレクトの場合と同様に展開されます。この展開結果がヒアストリングの内容となります。ただしヒアストリングの内容の末尾には自動的に改行が付きます。
ヒアストリングは POSIX 規格にはない yash の独自拡張ですが、bash, ksh, zsh にも同様の機能があります。
パイプリダイレクトを用いるとプロセス間通信に利用可能なパイプを開くことができます。
パイプリダイレクト
トークンはファイルのリダイレクトの場合と同様に展開されますが、これはファイル名ではなくファイル記述子として解釈されます。すなわち、トークンの展開結果はファイル記述子を表す非負整数となる必要があります。
パイプリダイレクトはパイプを開きます。標準出力 (演算子 >>| の直前に非負整数を指定している場合はその値のファイル記述子) がパイプに書きこむためのファイル記述子になります。またトークンの展開結果で示されたファイル記述子がパイプから読み込むためのファイル記述子になります。
パイプリダイレクトは POSIX 規格にはない yash の独自拡張です。
プロセスリダイレクトを用いると別のコマンドの入力または出力を受け渡せるパイプを開くことができます。
プロセスリダイレクト
>(サブコマンド...)
プロセスリダイレクトでは、サブコマンドがサブシェルで実行されます。このとき、<(サブコマンド...) の形式のプロセスリダイレクトでは、サブコマンドの標準出力がこのコマンドの標準入力に渡るようパイプが開かれます。>(サブコマンド...) の形式のプロセスリダイレクトでは、このコマンドの標準出力がサブコマンドの標準入力に渡るようパイプが開かれます。
プロセスリダイレクトは POSIX 規格にはない yash の独自拡張です。Bash と zsh にはプロセスリダイレクトと同様の構文を用いるプロセス置換という機能がありますが、プロセスリダイレクトとプロセス置換の挙動は異なっており、互換性はありません。
この節ではコマンドがどのように実行されるかを説明します。
単純コマンドは以下の手順に従って実行されます。
以下、展開の結果得られた最初の単語をコマンド名、それ以外の単語をコマンド引数と呼びます。得られた単語が一つの場合は、コマンド引数は存在しません。得られた単語が一つもない場合は、コマンド名もコマンド引数も存在しません。
コマンド名が指定された場合または all-export オプションが有効な場合は、代入される変数は自動的にエクスポート対象になります。
実行したコマンドの終了ステータスがこの単純コマンドの終了ステータスになります。コマンドが見つからなかった場合は、コマンドは実行されず終了ステータスは 127 になります。コマンドが見つかったが起動に失敗した場合は、終了ステータスは 126 になります。コマンドが起動されたがシグナルによって中断された場合は、終了ステータスはそのシグナルの番号に 384 を足した数になります。
コマンドの検索
単純コマンドで実行すべきコマンドは、展開で得られたコマンド名に基づいて以下の手順で特定されます。
PATH 変数の値は、いくつかのディレクトリのパス名をコロン (:) で区切ったものとみなされます (空のパス名はシェルの作業ディレクトリを表しているものとみなします)。それらの各ディレクトリについて順に、ディレクトリの中にコマンド名と同じ名前の実行可能な通常のファイルがあるか調査します。そのようなファイルがあれば、そのファイルが実行すべき外部コマンドとして特定されます (ただし、コマンド名と同じ名前の組込みコマンドがあれば、代わりにその組込みコマンドが実行すべきコマンドとして特定されます)。どのディレクトリにもそのようなファイルが見つからなければ、実行すべきコマンドは見つからなかったものとみなされます。
外部コマンドの検索が成功しパス名が特定できた場合、そのパス名が絶対パスならば、シェルはそのパス名を記憶し、再び同じコマンドを実行する際に検索の手間を省きます。ただし、再びコマンドを実行しようとした際に、記憶しているパス名に実行可能ファイルが見当たらない場合は、検索をやり直します。シェルが記憶しているパス名は hash 組込みコマンドで管理できます。
シェルは、入力が終わりに達して全てのコマンドを解釈・実行し終えた時や、exit 組込みコマンドを実行したときなどに終了します。シェルの終了ステータスは、シェルが最後に実行したコマンドの終了ステータスを 256 で割った余りです (一つもコマンドを実行しなかったときは 0)。
Trap 組込みコマンドでシェル終了時のハンドラが登録されている場合は、シェルが終了する直前にそのハンドラが実行されます。ただしこのハンドラ内で実行したコマンドはシェルの終了ステータスには影響しません。
対話モードでないシェルの実行中に下記エラーが発生した場合、シェルは直ちに終了します。このときシェルの終了ステータスは非 0 です。
Yash はそうではありませんが、コマンドの検索において実行すべきコマンドが見つからなかったときに直ちに終了するようなシェルもあります。
関数は一つの複合コマンドを単純コマンドのように呼び出せるようにする機構です。関数は関数定義コマンドによって定義でき、単純コマンドによって実行できます。関数を削除するには unset 組込みコマンドを使います。
Yash には、シェルの起動時に最初から定義されている関数は一つもありません。
関数の実行は、関数の内容である複合コマンドを実行することによって行われます。関数の実行中は、関数の引数が位置パラメータになります。それまでの位置パラメータは一時的に使えなくなりますが関数の実行が終わった時に元の位置パラメータに戻ります。
ローカル変数
ローカル変数とは、関数の実行中にだけ有効な一時的な変数です。ローカル変数は typeset 組込みコマンドを使って作ることができます。関数の実行中に作られたローカル変数は関数の実行が終わった時に削除され、ローカル変数を作る前の元の変数の状態に戻ります。
関数内で定義したローカル変数は、関数の実行に先立って定義してあった同名の他の変数を隠蔽します。隠蔽された変数は、関数の実行が終わってローカル変数がなくなるまで使えなくなります。
関数の実行中でないときにローカル変数を作ることはできません。ローカル変数を作ろうとしても、通常の変数になります。
シェルは実行時に以下の情報を保持します。
これらの情報はシェルが起動されたときに元のプログラムからシェルに受け継がれます。そしてシェルが起動する外部コマンドやサブシェルにもシェルから受け継がれます。
これらの情報は所定の組込みコマンド等を使って変更可能です。
サブシェル
サブシェルは、実行中のシェルのプロセスのコピーです。サブシェルは括弧 ( ) で囲んだグルーピングやパイプラインで使われます。
サブシェルはシェルのプロセスのコピーであるため、上記の情報の他にシェルで定義された関数やエイリアスなどの情報も元のシェルから受け継ぎます。ただし、
サブシェルは元のシェルとは独立しているため、サブシェルでの作業ディレクトリの変更や変数代入は元のシェルに影響しません。
Yash 以外のシェルでは、サブシェル内で実行されるコマンドが trap 組込みコマンドのみの場合にはトラップの設定を解除しないものもあります。
対話モードは、利用者が直接シェルを操作することを意図したモードです。シェルの起動時に -i オプションを指定した場合 (その他対話モードが有効になる条件が満たされている場合)、シェルは対話モードになります。シェルが起動した後は、そのシェルの対話モードのオン・オフを切り替えることはできません。
対話モードが有効な時......
対話モードでは、シェルはコマンドの入力を読み取る直前にプロンプトを標準エラーに出力します。プロンプトの内容は PS1 変数で指定します。ただし、複数行にわたるコマンドを読み取る際、二行目以降の読み取りには PS1 ではなく PS2 変数の値がプロンプトとして表示されます。
プロンプトの表示の際には、まず PS1 (または PS2) 変数の値がパラメータ展開・コマンド置換・数式展開で展開されます (ただし POSIX によればパラメータ展開だけが行われることになっています)。この展開後の値は以下の通り解釈され、その結果がプロンプトとして標準エラーに出力されます。
POSIX 準拠モードでは、値に含まれる ! はこれから入力しようとしているコマンドの履歴番号に変換されます。感嘆符そのものをプロンプトに表示させるには !! と二つ続けて書きます。これ以外の文字はプロンプトにそのまま表示されます。
POSIX 準拠モードでないときは、バックスラッシュで始まる以下の記法が解釈されます。これらの記法以外の文字はそのままプロンプトに表示されます。
\a
\e
\j
\n
\r
\!
\$
\\
\[, \]
\fフォント指定.
k
r
g
y
b
m
c
w
K
R
G
Y
B
M
C
W
t
d
s
u
v
b
i
o
x
D
文字と背景の色は最終的に端末によって決まるため、実際にはここで指定した色と異なる色で表示されることがあります。
入力するコマンドの右側に表示されるプロンプトを指定することもできます (右プロンプト)。PS1/PS2 変数に対応する右プロンプトは PS1R/PS2R 変数で指定します。
また、プロンプトのフォントだけでなく、入力するコマンドのフォントを変えることもできます。PS1S (または PS2S) 変数に上述のフォントを指定するシーケンスを指定することで、コマンド入力時のコマンドのフォントが変わります。
POSIX 準拠モードでないときは、上記の変数は名前に YASH_ を付けた名前 (例えば YASH_PS1) で定義することもできます。これにより、POSIX 準拠モードとは異なるプロンプトを使い分けることができます。
POSIX 準拠モードでないときは、プロンプトを出す前に PROMPT_COMMAND 変数の値がコマンドとして実行されます。
コマンド履歴は実行したコマンドを記録し後で再び実行することのできる機能です。対話モードでシェルが読み込んだコマンドは自動的にコマンド履歴に記録されます。履歴に記録したコマンドは行編集で呼び出して再実行することができます。また fc・history 組込みコマンドで履歴のコマンドを再実行したり編集したりすることもできます。
コマンドは行単位で履歴に記録されます。空白以外の文字を一切含まない行は履歴には記録されません。また hist-space オプションが有効なときは空白で始まる行は履歴に記録されません。
コマンド履歴の内容は HISTFILE 変数で指定されるファイルに保存されます。対話モードのシェルの起動後に履歴関連の機能が初めて使用されるとき、HISTFILE 変数の値をファイル名とみなしてファイルを開きます。既にファイルに履歴データが保存されている場合は、それが読み込まれます。ファイルが存在しないか内容が履歴データではない場合は、新しい履歴ファイルに初期化されます。HISTFILE 変数が存在しない場合やファイルを開くことができない場合は履歴はファイルに保存されませんが、履歴機能自体は使用できます。
シェルが記録するコマンドの数は HISTSIZE 変数で指定します。履歴の件数がこの変数の値を超えると順次古いデータから削除されます。この変数が存在しない場合または値が自然数でない場合は、履歴は 500 件まで記録されます。
HISTFILE および HISTSIZE 変数は履歴機能が初めて使用されるときにのみ参照され、それ以降は変数を再設定しても履歴機能の動作に影響しません。履歴機能が利用されるときというのは、具体的には以下のタイミングです。
このため HISTFILE および HISTSIZE 変数は原則としてシェルの起動時に読み込まれる初期化スクリプトの中で設定する必要があります。
複数のシェルプロセスが同じ履歴ファイルを使用している場合、これらのシェルは一つの履歴データを共有します。このとき例えばあるシェルプロセスで実行したコマンドを別のシェルプロセスで実行することができます。同じ履歴を使用しているシェルの間で HISTSIZE が異なっていると履歴が正しく共有されないので、HISTSIZE の値は統一するようにしてください。
Yash は独自の形式の履歴ファイルを使用しているため、履歴ファイルを他の種類のシェルと共用することはできません。
履歴に同じコマンドを記録する無駄を解消するため、HISTRMDUP 変数を使用することができます。新しくコマンドを履歴に記録しようとする際、すでに同じコマンドが最近の $HISTRMDUP 件の履歴データの中に記録されていれば、その既に記録されているコマンドは履歴から削除されます。
対話モードのシェルには、電子メールが届いたらそれを知らせる機能があります。これは所定のファイルの更新日時を調べて、更新日時が変わっていたらメッセージを表示するというものです。受信したメールのデータが保存されるファイルをチェック対象として指定しておくことで、メールを受信したときにメッセージが表示されるようになります。
ファイル更新のチェックはシェルがプロンプトを出す直前に行います。チェックを行う間隔を MAILCHECK 変数で指定することができます。この変数で指定した秒数が経過するごとに、シェルはプロンプトを出す直前にチェックを行います。この変数の値が 0 になっている場合は、プロンプトを出す直前に毎回チェックを行います。また変数の値が 0 以上の整数でない場合は、チェックは一切行いません。
更新日時をチェックする対象のファイルは MAIL 変数で指定します。この変数にチェックしたいファイルのパス名を指定しておくと、シェルはそのファイルの更新日時をチェックします。ファイルの更新日時が前回チェックしたときと変わっていたら、新着メールを知らせるメッセージを標準エラーに出力します。(ただしファイルが空のときはメッセージは出ません (POSIX 準拠モードのときを除く))
複数のファイルをチェックの対象にしたい場合やメッセージを自分で指定したい場合は、MAIL 変数の代わりに MAILPATH 変数を使うことができます。MAILPATH 変数が設定されている場合は、MAIL 変数の設定は無視されます。MAILPATH 変数の値には、一つ以上のファイルのパス名をコロン (:) で区切って指定することができます。シェルは毎回のチェックでそれぞれのファイルの更新日時を調べ、ファイルが更新されていたらメッセージを表示します。メッセージを自分で指定するには、パス名の直後にパーセント (%) を置き、続けて表示させたいメッセージを置きます。それぞれのファイルごとに異なるメッセージを指定することができます。(パーセントをパス名とメッセージとの区切りではなくパス名の一部としたい場合はパーセントをバックスラッシュでクォートしてください) パーセントの後に指定されたメッセージは、表示の前にパラメータ展開されます。
例えば MAILPATH 変数の値が /foo/mail%New mail!:/bar/mailbox%You've got mail:/baz/mail\%data だとすると、ファイル /foo/mail が更新されたときは New mail! が、/bar/mailbox が更新されたときは You've got mail が、/baz/mail%data が更新されたときはデフォルトのメッセージが表示されます。
ジョブ制御とは、複数のコマンドを同時に実行し、必要に応じてそれらを中断・再開させる機能です。シェルは、オペレーティングシステムが提供する端末の機能やプロセスグループ管理機構などを用いて、ジョブ制御を実現します。
ジョブ制御が有効な時......
ジョブ制御が無効な時、シェルが起動する各プロセスはシェルと同じプロセスグループに属しますが、実行した非同期コマンドはそれぞれジョブ制御の対象となっていないジョブとして扱います。
ここでジョブ制御に関連する組込みコマンドを簡単に紹介します。
jobs
fg および bg
wait
disown
kill
対話モードでジョブ制御が有効な時、シェルはプロンプトを出す直前にジョブの状態変化を報告します。これ以外のタイミングで状態変化を報告してほしい場合は、以下のオプションを指定することができます。
notify
notify-le
シェルが管理しているジョブは以下のタイミングで削除されます。
対話シェルが自動的にジョブの状態変化を報告するときにはジョブは削除されません。
いくつかの組込みコマンドでは、操作対象のジョブを指定するためにジョブ ID という以下のような記法を用います。
%, %%, %+
%-
%n
%string
%?string
現在のジョブ及び前のジョブとは、シェルが特定の方法で選んだジョブのことで、fg 組込みコマンドなどでジョブを選択しやすくするために用意されています。現在のジョブと前のジョブは以下の規則を満たすように選ばれます。
Yash には、現在のジョブを選択する方針を指示するためにいくつかのオプションが用意されています。ただしこれらのオプションよりも上記の規則のほうが優先します。
cur-async
cur-bg
cur-stop
これらの規則・オプションに反しない限り、一度選ばれた現在のジョブ・前のジョブはずっと現在のジョブ・前のジョブのままです。
POSIX は現在のジョブ・前のジョブの選択方法を細かく定めていないため、他のシェルでは選び方が異なることがあります。
組込みコマンドとはシェルに内蔵されたコマンドです。組込みコマンドは外部のプログラムを起動することなくシェル自身によって実行されます。
Yash の組込みコマンドは特殊組込みコマンド・準特殊組込みコマンド・通常の組込みコマンドの三種類に分けられます。
特殊組込みコマンドは他の組込みコマンドよりも特に重要なコマンドで、他のコマンドとは異なる性質をいくつか持っています。まず、特殊組込みコマンドは対応する外部コマンドの存在に関係なく常に実行されます。また特殊組込みコマンドにおける変数代入の結果はコマンドの実行が終わった後も残ります。さらに POSIX 準拠モードでは、特殊組込みコマンドにおいてリダイレクトエラーまたは代入エラーが発生した場合あるいはコマンドのオプションやオペランドの使い方が間違っている場合、シェルが対話モードでなければシェルは直ちに非 0 の終了ステータスで終了します。
準特殊組込みコマンドは特殊組込みコマンドに次いで重要な組込みコマンドで、対応する外部コマンドの存在に関係なく常に実行されます。その他の点では準特殊組込みコマンドは通常の組込みコマンドと同じです。
外部コマンドとして実装可能な組込みコマンドや POSIX に規定されていない組込みコマンドを含む、重要度の低い組込みコマンドは通常の組込みコマンドです。POSIX 準拠モードでは、通常の組込みコマンドは対応する外部コマンドが PATH 変数の検索で見つかった場合のみ実行されます。
ここでは組込みコマンドの引数に関する一般的な規則について説明します。Yash の組込みコマンドの引数の指定・解釈の仕方は、他に断りがない限りこの規則に従います。
コマンドの引数は、オプションとオペランドの二種類に分けられます。オプションはハイフン (-) で始まる引数で、主にコマンドの動作を変更するのに使われます。オプションの中にはそれに対応する引数をとるものもあります。オペランドはオプション以外の引数で、主にコマンドが処理を行う対象を指定するのに使われます。
一つのコマンドに複数のオプションを与える場合、原則としてそれらのオプションの順序はコマンドの動作に影響しません。しかしオペランドの順序には意味があります。
オプションには一文字のオプションと長いオプションとがあります。一文字のオプションは英数字一文字によって識別されるオプションです。長いオプションはもっと長い文字列によって識別されるオプションです。POSIX 規格は一文字のオプションについてしか規定していないため、POSIX 準拠モードでは長いオプションは使えません。
一文字のオプションは、一つのハイフンと一文字の英数字からなります。例えば -a は一文字のオプションです。引数をとるオプションでは、コマンドに与えられた引数の並びの中でそのオプションの直後に位置している引数がそのオプションに対する引数とみなされます。
例4 Set 組込みコマンドと一文字のオプション
Set 組込みコマンドにおいて、-m は引数をとらない一文字のオプション、-o は引数をとる一文字のオプションです。
この二つの例では、errexit が -o オプションに対する引数となります。
上の二つ目の例では、-o オプションとそれに対する引数が一つのコマンドライン引数になっています。POSIX はこのような書き方は避けなければならないと定めており、POSIX に従うアプリケーションは必ず一つ目の例のようにオプションとそれに対する引数を別々のコマンドライン引数として与えなければなりません。しかし yash はどちらの指定の仕方も受け付けるようになっています。
引数をとらない複数の一文字のオプションは、一つにまとめて書くことができます。例えば -a, -b, -c という三つのオプションは -abc と書けます。
長いオプションは、二つのハイフンとオプション名を表す文字列からなります。例えば --long-option は長いオプションです。オプション名は他と紛らわしくない限り末尾を省略できます。例えば他に --long で始まる長いオプションがなければ、--long-option は --long と省略できます。引数をとるオプションでは、一文字のオプションの場合と同様に、オプションの直後にあるコマンドライン引数がそのオプションに対する引数とみなされます。あるいは、オプション名の後に等号 (=) で区切って直接引数を与えることもできます。
例5 Fc 組込みコマンドと長いオプション
Fc 組込みコマンドにおいて、--quiet は引数をとらない長いオプション、--editor は引数をとる長いオプションです。
この二つの例では、vi が --editor オプションに対する引数となります。
オプション (およびオプションに対する引数) 以外の引数は、全てオペランドとみなされます。POSIX は、オペランドは全てオプションより後に書かなければならないと定めています。そのため POSIX 準拠モードでは、最初のオペランドより後にある引数は (たとえそれがオプションであるように見えても) 全てオペランドとして解釈します。POSIX 準拠モードでないときは、オペランドの後にオプションを書いても構いません。
POSIX 準拠モードであるかどうかにかかわらず、ハイフン二つからなる引数 (--) はオプションとオペランドとの区切りとして使えます。この区切り以降の全てのコマンドライン引数はオペランドとして解釈されるため、ハイフンで始まるオペランドを正しく指定できます。
例6 Set 組込みコマンドのオプションとオペランド
この例では、-a と -b がオプションで、-c と -d がオペランドとなります。区切り (--) 自体はオプションでもオペランドでもありません。
POSIX 準拠モードであるかどうかにかかわらず、ハイフン一つからなる引数 (-) は常にオペランドとみなされます。
行編集機能は、対話モードのシェルにコマンドを入力する際に使える、コマンドの簡易編集機能です。行編集機能は、コマンドを編集するための簡単なエディタとして働きます。行編集機能はコマンド履歴とも連携しており、fc コマンドを使ってエディタを起動する代わりに行編集で直接コマンドを編集・再実行できます。
行編集には複数の編集モードがあり、モードごとにキー操作の割り当てが異なります。行編集の有効・無効を切り替えたりモードを選択したりするには、set 組込みコマンドで編集モードに対応するオプションを設定します。あるモードに対応するオプションを有効にすると、そのモードの行編集が有効になります (同時に他のモードのオプションは自動的に無効になります)。現在有効になっているモードのオプションを無効にすると、行編集は無効になります。現在 yash が搭載している編集モードは vi 風と emacs 風の二種類で、それぞれ対応するオプションは -o vi と -o emacs です。
シェルが対話モードで起動したとき、標準入力と標準エラーがともに端末ならば、vi 風行編集が自動的に有効になります。
行編集は、標準入力と標準エラーがともに端末のときだけ使えます。この条件が満たされていないときは、行編集は働きません。行編集が働くとき、シェルは termios インタフェースを使用して端末の入出力モードを一時的に変更し、terminfo インタフェースを使用して入力されたキーの判別などを行います。
行編集を有効にし編集モードを選択するオプションとして、以下のオプションが set 組込みコマンドで設定できます。
vi
emacs
この他に、行編集に関わるものとして以下のオプションが設定できます。
le-always-rp
le-comp-debug
le-conv-meta
le-no-conv-meta
Le-conv-meta オプションと le-no-conv-meta オプションは片方しか有効にできません (片方を有効にするともう片方は自動的に無効になります)。どちらも無効な時は terminfo データベースの情報に従って 8 ビット目を meta-key とみなすかどうか判断します。
le-predict
le-predict-empty
le-prompt-sp
このオプションは最初から有効になっています。
le-visible-bell
Vi 風編集モードは vi に似たキー操作で編集を行う編集モードです。Vi 風編集モードでは、挿入モードとコマンドモードの二つのモードを適宜切り替えて編集を行います。編集が始まるときはモードは必ず挿入モードになっています。挿入モードでは入力した文字が基本的にそのままバッファに挿入されます。コマンドモードでは入力した文字はカーソルを移動したり文字を消去したりするコマンドとして解釈されます。
Emacs 風編集モードは emacs に似たキー操作で編集を行う編集モードです。入力した文字は基本的にそのままバッファに挿入されますが、コマンドとして解釈される一部のキー操作が vi 風編集モードの挿入モードと異なります。
これらのモードの他に、コマンドの検索の際に用いる検索モードが vi 風と emacs 風とそれぞれにあります。
行編集中に入力された文字は全て以下の行編集コマンドのいずれかとして解釈されます。コマンドとキーの対応は bindkey 組込みコマンドで変更できます (検索モードを除く)。
以下の一覧には各コマンドに対応するキー入力の初期設定も示してあります。なお、 『vi-insert』 は vi 風編集モードの挿入モードを、 『vi-command』 は vi 風編集モードのコマンドモードを、 『vi-search』 は vi 風編集モードの検索モードを、 『emacs』 は emacs 風編集モードを、 『emacs-search』 は emacs 風編集モードの検索モードを示します。
コマンドの中には引数を指定することでその動作を変更できるものがあります。例えば forward-char コマンドは通常はカーソルを一文字分前に移動しますが、引数を指定するとその引数の文字数分だけカーソルを移動します。引数は、目的のコマンドの直前に digit-argument コマンドを使うことで指定できます。
基本的な編集コマンド
noop
vi-command
alert
self-insert
コマンドライン推定が有効な場合、推定された部分は無視します。Accept-prediction コマンドも参照。
vi-insert, emacs
insert-tab
emacs
expect-verbatim
vi-insert, vi-search, emacs-search
emacs
digit-argument
Digit-argument コマンドを連続して使うことで複数桁の引数を指定できます。例えば vi 風編集モードのコマンドモードで 12l と入力すると、forward-char コマンドに引数 12 を与えたことになります (すなわちカーソルが左に 12 文字分移動します)。
vi-command
emacs
bol-or-digit
vi-command
accept-line
vi-insert, vi-command, emacs, emacs-search
abort-line
vi-insert, vi-command, vi-search, emacs, emacs-search
eof
eof-if-empty
vi-insert, vi-command
eof-or-delete
emacs
accept-with-hash
vi-command
emacs
accept-prediction
setmode-viinsert
vi-command
setmode-vicommand
vi-insert
setmode-emacs
expect-char, abort-expect-char
redraw-all
vi-insert, vi-command, vi-search, emacs, emacs-search
clear-and-redraw-all
移動コマンド
移動コマンドはカーソルを移動させるコマンドです。ほとんどの移動コマンドは引数を与えることでそのコマンドを引数の回数だけ実行するのと同じように動作させられます。例えば forward-char コマンドに引数 4 を与えると、カーソルを 4 文字先に進めます。
以下、bigword とは一文字以上の連続した空白でない文字をいい、semiword とは一文字以上の連続した空白でも句読点でもない文字をいい、emacsword とは一文字以上の連続した英数字をいいます。また viword とは以下のいずれかをいいます
以下に移動コマンドの一覧を示します。
forward-char
vi-insert
vi-command
emacs
backward-char
vi-insert
vi-command
emacs
forward-bigword
vi-command
end-of-bigword
vi-command
backward-bigword
vi-command
forward-semiword
end-of-semiword
backward-semiword
forward-viword
vi-command
end-of-viword
vi-command
backward-viword
vi-command
forward-emacsword
emacs
backward-emacsword
emacs
beginning-of-line
vi-insert, vi-command
emacs
end-of-line
vi-insert
vi-command
emacs
go-to-column
vi-command
first-nonblank
vi-command
find-char
vi-command
emacs
find-char-rev
vi-command
emacs
till-char
vi-command
till-char-rev
vi-command
refind-char
vi-command
refind-char-rev
vi-command
編集コマンド
編集コマンドはバッファの内容を変更するコマンドです。ほとんどの編集コマンドは引数を与えることでそのコマンドを引数の回数だけ実行するのと同じように動作させられます。
名前に 『kill』 が付くコマンドで削除した文字列はキルリングという場所に保管され、後で put などのコマンドでバッファに戻すことができます。
以下に編集コマンドの一覧を示します。
delete-char
vi-insert, emacs
delete-bigword
delete-semiword
delete-viword
delete-emacsword
backward-delete-char
vi-insert, emacs
backward-delete-bigword
backward-delete-semiword
vi-insert
backward-delete-viword
backward-delete-emacsword
delete-line
forward-delete-line
backward-delete-line
vi-insert
kill-char
vi-command
kill-bigword
kill-semiword
kill-viword
kill-emacsword
emacs
backward-kill-char
vi-command
backward-kill-bigword
emacs
backward-kill-semiword
backward-kill-viword
backward-kill-emacsword
emacs
kill-line
forward-kill-line
emacs
backward-kill-line
emacs
put-before
vi-command
put
vi-command
put-left
emacs
put-pop
emacs
undo
vi
emacs
undo-all
vi
emacs
cancel-undo
vi
cancel-undo-all
redo
vi-command
補完コマンド
complete
complete-next-candidate
vi-insert, emacs
complete-prev-candidate
vi-insert, emacs
complete-next-column
complete-prev-column
complete-next-page
complete-prev-page
complete-list
emacs
complete-all
emacs
complete-max
complete-max-then-list
complete-max-then-next-candidate
complete-max-then-prev-candidate
clear-candidates
Vi 固有のコマンド
vi-replace-char
vi-command
vi-insert-beginning
vi-command
vi-append
vi-command
vi-append-to-eol
vi-command
vi-replace
vi-command
vi-switch-case
vi-switch-case-char
vi-command
vi-yank
vi-command
vi-yank-to-eol
vi-command
vi-delete
vi-command
vi-delete-to-eol
vi-command
vi-change
vi-command
vi-change-to-eol
vi-command
vi-change-line
vi-command
vi-yank-and-change
vi-yank-and-change-to-eol
vi-yank-and-change-line
vi-substitute
vi-command
vi-append-last-bigword
vi-command
vi-exec-alias
vi-command
vi-edit-and-accept
vi-command
vi-complete-list
vi-command
vi-complete-all
vi-command
vi-complete-max
vi-command
vi-search-forward
vi-command
vi-search-backward
vi-command
Emacs
固有のコマンド
emacs-transpose-chars
emacs
emacs-transpose-words
emacs
emacs-downcase-word
emacs
emacs-upcase-word
emacs
emacs-capitalize-word
emacs
emacs-delete-horizontal-space
emacs
emacs-just-one-space
emacs
emacs-search-forward
emacs
emacs-search-backward
emacs
コマンド履歴関連のコマンド
oldest-history
newest-history
return-history
oldest-history-bol
vi-command
newest-history-bol
return-history-bol
vi-command
oldest-history-eol
emacs
newest-history-eol
return-history-eol
emacs
next-history
prev-history
next-history-bol
vi-command
prev-history-bol
vi-command
next-history-eol
vi-insert, emacs
prev-history-eol
vi-insert, emacs
search-again
vi-command
search-again-rev
vi-command
search-again-forward
search-again-backward
beginning-search-forward
beginning-search-backward
コマンド履歴検索モードのコマンド
srch-self-insert
vi-search, emacs-search
srch-backward-delete-char
vi-search, emacs-search
srch-backward-delete-line
vi-search, emacs-search
srch-continue-forward
emacs-search
srch-continue-backward
emacs-search
srch-accept-search
vi-search
emacs-search
srch-abort-search
vi-search
emacs-search
Bindkey コマンドで行編集のキー設定を表示・設定する際、ファンクションキーなどの特殊なキーはエスケープシーケンスで表わします。エスケープシーケンスは全てバックスラッシュ (\) で始まります。またバックスラッシュそのものもエスケープの対象です。エスケープシーケンスに対するキーの割り当ては以下の通りです。
\\
\B
\D
\E
\H
\I
\L
\N
\P
\R
\U
\X
\!
\#
\$
\?
\^@
\^A, \^B, ..., \^Z
※ Ctrl + I は Tab、Ctrl + J は Newline、Ctrl + M は Carriage-return です。
\^[
\^\
\^]
\^^
\^_
\^?
\F00, \F01, ..., \F63
\a1
\a3
\b2
\bg
\bt
\c1
\c3
\ca
\cl
\cn
\co
\cp
\cr
\cs
\ct
\dl
\ei
\el
\es
\et
\ex
\fd
\hp
\il
\ll
\me
\mk
\ms
\mv
\nx
\on
\op
\pr
\pv
\rd
\re
\rf
\rh
\rp
\rs
\sf
\sl
\sr
\st
\su
\sv
\ud
\SE
\SH
\SI
\SL
\SR
\SX
\Sbg
\Scn
\Sco
\Scp
\Scr
\Sdl
\Sel
\Sex
\Sfd
\Shp
\Smg
\Smv
\Snx
\Sop
\Spr
\Spv
\Srd
\Sre
\Srp
\Ssu
\Ssv
\Sud
INTR, EOF, KILL, ERASE の四つは stty コマンドなどで設定される端末の特殊文字です。一般的な環境では、INTR は Ctrl + C に、EOF は Ctrl + D に、KILL は Ctrl + U に、ERASE は Ctrl + H または Ctrl + ? に設定されています。これら四つは他のキー入力よりも優先して認識されます。
行編集でコマンドを入力している途中で Tab キーを押すことで、コマンドの名前やオプション、引数を補完することができます。コマンド名やファイル名を途中まで打ち込んだところで Tab キーを押すと、その名前に一致するコマンド名やファイル名の一覧が現れます。さらに続けて Tab キーを押すと、入力したい名前を一覧の中から選ぶことができます。(一致する名前が一つしかない場合は、一覧は現れず、直接名前がコマンドラインに入力されます。)
補完の対象となる名前に * や ? などの文字が入っている場合は、そのパターンに一致する名前全てがコマンドラインに展開されます。(一覧による選択はできません)
標準状態では、コマンド名を入力しているときはコマンド名が、コマンドの引数を入力しているときはファイル名が補完されます。しかし補完を行う関数 (補完関数) を定義することで補完内容を変更することができます。
補完動作の詳細
シェルを起動してから初めて補完を行おうとしたとき、コマンド . -AL completion/INIT を実行するのと同様にして、ファイル completion/INIT をロードパスから読み込みます。ファイルが見つからない場合は、そのまま補完動作を続けます。(この処理は主にシェルに付属している補完関数を読み込むためのものですが、ロードパス内に自分で用意したファイルを置いておくことで代わりにそれを読み込ませることもできます。)
補完は、対象に応じて以下のように行います。
コマンド名
コマンドの引数
この他、チルダ展開におけるユーザ名やパラメータ展開におけるパラメータ名を入力しているときは、ユーザ名やパラメータ名が常に補完されます。(補完のしかたを変更することはできません)
補完関数は普通の関数と同様に (位置パラメータなしで) 実行されます。ただし、補完関数の実行時には以下のローカル変数が自動的に設定されます。
IFS
WORDS
TARGETWORD
補完関数の中で complete 組込みコマンドを実行することで、補完候補が生成されます。シェルは補完関数実行中に生成された補完候補を用いて補完を行います。
補完関数の実行中は、端末に対して入出力を行ってはなりません (端末の表示が乱れてしまいます)。スムーズな補完を行うために、補完の実行中に長い時間のかかる処理を行うのは避けてください。
補完の実行中は、POSIX 準拠モードと err-return オプションが強制的に解除されます。また err-exit オプションは無視され、トラップは実行されません。
コマンドライン推定は実験的な機能です。Le-predict オプションが有効なとき、行編集で入力したコマンドの部分に続けて入力されそうなコマンド文字列を推定します。
例えば、あなたは既に一度 ls Documents というコマンドを実行したとします。次にあなたが ls Doc と打ったとき、シェルはカーソルの直後に uments と表示します。入力しようとしているコマンドがこの通りなら、コマンドを打ち続ける代わりにカーソルを右に動かす (forward-char コマンドを始めどの移動コマンドでも構いません) ことでコマンドを入力できます。最後の s の後ろまでカーソルを動かした後、accept-line コマンドでコマンドを実行できます。あるいは、カーソルを動かさなくても accept-prediction コマンドを使えば推定されたコマンドを直接実行できます。
打ったコマンドと推定されたコマンドの部分を区別するために、PS1S 変数を設定して打ったコマンドの部分のフォントの表示を変更することができます。推定された部分の表示を変更する機能は (まだ) 提供されていません。
カーソルを右に動かしたとき、カーソルを動かした位置までの部分は実際に打ったのと同様に取り扱われます。しかしその後カーソルを左に戻しても入力を取り消したことにはなりません。推定機能を使っているかどうかに関係なく、backward-delete-char などのコマンドで文字を削除する必要があります。
コマンドの推定はカーソルが入力中のコマンドの末尾にあるときのみ機能します。
デフォルトでは、コマンドを打ち始めると推定が行われます。Le-predict-empty オプションを有効にするとコマンドを一文字も入力する前から推定されたコマンドが表示されます。
推定アルゴリズムはコマンド履歴に基づいてコマンドを推定します。より新しい履歴はより確率が高いと判断します。また複数行に亘るコマンドの出現パターンも考慮します。確率が十分に高いと判断した部分のみを推定結果として表示するため、推定結果は必ずしも完全なコマンドにはなりません。
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 準拠モードを有効にすると以下のような挙動の変化があります。
Unicode 文字を使えるようにするにはロケール環境変数の設定が必要です。
既に環境変数があなたの使用したいロケールに合わせて設定されている場合は、特に何もする必要はありません。現在の設定を確認するには、locale コマンドを使用してください。
$ locale LANG=ja_JP.utf8 LC_CTYPE="ja_JP.utf8" LC_NUMERIC="ja_JP.utf8" LC_TIME="ja_JP.utf8" LC_COLLATE="ja_JP.utf8" LC_MONETARY="ja_JP.utf8" LC_MESSAGES="ja_JP.utf8" LC_PAPER="ja_JP.utf8" LC_NAME="ja_JP.utf8" LC_ADDRESS="ja_JP.utf8" LC_TELEPHONE="ja_JP.utf8" LC_MEASUREMENT="ja_JP.utf8" LC_IDENTIFICATION="ja_JP.utf8" LC_ALL=
この例の locale コマンドの出力結果は、各ロケール設定カテゴリーについて、言語が日本語、地域が日本、エンコーディングが UTF-8 に設定されていることを示しています。
現在の設定が自分の使いたいロケール設定に合っていない場合は、LC_ALL 変数を以下の様に設定してください。
export LC_ALL=ja_JP.utf8
この例とは異なる言語・地域・エンコーディングの設定を使いたい場合は、設定値を変える必要があります。詳しくは、お使いのオペレーティングシステムの説明書を参照してください。
Yash を起動する度に同じ設定を自動的に適用するには、上記のコマンドを ~/.yashrc か ~/.yash_profile に書いてください。
上記の設定をしてもなお Unicode 文字が正しく入力できない場合は、以下の行編集に関する項目を読んでください。
まず、echo $TERM を実行して出力される値が正常かどうか調べてください。値が xterm なら、おそらくどんな環境でも最低限の機能は使えるはずです。 xterm-16color などの色が使えるバージョンや、rxvt や vt100 などの他の端末機種も大概は動きます。利用可能な全ての値を列挙するには toe コマンドを使用してください。 お使いの端末機種に合った値を設定するのが理想ですが、yash を実行しようとしている環境がその端末機種に対応していない場合はうまく動かないかもしれません。その場合は、export TERM=xterm などを実行して TERM の値を変えてみてください。
行編集自体は動いているが Unicode (非 ASCII) 文字の入力に問題がある場合は、set -o le-no-conv-meta を実行して le-no-conv-meta オプションを有効にしてみてください。
ここにプログラミング言語としてのシェルの構文定義を示します。
以下に示す構文の一部は POSIX 準拠モードでは使用できません。
入力ソースコードの文字列はまずトークンに分割されます。トークンはソースコード内のより先に現れるトークンができるだけ長くなるように分割します。一つ以上の空白 (blank) 文字の連なりはトークンを分割します。
Yash に存在する演算子トークンは以下の通りです:
& && ( ) ; ;; | || < << <& <( <<- <<< <> > >> >& >( >>| >| (改行)
他の一般的なプログラミング言語とは異なり、改行演算子は空白ではなくトークンとして扱われます。
空白ではなく演算子トークンの一部でもない文字は単語 (word) トークンとなります。単語は以下の解析表現文法によって解析されます。
Word
WordElement
' (!' .)* ' /
" QuoteElement* " /
Parameter /
Arithmetic /
CommandSubstitution
QuoteElement
Parameter /
Arithmetic /
CommandSubstitutionQuoted /
![`"\] .
Parameter
$ PortableName /
$ ParameterBody
PortableName
ParameterBody
ParameterNumber
ParameterName
[[:alnum:] _]+
ParameterIndex
ParameterIndexWord
ParameterMatch
(# / ## / % / %%) ParameterMatchWord /
(:/ / / [#%/]?) ParameterMatchWordNoSlash (/ ParameterMatchWord)?
ParameterMatchWord
ParameterMatchWordNoSlash
Arithmetic
ArithmeticBody
Parameter /
Arithmetic /
CommandSubstitution /
( ArithmeticBody ) /
![`()] .
CommandSubstitution
` CommandSubstitutionBody* `
CommandSubstitutionQuoted
` CommandSubstitutionBodyQuoted* `
CommandSubstitutionBody
!` .
CommandSubstitutionBodyQuoted
!` .
SpecialChar
この文法における終端記号の集合は、yash を実行する環境が扱える任意の文字の集合 (実行文字集合) です (ただしナル文字 '\0' を除く)。
厳密には、上記の文法定義は完全な解析表現文法ではありません。CommandSubstitution (Quoted) のルールが構文定義の非終端記号である CompleteProgram に依存しているためです。
トークン分類
単語トークンが生成された後、単語はさらに IO_NUMBER トークン・予約語・名前・代入・通常の単語のどれかに分類されます。通常の単語以外の分類は、その単語が現れる文脈においてその分類のトークンが現れ得る場合のみ採用されます。予約語の一覧と予約語が認識される文脈の要件は、トークンの解析と予約語を参照してください。
トークンが数字のみから構成されていて直後に < または > が続くとき、それは IO_NUMBER トークンとなります。
代入 (assignment) トークンは名前 (name) とそれに続く = で始まるトークンです:
AssignmentWord
AssignmentPrefix
Name
コメント
コメントは # で始まり、次の改行文字の直前まで続きます。コメントは空白と同様に扱われ、トークンの一部にはなりません。コメントを開始する # は、トークンの始まりの位置にあるときのみ有効です。それ以外の位置にある # は単に単語トークンの一部と見做されます。
Comment
トークンが分割された後、その結果であるトークンの並びは以下に示す文脈自由文法によって解析されます。(以下、* と + と ? は正規表現と同様の意味を持ちます)
CompleteProgram
CompoundList
AndOrList
Pipeline
Command
FunctionDefinition |
SimpleCommand
CompoundCommand
Grouping |
IfCommand |
ForCommand |
WhileCommand |
CaseCommand |
DoubleBracketCommand |
FunctionCommand
Subshell
Grouping
IfCommand
ForCommand
WhileCommand
CaseCommand
CaseList
CaseItem
DoubleBracketCommand
Ors
Ands
Nots
Primary
Word (-ef | -eq | -ge | -gt | -le | -lt | -ne | -nt | -ot | -veq | -vge | -vgt | -vle | -vlt | -vne | = | == | === | =~ | != | !== | < | >) Word |
( Ors ) |
Word
FunctionCommand
FunctionDefinition
SimpleCommand
Word (Word | Redirection)*
Assignment
AssignmentPrefix( NL* (Word NL*)* )
Redirection
IO_NUMBER? <( CompleteProgram ) |
IO_NUMBER? >( CompleteProgram )
RedirectionOperator
NL
ルール Primary では、Word トークンは ]] に一致してはなりません。また、Primary が Word トークンで始まる場合にはその Word は同ルールで認められている単項演算子に一致してはなりません。
ルール SimpleCommand では、Word トークンはそれが Assignment の始まりとは解釈できない場合にのみ採用されます。
ルール Assignment では、AssignmentPrefix と ( の間に空白を置くことはできません。
上記の文法定義にはヒアドキュメントの内容とその終わりを表す行の解析のための規則は含まれていません。それらは対応するリダイレクト演算子の後にある最初の改行 (NL) トークンが解析された直後に解析されます。
エイリアス置換
単語はエイリアス置換の対象となります。
予約語に分類されたトークンはエイリアス置換の対象からは除外されます。
Alias 組込みコマンドはエイリアスを設定・表示します。
Alias コマンドはエイリアスをオペランドに従って設定または表示します。表示は、コマンド (の一部) として解釈可能な形式で標準出力に出力します。オペランドを一つも与えない場合、alias コマンドは現在設定されている全てのエイリアスを表示します。
-g, --global
-p, --prefix
エイリアス名
エイリアス名=値
エラーがない限り alias コマンドの終了ステータスは 0 です。
Yash でエイリアスの名前として使えない文字は、空白文字・タブ・改行、および =$<>\'"`;&|()# の各文字です。エイリアスの内容にはすべての文字が使えます。
Alias コマンドは準特殊組込みコマンドです。
POSIX にはオプションに関する規定はありません。よってオプションは POSIX 準拠モードでは使えません。
Array 組込みコマンドは配列の表示や操作を行います。
オプションもオペランドも指定せずに実行すると、array コマンドは全ての配列の定義を (コマンドとして解釈可能な形式で) 標準出力に出力します。
オプションを指定せずに配列名と値を与えて実行すると、array コマンドはその配列の内容を指定された値に設定します。
-d (--delete) オプションを指定して実行すると、array コマンドは指定した配列の指定したインデックスにある要素を削除します。配列の要素数は削除した要素の分だけ少なくなります。存在しない要素のインデックスを指定したときは無視します。
-i (--insert) オプションを指定して実行すると、array コマンドは指定した配列の指定したインデックスにある要素の直後に指定した値を要素として追加します。配列の要素数は追加した要素の分だけ増えます。インデックス として 0 を指定すると配列の先頭に要素を追加します。インデックスとして配列の要素数より大きな数を指定すると配列の末尾に要素を追加します。
-s (--set) オプションを指定して実行すると、array コマンドは指定した配列の指定したインデックスにある要素の値を指定した値に変更します。
-d, --delete
-i, --insert
-s, --set
配列名
インデックス
値
エラーがない限り array コマンドの終了ステータスは 0 です。
POSIX には array コマンドに関する規定はありません。
array 配列名 [値...] の形式の array コマンドは変数代入を用いて 配列名=(値...) と書くこともできます。
Bg 組込みコマンドはジョブをバックグラウンドで実行します。
Bg コマンドはジョブをバックグラウンドで実行します。ジョブには SIGCONT シグナルが送られ、ジョブが停止している場合は再開されます。
ジョブの実行を再開する前に bg コマンドはジョブの名前を標準出力に出力します。
Bg コマンドはジョブ制御が有効な時しか使えません。
ジョブ
ジョブを複数指定することもできます。何も指定しないと現在のジョブを実行します。
非 POSIX 準拠モードではジョブ ID の先頭の % は省略できます。
エラーがない限り bg コマンドの終了ステータスは 0 です。
Bg コマンドは準特殊組込みコマンドです。
POSIX は指定したジョブが既に実行中の場合は bg コマンドは何もしないと規定していますが、yash の bg コマンドはジョブが実行中かどうかにかかわらず SIGCONT シグナルを送信します。
Bindkey 組込みコマンドは行編集におけるキーバインド設定を表示・設定します。
-l (--list) オプションを付けて実行すると、bindkey コマンドはキーバインド設定で利用可能な行編集コマンドの一覧を標準出力に出力します。
他のオプションを付けて実行すると、bindkey コマンドはキーバインド設定の表示または設定を行います。
-a, --vi-command
-e, --emacs
-v, --vi-insert
キー
コマンド
エラーがない限り bindkey コマンドの終了ステータスは 0 です。
Bindkey コマンドは準特殊組込みコマンドです。 POSIX では bindkey コマンドの動作は規定されていません。
Break 組込みコマンドは実行中のループを中断します。
-i (--iteration) オプションを付けずに実行すると、break コマンドは現在実行中の for ループまたは while ループまたは until ループを中断します。多重ループの中で実行した場合、内側から数えて深さ番目のループを中断します。深さが指定されていないときは、最も内側のループを中断します (深さ = 1)。指定された深さが実際に実行している多重ループの深さより大きい場合は最も外側のループを中断します。
-i (--iteration) オプションを付けて実行すると、break コマンドは現在実行中の反復実行を中断します。
-i, --iteration
nest
ループの中断に成功すると終了ステータスは 0 です。反復実行の中断に成功すると break コマンドの直前に実行されたコマンドの終了ステータスが break コマンドの終了ステータスになります。
Break コマンドは特殊組込みコマンドです。
POSIX には -i (--interact) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
POSIX では、break コマンドを構文的に取り囲んでいないループの扱いを規定していません。例えば以下のような場合が該当します:
Yash では、このようなループは break の対象に出来ません。
Cd 組込みコマンドはシェルの作業ディレクトリを変更します。
Cd コマンドはシェルの作業ディレクトリをオペランドで指定したディレクトリに変更します。
新しい作業ディレクトリに応じて PWD 変数の値が再設定されるとともに、前の PWD 変数の値が OLDPWD 変数に設定されます。新しい PWD の値は . や .. のディレクトリ成分を含みません (POSIX 準拠モードで新しいパスが /.. で始まる場合を除く)。
指定したディレクトリが相対パスの場合 (最初が . または .. で始まるものを除く)、コマンドの検索における PATH 変数の検索と同様にして、CDPATH 変数の値にあるコロンで区切った各ディレクトリ内に指定したディレクトリがあるかどうか調べます。ディレクトリが見つかった場合は、そのディレクトリが新しい作業ディレクトリになります。見つからなかった場合は、ディレクトリは現在の作業ディレクトリからの相対パスとなります。
CDPATH 変数の検索で新しい作業ディレクトリが見つかった場合またはディレクトリとして - が指定された場合は新しい作業ディレクトリのパスを標準出力に出力します。
作業ディレクトリの変更に成功した場合、YASH_AFTER_CD 変数が設定されていればその値がコマンドとして解釈・実行されます (非 POSIX 準拠モード時)。
-L, --logical
-P, --physical
--default-directory=ディレクトリ
-L (--logical) オプションと -P (--physical) オプションの両方を指定した場合、後に指定したほうを優先します。どちらも指定していない場合は、-L を指定したものとみなします。
ディレクトリ
この値がハイフン一つ (「-」) の場合、OLDPWD 変数の値が指定されたものとみなします。このオペランドが与えられていない場合、HOME 変数の値が指定されたものとみなします (--default-directory オプションを指定した場合を除く)。
作業ディレクトリを正しく変更できた場合、終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
Cd コマンドは準特殊組込みコマンドです。
POSIX には YASH_AFTER_CD 変数および --default-directory=... オプションに関する規定はありません。POSIX はディレクトリとしてハイフン一つを指定したときに -L または -P オプションを併用することを認めていません。
YASH_AFTER_CD 変数の実行結果は cd コマンドの終了ステータスには影響しません。
コロン組込みコマンドは何も行わない組込みコマンドです。
コロンコマンドは何も行いません。コマンドライン引数は一切無視します。
コロンコマンドの終了ステータスは 0 です。
コロンコマンドは特殊組込みコマンドです。
引数の展開とリダイレクトは他のコマンドと同様に行います。
True コマンドはコロンコマンドと同様に何も行いませんが、コロンコマンドは特殊組込みコマンドであるのに対し true コマンドは準特殊組込みコマンドです。
Command 組込みコマンドはコマンドを実行します。またコマンドの種類を特定します。
-v (--identify) オプションならびに -V (--verbose-identify) オプションを付けずに実行すると、command コマンドは与えられたコマンドを与えられた引数で実行します。コマンドの実行の仕方は単純コマンドの実行の最後のステップに準じますが、コマンドの検索では外部コマンド・組込みコマンド・関数の内オプションで指定したものしか検索しません。またコマンドが特殊組込みコマンドの場合、コマンドのオプションやオペランドの使い方が間違っていたりリダイレクトエラーや代入エラーが起きたりしてもシェルは終了しません。
-v (--identify) オプションまたは -V (--verbose-identify) オプションを付けて実行すると、command コマンドは与えられたコマンドの種類とパスを特定しそれを標準出力に出力します。コマンドはエイリアスや関数であっても構いません。
-v (--identify) オプションを付けて実行したときの出力は以下のようになります。
-V (--verbose-identify) オプション使用時は、出力の形式が人間にとってより読みやすくなります。
-a, --alias
-b, --builtin-command
-e, --external-command
-f, --function
-k, --keyword
-p, --standard-path
-v, --identify
-V, --verbose-identify
-a (--alias), -b (--builtin-command), -e (--external-command), -f (--function), -k (--keyword) オプションのどれも指定しなかった場合は、以下のオプションを指定したものとみなします。
-v (--identify) あるいは -V (--verbose-identify) オプションを指定していないとき
-v (--identify) または -V (--verbose-identify) オプションを指定しているとき
コマンド
引数...
-v (--identify) あるいは -V (--verbose-identify) オプションを指定していないとき
-v (--identify) または -V (--verbose-identify) オプションを指定しているとき
Command コマンドは準特殊組込みコマンドです。
POSIX に規定のあるオプションは -p, -v, -V だけです。これ以外のオプションは POSIX 準拠モードでは使えません。また POSIX 準拠モードでは -v または -V オプションを使用するときコマンドはちょうど一つしか指定できません。
POSIX は -v オプションと -V オプションを同時に指定することを認めていません。Yash ではこれら二つのオプションを両方指定すると最後に指定したものが有効になります。
Complete 組込みコマンドはコマンドライン補完において補完候補を生成します。この組込みコマンドは補完関数の実行中にだけ使えます。
補完関数の中でこの組込みコマンドを実行すると、complete コマンドは指定した引数に従って補完候補を生成します。どのオプション・オペランドで候補を生成するにせよ、実際に生成される候補は現在補完しようとしている (コマンドライン上に途中まで入力された) 単語に一致するものに限られます。
-A パターン, --accept=パターン
-D 説明, --description=説明
-O, --option
-P 接頭辞, --prefix=接頭辞
-R パターン, --reject=パターン
-S 接尾辞, --suffix=接尾辞
-T, --no-termination
補完方式設定のためのオプション
-a, --alias
--array-variable
--bindkey
-b, --builtin-command
-c, --command
-d, --directory
--dirstack-index
--executable-file
--external-command
-f, --file
--finished-job
--function
--global-alias
-g, --group
-h, --hostname
-j, --job
-k, --keyword
--normal-alias
--regular-builtin
--running-job
--scalar-variable
--semi-special-builtin
--signal
--special-builtin
--stopped-job
-u, --username
-v, --variable
-d (--directory) オプションを指定せずに -f (--file) オプションを指定した場合、-S ... (--suffix=...) オプションの指定の有無にかかわらず、ディレクトリ名を表す補完候補には接尾辞としてスラッシュが付き、候補の直後には空白が入りません (-S / -T を指定したときと同じ動作)。
ジョブ ID の補完は先頭の % を除いた部分に対して行われるので、補完しようとしている単語が既に % を含んでいる場合は % を接頭辞として指定してください。
Complete コマンドのオペランドは、各オペランドがそれぞれ補完候補として扱われます。指定したオペランドのうち、現在補完しようとしている単語に合うものが補完候補となります。
候補が少なくとも一つ生成できた場合は、終了ステータスは 0 です。新たな候補が一つも生成できなかったときは、終了ステータスは 1 です。その他のエラーの場合は 2 以上の終了ステータスになります。
Complete コマンドは準特殊組込みコマンドです。 POSIX では complete コマンドの動作は規定されていません。
Continue 組込みコマンドは実行中のループの次の繰り返しに処理を移します。
-i (--iteration) オプションを付けずに実行すると、continue コマンドは現在実行中の for ループまたは while ループまたは until ループの繰り返しを中断し、直ちに次の繰り返しを開始します (while/until ループについては、ループの実行条件の判定からやり直します)。多重ループの中で実行した場合、内側から数えて深さ番目のループに対してこの動作を行います。深さが指定されていないときは、最も内側のループに対してこの動作を行います (深さ = 1)。指定された深さが実際に実行している多重ループの深さより大きい場合は最も外側のループに対してこの動作を行います。
-i (--iteration) オプションを付けて実行すると、continue コマンドは現在実行中の反復実行の現在のコマンドの実行を中断し、直ちに次のコマンドの実行を開始します。
-i, --iteration
深さ
-i (--iteration) オプションが指定されていないとき、continue コマンドの処理が成功すると終了ステータスは 0 です。-i (--iteration) オプションが指定されているとき、continue コマンドの処理が成功すると continue コマンドの直前に実行されたコマンドの終了ステータスが continue コマンドの終了ステータスになります。
Continue コマンドは特殊組込みコマンドです。
POSIX には -i (--interact) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
POSIX では、continue コマンドを構文的に取り囲んでいないループの扱いを規定していません。例えば以下のような場合が該当します:
Yash では、このようなループは continue の対象に出来ません。
Dirs 組込みコマンドはディレクトリスタックの内容を表示します。
ディレクトリスタックとは、作業ディレクトリの変更の履歴をとる仕組みです。Pushd コマンドで作業ディレクトリを変更すると、元の作業ディレクトリがディレクトリスタックに追加されます。Popd コマンドを使うと、ディレクトリスタックに保存してある元の作業ディレクトリに戻ることができます。Dirs コマンドを使うと、ディレクトリスタックの内容を表示することができます。ディレクトリスタックの内容は DIRSTACK 配列と PWD 変数に保存されます。これらの値を変更すると、ディレクトリスタックの動作に影響します。
ディレクトリスタックに保存してあるディレクトリはインデックスで区別します。インデックスは -v (--verbose) オプションを付けて dirs コマンドを実行することで知ることができます。インデックスは正号 (+) または負号 (-) の付いた整数の形で表わします。整数は pushd コマンドでディレクトリスタックに追加した順に振られます。例えばインデックス +0 は現在の作業ディレクトリに対応します。インデックス +1 は最後に追加したディレクトリで、インデックス +2 はその一つ前に追加したディレクトリに対応します。インデックス -0 は最初に 追加したディレクトリ、インデックス -1 はその次に追加したディレクトリに対応します。
-c (--clear) オプションを付けずに実行すると、dirs コマンドは現在のディレクトリスタックの要素を一つずつ標準出力に出力します。 -c (--clear) オプションを付けて実行すると、dirs コマンドはディレクトリスタックのインデックス +0 以外の要素をすべて削除します。
-c, --clear
-v, --verbose
インデックス
エラーがない限り dirs コマンドの終了ステータスは 0 です。
Dirs コマンドは準特殊組込みコマンドです。 POSIX では dirs コマンドの動作は規定されていません。
Disown 組込みコマンドはジョブを削除します。
Disown コマンドはシェルが管理しているジョブを削除します。削除したジョブはジョブ制御の対象から外れますが、ジョブを構成するコマンドの実行は継続します。
-a, --all
ジョブ
複数指定することもできます。何も指定しないと現在のジョブを削除します。非 POSIX 準拠モードではジョブ ID の先頭の % は省略できます。
エラーがない限り disown コマンドの終了ステータスは 0 です。
Disown コマンドは準特殊組込みコマンドです。 POSIX では disown コマンドの動作は規定されていません。
ドット組込みコマンドはテキストファイルを開いて、その内容をコマンドとして解釈し実行します。
ドットコマンドは与えられたファイル名のファイルを開き、その内容をコマンドとして解釈し現在のコマンド実行環境で実行します。
ファイル名に続けて引数が与えられているときは、関数の実行の時と同様に、コマンドの実行前に引数が位置パラメータに設定され、実行後に元の位置パラメータに戻ります。
ファイル名にスラッシュ (/) が一つも入っていない場合は、コマンドの検索のときと同様に PATH 変数の検索を行い、開くべきファイルを探します。ただしファイルは読み込み可能でさえあれば実行可能である必要はありません。検索の結果ファイルが見つかれば、そのファイルの内容を解釈・実行します。ファイルが見つからなかった場合、POSIX 準拠モードでは直ちにエラーになります。POSIX 準拠モードでないときは現在の作業ディレクトリのファイルを開くことを試みます。
-A, --no-alias
-L, --autoload
ドットコマンドでは、最初のオペランドより後にあるコマンドライン引数は全てオペランドとして解釈します。
ファイル名
引数...
ドットコマンドの終了ステータスは、ファイルから読み込んで実行した最後のコマンドの終了ステータスです。ファイルの内容に一つもコマンドが入っていなかったときは終了ステータスは 0 です。ファイルが見つからなかったり開けなかったりしたときは終了ステータスは非 0 です。
ドットコマンドは特殊組込みコマンドです。
シェルが対話モードでないとき、読み込むべきファイルが見つからなかったり開けなかったりするとシェルは直ちに終了します。
POSIX にはオプションに関する規定はありません。よってオプションは POSIX 準拠モードでは使えません。
POSIX には引数オペランドによって位置パラメータを変更できることについての規定はありません。よって POSIX 準拠モードでは引数オペランドを与えるとエラーになります。
Echo 組込みコマンドはコマンドライン引数を標準出力に出力します。
Echo コマンドはコマンドライン引数を全てオペランドとして解釈します。オプションは、以下に述べる例外を除いて一切解釈しません。オプションはオペランドより前に置く必要があります。Echo コマンドでは構文エラーは絶対に起きません。
Echo コマンドは与えられたコマンドライン引数と改行を標準出力に出力します。引数がない場合は改行だけを出力します。引数が複数ある場合はそれぞれを空白文字で区切って出力します。
エスケープシーケンス
Echo コマンドに与える引数では、後述の ECHO_STYLE 変数と -e オプションの指定によって以下のエスケープシーケンスを使用することができます。
\a
\b
\c
\e
\f
\n
\r
\t
\v
\\
\0xxx
エスケープシーケンスが無効の時は、エスケープシーケンスは解釈せずにそのまま出力します。
ECHO_STYLE 変数
Echo コマンドがオプションやエスケープシーケンスを解釈するかどうかは ECHO_STYLE 変数の値によります。以下に、この変数の値と echo コマンドの動作との対応を示します。
SYSV, XSI
BSD
GNU
ZSH
DASH
RAW
ECHO_STYLE 変数が設定されていないときは、値が SYSV または XSI の場合の動作をします。
-n
-e
-E
エラーがない限り echo コマンドの終了ステータスは 0 です。
POSIX には ECHO_STYLE 変数およびオプションに関する規定はありません。POSIX では、-n オプションが指定されたときまたは引数にバックスラッシュが含まれている場合の動作を規定していません。可搬性のあるシェルスクリプトを書くには、echo コマンドよりも printf コマンドの使用を推奨します。
ECHO_STYLE 変数のとれる値は主に他のシェルの実装を基に決めてありますが、これらの実装を yash が完全に模倣することを意図するものではありません。Zsh の echo 組込みには単一のハイフンをオプションとオペランドの区切りとして解釈するという挙動がありますが、yash ではこのようなハイフンの使い方はできません。
Eval 組込みコマンドはオペランドをコマンドとして解釈して実行します。
Eval コマンドでは、POSIX 準拠モードであるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。最初のオペランドより後にあるコマンドライン引数は全てオペランドとして解釈します。
Eval コマンドは、与えられたオペランドをシェルのコマンドとして解釈し、現在のコマンド実行環境で実行します。
-i (--iteration) オプションが指定されていないときは、コマンドをまとめて一度に解釈・実行します。複数のオペランドがある場合は、それらを順に連結して一つにしてから解釈・実行します (連結の際、各オペランド間に空白文字を一つずつ区切りとして挿入します)。
-i (--iteration) オプションが指定されているときは、オペランドを順に一つずつ解釈・実行します。これを反復実行といいます。反復実行の途中で continue コマンドを -i オプション付きで実行した場合、コマンドの実行は中断され、eval コマンドに与えられた次のオペランドの解釈・実行に移ります。反復実行の途中で break コマンドを -i オプション付きで実行した場合、反復実行は中断され、この eval コマンドの実行は終了します。特殊パラメータ ? の値が反復実行の開始前に保存されます。オペランドを一つ解釈・実行するたびに特殊パラメータ ? の値は保存された値にもどります。
-i, --iteration
コマンド
オペランドが一つもない場合またはオペランドの中にコマンドが一つも含まれていなかった場合、終了ステータスは 0 です。コマンドが一つ以上解釈・実行された場合、最後に実行したコマンドの終了ステータスが eval コマンドの終了ステータスになります。
Eval コマンドは特殊組込みコマンドです。
POSIX にはオプションに関する規定はありません。よってオプションは POSIX 準拠モードでは使えません。
Exec 組込みコマンドはシェルのプロセスを別の外部コマンドに置き換えます。またシェルのプロセスに対してリダイレクトを実行します。
Exec コマンドでは、POSIX 準拠モードであるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。これは exec コマンドに対するオプションとコマンドに対するオプションを区別するために重要です。コマンドより後にある引数はすべて引数とみなされます。
Exec コマンドをコマンドを指定して実行すると、シェルは単純コマンドの実行の最後のステップと同様にしてコマンドを実行します。ただし、コマンドは必ず外部コマンドとしてみなされ、関数や組込みコマンドは無視します。そしてその外部コマンドはサブシェルではなく現在のコマンド実行環境で exec システムコールを呼び出すことで実行します。これにより、シェルのプロセスは新しく起動するコマンドに置き換わります。
シェルが POSIX 準拠モードのときまたは対話モードでないとき、コマンドの起動に失敗するとシェルは直ちに終了します。
シェルが POSIX 準拠モードではなくかつ対話モードのとき、停止中のジョブがあると、シェルは警告を表示し、コマンドを起動しません。一度 exec が実行されると、シェルが持っているジョブの情報は失われるため、手動でシグナルを送ってジョブを再開または終了させなければならなくなります。警告を無視してコマンドを起動するには -f (--force) オプションを付けてください。
コマンドなしで実行した場合 exec コマンドは何も行いませんが、この exec コマンドを実行する際に行ったリダイレクトの効果は現在のコマンド実行環境に残ります。
-a コマンド名, --as=コマンド名
-c, --clear
-f, --force
コマンド
引数...
指定されたコマンドの起動に成功した場合、シェルのプロセスはそのコマンドのプロセスに置き換わってしまうので、終了ステータスはありません。
実行しようとしたコマンドが見つからなかった場合、終了ステータスは 127 です。コマンドが見つかったが実行できなかった場合、終了ステータスは 126 です。コマンドを指定せずに exec コマンドを実行した場合、終了ステータスは 0 です。
Exec コマンドは特殊組込みコマンドです。
POSIX にはオプションに関する規定はありません。よってオプションは POSIX 準拠モードでは使えません。
Exit 組込みコマンドコマンドはシェルの実行を終了します。
Exit コマンドは、このコマンドを実行したシェル (またはサブシェル) を終了します。
停止しているジョブのある対話モードのシェルを終了しようとすると、シェルは警告を表示し、終了しません。-f (--force) オプションを付けて実行するか exit コマンドを二連続で実行すると警告を無視してシェルを終了します。
シェル終了時のトラップが設定されている場合は、シェルが終了する前にそれが実行されます。
-f, --force
終了ステータス
このオペランドが与えられていない場合は、exit コマンドの直前に実行されたコマンドの終了ステータスを用います (ただしトラップを実行中の場合はトラップに入る直前のコマンドの終了ステータス)。
終了するシェルの実際の終了ステータスは、オペランドで与えられた数を 256 で割った余りになります。
Exit コマンドはシェルを終了するので、exit コマンドそのものの終了ステータスはありません。
例外として、exit コマンドが警告を表示して、シェルを終了しなかった場合、exit コマンドの終了ステータスは非 0 です。
Exit コマンドは特殊組込みコマンドです。
POSIX では、終了ステータスの値は 0 以上 256 未満でなければならないとしています。Yash では拡張として 256 以上の値も受け付けるようになっています。
POSIX には -f (--force) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
シェル終了時のトラップの実行中に exit コマンドを実行すると、再びトラップが実行されることはなくそのままシェルは終了します。このとき exit コマンドに終了ステータスが与えられていない場合は、もし終了時のトラップが設定されていなかった場合にシェルが返したろう終了ステータスでシェルは終了します。(シェルの終了も参照)
Export 組込みコマンドはエクスポート対象の変数を表示・設定します。
Export コマンドは typeset コマンドに -gx オプションを付けたものと同じです。その他オプション・オペランド・終了ステータスは typeset コマンドと同様です。
Export コマンドは特殊組込みコマンドです。
POSIX には export コマンドに関する規定はありますが、オプションは -p しか規定がありません。その他のオプションは POSIX 準拠モードでは使えません。また POSIX は -p オプションをオペランドとともに使うことを認めていません。
False 組込みコマンドは何も行わずに非 0 の終了ステータスで終了します。
False コマンドは何も行いません。コマンドライン引数は一切無視します。
False コマンドの終了ステータスは非 0 です。
False コマンドは準特殊組込みコマンドです。
Fc 組込みコマンドはコマンド履歴に記録されたコマンドを再実行・表示します。
-l (--list) オプションを付けずに実行すると、fc コマンドはオペランドで指定したコマンド履歴のコマンドを再実行します。-s (--silent) オプションを付けていない場合、シェルはコマンドを再実行する前にエディタを起動し、コマンドを編集できるようにします。エディタが終了するとシェルは編集後のコマンドを実行します。-s (--silent) オプションを付けた場合、シェルはエディタを起動せず直接コマンドを再実行します。いずれの場合も、実行するコマンドは標準出力に出力しコマンド履歴に追加されます。
-l (--list) オプションを付けて実行すると、fc コマンドはオペランドで指定した範囲のコマンド履歴を標準出力に出力します。標準では履歴内のコマンドの内容を履歴番号とともに表示しますが、-n (--no-numbers) および -v (--verbose) オプションにより出力形式を変更できます。
-e エディタ, --editor=エディタ
このオプションを指定しない場合、FCEDIT 変数の値をエディタとして使用します。FCEDIT 変数も設定されていない場合は、ed をエディタとして使用します。
-l, --list
-n, --no-numbers
-q, --quiet
-r, --reverse
-s, --silent
-v, --verbose
始点と終点
Fc コマンドが再実行または表示するコマンドは、始点と終点で指定したコマンドとその間にある履歴のコマンドです。始点が終点より後のコマンドを指している場合、コマンドの順序は逆になります。
始点または終点が与えられていない場合のデフォルト値は以下の表のとおりです。
-l あり | -l なし | |
始点 | -16 | -1 |
終点 | -16 | 始点に同じ |
前=後
コマンドを正しく再実行できた場合、fc コマンドの終了ステータスは再実行したコマンドの終了ステータスになります。-l (--list) オプションを指定した場合は、履歴が正しく出力できれば終了ステータスは 0 です。
Fc コマンドは準特殊組込みコマンドです。
POSIX には -q (--quiet) および -v (--verbose) オプションに関する規定はありません。よってこれらのオプションは POSIX 準拠モードでは使えません。
行編集の動作中は履歴の内容を変更することはできません。
Fg 組込みコマンドはジョブをフォアグラウンドで実行します。
Fg コマンドはジョブをフォアグラウンドに移動し SIGCONT シグナルを送ります。これにより、ジョブが停止していた場合はフォアグラウンドで実行が再開されます。Fg コマンドはジョブの実行が終了するまで待機し、ジョブの終了ステータスを返します。
ジョブの実行を再開する前に fg コマンドはジョブの名前を標準出力に出力します。 非 POSIX 準拠モードではジョブの番号も出力されます。
Fg コマンドはジョブ制御が有効な時しか使えません。
ジョブ
複数指定すると指定した順に一つずつジョブをフォアグラウンドで実行します。何も指定しないと現在のジョブを実行します。
非 POSIX 準拠モードではジョブ ID の先頭の % は省略できます。
ジョブを正しく実行できた場合、fg コマンドの終了ステータスは (最後に) 実行したジョブの終了ステータスです。エラーが発生した場合は終了ステータスは非 0 です。
Fg コマンドは準特殊組込みコマンドです。
POSIX 準拠モードではジョブは一つまでしか指定できません。
Getopts 組込みコマンドはコマンドライン引数のオプションを解析します。
Getopts コマンドは、オペランドで与えられたコマンドライン引数に含まれている一文字のオプションを解析します。Getopts コマンドを一回呼び出すたびにオプションが一つ解析され、そのオプションを表す一文字が変数名で指定した変数に代入されます。
解析の対象となるオプションの種類もオペランドで指定します。オプションリストには受け付けるオプションの文字を並べて指定します。文字の後にコロン (:) を付けるとそのオプションは引数をとるものとみなします。例えば、-a, -b, -c の三種類のオプションを受け付け、さらにこれらのうち -b が引数をとる場合、オプションリストには ab:c を指定します。
引数をとるオプションを解析したとき、その引数の値が OPTARG 変数に代入されます。
オプションリストで与えられていないオプションに出くわしたときまたは引数をとるオプションに引数が与えられていないときの動作は、オプションリストの最初の文字がコロン (:) であるかどうかで決まります。
Getopts コマンドは、実行するたびに一つずつオプションを解析します。全てのオプションを解析するには、毎回同じ引数で getopts コマンドを繰り返し実行する必要があります。シェルは、オプションをどこまで解析したかを覚えておくために、OPTIND 変数を用います。全てのオプションを解析し終わるまでにこの変数を変更してはいけません。全てのオプションを解析し終わると、OPTIND 変数には引数 (または位置パラメータ) の中で最初のオペランドに当たるもののインデックスが代入されます (オペランドがない場合は引数または位置パラメータの個数 + 1 になります)。
異なる引数を解析させたい場合は、getopts コマンドに新しい引数を与える前に OPTIND 変数に 1 を代入してください。
オプションリスト
変数名
引数s
このオペランドを指定しない場合は、位置パラメータを解析します。
引数の中にオプションが見つかった場合は、(それがオプションリストに含まれているかどうかにかかわらず) 終了ステータスは 0 です。全てのオプションを解析し終わった時は、終了ステータスは非 0 です。
aopt=false bopt= copt=false while getopts ab:c opt do
case $opt in
a) aopt=true ;;
b) bopt=$OPTARG ;;
c) copt=true ;;
\?) return 2 ;;
esac done if $aopt; then echo オプション -a が指定されました; fi if [ -n "$bopt" ]; then echo オプション -b $bopt が指定されました; fi if $copt; then echo オプション -c が指定されました; fi shift $((OPTIND - 1)) echo オペランドは $*
Getopts コマンドが解析するコマンドライン引数では、オプションは全てオペランドより前に指定してある必要があります。最初にオペランドが現れた時点で、getopts コマンドは解析を終了します。
Getopts コマンドは準特殊組込みコマンドです。
POSIX は、OPTIND 変数に 1 以外の値を代入した場合の動作を規定していません。
POSIX 準拠モードでは、オプションリストに含まれるオプションは英数字でなければなりません。
Hash 組込みコマンドは外部コマンドのパスを検索・表示します。
オプションを指定しない場合、hash コマンドはオペランドで指定した外部コマンドのパスを検索し、結果を記憶します (既に記憶している場合は再度検索・記憶します)。
-r (--remove) オプションを指定している場合、hash コマンドはオペランドで指定した外部コマンドのパスに関する記憶を消去します。-r (--remove) オプションを指定しかつコマンドを指定しない場合、全ての記憶を消去します。
-r (--remove) オプションを指定せずコマンドも指定しない場合、記憶しているパスの一覧を標準出力に出力します。
-d (--directory) オプションを指定した場合、hash コマンドは外部コマンドのパスの代わりにユーザのホームディレクトリのパスを検索・記憶または表示します。記憶したパスはチルダ展開で使用します。
-a, --all
このオプションを指定しない場合、シェルが記憶しているパスのうち組込みコマンドに対するものは出力しません。
-d, --directory
-r, --remove
コマンド
ユーザ名
エラーがない限り hash コマンドの終了ステータスは 0 です。
シェルは、外部コマンド (またはチルダ展開) を実行する際に自動的にコマンド (またはホームディレクトリ) のパスを記憶するので、通常はわざわざ hash コマンドを使ってパスを記憶させる必要はありません。
PATH 変数の値が変わった時は、記憶した外部コマンドのパスは自動的にすべて消去されます。
POSIX が規定しているオプションは -r だけです。よって他のオプションは POSIX 準拠モードでは使えません。
Hash コマンドは準特殊組込みコマンドです。
Help 組込みコマンドは組込みコマンドに関する説明を表示します。
Help 組込みコマンドは、オペランドで指定した組込みコマンドに関する説明を出力します。
コマンド
エラーがない限り help コマンドの終了ステータスは 0 です。
Help コマンドは準特殊組込みコマンドです。 POSIX では help コマンドの動作は規定されていません。
Yash の多くの組込みコマンドでは、--help オプションを与えることで help コマンドの出力と同様の説明を表示させることができます。
History 組込みコマンドはコマンド履歴を編集します。
History コマンドはコマンド履歴の内容を編集・表示します。
オプションが指定してある場合、history コマンドはそのオプションに従ってコマンド履歴の内容を編集します。複数のオプションがある場合は指定した順に処理します。
オペランドで個数が与えられている場合、history コマンドはコマンド履歴の内容をその個数だけ標準出力に出力します。出力の形式は fc コマンドに準じます。
オプションもオペランドも与えられていない場合、history コマンドはコマンド履歴の内容を全て標準出力に出力します。
-c, --clear
-d 項目, --delete=項目
-F, --flush-file
-r ファイル, --read=ファイル
-s コマンド, --set=コマンド
-w ファイル, --write=ファイル
個数
エラーがない限り history コマンドの終了ステータスは 0 です。
History コマンドは準特殊組込みコマンドです。 POSIX では history コマンドの動作は規定されていません。
行編集の動作中は履歴の内容を変更することはできません。
Jobs 組込みコマンドはシェルが有しているジョブを表示します。
Jobs コマンドはシェルが現在有しているジョブの名前や状態を表示します。
標準では各ジョブについて以下の情報を一行ずつ表示します。
-l, --verbose
-n, --new
-p, --pgid-only
-r, --running-only
-s, --stopped-only
ジョブ
非 POSIX 準拠モードではジョブ ID の先頭の % は省略できます。
エラーがない限り jobs コマンドの終了ステータスは 0 です。
Jobs コマンドは準特殊組込みコマンドです。
POSIX で規定されているオプションは -l と -p だけです。従って POSIX 準拠モードではこれ以外のオプションは使えません。また POSIX 準拠モードでは、-l オプション指定時、プロセスごとではなくジョブごとに状態を表示します。
Yash では、ジョブのプロセスグループ ID はジョブを構成するパイプラインの最初のコマンドのプロセス ID に一致します。
Kill 組込みコマンドはプロセスにシグナルを送ります。
Kill コマンドでは、POSIX 準拠モードであるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。最初のオペランドより後にあるコマンドライン引数は全てオペランドとして解釈します。
-l オプションを付けずに実行すると、kill コマンドは指定したプロセスにシグナルを送信します。送信するシグナルの種類はシグナル指定オプションで指定します。シグナルの種類を指定しない場合は SIGTERM シグナルを送信します。
-l オプションを付けて実行すると、kill コマンドは指定したシグナルに関する情報を標準出力に出力します。シグナルを指定しない場合は全てのシグナルに関する情報を表示します。
シグナル指定オプション
-シグナル, -s シグナル, -n シグナル
シグナル指定オプションは一度に一つまでしか使えません。
他のオプション
-l
-v
このオプションを指定したときは同時に -l も指定してあるとみなします。
プロセス
シグナル
エラーがない限り kill コマンドの終了ステータスは 0 です。一つ以上のプロセスにシグナルを送ることができた場合、他にシグナルを送れなかったプロセスがあったとしても終了ステータスは 0 になります。
Kill コマンドは準特殊組込みコマンドです。
負数に見えるコマンドライン引数の扱いには注意が必要です。例えば kill -1 -2 では -1 がシグナル指定オプション、-2 がオペランドとなるので、番号 1 のシグナルをプロセスグループ 2 に送信します。kill — -1 -2 や kill -TERM -1 -2 では -1 と -2 はどちらもオペランドになります。
POSIX には -v および -n オプションに関する規定はありません。よってこれらのオプションは POSIX 準拠モードでは使えません。また POSIX は -s オプションの引数としてシグナル番号を指定することを認めていません。POSIX はシグナルのオペランドとしてシグナルの名前を指定することを認めていません。
POSIX は、シグナル名は INT や QUIT のように最初の SIG を除いた形で指定しなければならないと規定しています。非 POSIX 準拠モードの yash では、拡張として SIG を付けた形でも指定できます。
Local 組込みコマンドはローカル変数を表示・設定します。
Local コマンドは typeset コマンドと同じですが -f (--functions) および -g (--global) オプションは使えません。
Local コマンドは準特殊組込みコマンドです。 POSIX では local コマンドの動作は規定されていません。
Popd 組込みコマンドはディレクトリスタックからディレクトリを削除し、シェルの作業ディレクトリを戻します。
Popd コマンドはディレクトリスタックからオペランドで指定したインデックスの要素を削除します。インデックス +0 の要素を削除した場合は、新たにインデックス +0 の要素となったディレクトリにシェルの作業ディレクトリを変更し、そのディレクトリ名を標準出力に出力します。
インデックス
ディレクトリスタックの要素を正しく削除し作業ディレクトリを変更できた場合、終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
ディレクトリスタックに要素が一つしかない場合はそれ以上要素を削除できないので、エラーになります。
Popd コマンドは準特殊組込みコマンドです。 POSIX では popd コマンドの動作は規定されていません。
Printf 組込みコマンドはオペランドを整形して出力します。
Printf コマンドはオペランドで指定した書式に従って値を整形し、標準出力に出力します。Echo コマンドとは異なり、出力の最後には自動的に改行は付きません。
書式の指定の仕方は C 言語の printf 関数とよく似ています。書式の中では % で始まる変換指定と \ で始まるエスケープシーケンスを使用できます。書式に含まれる変換指定とエスケープ以外の文字はそのまま出力します。
変換指定
変換指定はパーセント記号 (%) から始まります。
%% 以外の変換指定は、対応する値をとります。変換指定は、値を特定の形式に整形して出力します。変換指定と値は与えられた順番に対応付けられます。値が余った場合は、全ての値を処理し終わるまで書式の整形・出力を繰り返します。値が足りない場合は、空文字列 (文字列に関する変換指定の場合) または 0 (数値に関する変換指定の場合) を仮定します。値が一つも与えられていない場合は、書式は一度だけ出力されます。
利用可能な変換指定は以下の通りです。
%d, %i
%u
%o
%x
%X
%f
%F
%e
%E
%g
%G
%c
%s
%b
%%
%g と %G では、小数の指数部が -5 以上精度以下の時に %f または %F を、それ以外の時に %e または %E を使用します。
%% 以外の変換指定では、最初の % の直後に変換指定フラグ・フィールド幅・精度をこの順で指定できます。これらを指定することで出力の形式を細かく調整できます。
指定できる変換指定フラグは以下の通りです。フラグを複数指定しても構いません。
マイナス (-)
プラス (+)
空白文字 ( )
#
ゼロ (0)
マイナスフラグが指定されている場合、このフラグは無視されます。
変換指定が %d, %i, %u, %o, %x, %X で、精度が指定されている場合、このフラグは無視されます。
フィールド幅は、先頭に 0 の付かない十進整数の形で指定します。
フィールド幅は出力の最低バイト数を指示します。出力のバイト数がフィールド幅に満たないときは、バイト数がフィールド幅に一致するまで空白文字を付加します。
精度は、ピリオド (.) の直後に十進整数を置いたものの形で指定します。ピリオドの後に整数がなければ、0 が指定してあるものとみなします。
変換指定が %d, %i, %u, %o, %x, %X の場合、精度は出力の最低桁数を指示します。数値が最低桁数に満たない場合は最低桁数に達するまで先頭に 0 を付加します。精度が指定されていない場合、精度は 1 とみなします。
変換指定が %e, %E, %f, %F の場合、精度は小数点以降の桁数を指示します。精度が指定されていない場合、精度は 6 とみなします。
変換指定が %g, %G の場合、精度は数値の最大有効桁数を指示します。精度が指定されていない場合、精度は 6 とみなします。
変換指定が %s, %b の場合、精度は出力する文字列の最大バイト数を指示します。精度が指定されていない場合、精度は無限大とみなします。
変換指定 %f にゼロフラグを指定し、フィールド幅に 8、精度に 3 を指定する場合、最終的な変換指定は %08.3f となります。この変換指定に対して値 12.34 を与えると、出力は 0012.340 となります。
エスケープシーケンス
書式の中で使えるエスケープシーケンスは以下の通りです。
\a
\b
\f
\n
\r
\t
\v
\\
\"
\'
\xxx
書式
値
数値を値として指定する際、一重または二重引用符の後に何か文字を置いたものを指定することで、その文字のコード番号を数値として指定できます。例えば 3 という文字のコード番号が 51 ならば、 printf '%d' '"3' は 51 を出力します。
エラーがない限り printf コマンドの終了ステータスは 0 です。
POSIX では、マルチバイト文字の扱いについて厳密に定義していません。%s 変換指定で精度を指定した場合や、%c 変換指定を使用する場合、値にマルチバイト文字が含まれていると適切な出力が得られないかもしれません。Yash では、マルチバイト文字は全てワイド文字に変換してから処理するので、マルチバイト文字の一部のバイトだけが出力されるようなことはありません。
シェルが非 POSIX 準拠モードで、システム上で 『long double』 浮動小数点数が使用可能な場合は、実数の変換指定は 『long double』 で処理されます。それ以外の場合は 『double』 で処理されます。
Pushd 組込みコマンドはディレクトリスタックにディレクトリを追加し、シェルの作業ディレクトリをそのディレクトリに変更します。
Pushd コマンドは cd コマンドと同様に、シェルの作業ディレクトリをオペランドで指定したディレクトリに変更します。作業ディレクトリの変更に成功すると、新しい作業ディレクトリをディレクトリスタックに追加します。
Cd コマンドで使えるオプションに加えて以下のオプションが pushd コマンドで使えます。
--remove-duplicates
ディレクトリ
この値がハイフン一つ (-) の場合、OLDPWD 変数の値が指定されたものとみなします。
この値が符号付き整数の場合、その整数をディレクトリスタックの要素のインデックスとみなして、その要素が表すディレクトリが指定されたものとみなします (指定された要素はディレクトリスタックから削除されます)。
このオペランドが与えられていない場合、インデックス +1 が指定されたものとみなします (--default-directory オプションを指定した場合を除く)。
作業ディレクトリを正しく変更しディレクトリスタックに追加できた場合、終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
Pushd コマンドは準特殊組込みコマンドです。 POSIX では pushd コマンドの動作は規定されていません。
Pwd 組込みコマンドはシェルの現在の作業ディレクトリを表示します。
Pwd コマンドはシェルの現在の作業ディレクトリを絶対パスで標準出力に出力します。
-L, --logical
-P, --physical
-L (--logical) オプションと -P (--physical) オプションの両方を指定した場合、後に指定したほうを優先します。どちらも指定していない場合は、-L を指定したものとみなします。
エラーがない限り pwd コマンドの終了ステータスは 0 です。
Pwd コマンドは準特殊組込みコマンドです。
Read 組込みコマンドは標準入力から行を読み込み変数に代入します。
Read コマンドは標準入力から一行の文字列を読み込み、それを変数に代入します。
-r (--raw-mode) オプションを付けると、行内のバックスラッシュは通常の文字と同様に扱われます。
-r (--raw-mode) オプションを付けない場合、読み込んだ文字列の中のバックスラッシュ (\) は引用符として働きます。バックスラッシュが行末にあるときは行の連結を行います。対話モードのシェルが 2 行目以降を読み込むとき、標準入力が端末ならば PS2 変数の値がプロンプトとして出力されます。
読み込んだ文字列は、単語分割によって分割します。分割後の各文字列が、それぞれオペランドで指定された変数の値に順に設定されます。指定された変数の数より分割結果のほうが多い場合は、最後の変数に残りの分割結果の全てが入ります。分割結果の数より指定された変数のほうが多い場合は、余った変数には空文字列が入ります。
-A, --array
-e, --line-editing
行編集が有効になるには以下の条件が全て満たされている必要があります:
-P, --ps1
-p プロンプト, --prompt=プロンプト
-r, --raw-mode
変数名
エラーがない限り read コマンドの終了ステータスは 0 です。
なお、行を完全に読み込む前に入力が終端に達した時は終了ステータスは非 0 になります。
Read コマンドは準特殊組込みコマンドです。
POSIX には -A (--array) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
PS1 変数をプロンプトとして表示する際、PS1R および PS1S 変数も使用されます。 PS2 についても同様です。
Readonly 組込みコマンドは読み取り専用の変数または関数を表示・設定します。
Readonly コマンドは typeset コマンドに -gr オプションを付けたものと同じです。その他オプション・オペランド・終了ステータスは typeset コマンドと同様です。
readonly コマンドは特殊組込みコマンドです。
POSIX には readonly コマンドに関する規定はありますが、オプションは -p しか規定がありません。その他のオプションは POSIX 準拠モードでは使えません。また POSIX は -p オプションをオペランドとともに使うことを認めていません。
Return 組込みコマンドは現在実行中の関数またはスクリプトの実行を終了します。
-n (--no-return) オプションを付けずに return コマンドを実行すると、以下のうち当てはまる動作を行います:
-n (--no-return) オプションを付けて return コマンドを実行すると、return コマンドはただ単にオペランドで指定されている終了ステータスを返します。
-n, --no-return
終了ステータス
このオペランドが与えられていない場合は、return コマンドの直前に実行されたコマンドの終了ステータスを用います (ただしトラップを実行中の場合はトラップに入る直前のコマンドの終了ステータス)。
Return コマンドの終了ステータスはオペランドで与えられた値です。Return コマンドの終了ステータスは return コマンドが終了する関数・ドットコマンド・初期化スクリプト・シェル自身の終了ステータスにもなります。
Return コマンドは特殊組込みコマンドです。
POSIX では、終了ステータスの値は 0 以上 256 未満でなければならないとしています。Yash では拡張として 256 以上の値も受け付けるようになっています。
POSIX では関数あるいはドットコマンドの実行中以外における return コマンドの動作を定めていません。
POSIX には -n (--no-return) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
Set 組込みコマンドはシェルのオプションの設定と位置パラメータの変更を行います。
Set コマンドでは、POSIX 準拠モードであるかどうかにかかわらずオプションはオペランドより先に全て指定しなければなりません。最初のオペランドより後にあるコマンドライン引数は全てオペランドとして解釈します。
コマンドライン引数を一切与えずに set コマンドを実行すると、現在シェルに設定されている全ての変数の一覧をアルファベット順で (コマンドとして解釈可能な形式で) 標準出力に出力します。
-o を唯一のコマンドライン引数として与えた場合は現在のシェルのオプション設定を一覧にして標準出力に出力します。+o を唯一のコマンドライン引数として与えた場合も同様ですが、この場合はコマンドとして解釈可能な形式で出力します。
これ以外の場合は、set コマンドは以下のようにシェルのオプションの設定と位置パラメータの変更のどちらかまたは両方の動作を行います。
オプションが一つ以上与えられている場合、set コマンドはそれらの有効・無効を切り替えます。通常の形式でオプションを与えると、そのオプションは有効になります。オプションの先頭のハイフン (-) の代わりにプラス (+) を付けて指定すると、そのオプションは無効になります。例えば -m や -o monitor や --monitor はシェルのジョブ制御を有効にし、逆に +m や +o monitor や ++monitor はジョブ制御を無効にします。
長いオプションの名前に含まれる英数字以外の文字は無視され、大文字と小文字の区別はありません。例えば --Le-Comp-Debug は --lecompdebug に同じです。また長いオプションの名前の先頭に no を付けることで、オプションの有効・無効を逆転することができます。例えば --noallexport は ++allexport に同じく、また ++nonotify は --notify に同じです。
オプションは以下に挙げる形式で指定することができます:
ただし全てのオプションが一文字のオプションで指定できるわけではありません。
利用可能なオプションは以下のとおりです:
all-export (-a)
brace-expand
case-glob
clobber (+C)
cur-async, cur-bg, cur-stop
dot-glob
emacs
empty-last-field
err-exit (-e)
err-return
exec (+n)
extended-glob
glob (+f)
hash-on-def (-h)
hist-space
ignore-eof
le-always-rp, le-comp-debug, le-conv-meta, le-no-conv-meta, le-predict, le-predict-empty, le-prompt-sp, le-visible-bell
mark-dirs
monitor (-m)
notify (-b)
notify-le
null-glob
pipe-fail
posixly-correct
trace-all
unset (+u)
verbose (-v)
vi
x-trace (-x)
Set コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (--, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。
オプションの指定が間違っている場合を除き、set コマンドの終了ステータスは 0 です。
Set コマンドは特殊組込みコマンドです。
POSIX 規格に定義されているオプションは限られています。規格の定義では、
規格に定義されているオプションは以下のとおりです:
POSIX ではこのほかに、関数定義をコマンド履歴に登録しないようにする -o nolog オプションを規定していますが、yash はこれをサポートしていません。
Shift 組込みコマンドは位置パラメータまたは配列の要素のいくつかを削除します。
Shift コマンドは位置パラメータまたは配列の要素のうち最初のいくつかを削除します。削除するパラメータ・要素の数はオペランドで指定します。
-A 配列, --array=配列
個数
実際の位置パラメータ・要素の個数より大きい数を指定するとエラーになります。省略すると 1 を指定したものとみなします。負数を指定すると最初ではなく最後の位置パラメータまたは配列要素を削除します。
エラーがない限り shift コマンドの終了ステータスは 0 です。
Shift コマンドは特殊組込みコマンドです。
位置パラメータの個数は特殊パラメータ # によって知ることができます。配列の要素の個数は ${配列[#]} によって知ることができます。
POSIX には -A (--array) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
POSIX 準拠モードでは負の個数は指定できません。
Suspend 組込みコマンドはシェルを停止 (サスペンド) します。
Suspend コマンドはシェルプロセスが属するプロセスグループ内のすべてのプロセスに対して SIGSTOP シグナルを送信します。これにより、シグナルを送られた各プロセス (シェル自身を含む) は停止 (サスペンド) 状態になります。停止状態になったプロセスは SIGCONT シグナルを受信すると実行を再開します。
シェルが対話モードで、さらにシェルプロセスのプロセスグループ ID がセッションリーダーのプロセス ID に等しいときは、-f (--force) オプションを付けない限りシェルは警告を表示し、シグナルを送信しません。これはシェルが停止した後実行を再開させることができなくなってしまうのを未然に防ぐためです。
-f, --force
Suspend コマンドの終了ステータスは、SIGSTOP シグナルをシェルに正しく送信できたときは 0、それ以外なら非 0 です。
Suspend コマンドは準特殊組込みコマンドです。 POSIX では suspend コマンドの動作は規定されていません。
Test 組込みコマンドは引数で指定した内容の判定を行います。
Test コマンドはオプションとオペランドとを区別しません。コマンドライン引数は全て判定式として解釈します。コマンドが [ の名前で実行された時は、判定式の後に ] が必要です。
Test コマンドは引数で与えられた判定式を評価し、結果が真ならば 0 の終了ステータスを、偽ならば 1 の終了ステータスで終了します。判定式は何種類かの演算子とそれに対する被演算子とからなります。
ファイルに関する判定を行う単項演算子は以下の通りです。指定したファイルがシンボリックリンクの場合、そのシンボリックリンクが指している先のファイルについて判定を行います (-h, -L 演算子を除く)。
-b ファイル
-c ファイル
-d ファイル
-e ファイル
-f ファイル
-G ファイル
-g ファイル
-h ファイル
-k ファイル
-L ファイル
-N ファイル
-O ファイル
-p ファイル
-r ファイル
-S ファイル
-s ファイル
-u ファイル
-w ファイル
-x ファイル
ファイル記述子に関する判定を行う単項演算子は以下の通りです。
-t ファイル記述子
文字列に関する判定を行う単項演算子は以下の通りです。
-n 文字列
-z 文字列
シェルのオプションに関する判定を行う単項演算子は以下の通りです。
-o ?オプション
-o オプション
ファイルに関する判定を行う二項演算子は以下の通りです (存在しないファイルは他のファイルより古いとみなします)。
ファイル1 -nt ファイル2
ファイル1 -ot ファイル2
ファイル1 -ef ファイル2
文字列に関する判定を行う二項演算子は以下の通りです。
文字列1 = 文字列2, 文字列1 == 文字列2
文字列1 != 文字列2
以下の二項演算子は現在のロケールの辞書式順序に従って文字列を比較します。
文字列1 === 文字列2
文字列1 !== 文字列2
文字列1 < 文字列2
文字列1 <= 文字列2
文字列1 > 文字列2
文字列1 >= 文字列2
パターンマッチングを行う二項演算子は以下の通りです。
文字列 =~ パターン
整数に関する判定を行う二項演算子は以下の通りです。
v1 -eq v2
v1 -ne v2
v1 -gt v2
v1 -ge v2
v1 -lt v2
v1 -le v2
バージョン番号を表す文字列に関する判定を行う二項演算子は以下の通りです。文字列のバージョン番号としての比較のしかたは後述します。
v1 -veq v2
v1 -vne v2
v1 -vgt v2
v1 -vge v2
v1 -vlt v2
v1 -vle v2
他の判定式を組み合わせてより複雑な判定式を作る演算子は以下の通りです。
! 判定式
( 判定式 )
判定式1 -a 判定式2
判定式1 -o 判定式2
判定式が空の場合、結果は偽とみなします。判定式が (演算子の付いていない) 文字列一つの場合、その文字列が空文字列でないかどうかを判定します。
バージョン番号の比較
文字列のバージョン番号としての比較は、基本的には現在のロケール情報に従った辞書式順序で行います。ただし、連続する数字は一つの自然数として比較します。また数字とそれ以外の文字との比較では常に数字の方が大きいとみなします。
例えば、0.1.2-3 と 00.001.02-3 は等しく、0.2.1 と 0.10.0 とでは後者の方が大きいと判定されます。
Test コマンドの終了ステータスは、判定式の評価結果が真ならば 0、偽ならば 1 です。判定式の構文に誤りがある場合その他のエラーが発生したときは、終了ステータスは 2 です。
複雑な判定式は誤って解釈されることがあるので避けることをお勧めします。例えば [ 1 -eq 1 -a -t = 1 -a ! foo ] は [ 1 -eq 1 ] && [ -t = 1 ] && ! [ foo ] のようにコマンドを分けると式がより明確になります。
POSIX は、エラーが発生した場合の終了ステータスを 『2 以上』 と定めています。また POSIX には以下の演算子の規定はありません: -G, -k, -N, -O, -nt, -ot, -ef, ==, ===, !==, <, <=, >, >=, =~, -veq, -vne, -vgt, -vge, -vlt, -vle。 POSIX に -o の単項演算子としての規定はありません。
Times 組込みコマンドはシェルとシェルが起動したコマンドが消費した CPU 時間を表示します。
Times コマンドはシェルプロセスとその子プロセスが消費した CPU 時間を標準出力に出力します。一行目にシェルプロセス自身がユーザモードおよびシステムモードで消費した CPU 時間をそれぞれ表示します。二行目にシェルの全ての子孫プロセス (親プロセスが wait していないものを除く) がユーザモードおよびシステムモードで消費した CPU 時間をそれぞれ表示します。
エラーがない限り times コマンドの終了ステータスは 0 です。
Times コマンドは特殊組込みコマンドです。
Trap 組込みコマンドはシェルがシグナルを受信したときの動作を設定します。
Trap コマンドはシェルプロセスがシグナルを受信したときの動作 (トラップ) を表示または設定します。
オペランドに動作とシグナルを指定して trap コマンドを実行すると、シェルがシグナルを受信した際に指定した動作を行うようになります。最初のオペランドがシグナル番号の場合、それと残りのシグナルに対する動作は、動作として - が指定されたときと同様に標準の動作に設定されます。
-p (--print) オプションを指定した場合またはオペランドを一つも指定していない場合は、trap コマンドは現在のトラップの設定状況をコマンドとして解釈可能な形式で標準出力に出力します。シグナルが与えられているときはそのシグナルに関する設定を、与えられていないときは全ての設定を出力します。ただし、特定の状況では trap コマンドは現在の設定ではなく以前の設定を表示します (下記補足参照)。
-p, --print
動作
シグナル
シグナルとして 0 または EXIT を指定すると、これはシェルの終了時に発生する仮想のシグナルを指定しているとみなします。この仮想のシグナルに対して設定された動作は、シェルが正常終了する直前に実行されます。
シグナル番号
トラップが正しく設定または表示されたときは終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
Trap コマンドは特殊組込みコマンドです。
POSIX には -p (--print) オプションに関する規定はありません。よってこのオプションは POSIX 準拠モードでは使えません。
POSIX は、シグナル名は INT や QUIT のように最初の SIG を除いた形で指定しなければならないと規定しています。Yash では、拡張として SIG を付けた形でも指定できますし、シグナル名の大文字と小文字を区別しません (このような拡張は POSIX でも認められています)。
出力の再利用
Trap コマンドが出力したトラップの設定を変数に保存しておき、後で eval コマンドでそれを実行することで元のトラップの設定を復活させることができます。
saved_trap=$(trap) trap '...' INT eval "$saved_trap"
ただし、このテクニックの挙動には裏があります。Trap コマンドの出力を変数に保存するためにコマンド置換を使用しますが、コマンド置換はサブシェルで実行されます。サブシェルの開始時にトラップの設定は解除されるため、本来ならばサブシェル内の trap コマンドは何も出力せず、結果として変数にはトラップが保存されないことになります。
この問題を回避するため、POSIX は以下のうちどちらかの挙動を執ることをシェルに求めています。
Yash は二つ目の選択肢に従います。
True 組込みコマンドは何も行わずに 0 の終了ステータスで終了します。
True コマンドは何も行いません。コマンドライン引数は一切無視します。
True コマンドの終了ステータスは 0 です。
True コマンドは準特殊組込みコマンドです。
コロンコマンドは true コマンドと同様に何も行いませんが、true コマンドは準特殊組込みコマンドであるのに対しコロンコマンドは特殊組込みコマンドです。
Type 組込みコマンドはコマンドの種類を特定します。
Type コマンドは command コマンドに -V オプションを付けたものと同じです。その他オプション・オペランド・終了ステータスは command コマンドと同じです。
POSIX では、type コマンドと command コマンドとの関係について規定していません。従って他のシェルの type コマンドは command コマンドに -V オプションを付けたものとは異なる動作をすることがあります。また POSIX は type コマンドのオプションを規定していません。
POSIX 準拠モードでは少なくとも一つコマンドを指定する必要があります。
Type コマンドは準特殊組込みコマンドです。
Typeset 組込みコマンドは変数または関数を表示・設定します。
-f (--functions) オプションを付けずに実行すると、typeset コマンドは変数を出力または設定します。-f (--functions) オプションを付けて実行すると、typeset コマンドは関数を出力または設定します。
-p (--print) オプションを付けて実行すると、typeset コマンドはオペランドで指定した変数または関数を標準出力に出力します。-p (--print) オプションを付けずに実行すると、typeset コマンドはオペランドで指定した変数または関数を設定します。オペランドを一つも与えずに実行すると、-p (--print) オプションの有無にかかわらず typeset コマンドは全ての変数または関数を出力します (このとき -g (--global) オプションがあれば本当にすべての変数を、そうでないときはローカル変数だけを出力します)。
-f, --functions
-g, --global
オペランドがない場合は、このオプションを指定していると全ての変数を出力します。このオプションを指定していないとローカル変数だけ出力します。
-p, --print
-r, --readonly
変数・関数を出力する際は、読み取り専用の変数・関数だけ出力します。
-x, --export
変数を出力する際は、エクスポート対象の変数だけ出力します。
-X, --unexport
変数
変数が既に存在する場合、変数の値は変わりません。存在しない変数を指定した場合、変数は存在するがその値は存在しない状態になります (このような変数はパラメータ展開では存在しない変数として扱います)。
変数=値
指定した値が変数の値として設定されます。この形式のオペランドでは、-p (--print) オプションを指定したときでもこの変数は出力ではなく設定されます。
関数
エラーがない限り typeset コマンドの終了ステータスは 0 です。
既にローカル変数が存在する場合、それを無視してグローバル変数を新しく作ることはできません (-g (--global) オプションを指定していても既存のローカル変数が再設定されます)。
Typeset コマンドは準特殊組込みコマンドです。 POSIX では typeset コマンドの動作は規定されていません。
Export コマンドは typeset コマンドに -gx オプションを付けたものと同じです。Readonly コマンドは typeset コマンドに -gr オプションを付けたものと同じです。Local コマンドは typeset と同じですが -f (--functions) および -g (--global) オプションは使えません。
Ulimit 組込みコマンドはシェルプロセスのリソース制限を表示・設定します。
Ulimit コマンドはシェルプロセスのリソース制限値を表示または設定します。
-a (--all) オプションを付けて実行すると、ulimit コマンドは全ての種類のリソースについて現在の制限値を一覧形式で標準出力に出力します。-a (--all) オプションを付けないで実行すると、一種類のリソースについて制限値を表示または設定します。オペランドで値を指定している場合、その値に制限値を設定します。値を指定していない場合は現在の制限値を標準出力に出力します。表示・設定するリソースの種類はオプションで指定します。設定したリソースの制限値はシェルが起動する各コマンドに受け継がれます。
リソースの各種類について、ハードリミットとソフトリミットの二種類の制限値があります。ソフトリミットがハードリミットを超えることはできません。またハードリミットを緩めるには専用の権限が必要です。
-H (--hard) オプションを指定している場合、ulimit コマンドはハードリミットを表示または設定します。-S (--soft) オプションを指定している場合、ulimit コマンドはソフトリミットを表示または設定します。どちらのオプションも指定してない場合、ulimit コマンドはソフトリミットのみを表示するかまたはハードリミットとソフトリミットの両方を設定します。
-H, --hard
-S, --soft
-a, --all
以下のオプションは表示・設定するリソースの種類を指定します。これらのオプションがどれも与えられていないときは、-f が与えられたものとみなします。(表示・設定可能なリソースの種類はシステムによって異なります)
-c, --core
-d, --data
-e, --nice
-f, --fsize
-i, --sigpending
-l, --memlock
-m, --rss
-n, --nofile
-q, --msgqueue
-r, --rtprio
-s, --stack
-t, --cpu
-u, --nproc
-v, --as
-x, --locks
値
値は基本的に 0 以上の自然数で指定しますが、自然数の代わりに hard、soft、unlimited のいずれかの文字列を指定することもできます。これらの文字列はそれぞれ現在のハードリミットの値、現在のソフトリミットの値、無制限を表します。
リソース制限値が正しく出力または設定できたときは、終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
POSIX が規定しているオプションは -f だけです。また POSIX はオペランドの値として自然数しか規定していません。
Ulimit コマンドは準特殊組込みコマンドです。
Umask 組込みコマンドはシェルプロセスのファイルモード作成マスクを表示・設定します。
オペランドが与えられていないとき、umask コマンドはシェルプロセスの現在のファイルモード作成マスクを標準出力に出力します。-S (--symbolic) オプションで出力の形式を指定できます。出力はオペランドとして再利用可能な形式になっています。
オペランドが与えられているとき、umask コマンドはシェルプロセスのファイルモード作成マスクを与えられたオペランドの値に設定します。
-S, --symbolic
マスク
数値形式
数値形式は 0 以上の八進整数でマスクを指定します。これは以下の各モードを表す自然数のいくつかの和です。
0400
0200
0100
0040
0020
0010
0004
0002
0001
記号形式
記号形式は以下のような書式の記号列でマスクしない権限を指定します。
記号列は一つ以上の節をカンマ (,) で区切ったものです。 節は対象の列と一つ以上の動作からなります。
対象には以下の記号をいくつでも指定できます。
u
g
o
a
対象が一つも指定されていない場合は a が指定されているものとみなします。
動作は以下の演算子と権限の組み合わせです。 演算子は以下のどれかです。
=
+
-
権限は以下のどれかです。
r
w
x
X
s
u
g
o
r, w, x, X, s の記号同士は一度に組み合わせて指定できます。
例えば umask u=rwx,go+r-w を実行すると、ユーザの読み取り権限と書き込み権限と実行権限をマスクしないようにし、グループとその他の読み取り権限をマスクしないようにし、グループとその他の書き込み権限をマスクするようにします。
ファイルモード作成マスクが正しく出力または設定できたときは、終了ステータスは 0 です。エラーがあると終了ステータスは非 0 です。
Ulimit コマンドは準特殊組込みコマンドです。
POSIX は -S オプションを指定しなかった場合の出力形式が必ずしも数値形式であるとは規定していません。
Unalias 組込みコマンドはエイリアスを削除します。
Unalias コマンドはオペランドで指定したエイリアスを削除します。
-a, --all
エイリアス名
エラーがない限り unalias コマンドの終了ステータスは 0 です。存在しないエイリアスをオペランドで指定した場合はエラーになります。
Unalias コマンドは準特殊組込みコマンドです。
Unset 組込みコマンドは変数または関数を削除します。
Unset コマンドはオペランドで指定した名前の変数または関数を削除します。
元々存在しない変数・関数を削除しようとしても、何も起こりません (エラーにはなりません)。
-f, --functions
-v, --variables
-f (--functions) オプションと -v (--variables) オプションの両方を指定した場合、後に指定したほうを優先します。どちらも指定していない場合は、-v を指定したものとみなします。
名前
エラーがない限り unset コマンドの終了ステータスは 0 です。
Unset コマンドは特殊組込みコマンドです。
POSIX では、-f と -v のどちらのオプションも指定されていない場合、指定した名前の変数がない場合はかわりにその名前の関数を削除してよいと規定しています。
POSIX 準拠モードでは少なくとも一つ名前を指定する必要があります。
Wait 組込みコマンドはバックグラウンドのジョブが終了するのを待ちます。
Wait コマンドは実行中のバックグラウンドジョブが終了するのを待ちます。ジョブ制御が有効な時は、ジョブが停止したときも終了したとみなします。
Wait コマンドはジョブ制御が有効でないときでも非同期コマンドの終了を待つのに使えます。
Wait コマンドの実行中にシェルがシグナルを受信した場合、そのシグナルに対しトラップが設定してあればそのトラップを直ちに実行し wait コマンドはそのまま終了します。またジョブ制御が有効な場合、シェルが SIGINT シグナルを受信すると wait コマンドは中断されます。
シェルが対話モードで、ジョブ制御が有効で、非 POSIX 準拠モードのとき、ジョブが終了または停止した時にジョブの状態を出力します。
ジョブ
ジョブを何も指定しないとシェルが有する全てのジョブ・非同期コマンドの終了を待ちます。
存在しないジョブ・非同期コマンドを指定すると、終了ステータス 127 で既に終了したジョブを指定したものとみなし、エラーにはしません。
ジョブが一つも与えられておらず、シェルが全てのジョブ・非同期コマンドの終了を正しく待つことができた場合、終了ステータスは 0 です。ジョブが一つ以上与えられているときは、最後のジョブの終了ステータスが wait コマンドの終了ステータスになります。
Wait コマンドがシグナルによって中断された場合、終了ステータスはそのシグナルを表す 128 以上の整数です。その他の理由で wait コマンドがジョブの終了を正しく待つことができなかった場合、終了ステータスは 1 以上 126 以下です。
Wait コマンドは準特殊組込みコマンドです。
非同期コマンドのプロセス ID は非同期コマンドを実行した直後に特殊パラメータ ! の値を見ることで知ることができます。ジョブ制御が有効なときは jobs コマンドでプロセス ID を調べることもできます。
渡邊 裕貴[FAMILY Given] <magicant@users.osdn.me>
2018-12-28 | 2.48 |