CSH(1)

名称
csh - C 言語ライクな文法を持つシェル (コマンドインタープリタ)

書式
csh [-bcefinstvVxX] [arg ...] [-l]

解説
csh は、履歴 (ヒストリ置換 の項参照)、ジョブ制御 (ジョブ の項参照)、対話的なファイル名とユーザ名の補完 (ファイル名補完 の項参照)、C 言語ライクな文法を特徴とするコマンドインタープリタです。 対話的なログインシェル、また シェルスクリプトのコマンドプロセッサの両方の用途で使われます。

  引数リスト処理
シェルへの最初の引数 (第 0 引数) が ‘-’ で始まる場合、シェルはログインシェルとなります。シェルを ‘-l’ フラグを指定して起動することでもログインシェルにできます。

残りのフラグは以下のように解釈されます:

-b  このフラグは、オプションの処理を強制的に中断させる場合に使用します。この フラグ以降の引数はすべて、オプションではない引数として処理されます。 これにより、シェルスクリプトに混乱やごまかしを行わずにオプションを渡すことが 可能になります。setuid ビットのたったスクリプトは、本オプションなしでは 実行できません。

-c  コマンドを本フラグの次にくる 1 つの引数から読み込みます。 この引数は省略できません。残りの引数は argv に代入されます。

-e  起動したコマンドが異常終了したり、0 でない終了ステータスを返すと、 シェルが終了します。

-f  起動したユーザのホームディレクトリにある .cshrc の内容の解析もコマンドの実行もしないため、高速に起動します。

-i  たとえトップレベルの入力が端末かどうかはっきりしなくとも、 対話的に動作しプロンプトを表示します。 入力と出力が端末である場合、本オプションなしでもシェルは対話的に動作します。

-l  ログインシェルとなります (-l が、指定された唯一のフラグの場合にのみ有効です)。

-n  コマンドの解析は行いますが、実行しません。シェルスクリプトの文法検査に 役立ちます。

-s  標準入力からコマンドを読み込みます。

-t  入力から 1 行だけ読み込み、それを実行します。行末の改行を ‘\’ でエスケープすることで、次の行へ続けることができます。

-v  verbose 変数を設定します。これにより、ヒストリ置換が行われたあとのコマンドラインが 表示されるようになります。

-x  echo 変数を設定します。これにより、実行直前に、実行するコマンドを 表示するようになります。

-V  .cshrc を実行する前であっても verbose 変数を設定します。

-X  -X に対する -x の関係は、ちょうど -V に対する -v の関係に相当します。

フラグ引数の処理のあと、もし引数が残っていて、かつ -c, -i, -s, -t のいずれのフラグも指定されていなければ、残っている最初の引数は コマンドファイル名であるとみなされます。シェルはこのファイルをオープンし、 `$0' による置換に備えてファイル名を保存します。多くのシステムは version 6 または version 7 の標準のシェルを使っており、また、それらのシェルスクリプトは 本シェルとは互換性がないので、スクリプトの先頭の文字が `#' でない、 つまりスクリプトがコメントから始まらない場合は、 それらの `標準' シェルを起動して実行します。 残りの引数は変数 argv に初期値として設定されます。

csh は、まず、コマンドを /etc/csh.cshrc から、さらに、もしログインシェルであれば /etc/csh.login から読み込み、実行します。次にシェルを起動したユーザの ホーム ディレクトリにある .cshrc を読み込み、さらにログインシェルであるなら、 .login を読み込み、実行します。通常、 .login は、CRT 画面の設定のために ``stty crt'' を実行したり、 tset(1) を実行したりするために用いられます。

通常、シェルはプロンプト `% ' を表示し、端末からコマンドを読み込みます。 引数の処理やコマンドスクリプトを含むファイルの処理については後述します。

シェルは、読み込んだ行を 単語 に分解する、単語の列をコマンド履歴に格納し解析する、コマンドを実行する、 という動作を繰り返します。

ログインシェルが終了するとき、ユーザの ホーム ディレクトリにあるファイル .logout と /etc/csh.logout からコマンドを読み込み実行します。

  字句構造
シェルは、読み込んだ行を空白とタブを区切りとして単語に分割しますが、 いくつか例外があります。文字 `&' `|' `;' `<' `>' `(' `)' は独立した単語となります。 `&&', `||', `<<', `>>' のように 2 つ繰り返されているこれらは、 このペアで 1 つの単語を形成します。 これらのメタキャラクタは、直前に `\' を置くことによって単語の一部としたり、 特別な意味を無視させることができます。改行の直前に `\' を置くと、 単一の空白と等価になります。

対応したクォート記号 `'', `', `"' に狭まれた文字列は、単語の一部分となります。 このような文字列中のメタキャラクタやブランク、 タブによって単語が分割されることはありません。 これらのクォートの意味はあとで説明します。 `'' または `"' の内側で改行文字の直前に `\' を置くと、改行そのものに なります。

シェルの入力が端末からではない場合、`#' 文字から改行まではコメントとして 扱われます。直前に `\' を置くか ``', `'', `"" でクォートすることにより、 この意味を抑制することができます。

  コマンド
単純コマンドは単語の列であり、最初の単語が実行すべきコマンドを示します。 `|' 記号で区切られた、単純コマンドあるいは単純コマンドの列はパイプラインを 形成します。パイプラインの各コマンドの出力は、次のコマンドの入力に 接続されます。パイプラインの列を `;' によって区切ることで逐次実行が行えます。 パイプラインの後ろに `&' を置くと、そのパイプラインの終了を 待つことなく、次のパイプラインが実行されます。

上記のいずれかを `(' と `)' で囲むことにより、単純コマンドを形成することが できます (単純コマンドはパイプライン等の一部として使えます)。 また、パイプラインを `||' または `&&' で区切ることにより、 C 言語のように、第 1 のパイプラインが失敗あるいは成功したときにのみ 第 2 のパイプラインを実行させることいったことができます (式 の項参照)。

  ジョブ
シェルは各パイプラインに対し ジョブ を割り当てます。その時点でのジョブの表が保持されており、 jobs コマンドによって表示することができます。 ジョブには整数の番号が割り当てられます。ジョブが `&' を用いて非同期に 起動された場合、シェルは以下のような出力を行います:

[1] 1234

これは、非同期に起動したジョブがジョブ番号 1 で、 (トップレベル) プロセスを 1 つ持っていて、 そのプロセス ID が 1234であることを示しています。

もし、あるジョブを実行中に他のことをしたくなった場合、 ^Z キー (control-Z) を押すことにより実行中のジョブに STOP シグナルを 送信することができます。通常、シェルはそのジョブが停止した (Stopped) ことを 出力し、プロンプトを表示します。ここで、停止していたジョブの状態を 操作することができ、 bg コマンドにより バックグラウンド で走行させたり、他のコマンドを実行してから fg コマンドによりジョブを フォアグラウンド に戻すことができます。 ^Z は即座に効力を発揮し、インタラプトと同様に、それまで待たされていた 出力とまだ読み込まれていない入力は捨てられます。 ほかに特殊キーとして ^Y があり、プログラムがこれを read(2) で読み込もうとした時点で STOP シグナルが送信されます。 このリクエストは、実行中のジョブに対していくつかの入力を先に入力しておき、 先行入力を読み終えた時点でジョブを停止させたいときに便利です。

バックグラウンドで実行しているジョブが端末からの入力を試みた場合、その ジョブは停止します。通常、バックグラウンドジョブが端末に対して出力を行う のは可能ですが、コマンド ``stty tostop'' により禁止することができます。 この tty オプションが設定されていると、バックグラウンドで実行している ジョブは、端末から入力を試みたときと同様に端末に出力を試みたときに停止します。

シェルでジョブを参照するにはいくつかの方法があります。文字 `%' は ジョブ名を表すのに用いられます。番号 1 のジョブを参照する場合は `%1' とします。 単にジョブ名を入力した場合、そのジョブはフォアグラウンドに移動されます。 すなわち `%1' は `fg %1' と等価で、番号 1 のジョブをフォアグラウンドで 実行させます。同様に `%1 &' は番号 1 のジョブをバックグラウンドで走行 させます。ジョブはそのジョブを起動したときにタイプされた文字列の プレフィクスによって参照することもできます。ただしプレフィックスは あいまいでない必要があります。すなわち、`%ex' は通常、サスペンドされた ex(1) のジョブを再開しますが、これは名前が `ex' という文字列で始まる サスペンドされたジョブが 1 つしかない時だけです。 また、`%?string' で文字列 string を含むジョブを指定することができるのは、文字列 string を含むジョブが 1 つしかない場合だけです。

