Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ csh(1) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sh(1)

access(2)

execve(2)

fork(2)

killpg(2)

pipe(2)

sigvec(2)

umask(2)

setrlimit(2)

wait(2)

tty(4)

a.out(5)

environ(7)

CSH(1)  —  NEWS-OS Programmer’s Manual

名称

csh − C 言語に似た構文を持つシェル(コマンドインタープリタ)

形式

csh [ −bcefinstvVxX ] [ arg ...  ]

解説

csh は、 ヒストリ機構 (ヒストリ置換 参照)、 ジョブ制御機能 (ジョブ 参照)、 対話型のファイル名およびユーザ名の完成機能 (ファイル名の完成 参照)、 C 言語に似た構文規則、 などの機能を持つコマンドインタープリタです。 csh のジョブ制御機能を使用するためには、 tty(4) で詳しく述べられている new tty ドライバを使用しなければなりません (自動的に使用します)。 この new tty ドライバを使うと、 キーボードからインタラプト文字を入力して ジョブを停止することができるようになります。 new tty ドライバのオプション設定などについての詳細は、 stty(1) を参照してください。

csh は、 実行したユーザの home ディレクトリ内にある .cshrc ファイルから コマンドを実行して始まります。 これがログインシェルである場合には、 同じ場所にある .login ファイルからもコマンドを実行します。 CRT から使用するユーザは普通、自分の .login ファイルに stty crt コマンドを入れておき、 そこで tset(1) を呼び出します。

通常 csh は、続いてプロンプト  ‘% ’ を表示して、 端末装置からコマンドの読取りを開始します。 引数の処理、およびコマンドスクリプトが入った ファイルを処理するシェルの使用法については、後のセクションで解説します。

続いてシェルは、以下の動作を繰り返します。 まずコマンド入力の行を読み取り、「ワード」に分解します。 このワードの並びをコマンドヒストリリストに置き、 解析します。最後に、現在行の各コマンドを実行します。

終了時に、ログインシェルは、ユーザのホームディレクトリにある .logout ファイルからコマンドを実行します。

字句の構造

シェルは、入力行をブランクとタブでワードに分解しますが、 次の例外があります。 文字 & | ; < > ( ) は、1 つのワードと見なします。 &&、||、<<、 >> のように二重になっている場合には、ペアで 1 つのワードと見なします。 このような字句解析に用いるメタキャラクタは、その前にバックスラッシュ \ を付ければ、その特別な意味を無くしてワードの一部とすることができます。 \ を前に付けた 改行文字は、1 個のブランクに相当します。