シェルは現在のジョブと直前のジョブを覚えています。jobs コマンドの出力 では、`+' 記号が付加されているのが現在のジョブ、`-' 記号が付加されてい るのが直前のジョブです。`%+' は現在のジョブ、`%-' は直前のジョブの省略形です。 後述する ヒストリ の文法からも類推できる記法として、`%%' があります。 これもまた現在のジョブの省略形です。

ジョブ制御機構を使うためには stty(1) の new オプションが設定されていなければなりません。 これはジョブを停止させるためのシグナルをキーボードから入力できるようにした 新しい tty ドライバを用いていることを示します。 新しい tty ドライバのオプションについては stty(1) を参照してください。

  状態通知
シェルは、プロセスが状態の変化を起こすと、すぐにそれを検知します。 ジョブがもうそれより先に進めなくなってブロックした場合にはシェルは その旨を報告しますが、通常は、これを報告するのはプロンプトを 表示しようとする直前だけです。 これは、ユーザの仕事を邪魔しないようにするためです。しかしながら、シェル変数 notify をセットすることにより、シェルはバックグラウンドジョブの状態変化を すぐに報告するようになります。また、シェルコマンド notify により、特定のプロセスの状態変化をただちに報告させるようにマークすることも できます。 デフォルトでは notify は現在のプロセスに対してマークをつけるので、 バックグラウンドジョブの開始直後に単に `notify' と打つと そのジョブがマークされます。

停止したジョブがまだある状態でシェルを終了しようとすると、`You have stopped jobs.' という警告を受けます。このとき jobs コマンドを使えば、何が残っているかを確認できます。 jobs コマンドで確認した場合、および警告を受けた直後にもう一度シェルを終了させようと した場合には、シェルは 2 度目の警告を行わず、停止中のジョブを終了させてから シェルを終了します。

  ファイル名補完
シェル変数 filec がセットされて (set の項参照) ファイル名補完機能が有効になっている場合、 csh はファイル名やユーザ名のユニークな先頭部分からその名前への補完を 対話的に行います。文字列に続けて エスケープ文字 (エスケープキー、または control-[) を端末から入力することにより 補完が行われます。 たとえば、以下のファイルがカレントディレクトリにあったとします。

    DSC.OLD  bin      cmd      lib      xmpl.c
    DSC.NEW  chaosnet cmtest   mail     xmpl.o
    bench    class    dev      mbox     xmpl.out

ここで、以下のように入力すると、

    % vi ch<escape>

csh は、``ch'' を先頭が ``ch'' にマッチする唯一のファイル名 ``chaosnet'' に補完し、入力行は以下のようになります。

    % vi chaosnet

しかし、

    % vi D<escape>

とすると、 csh は次のように補完し、

    % vi DSC.

それから端末ベルを鳴らして補完が不完全であることをユーザに伝えます。 なぜなら、``D'' で始まるファイル名が複数あったからです。

ファイル名を部分的に指定した直後に end-of-file 文字 (通常は control-D) を 入力すると、 csh は、名前の補完を行うかわりにその名前にマッチするファイル名の一覧が出力され ます。たとえば、以下のように入力すると、

    % vi D<control-D>

``D'' で始まる全てのファイルの一覧が以下のように出力されます:

    DSC.NEW DSC.OLD

このとき、入力行は変化しません。

エスケープの機構および end-of-file の機構と同じものを、 ユーザ名を補完する場合にも用いることができます。これは、 最後の単語が ``~'' で始まっている場合です。たとえば、次のように入力すると、

    cd ~ro<escape>

以下のように補完されます。

    cd ~root

補完に失敗したり複数の候補があったりした場合には端末のベルが鳴りますが、 シェル変数 nobeep をセットすればこれを抑制できます。

通常、そのディレクトリにあるすべてのファイル名が補完の候補となります。 ある特定の拡張子を持つファイルを補完の候補から外したい場合、変数 fignore にその拡張子を列挙すれば、それらは無視されます。以下のコマンド

    % set fignore = (.o .out)

で fignore を設定し、それから以下のように入力すると、

    % vi x<escape>

次のように補完が行われ、

    % vi xmpl.c

"xmpl.o" と "xmpl.out" が無視されます。もし、 fignore で無視するように指定されたファイル名しか補完の対象になり得なかった場合、 それは無視されません。また、 fignore は control-D によるファイル名の一覧表示には影響を与えません。 拡張子に関係なくすべてのファイルの一覧が出力されます。

  置換
ここからは、シェルが入力に対して行うさまざまな置換を、処理が行われる順に 記述します。

  ヒストリ置換
ヒストリ置換は、以前のコマンド入力内の単語を 新たなコマンドラインに展開することで、 コマンドの繰り返しを容易にしたり、直前のコマンドの引数を次のコマンドで 再び使用したり、直前に入力した行の綴り間違いを少ないタイプ数でかつ 高い信頼性をもって修正するための機能です。 ヒストリ置換は文字 `!' で始まり、入力ストリームの どの位置にでも 置くことができます (ただし、入れ子にすることは できません )。`!' の直前に `\' をつけると、その特殊な意味を打ち消すことができます。 また、利便のために、`!' の直後に空白、タブ、改行、 `=', `(' が続いた場合にはヒストリ置換は行われず、入力された文字がそのまま 用いられます (ヒストリ置換は、入力行が `' で始まっている場合にも 起こります。これについては後述します)。入力行にヒストリ置換が含まれている 場合は、実行直前にヒストリ置換を行った結果が端末に出力されます。

端末から入力された 1 つあるいはそれ以上の単語からなるコマンドは、 ヒストリリストに記録されます。ヒストリ置換は、この記録されたコマンド内の 単語列を入力ストリームに挿入することにより行われます。 ヒストリリストの大きさは、変数 history により制御されます。直前のコマンドは history の値によらず必ず保存されます。記録されているコマンドは 1 から順に イベント番号が割り当てられます。

history コマンドにより、以下の出力が得られたとします:

     9  write michael
    10  ex write.c
    11  cat oldwrite.c
    12  diff *write.c

イベント番号つきでコマンドが表示されています。必ずしもイベント番号を 用いる必要はありませんが、 prompt に `!' を含めることにより、現在のイベント番号を プロンプト内に表示させることができます。

現在のイベント番号が 13 だとすると、イベント番号 11 のコマンドは `!11' や、相対指定 `!-2' で指定することができます。 `!d' でイベント番号 12 や `!wri' でイベント番号 9 を指定でき、また、 ある文字列を含むコマンドを指定するのに `!?mic?' (これはイベント番号 9 の コマンドを示します) のような記法も使えます。これらの記法は、それ以上変更 せずに、指定されたイベントの各単語を単一の空白で区切った単語列に置換するだけ です。特例として、`!!' は直前のコマンドを参照します。すなわち、 `!!' だけを入力することは直前のコマンドの 再実行 を意味します。

あるイベント中の単語を指定するには、イベントの指定に続けて `:' を置き、 さらに望みの単語を表す指示子を書きます。イベントの単語は 0 から順に番号が 振られており、最初の単語 (通常はコマンドです) が 0 で、2 番目の単語 (第 1 引数) が 2 などとなります。基本的な単語指示子は以下のとおりです:

0   最初の (コマンド) 単語
n   n 番目の単語
    最初の引数 (すなわち 1 と同じ)
$   最後の引数
%   直前の ?s? 検索でマッチした単語
x-y x 番目から y 番目までの単語
-y  `0-y' の省略形
*   `-$' の省略形。イベントが 1 語のみからなる場合は空になる
x*  `x-$' の省略形
x-  `x*' から最後の単語を除いたもの

イベント選択と単語選択を区切っている `:' は、単語選択が `', `$', `*', `-', `%' で始まっている場合には省略することができます。 単語選択の直後に `:' に続けて修飾子を置くことができます。 以下の修飾子が定義されています:

h   パス名の最後の要素を削除します (head)
r   最後の `.xxx' 要素を削除します (root)
e   `.xxx' 以外の部分を削除します (extension)
s/l/r/
    l を r で置換します (substitution)
t   先行するパス名の要素を削除します (tail)
&   直前の修飾子の効果を繰り返します
g   上記の修飾子の直前に置き、変更を各単語に 1 回だけ適用するように指定します。 例えば `g&' とします。
a   上記の修飾子の直前に置き、1 つの単語に対して可能な限り繰り返して 変更を行います。変更が全体に及ぶように `g' と組み合わせて使えます。
p   置換結果を表示しますが、実行はしません (print only)
q   さらに置換が行われないように、置換結果をクォートします (quote)
x   q と似ていますが、空白、タブ、改行によって単語を分割します

`g' が指定されなかった場合、適用可能な最初の単語のみが修飾子の影響を受けます。 置換では、適用可能な単語がなかった場合にはエラーとなります。

置換 (s/l/r/) における左辺 (l) は、エディタなどで使われる正規表現ではなく単なる文字列です。`/' のかわりに自由な文字を区切りに指定することができます。`\' を使えば l や r 中の区切り文字をクォートすることができます。右辺 (r) 中の文字 `&' は左辺の文字列に置換されます。`\' は `&' もクォートできます。 空の l (`//') は、直前の l または、 `!?s\?' 内のコンテキストスキャン文字列 s を意味します。置換指定の直後に改行がくる場合には、 最後の区切り文字を省略することができます。コンテキストスキャンの後ろ側の 文字 `?' も同様に省略できます。

ヒストリは、 `!$' のようにイベント指定なしで参照することができます。 同じ行でそれ以前にヒストリ参照が行われた場合はそのイベントを、 そうでなければ直前のコマンドが参照されます。`!?foo? !$' は `?foo?' に マッチするイベントの最初と最後の単語に置換されます。

入力行の最初の非空白文字が `' の場合、特殊なヒストリ参照の 省略形であるとみなされます。これは `!:s' と等価で、 直前に入力したコマンドラインの文字列置換を行うことができます。 たとえば、`lblib' は直前のコマンドの `lib' の綴り間違いを修正します。 最後に、ヒストリ置換とそれに後続する文字とを区別するために、ヒストリ置換を `{' と `}' で囲むことができます。`ls -ld ~paul' を実行した直後に `!{l}a' と入力することで、`ls -ld ~paula' に展開されます。`{}' を使わずに `!la' とした場合は `la' で始まるイベントを検索します。

  ' や " によるクォート
文字列を `'' または `"' によってクォートする ことにより、残りの置換のすべてあるいは一部を抑制することができます。 `'' によってクォートされた文字列には本マニュアルのこれ以降に解説する置換が 適用されません。`"' によってクォートされた文字列は、 後述するように一部の置換が適用されます。

どちらのクォートの結果も単一の単語 (の全体または一部) となります。 ただし、`"' クォートされたコマンド置換は複数の単語になる特殊な場合が 1 つだけあります (後述の コマンド置換 の項を参照)。 `'' クォートの場合は、このようなことはありません。

  エイリアス置換
シェルはエイリアス (別名定義) を管理しており、 alias コマンドと unalias コマンドに より設定、表示、修正等を行うことができます。コマンドラインがスキャンされた 後、個々のコマンドに分解され、左から右へ、各コマンドの最初の単語に対応する エイリアスがあるかどうかチェックします。もし存在すれば、 入力されたコマンドラインの内容を直前のコマンドとみなして、 エイリアスの内容をヒストリメカニズムを使って展開します。 この結果出来上がった単語列をコマンドと引数リストとします。エイリアスの内容が ヒストリ参照を含まなかった場合、入力したコマンドラインの引数は変更されずに そのままになります。

`ls' に対するエイリアスが `ls -l' だった場合、`ls /usr' は `ls -l /usr' に 展開され、引数リストはそのままになります。`lookup' に対するエイリアスが `grep ! /etc/passwd' だった場合、`lookup bill' は `grep bill /etc/passwd' に展開されます。

エイリアスが展開された場合、展開結果に対して再度エイリアス検索が行われます。 展開結果の最初の単語が展開前の最初の単語と同一になった場合には、 再度エイリアス検索が行われないようフラグが立ち、ループが防止されます。 それ以外の、エイリアスによるループが検出された場合はエラーとなります。

このメカニズムがあるため、エイリアスでパーサのメタ文法を構築することが できます。よって `alias print 'pr \!* | lpr'' とエイリアスすることで pr の引数をプリンタに出力させるというようなことができます。

  変数置換
シェルは変数を管理しており、それらは 0 個またはそれ以上の単語のリストを値として 持ちます。変数のうちいくつかはシェルがセットしたり参照したりします。 たとえば、 argv はシェルへの引数を保持しており、この変数の値の単語列は特殊な方法で 参照されます。

変数の値は set および unset コマンドにより参照、変更することができます。シェルが 参照する変数のうちいくつかは、それがセットされているかどうかだけが重要 であり、値が何であっても意味を持たないものがあります。たとえば、変数 verbose は入力行がエコーされるかどうかを制御する変数であり、この変数を セットすることは、コマンドラインオプションの -v を指定したのと同じ意味になります。

変数を数値として扱う操作もあります。`@' コマンドによって変数に対して数値演算 を適用し、演算結果を変数に代入することができます。しかしながら、変数の 値はつねに文字列として表現されます。数値演算の場合、ヌル文字列は 0 と みなされ、複数の単語からなる変数の値のうち 2 番目以降の単語は無視されます。

入力行にエイリアス置換を適用し、構文解析を行ったあと、各コマンドの実行前に 文字 `$' をキーとして変数置換が行われます。`$' の直前に `\' を置くことにより、この変数置換を抑制することができます。 ただし、`"' クォート中では変数置換は 必ず 行われますが、`'' クォート中では 決して 行われません。`' クォートの中はあとで解釈されるため (後述の コマンド置換 の項を参照)、ここでは変数置換は行われません。`$' の直後に空白、タブ、 改行がくる場合、`$' はそのまま残されます。

入出力リダイレクトは変数置換より前に解釈され、別々に変数置換が行われます。 それ以外のコマンド名と引数は同時に展開されます。このため、最初の 単語 (コマンド) が複数の単語となって、展開された結果の 最初の単語がコマンド名、それ以外が引数の一部になることもあります。

`"' でクォートされておらず、変数置換に `:q' 修飾子も指定されなかった 場合には、変数置換の結果にコマンド置換とファイル名置換が行われます。 `"' クォート内では複数の単語からなる値を持つ変数は、 各単語を空白で区切ったうえで、単一の単語として展開されます。 置換に `:q' 修飾子が指定された場合は、変数は各単語間を 1 個の空白で区切られた 単語列に展開され、 この後のコマンド置換やファイル名置換を抑止するためにクォートされます。

変数置換には以下の形式があります。明記していない場合、 セットされていない変数の参照はエラーになります。

$name
${name}
    変数 name の値の各単語間を 1 個の空白で区切った単語列にし、これで置き換えます。中括弧で name と後続する文字とを分離すれば、後続する文字が変数名の一部と解釈されないように できます。 シェル変数の名前は、先頭はアルファベットで始め、アルファベットまたは 数値の組合せで計 20 文字までです。 アンダースコアも使用することができます。 name という名前のシェル変数は存在しないが、同名の環境変数が設定されている 場合には、その値に置換されます (ただし、環境変数に対しては `:' 修飾子 および以降に説明する書式を用いることはできません)。
$name[selector]
${name[selector]}
    変数 name の値の単語列からいくつかの単語を選択して展開します。 selector は `$' 置換に対して働き、1 つの数字、または範囲を示す 2 つの数字を `-' でつないだものから構成されます。最初の単語が番号 `1' となります。 範囲を表す最初の数字が省略された場合は 1 が用いられます。範囲を表す 後の方の数字が省略された場合は `$#name' が用いられます。 selector として `*' が用いられた 場合には、すべての単語に展開されます。範囲の第 2 の数字が省略された場合や 範囲内にないために結果としてその範囲が空になっても、エラーとはなりません。
$#name
${#name}
    その変数内の単語数を返します。 この機能は後述する `$argv[selector]' で有用です。
$0  コマンドを読み込んでいるファイル名に展開されます。ファイル名が不明の場合は エラーとなります。
$number
${number}
    `$argv[number]' と等価です。
$*  `$argv[*]' と等価です。

上記の置換に対し、`:gh', `:gt', `:gr' の場合と同様に、 修飾子 `:e, `:h', `:t', `:r', `:q', `:x' を適用することができます。 中括弧 `{' `}' で囲まれている場合は、 中括弧内に修飾子が存在しなければなりません。 現在の実装では、各 `$' 展開に対して `:' 修飾子の指定は 1 つまでです。

以下の置換を行う場合は `:' 修飾子を指定することはできません。
$?name
${?name}
    変数 name がセットされていれば文字列 `1' に、さもなければ `0' に展開されます。
$?0 現在の入力ファイル名がわかっていれば `1' に、不明ならば `0' に展開されます。
$$  (親の) シェルの (10 進の) プロセス番号に展開されます。
$!  そのシェルから起動された最後のバックグラウンドプロセスの (10 進の) プロセス番号に展開されます。
$<  標準入力から 1 行を読み込み、その内容に展開されます。読み込んだ内容の解釈は 行いません。シェルスクリプト中でキーボードからの入力を受けるのに用いることが できます。

  コマンド置換とファイル名置換
残っている置換はコマンド置換とファイル名置換で、 組み込みコマンドの引数に対しては選択的に行われます。 ここでの選択的にとは、評価されない式に対しては これらの置換は行われないということを意味しています。 組み込みコマンドではないコマンドの場合は、 コマンド名と引数とは別々に置換が行われます。この置換が行われるのはかなり後の、 入出力リダイレクトが行われた後で、メインシェルの子供の中で行われます。

  コマンド置換
コマンド置換は、コマンドを `' で囲むことによって指示します。コマンドからの 出力は空白、タブ、改行によって単語に分割され、空の単語を削除したあとに 元の文字列と置き換えられます。 `"' の内部では、改行だけが単語分割の区切りとして扱われ、空白とタブは そのまま残されます。

どちらの場合も、コマンドの出力の最後の改行は単語の区切りとはなりません。 これにより、コマンド置換によって、コマンドの出力が完全な 1 行であっても、 単語の一部分のみを生成することが可能です。

  ファイル名置換
単語が文字 `*', `?', `[', `{' を含んでいるか、先頭が `~' の場合、 その単語はファイル名展開 (あるいはグロブ (glob) と呼ばれます) の 候補となります。ファイル名展開の候補となった単語はパターンとみなされ、 パターンにマッチするファイル名をアルファベット順にソートしたうえで 置換されます。ファイル名置換を含む ファイル名置換を指示する単語群内のどのパターンもファイル名にマッチしなかった 場合にはエラーとなりますが、マッチするものがすべてのパターンにある 必要はありません。メタキャラクタ `*', `?', `[' だけがパターンマッチ文字であり、 `~' と `{' は省略形といったほうが近いでしょう。

ファイル名マッチにおいて、先頭または `/' の直後の `.' は明示的にマッチ させなければならず、同様に `/' も明示的にマッチさせなければなりません (`*' や `?' はこれらにマッチしません)。 文字 `*' は、どのような文字列にもマッチします。これにはヌル文字列も含みます。 文字 `?' は、全ての単一文字にマッチします。 ‘[...]’ は、括弧の中で指定した文字のいずれかにマッチします。 ‘[...]’ 内では、文字の対を `-' でつなぐことで、文字の範囲を指定することが できます (両側の文字も含まれます)。

ファイル名の先頭の `~' はホームディレクトリを示すのに用いられます。 単独で用いられた場合、つまり `~' だけの場合、シェルを起動したユーザの ホームディレクトリ (これは、 変数 home に反映されています) に展開されます。`~' に続けてアルファベット、 数字、`-' からなる単語が続いた場合は、その単語をユーザ名とみなして、 そのユーザのホームディレクトリに展開されます。たとえば、ユーザ ken の ホームディレクトリが `/usr/ken' ならば、`~ken' は `/usr/ken' に、`~ken/chmach' は `/usr/ken/chmach' に展開されます。直後に `~' にアルファベットと `/' 以外が続いたり、`~' がファイル名の先頭にない 場合には、変更されずにそのまま残されます。

メタ記法 `a{b,c,d}e' は `abe ace ade' の短縮形です。 出現順序は保存されます。これは、マッチした結果を個別に下位レベルで ソートしたうえでこの順序を保存するという方法で行われています。 この記法は入れ子にすることができます。 source のホームディレクトリが `/usr/source' の場合、 `~source/s1/{oldls,ls}.c' は `/usr/source/s1/oldls.c /usr/source/s1/ls.c' に展開されます。 このとき oldls.c や ls.c が存在しなくともエラーにはなりません。 同様に、`../{memo,*box}' は `../memo ../box ../mbox' 等に展開されます (`memo' と `*box' の展開結果がいっしょにソートされていないことに 注目してください)。特殊な場合として `{', `}', `{}' は変更されずにそのまま 残されます。

  入出力
コマンドの標準入出力は、以下の方法によりリダイレクトすることができます:

< name
    ファイル name (変数、コマンド、ファイル名展開後の 1 番目です) をオープンし、コマンドの標準入力とします。
<< word
    word と同一の行が出現するまで、シェルの入力を読み込みます。 word に対しては変数、ファイル名、コマンド置換は行われず、各入力行は 読み込まれると、置換を行う前にすぐに word と比較されます。その後、 word に `\', `"', `', `' によるクォートが出現しなければ、 読み込まれた行に対して変数置換とコマンド置換が適用されます。 `\' を使えば `$', `\', `' をクォートすることができます。 コマンド置換では、すべての空白、タブ、改行は保存されますが、 最後の改行は削除されます。 処理結果のテキストは中間ファイルに保存され、コマンドの標準入力として 用いられます。
> name
>! name
>& name
>&! name
    ファイル name を標準出力として用います。ファイルが存在しなければ作成され、 すでにファイルが存在すればその内容は切り捨てられ、以前の内容は失われます。

    変数 noclobber がセットされている場合、そのファイルは存在していないか、 キャラクタスペシャルファイル (たとえば、端末や `/dev/null') でなければならず、 これら以外ではエラーになります。これは、 すでに存在するファイルを思いがけず削除してしまうことを防止します。`!' を 用いた形式を使うと、この検査を抑制することができます。

    `&' を含む形式では、標準出力とともに標準エラー出力もファイルへ リダイレクトされます。 name の展開方法は、`<' の入力ファイル名の場合と同じです。
>> name
>>& name
>>! name
>>&! name
    `>' と同様に、ファイル name を標準出力として用います。ただし、コマンドの出力はファイルの末尾に 追加されます。変数 noclobber がセットされている場合、 ファイルが存在しなければエラーとなります (`!' を用いることで、この検査を 抑制することができます)。他は `>' と同様です。

コマンドは、シェルが起動されたときの環境に対し、入出力リダイレクトと パイプラインで変更を加えた環境を引き継ぎます。既存ののいくつかの シェルとは異なり、 シェルコマンドファイルから起動されたコマンドは、デフォルトでは標準入力に よってシェルコマンドファイル自体にアクセスすることはできません。 かわりに、シェルが起動した環境の標準入力をそのまま受け継いでいます。 `<<' 機構はインラインデータのために用いるべきです。 これにより、シェルコマンドスクリプトがパイプラインの一部として 機能することができ、そのシェルは入力の読み込みでブロックすることができる ようになっています。 バックグラウンドで実行されているコマンドの標準入力も /dev/null 等にリダイレクトされることは なく 、シェルの標準入力をそのまま受け継ぎます。 もしこの標準入力が端末で、コマンドが端末から読み込もうとした場合、 そのプロセスはブロックされ、シェルはユーザにそのことを通知します (上記 ジョブ の項を参照)。

標準エラー出力もパイプを通して標準出力と一緒ににリダイレクトすることが できます。単に `|' としていたものを `|&' にするだけです。

  式
いくつかの組み込みコマンド (後述します) は、引数に式をとります。演算子は C 言語に似たものとなっており、グループ化が右から左という 逆方向 であることを除けば優先順位も同じです。式は @, exit, if, while コマンド中で用います。以下の演算子が使用可能です:

|| && | & == != =~ !~ <= >= < > << >> + - * / % ! ~ ( )

上記の演算子は右にいくほど優先順位が高くなっています。 `==' `!=' `=~' `!~', `<=' `>=' `<' `>', `<<' `>>', `+' `-', `*' `/' `%' の 5 グループは、各グループ内では同じ優先度です。 `==', `!=', `=~', `!~' は引数を文字列とみなして比較演算を行い、 他の演算子は数値演算を行います。`=~', `!~' は `!=', `==' と同様ですが、右辺を パターン (`*', `?', `[...]' を含んだ) とみなして、左辺とのパターンマッチが行われます。 これにより、 実際に必要なのがパターンマッチだけという局面では、シェルスクリプの switch 文の必要度が低くなります。

先頭が `0' の文字列は 8 進数の数値とみなされます。空または省略された引数 は `0' とみなされます。すべての演算結果は 10 進数数値の文字列となります。 同一の単語中に式の要素が 2 つ出現してはいけません。つまり、 式の要素が連続することがパーサにとって文法的に重要な意味を持つもの (`&', `|', `<', `>', `(', `)') 以外は、その前後に空白が必要です。

さらに式では、`{' と `}' で囲んだコマンドと、以下のファイル検査演算子を 用いることができます。ファイル検査演算子は -l name の形式で、 l は以下のうちのいずれかです:

    r	読込みアクセス権
    w	書込みアクセス権
    x	実行アクセス権
    e	存在しているか
    o	所有者か
    z	サイズがゼロか
    f	通常ファイルか
    d	ディレクトリか