さらに、引用符 (´、`、 ") で囲まれた文字列は、ワードと見なされます。 これらの文字列中にあるメタキャラクタは、 ブランク、タブを含めて、特別な意味のワードとしては見なされません。 これらの引用符の意味については、後のセクションで説明します。 ´ や " で囲まれた中では、 改行文字の前に \ を付けると、本来の改行文字としての意味になります。

シェルの入力が端末装置ではない場合には、 文字 # からその入力行の終わりまではコメントになります。 ただし、 # の前に \ を付けたり、引用符 ‘、’、 " で囲まれた場合には、この特別な意味はなくなります。

コマンド

単一コマンドは、ワードの並びです。 最初のワードで、実行するコマンドを指定します。 単一コマンドもしくは | で区切られたコマンドの並びは、パイプラインになります。 パイプライン内の各コマンドの出力は、次のコマンドの入力に接続されます。 パイプラインの並びを ; で区切ることによって、各パイプラインを順番に実行することができます。 パイプラインコマンドの並びの後ろに & を付けると、終了するのを待たずに次のコマンドを実行することができます (バックグラウンド処理)。

前述のコマンドのいずれかを ( ) で囲むと、1 つの単純コマンドと同じことになります (パイプラインなどの構成要素にもなれます)。 また、 C 言語と同様、 || または && でパイプラインを区切ると、 2 番目のパイプラインは、最初のパイプラインの実行がそれぞれ 失敗または成功した場合にだけ実行されるよう指示することもできます (「式」参照)。

ジョブ

シェルは、「ジョブ」を各パイプラインに対応させています。 jobs コマンドで出力することのできるカレントジョブ (current jobs) の表を保持し、 ジョブに小さな整数番号を割り当てます。 & で同時実行のジョブが始まると、シェルは次のような行を表示します。

[1] 1234

これは、 同時実行が始まったジョブのジョブ番号が 1 で、 プロセス ID が 1234 である 1 個の(トップレベルの)プロセスを 持っていることを示しています。

あるジョブを実行中に他のジョブを実行したくなったら、 ^Z (control-Z) を押して、 カレントジョブに対して STOP シグナルを送ってください。 するとシェルは、通常、そのジョブが「停止した」ことを表示し、 別のプロンプトを表示します。 ここでは、 bg コマンドを使ってそのジョブをバックグラウンドで実行したり、 他のコマンドをいくつか実行してから、 先ほど止めたジョブを fg コマンドでフォアグラウンドへ戻したりして、 そのジョブの状態を操作することができます。 ^Z は即時に作用し、 入力されたときに延期されていた出力や まだ読み取られていない入力が破棄される点で割込みに似ています。 特殊キーにはもう 1 つ ^Y というのがあり、 プログラムが read(2) で ^Y を読み取るまでは STOP シグナルを発生しません。 これは、 ジョブをそのジョブに対する コマンドをいくつか読み取ったあとで停止しようとする場合には、 前もってタイプしておくことができるので便利です。

バックグラウンドで実行されているジョブは、 端末装置から読取りをしようとすると停止します。 通常、バックグラウンドジョブは出力は許されていますが、 stty tostop コマンドを与えれば出力できないようにすることができます。 この tty オプションをセットすれば、バックグラウンドジョブは、 入力を読むときにも出力するときにも停止します。

シェル内でジョブを指定する方法はいくつかあります。 % によってジョブ名を指定することができます。 %1 とすればジョブ番号 1 のジョブを指定できます。 このように単にジョブを指定した場合は、 そのジョブがフォアグラウンドに回されます。 したがって、 %1 は、ジョブ 1 をフォアグラウンドへ持ってくる fg %1 と同じ意味になります。 同様に、 %1 & は、ジョブ 1 をバックグラウンドで再開します。 また、一意に決まる文字列を前に付けてジョブを指定し、 開始させることもできます。 例えば、 名前が ex で始まるジョブが 1 つだけ保留されている場合には、 %ex とすると、通常、保留されている ex(1) のジョブが再開されます。 さらに、該当するジョブが 1 つだけのときには、 テキストに string を含むジョブを指定する %?string を使用することもできます。

シェルは、カレントおよび直前に実行していたジョブも記憶しています。 ジョブに関連した出力では、カレントジョブは + で、直前のジョブは − で表します。 短縮形 %+ はカレントジョブを指し、 %− は直前のジョブを指します。 「ヒストリ」機構(後述)の構文に近い表現として、 %% もカレントジョブを指します。

ステータスの報告

csh は、プロセスの状態変化を直ちに検出します。 プロセスがブロック状態になってそれ以上進行できなくなると、 シェルは、それをプロンプトを表示する直前にユーザに通知します。 そうしなければ、ユーザの仕事を邪魔してしまうことになるからです。 しかし、シェル変数 notify をセットした場合には、 バックグラウンドジョブでのステータスの変化を即時に通知してきます。 単一のプロセスをマークして、 そのステータスの変化を即時に報告するシェルコマンド notify もあります。デフォルトでは、 notify はカレントプロセスをマークします。 バックグラウンドジョブの開始後に単に notify と指示すれば、 そのジョブをマークするようになります。

停止しているジョブがあるのにシェルを exit しようとすると、 There are stopped jobs.  と警告されます。 jobs コマンドを使用すると、 それらのジョブが何であるかを見ることができます。 再びすぐに exit すると、シェルは 2 度目の警告はせず、停止していたジョブは中断されます。

ファイル名の完成

シェル変数 filec がセットされ (set 参照)、ファイル名完成機能が働く状態にある場合には、 一意に決められる文字列とエスケープ文字 (escape または control-[)を 端末から入力すると、 csh は、その文字列からファイル名とユーザ名を対話的に完成させます。 例えば、カレントディレクトリが

DSC.OLDbincmdlibxmpl.c
DSC.NEWchaosnetcmtestmailxmpl.o
benchclassdevmboxxmpl.out

のようになっていて、入力が

% vi ch<escape>

であると、 csh は、文字列 ch から一致する唯一のファイル名 chaosnet を完成させ、入力行を

% vi chaosnet

に変更します。しかし、

%vi D<escape>

と入力した場合には、文字 D に一致するファイル名が 2 つあるので、 csh は入力を

% vi DSC. 

とだけ展開して端末装置のベルを鳴らし、 展開されたものが未完成であることを伝えます。

部分的なファイル名のあとに end-of-file 文字 (通常は control-D)を続けると、 csh は名前を完成させる代わりに、 その文字列に一致するファイル名をすべて表示します。例えば、入力が

% vi D<control-D>

であると、 D で始まるファイル名をすべて次のようにリスト表示します。

DSC.NEW    DSC.OLD

元の入力行は変わりません。

完成させる(またはリスト表示する)ワードが ~ で始まっている場合には、 escape と end-of-file は、 部分的なユーザ名を展開するのにも使用されます。例えば、

cd ~ro<control-D>

とタイプすると、

cd ~root

と展開します。

変数 nobeep をセットすることによって、エラーや複数の一致が起こったときも 端末装置のベルを鳴らさないようにできます。

通常、特定のディレクトリにあるファイルすべてが名前完成の候補になります。 変数 fignore に、無視したい拡張子のリストをセットしておくと、 特定の拡張子を持ったファイルを候補対象から除外することができます。 したがって、 fignore を

% set fignore = (.o .out)

のようにセットしたあと

% vi x<escape>

とタイプすると、ファイル xmpl.o と xmpl.out を無視して

% vi xmpl.c

のように入力行が変わります。 しかし、与えられた文字列から完成できる唯一の名前が、 この変数で除外されている拡張子でしか特定できない場合には、 これらの拡張子を無視しません。 さらに、 fignore は control-D によって出力されるファイル名の リストには影響を及ぼしません。 拡張子に関係なくすべてのファイルが表示されます。

置換

以降のセクションでは、 シェルが入力に対して行う種々の置換について、 置換が起こる順に解説します。

ヒストリ(履歴)置換

ヒストリ置換は、 以前にコマンド入力されたワードを新しいコマンドの一部として置き、 コマンドを繰り返して実行したり、 以前のコマンドの引数を現コマンドで使用したり、 以前のコマンドにあったスペリングの誤りを 最小のタイピングと高度の信頼性で修正することを容易にする機能です。 ヒストリ置換は、 !  で始まり、 (ネストにならない という条件付きで)入力行ストリームの 任意の場所 から始めることができます。 !  の前に \ を付けると、その特別な意味をなくすることができます。 また、 !  のあとにブランク、タブ、復帰改行、 =、( が付いている場合にも、 簡単のために !  はそのまま渡されます (入力行が ↑ で始まっている場合にも、ヒストリ置換が行われます。 この特殊な短縮形については後述します)。 ヒストリ置換を含む入力行は、実行される前に、 ヒストリ置換を使用せずに入力行をタイプしたように、 端末装置にエコーされます。

端末装置から入力したコマンドは 1 個または複数のワードからなり、 ヒストリリストにセーブされます。 ヒストリ置換は、こうしてセーブされたコマンドから入力ストリーム内へ、 ワードの並びを再生します。 ヒストリリストのサイズは、 history 変数によって指定されます。 直前のコマンドは history 変数の値は無関係に保存されています。 コマンドには、1 から順に番号が付けられます。

例えば、 history コマンドから、次のような出力があったものとします。

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

コマンドは、イベント番号付きで表示されます。 イベント番号はいつも使用する必要はありませんが、 プロンプト文字列内に !  を置いておくと、 カレントイベント番号を「プロンプト」の一部として表示することができます。

カレントイベント番号が 13 であるとき、 それより前のイベントはイベント番号を !11 と指定することによって参照できます。 同じイベントを相対的に指定するには、 !−2 のように入力します (2 つ前のイベントの意)。 イベント 12 は、 !d のようにコマンドワードの最初の文字を使用して指定します。 同様に、イベント 9 の場合は、 !wri とします。 またイベント 9 は、 !?mic?  のようにコマンド内のワードに含まれている文字列で指定することもできます。 これらの形式は、指定されたイベントの 各ワードを 1 個のブランクで区切って再利用しています。 特殊なケースとして、 !!  は直前のコマンドを指定します。 したがって、 !!  だけの場合は「再実行」に相当します。

イベントからワードを選択するには、イベント指定のあとに : と希望するワードの指定子を続けます。 入力行のワードには、最初のワード(普通はコマンド本体)は 0、 2 番目のワード(最初の引数)は 1 というように 0 から始まる番号が 付けられています。 基本的なワード指定子は、次のとおりです。

0最初のワード(コマンド)。
nn番目の引数。
↑最初の引数、すなわち 1。
$最後の引数。
%直前の ?s? による検索で一致したワード。
x−yワードの範囲(x 番目から y 番目のワード)。
−y0−y の省略形。
∗↑−$ の省略形(イベント内に 1 ワードしかない場合は何も
指定しないのと同じ)。
x∗x−$ の省略形。
x−x∗ から $ を除いたもの。

ワード指定子とイベント指定を分離している : は、引数選択子が ↑、$、∗、 −、% で始まっている場合には、省略することができます。 ワード指定子のあとには、修飾子の並びを、各修飾子の前に : を付けて置くことができます。 次の修飾子が定義されています。

hパス名の先頭(head)の部分を残し、後続部分を切り捨てる。
rルート名(root)を残し、続く .xxx を取り除く。
e拡張子(extension) .xxx の部分以外のすべてを取り除く。
s/l/r/l を r に置き換える(substitute)。
tパス名の最後(tail)の部分を残し、先行部分をすべて取り除く。
&直前の置換を繰り返す。
g上記の修飾子の前に付けて、
変更をその入力行全体(global)に適用する (例えば g&)。
p修飾した結果の新しいコマンドを実行せずに、表示(print)だけ
をする。
qこれ以上の置換を抑制して、ワードを引用符で囲んだように取り
出す(quote)。
xq に働きは似ているが、ブランク、タブ、および復帰改行のある
場所でワードに分解する。

修飾子 g が前に付けられていない限り、 修正は、最初の修正可能なワードだけに適用されます。 修正を適用できるワードがなければエラーになります。

置換 (s) の左側 (l) では、エディタなどで使用する正規表現ではなく、 文字列を使います。区切りシグナルとしては、 / の場所に任意の文字を使用することができます。 文字列 l や r の中では、 区切りシグナルとして使った文字を \ でクォートしなければなりません。 右側の文字列 (r) で文字 & を使うと、左側の文字列そのもので置き換えられます。 この場合も、 & そのものを使いたいときは \ でクォートします。 l がナル(何も書いていない)である場合には、 直前に実行した置換の l、 または !?s? における文字列 s のいずれかが使用されます。 置換の最後の区切りシグナルは、 復帰改行文字が直後にくる場合には省略することができます。 !?s? における最後の ?  についても同様です。

ヒストリの参照は、 イベント指定なしでも使用できます (例えば、 !$)。 この場合、同一行でヒストリ参照をしていなければ、 直前のコマンドに対する参照になります。 同一行で既にヒストリ参照が行われている場合には、 その参照が繰り返されます。 したがって、 !?foo?^ !$ は、 ?foo?  に一致するコマンドの最初と最後の引数を与えます。

入力行の最初のブランク以外の文字が ^ である場合には、ヒストリ参照の特殊な省略形になります。 これは !:s^ に相当し、 直前の行のテキストを置換する便利な省略記法です。 したがって、 ^lb^lib は、直前のコマンド内の lib のスペリングを修正します。 最後に、ヒストリ置換をそのあとに続く文字と分離する必要がある場合には、 ヒストリ置換を { と } で囲むことができます。 したがって、 ls −ld ~paul を実行したあとで、 !{l}a とすると、 ls −ld ~paula となりますが、 !la とした場合には、 la で始まるコマンドが探されます。

’

’ および " で文字列を囲むことによって、 残りの置換の全体または一部を防止することができます。 ’ で囲まれた文字列は、それ以上解釈されることはありません。 " で囲まれた文字列は、後述のように展開されます。

いずれの場合も、 結果として得られるテキストは、 単一ワード(の全体または一部)になります。 特殊なケース (コマンド置換 参照) として、 " で囲まれた文字列は、複数のワードの一部となることがあります。 ’ で囲まれた文字列は、そのようなことはありません。

エイリアス(別名)置換

シェルはエイリアス(別名)用のリストを保持しており、 alias、unalias コマンドで定義、表示、修正をすることができます。 コマンド行が走査されたのち、 そのコマンド行はいくつかの別々のコマンドとなるように解析され、 各コマンドの最初のワードは、 左から右へ、エイリアスを持っているか否かがチェックされます。 コマンドにエイリアスがあると、ヒストリ機能が働き、 そのコマンドのエイリアスの方が 今の入力行であるかのように再び読込まれます。 その結果、 得られたワードによってコマンドおよび引数の並びが置き換えられます。 ヒストリリストに対する参照が行われない場合には、 引数の並びは置き換えられません。

したがって、 ls のエイリアスが ls −l である場合には、 コマンド ls /usr は、 ls −l /usr に変換され、引数の並びは影響を受けません。 同様に、 lookup のエイリアスが grep !↑ /etc/passwd と定義されていると、 lookup bill は、 grep bill /etc/passwd に変換されます。

エイリアスが見つかると、入力テキストのワード変換が行われ、 新しい入力行で再びエイリアス処理が始まります。 新しいテキストの最初のワードが元のテキストの最初のワードと同じ場合には、 そのことを表す内部的なフラグが立ち、 さらにエイリアス処理されるのを防止してループは回避されます。 他のループは検出され、エラーになります。

このメカニズムは、エイリアスが 解析メタシンタックスを採り入れていることに注意してください。 つまり、 alias print ´pr !∗ | lpr´ とすることによって、 その引数をラインプリンタへ出力するコマンドを作ることができます。

変数置換

シェルには変数があり、 各変数はゼロ個以上のワードの並びを値として持ちます。 シェルはこれらの変数をセットしたり、 参照したりします。例えば、変数 argv はシェルの引数リストのコピーで、 この変数の値のワードは特殊な方法で参照されます。

変数の値は、 set および unset コマンドで、表示/変更することができます。 シェルが参照する変数のうち、多くはトグルになっています。 すなわちシェルは、 その変数の値ではなくセットされているかどうかだけを見ます。 例えば、変数 verbose は、 コマンド入力をエコーさせるトグルスイッチです。 この変数は、シェルのコマンド行オプション −v でセットします。

他に、変数を数値的に扱うオペレーションもあります。 @ コマンドは数値計算を行い、その結果を変数に代入します。 しかし、変数の値は、常に(ゼロ個以上の)文字列として表されます。 数値演算では、ナル文字列はゼロと見なされ、 変数が複数のワードを値として持っていても、 2 番目以降のワードは無視します。

入力行がエイリアス処理されて解析されたのち、 各コマンドが実行される前に、 文字 $ 以降に指定された文字を変数として置換が行われます。 この展開は、 $ の前に \ を付けることによって防止することができます。 ただし、二重引用符(")の中にある場合には、 常に 置換が行われます。 単一引用符(’) 内では、置換は行われません。 ` で囲まれた文字列は、 あとで解釈されるので (後述 コマンド置換 参照)、 $ 置換はそれまで起こりません。 $ のあとにブランク、タブ、または end-of-line があると $ は、そのまま渡されます。

入力および出力リダイレクションは、 変数の展開の前に認識されますが、 リダイレクションの対象となるものが変数の時、 その展開は別個に行われます。 リダイレクションがない場合 (リダイレクションの処理後) には、 コマンド名とすべての引数は、同時に展開されます。 したがって最初のワード(コマンド)が複数のワードを生成することが可能です。 この生成された複数のワードのうち最初のワードは、 コマンド名となり、残りのワードは引数になります。

" で囲まれていないか :q 修飾子が与えられていない限り変数置換の後、 コマンド置換およびファイル名置換されます。 " の中では、値が複数のワードからなる変数は、 ブランクで区切られて、 単一のワード(の一部)に展開します。 :q 修飾子を置換に使用すると、 変数はブランクで区切られた複数のワードに展開されてからクォートされ、 そのあとで行われるコマンド置換、ファイル名置換が起こるのを防止します。

変数値をシェルの入力とするために以下のメタシーケンスが用意されています。 ただし、セットされていない変数を参照するとエラーになります。

$name

${name}
変数 name の値のワードで置換され、各ワードはブランクで区切られます。中かっこ { } は、 name をそのあとに続く文字から分離します。 シェル変数は、文字で始まり、 文字と数字からなる 20 桁までの名前を値とします。 アンダースコア (_) は文字と見なされます。
name がシェル変数ではないが、 環境に設定されている場合には、 その値が返されます (その場合、 : による修飾子、後述の他の形式を使用することはできません)。

$name[selector]

${name[selector]}
name の値からいくつかのワードだけを選択します。選択子 selector は単一の数字または − で区切られた 2 つの数字からなり、 $ 置換の対象となります。変数の最初のワードを 1 とします。 範囲の最初の数字が省略された場合には、1 と見なされます。 範囲を示す 2 番目の数字が省略された場合には、 $#name と見なされます。選択子 ∗ はすべてのワードを選択します。 2 番目の引数が省略されているか、 あるいは範囲内にある場合には、範囲が空であってもエラーにはなりません。

$#name

${#name}
変数のワード数を与えます。 [selector] で使用すると便利です。

$0
いまコマンド入力を読み取っている ファイルの名前と置き換えられます。 ファイル名がわからない場合には、エラーになります。

$number

${number}
$argv[number] と同じです。

$∗
$argv[∗] と同じです。

前述の置換に、 修飾子 :h、:t、:r、 :q、:x を適用することができます。 同様に、 :gh、:gt、:gr も適用できます。 コマンド形式に中かっこ { } が含まれる場合には、 修飾子は、その中かっこ内になければなりません。 : 修飾子は、各 $ 展開について 1 つしか使用できません。

以下の置換は、 : 修飾子で修飾することはできません。

$?name

${?name}
name がセットされている場合は文字 1 に、セットされていない場合は 0 に置換されます。

$?0
現入力ファイル名がわかる場合は 1 に、わからない場合は 0 に置換されます。

$$
(親)シェルのプロセス番号(10 進数)に置換されます。

$<
標準入力からの 1 行に置換されるだけで、それ以上の解釈はされません。 これは、シェルスクリプト内でキーボードから入力を読み取るのに 使用することができます。

コマンド置換、ファイル名置換

最後の置換であるコマンド置換、ファイル名置換は 組込みコマンドの引数には適用されたり、されなかったりします。 これは、一部の式はこれらの選択の対象とはならないことを意味します。 たとえば、 次のように @ という組込みコマンドは、 その引数 ∗ などを置換しません。

% @ a=2 ∗ 3
% echo $a
6

シェルの外部コマンドのコマンド名は、引数とは別置換が行われます。 この置換は、入出力リダイレクションが処理されたあとで メインシェルの子シェルで実行されます。

コマンド置換

コマンド置換は、 ` で囲まれたコマンドによって示されます。 このようなコマンドからの出力は、 通常、ブランク、タブ、改行(復帰改行)で別々のワードに分解されます。 このとき、ナルのワードは破棄され、 こうしてできたテキストで元の文字列が置き換えられます。 " で囲まれた部分では、復帰改行だけでワードの分解が行われ、 ブランクとタブはそのまま残されます。

いずれの場合にも、 最後にある復帰改行だけは新しいワードを生成しません。 したがって、 コマンド置換内で完全な行を出力するコマンドを使っても、 単に一つのワードとして生成できるのです。

ファイル名置換

ワードが ∗、?、[、 { のいずれかの文字を含む場合、あるいは ~ で始まっている場合には、そのワードは「グロッビング(globbing)」と いわれるファイル名置換の対象となります。 このようなワードは、1 つのパターンと見なされ、 そのパターンに一致するファイル名のリストを アルファベット順にソートしたもので置き換えられます。 ファイル名置換を指定するワードの並びでは、 存在するファイル名に一致する パターンが 1 つもなければエラーとなりますが、 どのパターンもが一致しなければならないわけではありません。 メタキャラクタ ∗、?、[ だけがパターンマッチングに使用され、 ~ および { は、省略記法に近いものとなっています。

ファイル名を一致させる際には、 ファイル名の先頭や / の直後にある文字 .  は、 / と同様に明示的に一致しなければなりません。 ∗ は、ナル文字列を含む任意の文字列に一致します。 ?  は、1 個の任意の文字に一致します。 [...] は、囲まれた文字のいずれか 1 つに一致します。 [...] 内で 2 つの文字を − で区切ると、その 2 つの文字の範囲にある任意の文字に一致します。

ファイル名の先頭にある ~ は、ホームディレクトリを指します。 この文字が単独で使用されると、変数 home の値に従って、呼び出しユーザのホームディレクトリに展開します。 ~ の直後に文字、数字、 − からなる名前が続いている場合は、 シェルは、その名前を持つユーザを探し、 そのユーザのホームディレクトリで置き換えます。 したがって、 ~ken は /usr/ken に展開され、 ~ken/chmach は /usr/ken/chmach に展開されます。 ~ のあとに「英字または / 」以外の文字 が続いている場合、または ~ がワードの先頭にない場合には、そのまま残されます。

a{b,c,d}e のような記法は、 abe ace ade を省略したものと見なされます。 { } 内の左右の関係は保存され、一致の結果はそれぞれ別々にソートされます。 この構造はネストにすることができます。 したがって、 ~source/s1/{oldls,ls}.c は、 /usr/source/s1/oldls.c /usr/source/s1/ls.c に展開されます。 このとき、 source のホームディレクトリが /usr/source でさえあれば、展開されたファイルが実際に存在するか否かにかかわらず、 エラーとはなりません。 同様に、 ../{memo,∗box} は、 ../memo ../box ../mbox に展開されます (memo が、 ∗box で一致した結果といっしょにソートされないことに注意してください)。 特殊な場合として、 {、}、{} はそのまま渡されます。

入出力

コマンドの標準入力および標準出力は、 以下の構文を用いてリダイレクトすることができます。

< name
ファイル name (最初の変数、コマンド、展開されたファイル名)を標準入力として オープンします。

<< 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 コマンドで使用します。次の演算子が使用できます。

||  &&  |  ↑  &  ==  !=  =~  !~  <=  >=  <  >  <<  >>  +  −  ∗  /  %  !  ~  (  )

演算子の優先順位は、次のとおりです。 同じレベルの演算子をグループにしてあります (下へいくほど優先順位が高くなっています)。

==  !=  =~  !~
<=  >=  <  >
<<  >>
+  −
∗  /  %

==、!=、=~、 !~ は、引数を文字列として比較します。 他のすべての演算子は数値に作用します。 演算子 =~ と !~ は、右側のオペランドが左側のオペランドを含むような pattern (例えば ∗、?、 [...])、 も許していることを除けば、 != と == と同じです。 これによって、パターンマッチングだけが必要な場合には、 シェルスクリプト内での switch 文の使用を減らすことができます。

0 で始まる文字列は 8 進数と見なされます。 ナルまたは存在しない引数は 0 と見なされます。すべての式の結果は、10 進数を表す文字列です。 同一ワード内に、1 つの式の構成要素 2 つともが現れることはできないので、 注意してください。 パーサに対して構文的に意味があるような式の 構成要素 (&、|、 <、>、 (、)) に隣接する場合を除き、式の構成要素はスペースで囲まれている必要があります。

同様に、 { と } で囲んだコマンドの実行と、 −l name という形式でのファイルに対する照会も、 式におけるプリミティブなオペランドとして使用することができます。 ここで l は、次に示す文字のいずれかです。

r読出し可である
w書込み可である
x実行可である
e存在している
o所有者である
z大きさがゼロである
f普通のファイルである
dディレクトリである

ここで指定されるのは展開後のコマンド名/ファイル名で、 それが実ユーザに対してある関係を持っているかどうかをテストします。 ファイルが存在しないか、またはアクセス不能である場合には、 すべての照会は偽 (すなわち 0) を返します。コマンドの実行が成功した場合には、真 (すなわち 1) を返し、コマンドがステータス 0 で終了した場合や実行が失敗した場合には、 偽 (すなわち 0) を返します。 さらに詳しいステータス情報が必要な場合には、 コマンドを式の外で実行し、変数 status を調べます。

制御フロー

このシェルの組込みコマンドには、 コマンドファイル (シェルスクリプト) や (制限はあるが有効な方法で) 端末装置からの 入力において制御の流れを統制するコマンドが数多くあります。 これらのコマンドはすべて、 シェルに入力の再読取りや読み飛ばしをさせて動作しています。 また、 実行系実現のための制約によりいくつかのコマンドの位置に制限があります。

後述のように、 foreach、switch、while 文は、 if 文の if−then−else 形と同様に、主たるキーワードはそれだけを 1 行としなければなりません。

シェルの入力がシークできない場合には、 シェルはループの読取り中に入力をバッファに入れ、 この内部バッファ内で入力を探索して、 ループが指示する再読取りを行います (これが可能な限り、 シークが不可能な入力においても逆方向への goto コマンドが可能です)。

組込みコマンド

組込みコマンドは、シェル内で実行されます。 パイプラインの構成要素 (最後のものは除く) として組込みコマンドが 使用された場合には、そのコマンドはサブシェルで実行されます。

alias

alias name

alias name wordlist
最初の形式は、 すべてのエイリアス(別名)を表示します。 2 番目の形式は、 name のエイリアスを表示します。 最後の形式は、指定された wordlist を name のエイリアスとして割り当てます。 ここで、 wordlist は、 置換されるコマンドとファイル名です。 name を alias または unalias とすることはできません。

alloc
獲得された動的メモリの量を、使用メモリと空きメモリとに分けて表示します。 引数があると、 各サイズ区分で空きブロックと使用されているブロックの数を表示します。 サイズ区分は、サイズ 8 から始まり、各ステップで倍になります。

bg

bg %job ... 
カレントジョブまたは指定したジョブをバックグラウンドへ回し、 もしジョブが停止されていた場合は継続させます。

break
最も近くにある foreach 文または while 文の end の直後から実行を再開します。現在行の残りのコマンドが実行されます。 したがって、1 行に複数の break を記述することによって、 マルチレベルの break が可能になります。

breaksw
switch 文の実行を中断し、 endsw の直後から実行を再開します。

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

cd

cd name

chdir

chdir 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 の使用例については、 tset(1) を参照してください。

exec command
指定されたコマンドがカレントシェルに代わって実行されます。

exit

exit expr
シェルは終了時に、 status 変数の値(最初の形式)、または指定された expr の値を終了ステータスとします(2 番目の形式)。

fg

fg %job ... 
カレントジョブまたは指定されたジョブをフォアグラウンドへ回し、 もし停止されていたら継続させます。

foreach name (wordlist)

    ... 

end
変数 name が次々と wordlist の各メンバにセットされ、対応する end との間にあるコマンドの並びを順に実行します (foreach と end は、それぞれ別の行に単独で記述しなければなりません)。
組込みコマンド continue を使用すると、ループを途中から継続することができ、 組込みコマンド break を使用すると、ループを途中で終了させることができます。 このコマンドを端末装置から実行すると、プロンプト ?  が表示され、繰り返し部分の入力が要求されます。 端末装置から繰り返し部分の入力中にタイプミスをした場合は、 消すことができます。

glob wordlist
echo に似ていますが、 \ エスケープは認識されず、ワードは出力ではナル文字によって区切られます。 シェルにファイル名をワードの並びに 展開させるようなプログラムで用いると便利です。

goto word
指定する word は、 label 形式の文字列に展開されるようなファイル名/コマンドです。 シェルは可能な限り入力をさかのぼって label: 形式の行をサーチします。 ラベルの前にはブランクやタブがあっても構いません。 指定された行の直後から実行が継続されます。

hashstat
コマンドの検索 (exec の回避) において内部ハッシュテーブルがどれほどの効率を挙げているかを 示す統計行を表示します。 exec は、ハッシュ関数が 1 回の検索でコマンドを見つけられそうな path の各構成要素と / で始まっていない各構成要素で試みられます。

history

history n

history −r n

history −h n
ヒストリイベントリストを表示します。 n が与えられた場合には、最近の n 個のイベントだけが表示されます。 −r オプションは、 表示の順序を逆にして最新のものから順に表示されるようにします。 −h オプションは、各イベントの前に番号を付けずにヒストリリストを表示させます。 これは、−h オプション付きの source コマンドに対する入力ファイルを作成するのに使います。

if (expr) command
指定された式が真の場合には、引数のある単一の command が実行されます。 command に対する変数置換は、 if コマンドの残りの部分の変数置換と同時に行われます。 command は、1 個の単純コマンドでなければならず、 パイプライン、コマンドの並び、 かっこで囲まれたコマンドの並びであってはなりません。 入出力のリダイレクションは、 expr が偽でコマンドが 実行されない ときにも行われます(これはバグ)。

if (expr) then

    ... 

else if (expr2) then

    ... 

else

    ... 

endif
指定された expr が真であると、最初の else までのコマンドが実行されます。 expr が偽の場合は、 expr2 が真なら 2 番目の else までのコマンドが実行されます。 else−if のペアは任意の数だけ使用することができ、 endif は最後に 1 つだけ必要です。 else の部分は省略可能です (ワード else および endif は、入力行の先頭になければなりません。 if は、入力行に単独で記述するか、または else のあとに来なければなりません)。

jobs

jobs −l
現在実行中のジョブをリスト表示します。 −l オプションが与えられた場合には、通常の情報に加えてプロセス ID も表示します。

kill %job

kill −sig %job ... 

kill pid

kill −sig pid ... 

kill −l
TERM (terminate) シグナルか指定されたシグナルのいずれかが、 指定されたジョブまたはプロセスへ送られます。シグナルは、番号または (/usr/include/signal.h 内のものから SIG を取り除いた)名前のいずれかによって指定されます。 シグナル名は kill −l によってリスト表示されます。 デフォルトはないので、単に 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 (作成できるファイルの最大サイズ)、 datasize (プログラムテキストの終りから始まる、 sbrk(2) によるデータ領域+スタック領域の上限)、 stacksize (自動的に拡張されるスタック領域の最大サイズ)、 coredumpsize (作成される最大のコアダンプのサイズ)、 memoryuse (プロセスに与えられる最大物理メモリ量)、 descriptors (プロセスが open できるファイルの最大数)があります。

maximum-use は、後ろにスケールファクタを付けた浮動小数点数または整数として 指定することができます。 cputime と descriptors 以外のすべての制限値の場合、デフォルトのスケールは k または kilobytes (1024 バイト)ですが、スケールファクタとしては、 m または megabytes も使用することができます。 cputime の場合、デフォルトのスケールは seconds ですが、分単位の場合は m、 時単位の場合は h、 または分と秒を指定する mm:ss の形式を使用することができます。

resource の名前とスケールファクタの場合は、両方とも、 一意に決まる名前のプリフィックスだけでも十分です。

login
/bin/login で置き換えて、ログインシェルを終了させます。これは、 sh(1) との互換性ためにあり、ログオフする 1 つの方法です。

logout
ログインシェルを終了させます。 ignoreeof がセットされている場合に特に役立ちます。

nice

nice +number

nice command

nice +number command
最初の形式は、 このシェルのスケジューリングのプライオリティの値を 4 にセットします。 2 番目の形式は、プライオリティを指定された数値にセットします。 最後の 2 つの形式は、コマンドをそれぞれプライオリティ 4 と number で実行します。スーパーユーザは、 nice −number ...  の形式を用いて負の値を指定することができます。 コマンドは常にサブシェルで実行され、コマンドの場所に関する制限は、単純 if 文に適用されるのと同じものが適用されます。

nohup

nohup command
最初の形式はシェルスクリプト内で使用し、 以降のスクリプトでハングアップが無視されるようにします。 2 番目の形式は、指定されたコマンドがハングアップを無視して 実行されるようにします。 なお、 & でバックグラウンドで実行されたすべてのプロセスは、 自動的にハングアップを無視して実行されます。

notify

notify %job ... 
カレントジョブまたは指定されたジョブの状態が変化したときに、 シェルが即時にユーザへ通知するようにします。 通常、通知はプロンプトが表示される前に行われます。 シェル変数 notify がセットされている場合には、これは自動的に行われます。

onintr

onintr −

onintr label
割込みに対するシェルの処理を制御します。 最初の形式は、割込みに対するシェルのデフォルトの処理をとり戻します。 つまり、シェルはシェルスクリプトを終了するか、 または端末装置からのコマンド入力レベルへ戻ります。 2 番目の形式 onintr − は、すべての割込みが無視されるようにします。 最後の形式は、割込みが受信されるか、 または割込み発生で子プロセスが終了したときに、 シェルに goto label を実行させます。

いずれの場合にも、シェルがバックグラウンドで実行されていて、 割込みが無視されると、 onintr のすべての形式は意味を持たず、 シェルや呼び出されたすべてのコマンドは割込みを無視し続けます。

popd

popd +n
ディレクトリスタックをポップし、新しいトップディレクトリに戻ります。 引数 +n があると、スタック内の n 番目のエントリを捨てます。ディレクトリスタックのエレメントには、 トップから始まって 0 から番号が付けられます。

pushd

pushd name

pushd +n
引数がなければ、 pushd はディレクトリスタックの最初の 2 つのエレメントを入れ換えます。 引数 name が指定された場合には、 pushd は、 (cd のように) 新しいディレクトリへ変更し、 古いカレント作業ディレクトリを ディレクトリスタックへプッシュします。 数値の引数があると、 ディレクトリスタックの n 番目の引数を先頭の要素になるように循環させ、それに変更します。 ディレクトリスタックの要素には、 トップから始まって 0 から番号が付けられます。

rehash
path 変数に含まれているディレクトリ内容の内部ハッシュテーブルが作り直されます。 これは、ユーザがログインしている間に、 path に含まれているディレクトリに新しいコマンドが追加された場合に必要となります。 ユーザがユーザの所有するディレクトリにコマンドを追加する場合、 またはシステムプログラマがシステムディレクトリの 1 つの内容を 変更した場合にだけ、このコマンドの実行が必要になります。

repeat count command
指定された command が count 回実行されます。 command は、前述の単純 if 文におけるコマンドと同様の制限を受けます。 count が 0 であっても、入出力リダイレクションは 1 回実行されます。

set

set name

set name=word

set name[index]=word

set name=(wordlist)
コマンドの最初の形式は、すべてのシェル変数の値を表示します。 単一ワード以外を値として持つ変数は、 かっこで囲まれたワードの並びとして表示されます。 2 番目の形式は、 name をナル文字列にセットします。 3 番目の形式は、 name を単一の word にセットします。 4 番目の形式は、 name の index 番目の構成要素を word にセットします。 この構成要素は既に存在しているものでなければなりません。 最後の形式は、 name を wordlist のワードの並びにセットします。 いずれの場合も、値は、展開されたコマンドやファイル名です。

これらの引数は、 単一のセットコマンド内で複数の値をセットするために 繰り返すことができます。 ただし、変数の展開は、設定が行われる前に、 すべての引数について発生することに注意してください。

setenv

setenv name value

setenv name
最初の形式は、すべての現在の環境変数をリスト表示します。 2 番目の形式は、 環境変数 name の値を単一の文字列である value にセットします。 最後の形式は、 name を空の文字列にセットします。 最も一般的に使用される環境変数 USER、TERM、PATH は、 csh の変数 user、term、path との間で自動的にインポート/エクスポートされますので、 これらの環境変数のために setenv を使用する必要はありません。

shift

shift variable
argv のメンバが左へシフトされ、 argv[1] が破棄されます。 argv がセットされていない場合、 または値として 1 ワードも持っていない場合には、 エラーになります。 2 番目の形式は、指定された変数に対して同じ機能を実行します。

source name

source −h name
シェルは name からコマンドを読み取ります。 source コマンドはネスティングすることが可能です。 ネスティングのレベルがあまり深くなると、 シェルは、ファイルディスクリプタが不足してしまうこともあります。 どのレベルにある source でエラーが発生しても、すべてのネスティングされた source コマンドが終了します。通常、 source コマンドにおける入力は、ヒストリリストには置かれません。 −h オプションは、コマンドを実行せずにヒストリリストに置きます。

stop

stop %job ... 
カレントジョブ、 またはバックグラウンドで実行されている指定ジョブを停止します。

suspend
あたかも ^Z を用いてシェルが STOP シグナルを送られたかのように、 シェルを停止させます。これは、 su(1) によって開始させられたシェルを停止するためによく使われます。

switch (string)

case str1:

    ... 

  breaksw

... 

default:

    ... 

  breaksw

endsw
各 case ラベルが、指定された string (これは展開された最初のコマンドとファイル名)と 一致するかどうかが連続的に調べられます。 変数展開された case ラベルでは、ファイルメタキャラクタ ∗、?、 [...] を使用することができます。 default ラベルが見つけられる前に、どの case ラベルにも一致しない場合には、 default ラベルの直後から実行が開始されます。 各 case ラベルと default ラベルは、行の先頭に来なければなりません。 コマンド breaksw は、制御を endsw の次の行に移します。 このコマンドを使用しない場合には、C 言語の場合と同様に、制御が case ラベルにも default ラベルにも失敗することがあります。一致するラベルがなく、 default がない場合には、制御は endsw の次の行に移ります。

time

time command
引数が与えられない場合には、 このシェルとその子シェルが使用した時間の要約が表示されます。 引数が与えられると、その指定された単純コマンドについて時間の測定が行われ、 time 変数のもとに記述されているように時間の要約が表示されます。 必要があれば、コマンドが完了したとき、 時間統計を表示するためにエキストラシェルが作られます。

umask

umask value
ファイル作成マスクが表示される (最初の形式) か、 または指定された値にセットされます (2 番目の形式)。 マスクは 8 進数で与えられます。 マスクの一般的な値は、 グループにすべてのアクセスパーミッションを与え、 その他のユーザに読み出し/実行パーミッションを与える 002 か、 または、 そのグループのユーザやその他のユーザに書き込みパーミッション以外の すべてのアクセスパーミッションを与える 022 です。

unalias pattern
指定されたパターンに一致するすべてのエイリアス(別名)が取り消されます。 したがって、すべてのエイリアスは‘unalias ∗’によって取り消されます。 unalias できるエイリアスがない場合でもエラーとはなりません。

unhash
実行されるプログラムを素早く検索するのに使用する内部 ハッシュテーブルを使用できないようにします。

unlimit

unlimit resource

unlimit −h

unlimit −h resource
resource に対する制限を取り除きます。 resource が指定されない場合には、すべての resource に対する制限が取り除かれます。 −h オプションが指定された場合には、対応するハードの制限が取り除かれます。 スーパーユーザだけがこれを行うことができます。

unset pattern
指定されたパターンに一致する名前を持つ変数がすべて取り消されます。 したがって、 unset ∗ によって、すべての変数を取り消すことができますが、 これは、好ましくない結果を招きます。 unsetenv で取り消される変数がなくても、エラーにはなりません。

unset pattern
指定されたパターンに名前が一致する すべての環境変数が環境から取り除かれます。 前述の setenv コマンドと printenv(1) も参照してください。

wait
すべてのバックグラウンドジョブの終了を待ちます。 シェルがインタラクティブな状態の場合は、 割込みで待機を中断することができます。 このとき、シェルは、 実行中にあると認識されているすべてのジョブの名前と ジョブ番号を表示します。

while (expr)

    ... 

end
指定した式の評価結果がゼロ以外である間、 while と対応する end との間にあるコマンドが評価されます。 break と continue は、それぞれループを途中で終了したり、 途中から継続するのに使用します (while と end は、それぞれ 1 行に単独で記述しなければなりません)。 入力が端末装置である場合には、 foreach 文の場合と同様に、繰り返し部分の入力が要求されます。

%job
指定されたジョブをフォアグラウンドへ持ってきます。

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

@

@ name = expr

@ name[index] = expr
最初の形式は、すべてのシェル変数の値を表示します。 2 番目の形式は、指定された name を expr の値にセットします。式に <、>、&、 | が含まれている場合には、少なくとも式のこの部分は ( ) 内に置かなければなりません。 3 番目の形式は、 expr の値を name の index 番目の引数に代入します。 name とその index 番目の構成要素は既に存在していなければなりません。

∗= や += などの演算子は、C 言語の場合と同様に使用可能です。 代入演算子と名前とを区切るスペースは省略することができます。しかし、 expr の構成要素を区切るスペースは省略することはできません。

特殊な後置 (postfix) 演算子 ++ および −− は、 name をそれぞれ 1 つ増加および減少させます (@ i++ など)。

あらかじめセットされた環境変数

以下の変数はシェルにとって特別の意味を持っています。 これらの変数のうち、 argv、cwd、home、 path、prompt、shell、 status は、常にシェルによってセットされます。 cwd と status 以外は、初期設定時にだけセットされ、 その後ユーザによって明示的に修正されない限り、 その設定が修正されることはありません。

シェルは、環境変数 USER をシェル変数 user に、 TERM を term に、 HOME を home にコピーし、シェル変数がリセットされたときには、 逆にそれを環境変数にコピーします。 環境変数 PATH もこのように扱われます。 csh のプロセスが path の定義を環境からインポートし、ユーザが path の定義を変更した場合にはそれをエクスポートするので、ファイル .cshrc 内の設定を除き、その設定を気にする必要はありません。

argv シェルに対する引数がセットされます。 この変数から位置パラメタが置き換えられます。 すなわち、 $1 は $argv[1] で置き換えられるといった具合いです。

cdpath chdir コマンドで指定されたサブディレクトリを探す代替 ディレクトリのリストを出します。

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

echo −x のコマンド行オプションが指定されたときにセットされます。 各コマンドおよびその引数が、実行される前にエコーされます。 組込みコマンドでないの場合、エコーする前に、すべての展開が行われます。 組込みコマンドは、コマンド置換/ファイル名置換の前にエコーされます。 これらの置換は、その後、選択的に実行されます。

filec ファイル名の完成機能を使用可能にします。

histchars 文字列を与え、ヒストリ置換で使用する文字を変更することができます。 文字列値の最初の文字は、デフォルト文字 !  の代わりにヒストリ置換文字として使用されます。 2 番目の文字は、クイック置換用の文字 ^ と置き換えられます。

history ヒストリリストのサイズを示す数値を与えることができます。 ここで指定した数のイベントはつねにヒストリとして保持されています。 history の値が大きすぎると、シェルはメモリ不足を起こします。 直前に実行されたコマンドは、常にヒストリリストにセーブされます。

home 呼出しユーザのホームディレクトリで、環境により初期設定されます。 ~ のファイル名置換は、この変数を参照します。

ignoreeof セットされると、 シェルは入力デバイスから入力された end-of-file を無視します。 これによって、誤って control-D がタイプされても、 シェルが終了するのを防ぐことができます。

mail メールがあるかどうかをシェルがチェックするファイル名を指定します。 指定された時間が経過していれば、各コマンドが終了してプロンプトが 表示されるごとにチェックが行われます。ファイルが存在し、 最終アクセス時刻が最終修正時刻より遅い場合にメッセージ You have new mail.  を出力します。

mail の値の最初のワードが数値であると、 メールチェックの間隔時間 (デフォルトでは 10 分) として使用されます (単位は秒)。

複数のメールファイルが指定されている場合には、ファイル name にメールが到着していれば、シェルは、メッセージ New mail in name を出力します。

noclobber 入出力 の項で述べられているように、ファイルが不注意で破壊されないよう、 また >> リダイレクションが既存のファイルを参照しないよう、 出力リダイレクションに制限を設けます。

noglob セットされると、ファイル名の展開が禁止されます。これは、 ファイル名を扱っていないシェルスクリプトの中で用いるか、 または、得られたファイル名の並びをそれ以上展開したくない 場合に用いると便利です。

nonomatch
セットされると、ファイル名の展開が既存のファイルに一致しなくても、 エラーとはならず、基礎パターンが返されます。 ただし、基礎パターンに文法的な誤りがある場合にはエラーになります。 すなわち、 echo [ はエラーになります。

notify セットされると、 シェルはジョブの完了を即時に通知します。 セットしなければ(デフォルトでは)、 プロンプトを表示する直前にジョブの完了を知らせます。

path path 変数の各ワードには、 実行に当たってコマンドがサーチされるディレクトリを指定します。 ナルワードは、カレントディレクトリを指定します。 path 変数がない場合には、フルパス名で指定したコマンドだけが実行されます。 通常のサーチパスは .、/bin、/usr/bin ですが、これはシステムによって違ってきます。 スーパーユーザの場合、デフォルトのサーチパスは /etc、/bin、/usr/bin です。 −c オプションも −t オプションも指定されていないシェルは、通常、 .cshrc の読み取り後、および path 変数が再設定されるたびに path 変数のディレクトリの内容をハッシュします。 シェルが実行中であるときに、 新しいコマンドがこれらのディレクトリに追加された場合には、 rehash を実行する必要があります。これを実行しなければ、 そのコマンドを見つけることはできません。

prompt インタラクティブ(対話的)な端末装置入力から各コマンドが読み取られる前に、 表示される文字列です。 !  が文字列内にあると、その前に \ が付けられていない限りカレントイベント番号で置き換えられます。 デフォルトは  ‘% ’、 スーパーユーザの場合は  ‘# ’ です。

savehist これには、ユーザがログアウトするときにファイル ~/.history にセーブされるヒストリリストのエントリ数を指定します。 ここで指定した数のイベントがログアウト時にセーブされます。 ログイン時にシェルは、ヒストリリストへ ~/.history の内容を戻してヒストリをセーブしておきます。 savehist の値が大きすぎると、開始時のシェルの速度が遅くなります。

shell シェルの本体のファイルです。 実行ビットがオンになっているけれども システムからは実行可能ではないファイル (シェルスクリプトファイル) の 解釈のためにシェルをフォークするときにこの変数を使用します (組込みコマンド でないコマンドの実行の説明を参照してください)。 シェルのホーム(システムによって異なる)に初期設定されます。

status 最後のコマンドが返したステータスです。 コマンドが異常終了した場合には、 ステータスに 0200 が加えられます。 組込みコマンドは失敗すると終了ステータス 1 をセットし、成功すると 0 をセットします。

time 自動的に行われるコマンドの時間計測を制御します。 この変数がセットされていると、 その CPU 時間(秒数)より多くの時間を費やしたコマンドは、 終了時にユーザ、システム、実時間、CPU 利用割合 (実時間に対するユーザ時間+システム時間の割合) を報告する行を表示します。

verbose −v コマンド行オプションによってセットされ、ヒストリ置換後、 各コマンドのワードを表示します。

組込みコマンド以外のコマンドの実行

実行するコマンドが組込みコマンドではないことがわかると、 シェルは、 execve(2) によってそのコマンドを実行しようとします。 変数 path の各ワードは、 シェルがコマンドを実行しようとするディレクトリを指定しています。 −c オプションも −t オプションも指定されていない場合には、シェルは、 これらのディレクトリにある名前を内部テーブルにハッシュし、 コマンドの存在する可能性のあるディレクトリでだけ exec を実行できるようにします。 これによって、サーチパスに多数のディレクトリがある場合に コマンドの探知が大幅にスピードアップされます。 このメカニズムが (unhash によって)オフになっているか、もしくはシェルに −c または −t 引数が与えられていて、しかも path の各ディレクトリ要素が / で始まっていない場合には、シェルは、与えられたコマンド名と連結して、 実行しようとするファイルのパス名を作ります。

かっこで囲まれたコマンドは、常にサブシェルで実行されます。 したがって、 (cd ; pwd) ; pwd は、 home ディレクトリを表示します。 表示後もまだユーザはそれまでのディレクトリにいるので、 ホームディレクトリを表示したあとにそのディレクトリも表示します。 しかし、単に cd ; pwd とすると、ユーザは home ディレクトリへ移動します。かっこで囲まれたコマンドは、 chdir がカレントシェルに影響を及ぼすのを防止するために、よく使用されます。

ファイルに実行パーミッションがありますが、 システムにとって実行可能なバイナリではない場合には、 そのファイルはシェルコマンドの収められたファイルと見なされ、 それを読み取る新しいシェルが作られます。

「シェル」に対する alias がある場合には、そのエイリアス(別名)のワードが引数の並びの先頭に付けられ、 シェルコマンドが形成されます。 alias の最初のワードは、シェルのフルパス名 (例えば $shell) でなければなりません。 これは、エイリアス置換の (置換があとで行われる) 特殊なケースであり、 修正なしにワードを引数の並びの前に付けることができることに注意してください。

引数の並びの処理

シェルへの引数 0 が − である場合には、これはログインシェルです。 フラグ引数は、次のように解釈されます。

−b このフラグは、オプション処理を強制的に「ブレーク」し、 それ以降のシェル引数をオプション引数でないものとして扱われるようにします。 残りの引数はシェルのオプションとして解釈されません。 これは、シェルスクリプトに対して混乱なくオプションを渡すために使います。 シェルは、 このオプションがないとユーザ ID を設定するスクリプトを実行しません。

−c コマンドは、あとに続く引数から一つだけ読み取られます。 この引数は省略できません。残りの引数がある場合には、それらは argv に置かれます。

−e 呼び出されたコマンドが異常終了するか、 または 0 以外の終了ステータスを返すと、シェルを終了します。

−f シェルが短時間で起動します。 呼出しユーザのホームディレクトリ内のファイル .cshrc からコマンドをサーチも実行もしないためです。

−i シェルはインタラクティブ(対話的)になり、 入力が端末装置でないときでも、そのトップレベルの入力を促します。 シェルは、その入力および出力が端末装置である場合には、 このオプションを使用しなくても対話的になります。

−n コマンドが解析されますが、実行はされません。 このオプションは、シェルスクリプトの文法的なチェックを助けます。

−s コマンド入力が標準入力から取り込まれます。

−t 入力の単一行が読み取られ、実行されます。 \ を使用して行の終りにある復帰改行をエスケープして 別の行に続けることができます。

−v verbose 変数をセットすることによって、 コマンド入力をヒストリ置換後にエコーします。

−x echo 変数をセットします。 したがって、コマンドは、実行の直前にエコーされます。

−V .cshrc が実行される前に、 verbose 変数をセットします。

−X .cshrc が実行される前に、 echo 変数をセットします。

フラグ引数の処理後、引数が残っていて、 −c、−i、−s、 −t オプションのいずれも指定されていない場合には、 残った引数の最初が実行するコマンドのファイル名と解釈されます。 シェルは、このファイルをオープンし、 $0 による再置換にそなえてその名前をセーブします。 多くのシステムでは、シェルスクリプトに csh と互換性のない、バージョン 6 か 7 の標準シェルを使用しているので、 スクリプトの最初の文字が # ではない場合、つまり、そのスクリプトがコメントで始まっていない場合には、 シェルは「標準」シェル (/bin/sh) を実行します。 残りの引数は、変数 argv を初期設定します。

シグナルの処理

シェルは、通常、 quit シグナルを無視します。 (&、bg、%...& などのコマンドで) バックグラウンドで実行されているジョブは、 ハングアップも含めて キーボードから発生されるシグナルを無視します。 他のシグナルについては、 シェルがその親から受け継いだ値を持っています。 シェルスクリプトにおける割込み(interupt) と終了(terminate) シグナルを シェルがどのように処理するかは、 onintr でコントロールすることができます。 ログインシェルは terminate シグナルを受け取りますが、それ以外のシェルでは、 このシグナルはそのシェルの親から子に渡されます。 ログインシェルがファイル .logout を読み取っているときには、いかなる場合にも割込みは許されません。

多国語対応

漢字をはじめ多国語入力に対応するための処理は、以下のとおりです。

tty モードを sjis、euc、jis モードに設定することにより、 ASCII 文字と同様に漢字を入力することができます。 "、 &、|、;、 <、>、(、 ) などのメタキャラクタは ASCII 文字でなければなりません。 全角文字の  ‘”’ や  ‘&’ などは通常の文字と同じ扱いになります。 同様に全角スペース(シフト JIS コードなら 0x8140、EUC なら 0xa1a1)は 引数のセパレータとしては使用できません。

ファイル名操作用のメタキャラクタである ∗、?、 [...] などに対して、 2 バイトコードは 1 文字として扱われます。

ヒストリ機能、シェル変数や環境変数の値にも漢字が使用できます。

著者

William Joy。 ジョブ制御およびディレクトリスタック機能は、 オーストリアのルクセンブルグにある I.I.A.S.A の J.E. Kulp によって、 現在使われているのとは異なる構文を用いて、最初に実現されました。 ファイル名完成機能のコードは HP Labs. の Ken Greer によって書かれました。

関連ファイル

~/.cshrc 実行開始時に各シェルによって読まれるファイル。

~/.login ログイン時に .cshrc ファイルのあとに、ログインシェルによって読まれるファイル。

~/.logout ログアウト時にログインシェルによって読まれるファイル。

/bin/sh # で始まっていないスクリプトのための標準シェル。

/tmp/sh∗ << のための一時的ファイル。

/etc/passwd ~name に対するホームディレクトリを探すファイル。

制限事項

ワードの合計長は 1024 文字までに制限されています。 システムは引数の並びを 10240 文字までに制限しています。 ファイル名の展開を伴う 1 つのコマンドに対する引数の数は、 引数で許される文字数 (10240) の 1/6 に制限されています。 コマンド置換では、 引数で許されている文字数 (10240) を越える文字を置換することはできません。 シェルは、単一行上での alias によるエイリアス(別名)置換の数を 20 までに制限して、 深いループを検出しています。

関連事項

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

バグ

コマンドが停止状態から再スタートされたときに、 そのコマンドが起動したディレクトリが カレントディレクトリと異なる場合には、 起動ディレクトリを表示します。 ジョブは内部的には変更されたディレクトリを持っていることもあるので、 ディレクトリの表示は誤解の基(すなわち誤り)かもしれません。

シェルの組込み機能は、停止可能/再スタート可能ではありません。 また、 a ; b ; c という形式のコマンドの並びも、停止しようとしても簡単には処理されません。 b を停止すると、シェルは次には c から実行します。 この点は、エイリアス(別名)によって展開が生じる場合には、 特に注目すべきです。 コマンドの並びを ( ) の中に入れてサブシェルに強制すれば (すなわち、 ( a ; b ; c ) にすれば)十分です。

プロセス開始後の端末出力の制御は単純なものです。 おそらく、これを上等な仮想端末装置インターフェースに換えようと 取り組もうという気にさせることでしょう。 仮想端末装置インターフェースでは、 出力の制御にもっと面白いことができるでしょう。

エイリアス置換は、 シェルプロシージャをシミュレートするのによく使われますが、 これはよい考えではありません。 エイリアスよりもシェルプロシージャを用意するべきです。

ループ内のコマンド (?  によって入力要求される) は、ヒストリリストには置かれません。 組込みコマンドとして認識されることよりも、制御構造が解析されるべきです。 そうすれば、制御コマンドを任意の場所に置き、 | で結合し、 & や ; などのメタシンタックスと共に使用できるようになるでしょう。

コマンド置換の出力に : 修飾子を使用できるようにすべきです。 : 修飾子のすべてあるいはいくつかを、 $ 置換で使用できるようにすべきです。

filec 機能を実現している方法は、見苦しいし高くついています。

備考

setuid / setgid のシェルスクリプトについて
NEWS-OS Release 4.0 より、セキュリティ上の問題から setuid または setgid されたシェルスクリプトを実行する際、 コマンドのサーチパスを以下のように変更します。

シェル設定されるサーチパス
/bin/csh(/usr/ucb /bin /usr/bin /usr/sony/bin)
/bin/sh/bin:/usr/bin:/usr/sony/bin

必要に応じてシェルスクリプト中でサーチパスを再設定してください。

setuid されたアプリケーションプログラムから system() 関数や popen() 関数を使用する場合も、同様です。 これらの場合は、コマンドはフルパスで指定するようにしてください。

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026