指定された name は、コマンド置換とファイル名置換を適用したのちに、 指定された権限が実ユーザで成立するかどうかが検査されます。 ファイルが存在しないか、 アクセス不可なら演算結果は false すなわち `0' になります。 コマンドがステータス 0 で終了した場合はコマンドの実行が成功したとみなされ true すなわち `1' が返り、それ以外は失敗とみなされ false すなわち `0' が 返ります。詳しいステータス情報が知りたい場合は、そのコマンドを式の外部で 実行し、変数 status の値を調べてください。

  制御構造
シェルには、コマンドファイル (シェルスクリプト) 中あるいは (制限があるが、便利な方法の) 端末から制御の流れを変更する ためのコマンドがいくつかあります。これらのコマンドはシェルに入力を 読み直させたり、スキップさせたりすることができます。実装の都合上、 いくつかのコマンドは、置くことができる場所が制限されています。

if 文の if-then-else のように、 foreach, switch, while 文は、後述するように単一入力行に単一の単純コマンドとして現れる必要があります。

シェルの入力がシーク不可能なものの場合、シェルは、ループを読み込んでいる最中は その入力をバッファに保存し、この内部バッファに対してシークを行います (このため、シーク不可能な入力であっても、後方への goto が可能です)。

  組み込みコマンド
組み込みコマンドはそのシェルの内部で実行されます。ただし、 組み込みコマンドがパイプラインの最後以外に用いられた場合は、 サブシェル上で実行されます。

alias
alias name
alias name wordlist
    1 番目の形式は全てのエイリアスを出力します。2 番目の形式は name に対するエイリアスを出力します。最後の形式は wordlist を name のエイリアスとして登録します。 wordlist にはコマンド置換、ファイル名置換が適用されます。 name に alias や unalias を指定することはできません。

alloc
    csh が動的に獲得したメモリの量、使用中のものの量、未使用のものの量を表示します。 なんらかの引数をつけると、ブロックサイズごとの使用中/空ブロック数を表示します。 ブロックサイズは 8, 16, 32... となります。本コマンドの出力はシステムによって 異なります。VAX 以外のシステムは、異なるメモリ管理を行っているかもしれない からです。

bg
bg %job ...
    現在のジョブあるいは指定されたジョブをバックグラウンドに移動します。 もしそれらのジョブが停止されていたなら、実行が再開されます。

break
    最も内側の foreach または while ループに対応する end の後へ脱出します。同じ行にある残りのコマンドは実行されます。複数の break を同一行に記述することで複数レベルの脱出が可能です。

breaksw
    switch から脱出し、対応する endsw の直後から実行を再開します。

case label:
    後述の switch 文のラベルです。

cd
cd name
chdir
chdir name
    シェルのカレントディレクトリをディレクトリ name に変更します。引数が指定されなかった場合には、ユーザのホームディレクトリに 変更します。カレントディレクトリにディレクトリ name がない場合 (かつ name が `/', `./', `../' で始まっていない場合)、変数 cdpath の各要素に対し、そのサブディレクトリとして name がないかどうかを調べます。最後に、シェル変数 name に `/' で始まる値が設定されているならば、 その名前のディレクトリが存在するかどうかを調べます。

continue
    最も内側の while または foreach ループの先頭に戻ります。戻る前に、その行の残りのコマンドが実行されます。

default:
    switch 文のデフォルトを示すラベルです。 default は、全ての case ラベルより後に置くべきです。

dirs
    ディレクトリスタックを表示します。スタックの一番上が左端に表示されます。 スタックの一番上はカレントディレクトリです。

echo wordlist
echo -n wordlist
    指定された単語を空白で区切った文字列をシェルの標準出力に書き出します。 -n オプションが指定されなければ、最後に改行が出力されます。

else
end
endif
endsw
    後述の foreach, if, switch, while 文の項を参照してください。

eval arg ...
    (sh(1) と同様に) 引数をシェルへの入力であるとみなして読み込み、現在のシェルの コンテキストで実行します。コマンド置換や変数置換の結果として生成された コマンド列を実行する場合に用いられます。通常は、それらの置換に先立って 文法解析が行われてしまうからです。 eval の使い方の例が test(1) にあります。

exec command
    指定された command を現在のシェルと置き換えて実行します。

exit
exit (expr)
    1 行目の形式では変数 status の値、2 行目の形式では式 expr の値を戻り値としてシェルを終了します。

fg
fg %job ...
    現在のジョブあるいは指定されたジョブをフォアグラウンドに移動します。 停止していたジョブは実行を再開します。

foreach name (wordlist)
...
end 変数 name に wordlist の各値を順次セットしながら、対応する end までのコマンドを繰り返し実行します (foreach と end は別々の行に単独で置かなければなりません)。内蔵コマンド continue を使って途中でループの次の繰り返しを実行させたり、 break コマンドによって途中でループを脱出させたりすることができます。 このコマンドが端末から読み込まれた場合、ループすべての内容が (プロンプト ? を 表示しながら) 読み込まれてから実行が開始されます。 端末からループ内部を入力中にタイプミスした場合でも修正が可能です。

glob wordlist
    echo コマンドと似ていますが、`\' によるエスケープは解釈されず、 出力内の単語はヌル文字によって区切られます。他のプログラムから、 シェルをファイル名置換のために利用する場合に便利です。

goto word
    word にファイル名置換、およびコマンド置換を適用したのち、それを `ラベル' とみなします。シェルは可能なかぎり入力を遡って読み直し、`ラベル:' のある 行を検索し、そこから実行を開始します。 ラベルの前には空白またはタブを置くことが可能です。

hashstat
    コマンドを検索するのに、内部ハッシュテーブルがどの程度効率的に働いているか (また、 exec をどの程度回避できているか) を表示します。 path の各要素のうち、ハッシュ関数がヒットの可能性を示しているものと、 `/' で始まらない各要素について exec が試みられます。

history
history n
history -r n
history -h n
    ヒストリのリストを表示します。数字 n が指定された場合には、最近の n 個のイベントだけが表示されます。 -r オプションは表示順序を逆にします。 すなわち、もっとも古いものを先に表示するのではなく、もっとも新しいものを 先に表示します。 -h オプションを指定すると、イベント番号が省略されます。これは、 source で -h を使って読み込むためのファイルを生成したい場合に使います。

if (expr) command
    指定された式が true と評価されたならば、単一のコマンド command が実行されます。 command に対する変数置換は前もって、 if コマンドの残りの部分と同時に行われます。 command は単純コマンドだけが許され、パイプライン、コマンドリスト、括弧でくくられた コマンドリストであってはいけません。たとえ式 expr が false と評価された、つまり command が実行 されなかった 場合であっても、入出力リダイレクションは実行されます (これはバグです)。

if (expr) then
...
else if (expr2) then
...
else
...
endif
    式 expr が true なら、最初の else までのコマンドが実行されます。さもなければ、式 expr2 が true なら、次の else までのコマンドが実行されます。いくつでも else-if の対を繰り返すことができますが、 endif が最後に 1 つ必要です。最後の else 部分はあってもなくてもかまいません (単語 else と endif は入力行の最初に置く必要があります。また、 if はその入力行内に単独で出現するか、 else のあとに置く必要があります)。

jobs
jobs -l
    アクティブなジョブの一覧を出力します。 -l オプションを指定すると、通常の出力に加えてプロセス ID も出力します。

kill %job
kill
    [-s signal_name] pid
kill -sig pid ...
kill -l [exit_status]
    TERM (terminate) シグナルあるいは指定したシグナルを、指定されたジョブ またはプロセスに送ります。シグナルは番号または名前で指定できます (名前は <signal.h> にある名前から `SIG' を取り除いたものです)。 シグナル名の一覧は ``kill -l'' で表示でき、 exit_status が指定されていると、その値に対応するシグナル名だけが表示されます。 kill にはデフォルト動作はなく、単に `kill' を実行しても 現在のジョブにシグナルが送られるようなことはありません。 送るシグナルが TERM (terminate) または HUP (hangup) の場合、 CONT (continue) シグナルも同時に送られます。

limit
limit resource
limit resource maximum-use
limit -h
limit -h resource
limit -h resource maximum-use
    現在のプロセスとそれが生成するプロセスのそれぞれについて、指定されたリソース resource を、 maximum-use を超えて使用しないように設定します。 maximum-use が指定されなかった場合には、現在の制限値が表示され、 resource が指定されなかった場合には、すべての制限値が表示されます。 -h フラグが指定された場合、現在の制限値のかわりに ハードリミットの表示/設定を行います。ハードリミットは現在の制限値の限界値です。 ハードリミットを増加させることができるのはスーパーユーザだけです。 一般ユーザは現在の制限値を決められた範囲内で増減することができます。

    現在のところ、制御可能なリソースは、 cputime (各プロセスが使うことのできる最大の CPU 秒数)、 filesize (1 つのファイルの最大サイズ)、 datasize (プログラムのテキスト領域の末尾の先にある data+stack 領域は sbrk(2) を用いて伸ばすことができますが、これの最大サイズ)、 stacksize (自動的に拡張されるスタック領域の最大サイズ)、 coredumpsize (コアダンプファイルの最大サイズ) です。

    最大値 maximum-use は、(整数あるいは浮動小数点数の) 数値とそれに続くスケールファクタによって 指定します。 cputime 以外の制限値のデフォルトのスケールファクタは `k' あるいは `kilobytes' (1024 バイト) で、スケールファクタには `m' あるいは `megabytes' も使用することができます。 cputime のデフォルトのスケールファクタは `seconds' (秒) です。`m' (分)、`h' (時間) をスケールファクタとして指定したり、 `mm:ss' 形式で分秒を指定したりすることもできます。

    リソース名 resource とスケールファクタを指定する際には、 一意に決まるのであれば、先頭部分だけを指定することもできます。

login
    ログインシェルを終了し、 /usr/bin/login と置き換えます。これは sh(1) との互換性のために用意されたログオフの一手段です。

logout
    ログインシェルを終了します。 ignoreeof がセットされている場合に便利です。

nice
nice +number
nice command
nice +number command
    1 行目の形式は、シェルのスケジューリングプライオリティを 4 に設定します。 2 行目の形式は、プライオリティを指定された値 number に設定します。残りの 2 つの形式は、コマンドをプライオリティ 4 または number で実行します。大きい数値を指定すると、プロセスの CPU 占有時間が少なくなります。 スーパーユーザだけが `nice -number ...' のようにして、 プライオリティに負の値を指定できます。 command は常にサブシェルで実行され、単純な if 文内のコマンドにかけられる制限と同様の制限を受けます。

nohup
nohup command
    1 行目の形式は、シェルスクリプト内で使用し、 スクリプトのそれ以降で hangup シグナルを無視するように設定します。 2 行目の形式は、指定されたコマンドが、hangup を無視するように設定して 実行されます。`&' をつけて実行されたプログラムは、 nohup を指定して実行したのと同様に hangup を無視します。

notify
notify %job ...
    現在のジョブまたは指定されたジョブの状態が変化したときに即座に通知する ように指定します。通常は、プロンプトが表示される直前に通知が行われます。 シェル変数 notify が指定されている場合は、すべてのジョブに対して同様の設定が行われます。

onintr
onintr -
onintr label
    割り込みに対するシェルの動作を制御します。1 行目の形式は、シェルをデフォルト の動作、すなわち、スクリプトの実行が中断される、言い換えると、 コマンド入力状態に戻るように設定します。 2 行目の形式は、すべての割り込みを無視するように設定します。 3 行目の形式は、シェルが割り込みを受けるか子プロセスが 割り込みによって停止した場合に、goto label が実行されるように設定します。

    シェルがバックグラウンドで、かつ、シグナルを無視するように 設定して実行されている場合は、どの形式の onintr も効力を持たず、 割り込みはシェルとそこから起動されるすべてのコマンドで引続き無視されます。 最後に、 システムのスタートアップファイル (/etc/csh.cshrc, /etc/csh.login) 中では 割り込みが禁止されているので、この中での onintr 文は無視されます。

popd
popd +n
    ディレクトリスタックをポップし、新たにスタックの 先頭になったディレクトリにカレントディレクトリを変更します。引数 `+ n' が指定された場合、スタックの n 番目の要素が捨てられます。ディレクトリスタックのメンバはスタックの先頭から 0 から順に番号がつけられます。

pushd
pushd name
pushd n
    引数を指定しなかった場合、 pushd はスタックの先頭の 2 つの要素を入れ替えます。引数 name が指定された場合、 cd と同様にカレントディレクトリを変更したあと、 古いカレントディレクトリ (cwd 内に設定されているもの) をディレクトリスタックにプッシュします。 数字引数が指定された場合、ディレクトリスタックの n 番目の要素がスタックの先頭にくるようにローテートし、カレントディレクトリを その要素が示すディレクトリに変更します。 ディレクトリスタックのメンバは スタックの先頭から、0 から順に番号がつけられます。

rehash
    変数 path に指定されているディレクトリ下の内容に対するハッシュテーブルを 再計算させます。ログイン中に新しいコマンドが path に含まれるディレクトリに追加された場合に、これを行う必要があります。 これは、あなたが個人的なディレクトリの 1 つにコマンドを追加したか、 システムの管理者がシステムディレクトリの内容を変更したような 場合にのみ必要です。

repeat count command
    指定されたコマンド command を count 回繰り返し実行します。 command は、前述の 1 行の if 文内の command と同様の制限を受けます。入出力リダイレクションは、 count がたとえ 0 であっても、必ず 1 回だけ処理されます。

set
set name
set name=word
set name[index]=word
set name=(wordlist)
    1 行目の形式は、全てのシェル変数の値を表示します。値として複数の単語を 持つ変数の場合は、単語のリストを括弧で括って表示します。 2 行目の形式は、 name にヌル文字列を設定します。3 行目の形式は name に 1 つの単語 word を設定します。4 行目の形式は name の index 番目の要素として word を設定します。 index 番目の要素はすでに存在していなければなりません。5 行目の形式は、 name に wordlist で指定した単語列を設定します。すべての形式で、 値にはコマンド置換とファイル名置換が適用されます。

    一度に複数の引数を並べて指定すれば、 1 回の set コマンドで複数の変数を設定することができます。 ただし、全ての引数に対する変数展開処理は、代入処理より前に行われます。

setenv
setenv name
setenv name value
    1 行目の形式は、すべての環境変数の一覧を出力します。 これは printenv(1) と等価です。 3 行目の形式は環境変数 name に値 value を設定します。2 行目の形式は環境変数 name に空の文字列を設定します。最も一般的に用いられる環境変数 USR, TERM, PATH の値と シェル変数 user, term, path の値は相互に自動的に設定されます。よって、これらを明示的に setenv する必要はありません。

shift
shift variable
    変数 argv の各要素を左にシフトし、 argv[1] の値を捨てます。 argv に値が設定されていないか、1 つ以上の要素を持たない場合にはエラーになります。 2 行目の形式は、指定された変数 variable に対して同様の処理を行います。

source name
source -h name
    シェルは、指定されたファイル name からコマンドを読み込みます。 source コマンドはネストすることができます。あまりに深くネストさせると、 ファイル識別子を使い切ってしまう場合があります。どのネストレベルの source コマンドであっても、その中でエラーが発生すると、ネストしている全ての source コマンドが中断されます。通常、 source の実行中に実行されたコマンドはヒストリに記録されませんが、-h オプションを指定することにより、ファイルに記述してあるコマンドを実行せずに、 ヒストリリストにのみ記録することができます。

stop
stop %job ...
    バックグラウンドで走行中の現在のジョブ、あるいは指定されたジョブを停止します。

suspend
    ^Z でストップシグナルを送られたかのように、シェル自身を停止させます。 su(1) で起動したシェルを停止させる場合によく用いられます。

switch (string)
case str1:
...
breaksw
...
default:
...
breaksw
endsw
    指定された文字列 string にまず、コマンド置換とファイル名置換を施したうえで、 string と各 case ラベルのマッチングを順番に行います。 case ラベルには変数置換が行われ、 ファイル名メタキャラクタの `*', `?', `[...]' を用いることができます。 default ラベルが出てくる前にどの case ラベルもマッチしなかった場合は、 default ラベルの直後から実行が始まります。 case ラベルと default ラベルは行の最初に書かれなければなりません。 breaksw コマンドによって endsw 以降のコマンドから実行が再開されます。 breaksw を用いない場合は、 C 言語の場合と同様に、 case ラベルや default ラベルを通過して実行が続けられます。 default がなく、どのラベルもマッチしなかった場合には、 endsw 以降から実行が再開されます。

time
time command
    引数なしの場合、シェルとその子プロセスが使用した時間が表示されます。 引数が指定された場合、指定された単純コマンドの実行時間が計測され、 変数 time の項で述べてある形式で、結果が表示されます。 必要ならば、コマンド終了時に時間を表示するための余分なシェルが生成されます。

umask
umask value
    ファイル作成マスクを表示 (第 1 の形式) または指定された値に設定 (第 2 の形式) します。 マスクは 8 進数で与えます。一般には、グループにすべての権限を与え、 そのほかには読込みと実行のみを許可する 002 を指定したり、所有者以外には 読込みと実行しか許可しない 022 を指定します。

unalias pattern
    pattern にマッチするすべてのエイリアスを削除します。`unalias *' とする ことで全てのエイリアスを削除することができます。削除するものがなかった 場合でもエラーにはなりません。

unhash
    実行するプログラムの位置検索を高速化する内部ハッシュテーブルの使用を 禁止します。

unlimit
unlimit resource
unlimit -h
unlimit -h resource
    リソースの制限を解除します。 resource が指定されない場合、すべてのリソースに対する制限が解除されます。 -h が指定された場合、対応するハードリミットが解除されます。 これができるのはスーパーユーザだけです。

unset pattern
    指定された pattern にマッチするすべての変数を削除します。`unset *' と指定すると 全ての変数が削除され、悲惨な結果を生じることがあります。 unset するものがない場合もエラーになりません。

unsetenv pattern
    指定された pattern にマッチするすべての環境変数を削除します。前述の setenv の項と printenv(1) を参照してください。

wait
    すべてのバックグラウンドジョブの終了を待ちます。シェルがインタラクティブモード であれば、インタラプトによりこの待ちをやめることができます。 このとき、シェルはいまだに終了していないジョブの名前とジョブ番号を表示します。
which command
    command の実行が指示された時に そのシェルが実際に何を実行するかを表示します。

while (expr)
...
end 指定された式の評価結果がゼロでないかぎり、 while と対応する end の間のコマンドを繰り返し実行します。 break や continue によりループを終了したり、途中から繰り返しを再開させたりすることができます。 (while と end は、その行に単独で書かれなければなりません。) 入力が端末の場合、 foreach 文の場合と同様に、ループのすべてを入力するまで プロンプトが表示され、すべての入力を終えた時点でループが実行されます。

%job
    指定されたジョブをフォアグラウンドに移動します。

%job &
    指定されたジョブをバックグラウンドで再開実行させます。

@
@name= expr
@name[index]= expr
    1 行目の形式は、すべてのシェル変数の値を表示します。2 行目の形式は、 指定された名前 name の変数に式 expr の値を代入します。式のなかに `<', `>', `&', `|' を含んでいる場合、 少なくともそのような部分は `(' と `)' で囲まれている必要があります。 3 行目の形式は、変数の index 番目の要素に式 expr の値を代入します。 name とその index 番目の要素はすでに存在していなければいけません。

C 言語と同様に、演算子 `*=', `+=' などが利用可能です。変数名と演算子の間の 空白はあってもなくてもかまいません。しかしながら、式の各要素の間には空白が 必須です。さもなければ、単一の単語とみなされてしまいます。

特別な後置演算子 `++' と `--' により変数の値を 1 だけ増加させたり、 減少させたりすることができます。たとえば、`@ i++' のように使います。

  定義済み変数と環境変数
以下の変数は、シェルにとって特別な意味があります。これらのうち、 argv, cwd, home, path, prompt, shell, status はシェルが設定します。このうち、 cwd と status 以外の変数の設定はシェルの起動時にのみ行われます。そのような 変数は、ユーザが明示的に変更しない限り、値が変化することはありません。

シェルは、環境変数 USER をシェル変数 user に、 TERM を term に、 HOME を home にそれぞれコピーします。また、これらのシェル変数が 再度セットされた場合は環境変数にコピーしなおします。 環境変数 PATH も同様に扱われます。サブシェルは環境変数によって path の値を得て、もし それが変更されれば環境変数にコピーしなおすので .cshrc 以外での path 変数の設定について気をつける必要はありません。

argv
    シェルへの引数が設定されます。位置パラメータは argv の値に展開されます。 すなわち、 `$1' は `$argv[1]' の値に置換されます。

cdpath
    chdir コマンドでサブディレクトリを探す時に検索される代替ディレクトリリストです。

cwd カレントディレクトリのフルパスです。

echo
    コマンドラインオプション -x が指定された場合にセットされます。セットすることにより、コマンド が実行される前にコマンド名とその引数が表示される (echo される) ようになります。 組み込みコマンド以外では、echo の前に全ての展開が行われます。 組み込みコマンドでは、コマンド置換とファイル名置換が行われる前に echo されます。 なぜなら、これらの置換は選択的に行われるからです。

filec
    ファイル名補完を有効にします。

histchars
    ヒストリ置換に用いる文字を文字列で指定します。指定した文字列の最初の文字は ヒストリ置換文字 (デフォルトは `!')に、2 文字目は簡易置換文字 (デフォルト は `') になります。

histfile
    ヒストリをセーブ/リストアするパス名を指定できます。

history
    ヒストリリストのサイズを指定します。このサイズを超えたコマンド履歴は 削除されます。あまりに大きな値を設定すると、シェルがメモリを使いつくすかも しれません。最後に実行したコマンドは history の値にかかわらず、つねにヒストリリストに保存されます。

home
    シェルを起動したユーザのホームディレクトリで、 環境変数の値を使って設定されます。 ‘~’ によるファイル名置換では、この変数が参照されます。

ignoreeof
    セットされると、端末型入力デバイスからのファイル終端 (EOF) を無視するように なります。 間違って control-D を押してシェルを終了させてしまうのを防ぐことができます。

mail
    シェルがメールの到着をチェックするためのメールファイルを指定します。 このチェックは、コマンド実行が完了しプロンプトが表示されるときに、 指定された時間が経過していれば行われます。 最終修正時刻が最終アクセス時刻以降であれば、 シェルは `You have new mail.' と出力します。

    mail の値の最初の単語が数値の場合には、その数値はメールチェックの間隔を秒単位で 表します。指定がなかった場合のデフォルト値は 10 分です。

    複数のメールファイルが指定された場合、メールが到着していた場合の メッセージは `New mail in name' となります。ここで、 name は到着したメールがあるファイル名です。

noclobber
    入出力 の項で説明したように、出力リダイレクトによって意図せずに ファイルを削除しないように制限したり、 すでに存在するファイルにしか `>>' リダイレクトが適用できないようにします。

noglob
    セットされると、ファイル名展開が禁止されます。ファイル名を扱わない シェルスクリプト内や、すでにファイル名展開を行った後でそれ以上の展開を 望まない場合に設定します。

nonomatch
    ファイル名展開の結果が空になってもエラーとせず、展開前のパターンを そのまま残します。ただし、`echo [' のような、展開前のパターンが 文法的に正しくないパターンはエラーになります。

notify
    セットされると、シェルがジョブの終了を随時報告するようになります。 通常はプロンプトの表示直前にのみ報告が行われます。

path
    path 変数の各単語は、コマンドファイルを検索すべきディレクトリ名を表します。 空の単語はカレントディレクトリを示します。 path 変数が設定されていない場合、フルパス名でしか実行できません。 通常の検索パスは `.', `/bin', `/usr/bin' です。 しかし、これらの値はシステムによって異なります。 スーパーユーザのデフォルトの検索パスは `/etc', `/bin', `/usr/bin' です。 -c オプションも -t オプションも指定されなかった場合、シェルは path 変数で指定されたディレクトリの内容をハッシュテーブルに保存します。 ハッシュテーブルは、起動時に .cshrc を読み込んだ後と、 path 変数を再設定した時に再構築されます。シェルの実行中に、 ハッシュされているディレクトリに新しいコマンドが追加された場合は、 rehash コマンドによりハッシュの再構築をしなければ、コマンドは見つけられないでしょう。

prompt
    端末上で対話的に実行されているシェルにおいて、各コマンドを読む前に表示 する文字列です。`!' が含まれる場合、これは現在のイベント番号に 置換されます。`\' を指定することにより、この解釈を抑制することができます。 デフォルトの値は `% ' で、スーパーユーザの場合は `# ' です。

savehist
    ログアウト時にファイル ~/.history に保存されるヒストリリストの数を指定 します。起動時に、シェルは ~/.history の内容をヒストリリストに読み込むため、 複数回に渡るログインでのヒストリが保存できます。あまりに savehist の値があまりに大きいと、シェルの起動が遅くなります。 savehist がセットされているだけの場合は history に指定された値を使用します。

shell
    シェルのフルパス名を示します。実行属性が立っているがシステムが起動できない ファイルを実行する際に、起動するシェルとしてこの変数の値が 用いられます (後述の 非組み込みコマンドの実行 の項を参照)。システム依存の値で初期化されます。

status
    最後に実行したコマンドの終了ステータス値を保持します。異常終了した場合は、 値に 0200 が加算されます。組み込みコマンドが失敗した場合は `1' に、 成功した場合は `0' になります。

time
    コマンドの実行時間の自動計測を制御します。これが設定されていた場合、 コマンドがその秒数よりも長く CPU 時間を消費した場合には、 コマンド終了時にユーザ時間、システム時間、実時間、利用率すなわち ユーザ+システム時間と実時間のパーセンテージが出力されます。

verbose
    -v コマンドラインオプションが指定されていた場合にセットされます。 ヒストリ置換が行われたあと、コマンドの内容が出力されます。

  非組み込みコマンドの実行
実行すべきコマンドが組み込みコマンドでなかった場合、シェルはそのコマンドを execve(2) システムコールによって起動しようとします。シェル変数 path の各単語は、コマンドを検索すべきディレクトリ名を表します。 -c オプションも -t オプションも指定されなかった場合、シェルはそれらのディレクトリ内にある ファイル名のハッシュ値を計算し、内部のテーブルに格納します。これは、 コマンドが存在する可能性のある 1 つのディレクトリだけで exec を試みるようにするためです。この近道によって、サーチパスに たくさんのディレクトリが指定されている場合は、 コマンドの位置決定が著しく高速化されます。この機能を (unhash コマンドによって) 禁止している場合や、 -c または -t オプションが起動時に指定された場合と、 path 内の要素のうち `/' で始まらない単語については、ハッシュが用いられることは ありません。この場合は、 path の要素にコマンドラインで指定されたコマンドを連結した名前をもつ ファイルを実行しようと試みます。

括弧で囲まれたコマンドは、つねにサブシェルによって実行されます。ですから、

    (cd; pwd); pwd

はホームディレクトリの値を表示しますが、カレントディレクトリ (ホームディレクトリの後に表示されます) は移動しません。 一方、

    cd; pwd

を実行すると、カレントディレクトリがホームディレクトリに移動します。 括弧で囲まれたコマンドは、現在のシェルのカレントディレクトリに影響を 与えずにコマンドを実行したい場合によく用いられます。

実行属性が立っているにもかかわらずシステムによって実行可能ではない ファイルは、シェルコマンドファイルであるとみなし、サブシェルを起動して そのファイルを読み込ませます。

shell という名前に対するエイリアスが存在する場合、エイリアスの値は シェルコマンドファイルを実行する場合の引数リストの前に挿入されます。 エイリアスの値の最初の単語はシェルのフルパス名でなければいけません (たとえば `$shell')。 このエイリアス展開は特別にかなり遅い時期に行われ、 引数リストを修正せずにその前に単語を挿入するための手段を提供します。

  シグナル処理
シェルは、通常 quit シグナルを無視します。端末と切り離されたジョブ (& または bg または %... & コマンドによる) は、キーボードから入力されたシグナルに影響されません (hangup も含みます)。 他のシグナルに対する挙動は親の環境を引き継ぎます。 シェルスクリプトでの interrupt と terminate シグナルに対する処理は onintr によって制御することができます。ログインシェルであれば terminate シグナルを捕捉し、そうでなければ、 terminate シグナルはシェルの親の状態に従って子プロセスに渡されます。 ログインシェルが .logout ファイルを読み込んでいる間は interrupt は無視されます。

作者
William Joy。 ジョブ制御とディレクトリスタックは、IIASA, Laxenburg, Austria の J.E. Kulp によって、現在とは異なる文法のものがインプリメントされました。 ファイル名補完は HP Labs の Ken Greer が、8 bit クリーンな実装は Cornell University の Christos S. Zoulas によって行われました。

関連ファイル
~/.cshrc
    各シェルが起動されるときに読み込まれる。
~/.login
    ログインシェルの場合、ログイン時に `.cshrc' の後に読み込まれる。
~/.logout
    ログインシェルの場合、ログアウト時に読み込まれる。
/bin/sh
    標準シェル。`#' で始まらないシェルスクリプトの実行に用いられる。
/tmp/sh*
    `<<' の処理に用いられる一時ファイル。
/etc/passwd
    `~name' 展開のためのホームディレクトリに関する情報源。

制限事項
単語の長さは 1024 文字より長くできません。引数リストは、 システムによって 10240 文字に制限されています。 ファイル名展開を含む引数の数は、引数リストの文字数の 6 分の 1 に制限されています。コマンド置換の結果は、引数リストと同数の 文字数制限があります。 ループ検出のため、1 行に対するエイリアス展開は 20 回までに制限されています。

関連項目
sh(1), access(2), execve(2), fork(2), pipe(2), setrlimit(2), sigaction(2), umask(2), wait(2), killpg(3), tty(4), a.out(5), environ(7),
An introduction to the C shell

歴史
csh は 3BSD で追加されました。ヒストリ (ヒストリ置換 参照)、ジョブ制御 (ジョブ 参照)、対話的なファイル名補完とユーザ名補完 (ファイル名補完 参照)、C 言語ライクな文法を採用して実装された最初のコマンドインタプリタです。 同様の機能にさらにいくつかの機能 (と、いくらかのバグの可能性) を追加した シェルはいまやたくさんあり、usenet から入手することができます。

バグ
コマンドが停止状態から復帰したとき、そのコマンドが起動したときの ディレクトリとカレントディレクトリが異なる場合は、シェルはコマンドを起動した ときのカレントディレクトリの値を表示します。これは、そのジョブが内部的に カレントディレクトリを変更した場合には誤解を与える可能性があります (つまり、間違っている)。

シェルの組み込みコマンドは中断 (suspend) も再開もできません。 `a ; b ; c' のようなコマンド列も適切には中断することができません。 たとえば、`b' の実行を中断した場合には、すぐに `c' の実行が開始されて しまいます。これは alias としてコマンド列を指定している場合に特に目立ちます。このようなコマンド列は `()' で囲んでサブシェルで実行されるようにすることによって 適切に停止させることが可能になります (`( a ; b ; c )'のように)。

プロセスが起動したあとの端末出力の制御が貧弱です。おそらく、このために もっと良い仮想端末インターフェースを開発したいと考える人が現れるでしょう。 仮想端末インターフェース上なら、 もっとおもしろい端末出力の制御が可能になるでしょう。

シェル関数をシミュレートするために、エイリアスが不格好に用いられることが よくあります。シェル関数がサポートされるべきです。

ループ中のコマンド入力において `?' プロンプトに続けて入力された内容は ヒストリに残りません。制御構造は組み込みコマンドとして解釈されるのではなく、 文法的に解釈されるべきです。これにより制御コマンドをどこにでも 置けるようになり、`|', `&', `;' との組み合わせが自由にできるようになる でしょう。

コマンド置換の出力にも `:' 修飾子が適用できるべきです。

ファイル名補完機構のインプリメントが不細工かつ非効率的です。