diff --git a/ja/man/man1/a2p.1 b/ja/man/man1/a2p.1 index 6b3481ac8a..40c9922daf 100644 --- a/ja/man/man1/a2p.1 +++ b/ja/man/man1/a2p.1 @@ -1,218 +1,218 @@ .rn '' }` .\" jpman %Id: a2p.1,v 1.3 1997/07/22 14:10:51 konuma Stab % ''' %Header: /home/ncvs/src/gnu/usr.bin/perl/x2p/a2p.1,v 1.1.1.1 1994/09/10 06:27:55 gclarkii Exp % ''' ''' %Log: a2p.1,v % ''' Revision 1.1.1.1 1994/09/10 06:27:55 gclarkii ''' Initial import of Perl 4.046 bmaked ''' ''' .\" Revision 1.1.1.1 1993/08/23 21:30:10 nate .\" PERL! .\" ''' Revision 4.0 91/03/20 01:57:11 lwall ''' 4.0 baseline. ''' ''' Revision 3.0 89/10/18 15:34:22 lwall ''' 3.0 baseline ''' ''' Revision 2.0.1.1 88/07/11 23:16:25 root ''' patch2: changes related to 1985 awk ''' ''' Revision 2.0 88/06/05 00:15:36 root ''' Baseline version 2.0. ''' ''' .de Sh .br .ne 5 .PP \fB\\$1\fR .PP .. .de Sp .if t .sp .5v .if n .sp .. .de Ip .br .ie \\n.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. ''' ''' Set up \*(-- to give an unbreakable dash; ''' string Tr holds user defined translation string. ''' Bell System Logo is used as a dummy character. ''' .tr \(*W-|\(bv\*(Tr .ie n \{\ .ds -- \(*W- .if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch .if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch .ds L" "" .ds R" "" .ds L' ' .ds R' ' 'br\} .el\{\ .ds -- \(em\| .tr \*(Tr .ds L" `` .ds R" '' .ds L' ` .ds R' ' 'br\} .TH A2P 1 LOCAL .SH 名称 a2p - Awk から Perl へのトランスレータ .SH 書式 .B a2p [options] filename .SH 解説 .I a2p はコマンドラインで指定された (あるいは標準入力からの) awk スクリプトを とり、同等の働きをする .I perl スクリプトを標準出力に出力します。 .Sh オプション オプションには以下のものがあります: .TP 5 .B \-D デバッグフラグをセットします。 .TP 5 .B \-F awk スクリプトが常にこの -F スイッチ付きで実行されることを指定します。 .TP 5 .B \-n 入力を分割して配列に格納する必要がない場合、 入力フィールドの名前を指定します。 例えば、パスワードファイルを処理する awk スクリプトを変換する場合、 このように指定します: .sp a2p -7 -nlogin.password.uid.gid.gcos.shell.home .sp フィールド名の区切りには任意のデリミタが使用できます。 .TP 5 .B \- a2p は、入力が常に指定した数のフィールドから成っていることを仮定します。 .Sh 考察 a2p は人間と同じぐらいうまい変換はできませんが、 大抵の場合はそこそこうまく処理します。 場合によっては、 生成された perl スクリプトを吟味し、少し手を加えたいと思うことも あるでしょう。 以下にいくつかの場合を、順不同で説明します。 .PP 文字列を表す式のまわりに int() を付け、 数値として解釈されるようにする awk イディオムが あります (その引数は常に整数型なのですが)。 これは一般に perl では不要ですが、 a2p は引数が常に整数となるかどうか判断できないので、 このイディオムはそのまま残します。 ユーザはこれを取り除くことができます。 .PP perl では数値比較と文字列比較は区別されています。 awk ではどちらにも同じ演算子が用いられ、 実行時にどちらの比較を行うかが決定されます。 この点で a2p は awk エミュレーションを完全には行おうとしません。 その代わり、a2p はどちらの種類の比較を行おうとしているのか推測します。 これはほとんどの場合正しいものですが、だまされることもあります。 推測を行った部分には \*(L"#???\*(R" というコメントが付与されますので、 それらの部分を調べ、中身をチェックすべきです。 ユーザは、少なくとも一度は \-w スイッチ付きで perl を走らせるとよいでしょう。 こうすると、eq を使うべきところで == を使っている場合に警告を受けます。 .PP 存在しない配列要素でも、単にそれを参照しただけで存在するようになるか、 という点で、perl は awk の動作をエミュレートしようとしません。 何らかの理由で、このメカニズムに依存して後続の for...in のために ヌルエントリを作成しようとする場合、 perl ではヌルエントリは作成されません。 .PP a2p が、(Fld1, Fld2, Fld3...) のような、変数のリストへの代入を行う行を 分割する場合、 上に述べた \-n オプションを用いて再度 a2p を走らせた方がいいかもしれません。 これにより、スクリプト内のフィールドに名前を付けます。 そうではなく、分割して配列に格納する場合、 その分割はおそらくどこかでフィールド数を参照しているでしょう。 .PP awk の exit ステートメントは必ずしも exit せず、 END ブロックがあればそこへ処理が移ります。 ある条件下で END ブロックをバイパスするような細工を END ブロックに 仕掛けてある awk スクリプトは、 END ブロック内の条件文を取り除き、perl スクリプトから直接 exit するように 修正することで簡単化できます。 .PP perl には 2 種類の配列、すなわち数値でインデックスされる配列と連想配列とが あります。 通常、awk の配列は連想配列に変換されますが、 もしそのインデックスが常に数値であるとわかったら、 配列添字の {...} を [...] に変更できます。 連想配列に対する繰り返し処理は関数 keys() を用いて行われますが、 数値配列に対してはそうではありません。 問題となっている配列の繰り返し操作を行うあらゆるループ構造を 修正する必要があるかもしれません。 .PP awk は起動時、OFMT の値が %.6g であると仮定しています。 perl でこれに相当する変数 $# は、初期値として %.20g を持っています。 OFMT のデフォルト値を用いる場合は $# を明示的に設定して下さい。 .PP awk スクリプトでは、行の先頭付近で行分割 (split) 操作が暗黙的に 繰り返されます。 場合によっては、全体レコードをテストする何らかの条件文より下に これを移動させることができます。 そうすることで無用な行分割処理を避けることができます。 .PP 美的理由から配列の基底 $[ を元々の 1 から perl でのデフォルトである 0 に 変更したいこともあるでしょう。 しかし、全ての配列添字式だけでなく、全ての substr() および index() 関数も 適合するように修正しなければならないことを忘れないで下さい。 .PP "# awk は馬鹿だからこうやって工夫してます" といった気の利いたコメントは、 そのまま修正されずに渡されます。 .PP awk スクリプトはしばしばシェルスクリプトに埋め込まれ、 awk の入出力がパイプで接続されます。 -こういったシェルスクリプトのラッパーも perl スクリプトに取り込める場合が +こういったシェルスクリプトのラッパも perl スクリプトに取り込める場合が かなりあります。 perl なら入出力パイプを開始でき、 awk が自分ではできなかった他の処理も行うことができるからです。 .PP 特殊変数 RSTART および RLENGTH を参照するスクリプトは、 これらの変数を定義するパターン照合のスコープの中で参照されている限り、 変数 $`, $&, $' を参照することで簡単化できる場合がかなりあります。 .PP 生成された perl スクリプトには、 getline および print に関する awk の意味規則に対処するための サブルーチンが定義されている場合があります。 a2p は通常、効率よりも正確さを選ぶからです。 ほとんどの場合、ご丁寧に意味規則に対処してくれるサブルーチンを捨てて、 もっと効率的なコードに書き換えることができます。 .PP 効率を上げるために、 サブルーチンで最後に実行される return ステートメントから キーワード return を取り除くことができる場合があります。 a2p は最も一般的な場合は見つけますが、 稀にある埋め込まれたブロックを解析したりしません。 .PP ARGV[0] は $ARGV0 に変換されますが、ARGV[n] は $ARGV[$n] に変換されます。 ARGV[0] を含めて繰り返し処理を行おうとするループは、 うまくいきません。 .SH 環境変数 a2p は環境変数を参照しません。 .SH 作者 Larry Wall .SH 関連ファイル .SH 関連項目 perl perl コンパイラ/インタプリタ .br s2p sed から perl へのトランスレータ .SH 診断 .SH バグ 実行時にオペランドを調べることで、文字列演算か数値演算かの選択で awk の エミュレーションを行うことは可能でしょうが、 プログラムは肥大し、非効率的になるでしょう。 なお、a2p の推測はほとんど常に正しく行われます。 .PP awk 文法ツリー用の領域は現在のところ静的に確保しており、 不足する可能性があります。 .rn }` '' diff --git a/ja/man/man1/csh.1 b/ja/man/man1/csh.1 index 5a2ead2d67..3cc1301443 100644 --- a/ja/man/man1/csh.1 +++ b/ja/man/man1/csh.1 @@ -1,2190 +1,2188 @@ .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)csh.1 8.2 (Berkeley) 1/21/94 .\" jpman %Id: csh.1,v 1.2 1997/04/08 00:35:51 h-nokubi Stab % .\" %Id: csh.1,v 1.5.2.1 1997/02/28 07:54:29 mpp Exp % .\" .\" Japanese translation for jpman-0.2 checked by jpman project 96.12.23 .\" .Dd January 21, 1994 .Dt CSH 1 .Os BSD 4 .Sh 名称 .Nm csh .Nd C 言語ライクな文法を持つシェル(コマンドインタプリタ) .Sh 書式 .Nm csh .Op Fl bcefimnstvVxX .Op arg ... .Nm csh .Op Fl l .Sh 解説 .Nm csh は、履歴(参照: .Nm ヒストリ置換 の項)、ジョブ制御(参照: .Nm ジョブ の項)、対話的なファイル名とユーザ名の補完(参照: .Nm ファイル名補完 の項)、C 言語ライクな文法を特徴とするコマンドインタプリタです。 対話的なログイン・シェル、また シェル・スクリプトのコマンド・プロセッサの両方の用途で使われます。 .Ss 引数リスト処理 シェルへの最初の引数(第 0 引数)が .Ql Fl \& で始まる場合、シェルはログイン・シェルとなります。 シェルを .Ql Fl l フラグを指定して起動することでもログイン・シェルにできます。 .Pp 残りのフラグは以下のように解釈されます: .Bl -tag -width 5n .It Fl b このフラグは、オプションの処理を強制的に中断させる場合に使用します。この フラグ以降の引数はすべて、オプションではない引数として処理されます。 これにより、シェル・スクリプトに混乱やごまかしを行わずにオプションを 渡すことが可能になります。 set-user ID スクリプトは本オプションなしでは実行できません。 .It Fl c コマンドを本フラグの次にくる 1 つの引数から読み込みます。 この引数は省略できません。残りの引数は .Ar argv に代入されます。 .It Fl e 起動したコマンドが異常終了したり、0 でない終了ステータスを返したときに、 ただちにシェルを終了します。 .It Fl f 起動したユーザのホーム・ディレクトリにある .Pa \&.cshrc を捜さず、また読み込まないため高速に起動します。 .It Fl i たとえ端末上で実行されていなくても、対話的に動作しプロンプトを表示します。 入力と出力が端末である場合、本オプションなしでもシェルは対話的に動作します。 .It Fl l ログイン・シェルとなります。( .Fl l が、指定された唯一のフラグの場合にのみ有効です。) .It Fl m シェルは、実効ユーザに属していなくても .Pa .cshrc をロードします。 .Xr su 1 は .Fl m をシェルに渡すことができます。 .It Fl n コマンドの解析は行いますが、実行しません。シェル・スクリプトの 文法検査に役立ちます。 .It Fl s 標準入力からコマンドを読み込みます。 .It Fl t 入力から1行だけ読み込み、それを実行します。改行の直前に .Ql \e を置くことで、次の行への継続を行うことができます。 .It Fl v .Ar verbose 変数を設定します。これにより、ヒストリ置換された状態のコマンド行を 表示するようになります。 .It Fl x .Ar echo 変数を設定します。これにより、実行直前に、実行するコマンドを 表示するようになります。 .It Fl V .Pa .cshrc を実行するより前に .Ar verbose 変数を設定します。 .It Fl X .Pa .cshrc を実行するより前に .Ar echo 変数を設定します。 .El .Pp .Fl X に対する .Fl x の関係は、ちょうど .Fl V に対する .Fl v の関係に相当します。 .Pp フラグ引数の処理のあと、もし引数が残っていて、かつ、 -.Fl c -、 -.Fl i -、 -.Fl s -、 +.Fl c , +.Fl i , +.Fl s , .Fl t のいずれのフラグも指定されていなければ、残っている最初の引数は コマンドファイル名であるとみなされます。シェルはこのファイルをオープンし、 `$0' による置換に備えてファイル名を保存します。多くのシステムは version 6 または version 7 の標準のシェルを使っており、また、それらの シェル・スクリプトは本シェルとは互換性がないので、 スクリプトの先頭の文字が `#' でない場合、 つまりスクリプトがコメントから始まらない場合、 本シェルはそれらの `標準' シェルを起動して実行します。 残りの引数は変数 .Ar argv に初期値として設定されます。 .Pp .Nm csh は、実行開始に際し、まず、ファイル .Pa /etc/csh.cshrc を読み込み実行します。ログイン・シェルであれば、さらに、ファイル .Pa \&/etc/csh.login を読み込み実行します。 次にシェルを起動したユーザの .Ar ホーム ・ディレクトリにあるファイル .Pa \&.cshrc を読み込み実行します。ログイン・シェルであるなら、 さらに、同じディレクトリのファイル .Pa \&.login を読み込み、実行します。 .Pa \&.login の通常の使い方としては、ユーザが CRT 画面の設定のために ``stty crt'' を実行したり、 .Xr tset 1 を実行したりするために用いられます。 .Pp 通常、シェルはプロンプト `% ' を表示し、端末からコマンドを読み込みます。 引数の処理やコマンド・スクリプトを含むファイルの処理については後述します。 .Pp シェルは以下の動作を繰り返します: 読み込んだ行を .Ar 単語 に分解します。この単語の列をコマンド履歴に格納し、解析します。 最後にその行の各コマンドを実行します。 .Pp ログイン・シェルが終了するとき、ユーザの .Ar ホーム -・ディレクトリのファイル +ディレクトリのファイル .Pa .logout と .Pa /etc/csh.logout を読み込み実行します。 .Ss 字句構造 シェルは、読み込んだ行を空白とタブを区切りとして単語に分割します。ただし、 以下の例外があります。文字 `&' `\&|' `;' `<' `>' `(' `)' -は独立した単語となります。`&&'、`\&|\&|'、`<<'、`>>' のように +は独立した単語となります。`&&', `\&|\&|', `<<', `>>' のように 2つ繰り返されている場合はペアで1単語を形成します。 これらのメタキャラクタは、直前に `\e' を置くことによって、単語の一部としたり、 特別な意味を無視させることができます。改行の直前に `\e' を置くと、 単一の空白と等価になります。 .Pp 対応したクォート記号 -`'\|'、`\*(ga'、`"'、に狭まれた文字列は、単語の一部分となります。 +`'\|', `\*(ga', `"' に狭まれた文字列は、単語の一部分となります。 このような文字列中のメタキャラクタやブランク、 タブによって単語が分割されることはありません。 これらのクォートの意味はあとで説明します。 `\'' または `"' の内側で改行文字の直前に `\e' を置くと、 改行文字そのものになります。 .Pp シェルの入力が端末からではない場合、 `#' 文字から改行まではコメントとして扱われます。 -直前に `\e' を置くか `\`'、`\''、`"" でクォートすることにより、 +直前に `\e' を置くか `\`', `\'', `"" でクォートすることにより、 この意味を抑制することができます。 .Ss コマンド 単純コマンドは単語の列であり、最初の単語が実行すべきコマンドを示します。 `\&|' 記号で区切られた、単純コマンドあるいは単純コマンドの列は パイプラインを形成します。パイプラインの各コマンドの出力は、次のコマンドの 入力に接続されます。パイプラインの列を `;' によって区切ることで逐次実行が 行えます。パイプラインの列に続けて `&' を置くと、そのパイプラインの終了を 待つことなく、次のパイプラインが実行されます。 .Pp -上記のいずれかを `('と`)' で囲むことにより、単純コマンドを形成することが +上記のいずれかを `(' と `)' で囲むことにより、単純コマンドを形成することが できます (これはパイプライン等の構成要素として使えます)。 また、パイプラインを `\&|\&|' または `&&' で区切ることにより、C -言語のように、第2のパイプラインが第1のパイプラインが失敗あるいは +言語のように、第 2 のパイプラインが第 1 のパイプラインが失敗あるいは 成功したときにのみ実行させることができます( .Em 式 の項参照)。 .Ss ジョブ シェルはパイプラインの各々に対し .Ar ジョブ -を一つづつ関連付けます。シェルは、現在実行中のジョブの一覧表を保持しており、 +を 1 つづつ関連付けます。シェルは、現在実行中のジョブの一覧表を保持しており、 これは、 .Ar jobs コマンドによって表示することができます。 ジョブには整数の番号が割り当てられます。ジョブが `&' を用いて非同期に 起動された場合、シェルは以下のような出力を行います: .Bd -filled -offset indent .Op 1 1234 .Ed .Pp -これは、非同期に起動したジョブがジョブ番号 1 であり、プロセスID が 1234 である +これは、非同期に起動したジョブがジョブ番号 1 であり、プロセス ID が 1234 である (トップレベルの) プロセスを 1 つ持っていることを示します。 .Pp もし、あるジョブを実行中に他のことをしたくなった場合、 .Nm ^Z キー (control-Z) を押すことにより実行中のジョブに STOP シグナルを 送信することができます。通常、シェルはそのジョブが停止した(Stopped)ことを 出力し、プロンプトを表示します。ここで、停止したジョブの状態を操作することが できます。つまり、 .Ar bg コマンドにより停止したプロセスを .Em バックグラウンド で走行させたり、他のコマンドを実行してから、停止していたジョブを .Ar fg コマンドにより .Em フォアグラウンド で再実行させることなどができます。 .Nm ^Z は即座に効力を発揮し、インタラプトと同様に、それまで待たされていた 出力とまだ読み込まれていない入力は捨てられます。 ほかに特殊キーとして .Nm ^Y があり、これを押すと、プログラムが .Xr read 2 によって読み込もうとした時点で STOP シグナルが送信されます。 これは、実行中のジョブに対していくつかの入力を先に入力しておき、 先行入力を読み終えた時点でジョブを停止させたいときに便利です。 .Pp バックグラウンドで実行しているジョブが端末からの入力を試みた場合、その ジョブは停止します。通常、バックグラウンドジョブが端末に出力することは 可能ですが、これは、コマンド ``stty tostop'' により禁止することができます。 もし、この tty オプションを指定したなら、バックグラウンドで実行している ジョブは、端末から入力を試みたときと同様に、端末に出力を試みたときに 停止します。 .Pp シェルでジョブを参照するにはいくつかの方法があります。文字 `%' は ジョブ名を表すのに用いられます。番号 1 のジョブを参照する場合は `%1' とします。 単にジョブ名を入力した場合、そのジョブはフォアグラウンドに移動されます。 -すなわち`%1' は `fg %1' と等価で、番号 1 のジョブをフォアグラウンドで +すなわち `%1' は `fg %1' と等価で、番号 1 のジョブをフォアグラウンドで 実行させます。同様に `%1 &' は番号 1 のジョブをバックグラウンドで 走行させます。ジョブはそのジョブを起動したときにタイプされた文字列の 先頭部分によって参照することもできます。ただし、この先頭部分は あいまいでない必要があります。すなわち、`%ex' は、`ex' という文字列で -始まる名前のサスペンドされたジョブが一つしかない場合に限り、サスペンドされた +始まる名前のサスペンドされたジョブが 1 つしかない場合に限り、サスペンドされた .Xr ex 1 のジョブを再開します。文字列 .Ar string -を含むジョブが一つしかない場合、`%?string' と入力することで、 +を含むジョブが 1 つしかない場合、`%?string' と入力することで、 それを指定することもできます。 .Pp シェルは現在のジョブと直前のジョブを覚えています。jobs コマンドの 出力では、`+' 記号が付加されているのが現在のジョブ、`\-' 記号が 付加されているのが直前のジョブです。`%+' は現在のジョブ、`%\-' は 直前のジョブの省略形です。後述する .Ar ヒストリ の文法から類推される記法として、`%%' があります。 これもまた現在のジョブの省略形です。 .Pp ジョブ制御機構を用いるには、 .Xr stty 1 のオプション .Ic new を設定しておく必要があります。ジョブ制御機構は、 .Em 新型 の端末ドライバの実装の上に構築されているからです。 新型の端末ドライバにより、ジョブを停止させるためのシグナルを キーボードから入力できるわけです。 新型の端末ドライバのオプション設定については stty(1) を参照してください。 .Ss 状態通知 シェルは、プロセスが状態の変化を起こすと、すぐにそれを検知します。通常、 プロンプトが表示される直前にのみ、あるジョブが停止し、それ以上処理が 進まなくなったことを通知します。これは、ユーザの仕事を邪魔しないように するためです。 しかしながら、シェル変数 .Ar notify をセットすることにより、シェルにバックグラウンド・ジョブの状態が 変化したことをただちに通知させることができます。 また、シェルコマンド .Ar notify により、特定のジョブの状態の変化をただちに通知させる ようにマークすることもできます。引数なしの .Ar notify は現在のプロセスに対してマークをつけます。 バックグラウンド・ジョブの開始直後に単に `notify' と打つと そのジョブをマークします。 .Pp 停止したジョブがある状態でシェルを終了しようとすると、`You have stopped jobs.' という警告を受けます。このとき、 .Ar jobs コマンドによりどのジョブが停止中であるのかを確認することができます。 警告を受けた直後に .Ar jobs コマンドで確認した場合と、 -警告を受けた直後にもう一度シェルを終了させようとした場合には、 -シェルは2度目の警告を行わず、停止中のジョブは終了させてから +警告を受けた直後に再度シェルを終了させようとした場合には、 +シェルは 2 度目の警告を行わず、停止中のジョブは終了させてから シェルを終了します。 .Ss ファイル名補完 シェル変数 .Ar filec がセットされてファイル名補完機能が有効になっている場合、 ( .Ic set の項参照) .Nm csh はファイル名やユーザ名の補完を対話的に行います。文字列に続けて エスケープ文字 (エスケープキー、または control-[) キーを端末から 入力することにより補完が行われます。 たとえば、以下のファイルがカレント・ディレクトリにあったとします。 .Bd -literal -offset indent DSC.OLD bin cmd lib xmpl.c DSC.NEW chaosnet cmtest mail xmpl.o bench class dev mbox xmpl.out .Ed .Pp ここで、以下のように入力します。 .Pp .Dl % vi ch .Pp このとき、 .Nm csh は ``ch'' を補完し、それにマッチする唯一のファイル名 ``chaosnet'' にします。補完後の入力行は以下のようになります。 .Pp .Dl % vi chaosnet .Pp 以下のように入力した場合は、 .Pp .Dl % vi D .Pp .Nm csh は、次のように補完を行います。 .Pp .Dl % vi DSC. .Pp ここで、端末ベルを鳴らし、補完が完了しなかったことをユーザに伝えます。 なぜなら、``D'' で始まるファイル名が複数あったからです。 .Pp 不完全なファイル名に続いて end-of-file 文字(通常は control-D)を入力すると、 名前の補完を行うかわりに、その名前にマッチするファイル名の一覧を出力します。 たとえば、以下のように入力すると、 .Pp .Dl % vi D .Pp ``D'' で始まるファイル名の一覧が以下のように出力されます: .Pp .Dl DSC.NEW DSC.OLD .Pp このとき、入力行は変化しません。 .Pp エスケープ文字と、end-of-file 文字を用いる同様の機構は、 ユーザ名を補完する場合にも用いることができます。この場合、``~'' で 名前を開始します。たとえば、次のように入力すると、 .Pp .Dl cd ~ro .Pp 以下のように補完されます。 .Pp .Dl cd ~root .Pp シェル変数 .Ar nobeep をセットすることにより、複数の候補があったり、補完に 失敗した場合に端末ベルを鳴らすのを禁止することができます。 .Pp 通常、そのディレクトリにあるすべてのファイル名が補完の候補となります。 ある特定の拡張子を持つファイルを補完の候補から外すのに、変数 .Ar fignore を用いる ことができます。以下のコマンドで、変数 .Ar fignore を設定すると、 .Pp .Dl % set fignore = (.o .out) .Pp 以下のように入力した場合に、 .Pp .Dl % vi x .Pp 次のように補完が行われます。 .Pp .Dl % vi xmpl.c .Pp つまり、"xmpl.o" と "xmpl.out" が無視されて補完が行われました。もし、 .Ar fignore で無視するように指定されたファイル名しか補完の対象になり得なかった場合、 .Ar fignore の設定は無視されます。また、 .Ar fignore は end-of-file 文字によるファイル名の一覧には影響を与えません。 一覧ではすべてのファイル名が出力されます。 .Ss 置換 ここからは、シェルが入力に対して行うさまざまな置換を、 処理が行われる順に記述します。 .Ss ヒストリ置換 ヒストリ置換は、以前に入力されたコマンド中の単語を、 新たなコマンドの一部として置き換えることで、 コマンドの繰り返し実行を容易にしたり、直前のコマンドの引数を次のコマンドで 再び使用したり、直前に入力した行の綴り間違いを修正する際に、 タイプ入力の手間を減らし、自信をもって修正できるようにするための機能です。 ヒストリ置換は文字 `!' により始まり、入力ストリームの .Ar どの位置にでも 置くことができます(ただし、入れ子にすることは .Nm できません )。`\e' を `!' の前に置くことにより、`!' の特殊な意味を打ち消すことが できます。また、利便のために、`!' の直後に空白、タブ、改行文字、 -`='、`(' が続いた場合、ヒストリ置換は行われず、入力された文字がそのまま +`=', `(' が続いた場合、ヒストリ置換は行われず、入力された文字がそのまま 用いられます(ヒストリ置換は、入力行が `\*(ua' で始まっている場合にも 起こります。これについては後述します)。入力行にヒストリ置換が含まれている 場合は、実行直前にヒストリ置換を行った結果が端末に出力されます。 .Pp -端末から入力された、1つあるいはそれ以上の単語からなるコマンドは +端末から入力された、1 つあるいはそれ以上の単語からなるコマンドは ヒストリ・リストに記録されます。ヒストリ置換は、この記録された 単語の列を入力ストリームに挿入することにより行われます。 ヒストリ・リストの大きさは、変数 .Ar history により制御されます。直前のコマンドは .Ar history の値に関わらず必ず 保存されます。記録されているコマンドは 1 から順にイベント番号が 割り当てられます。 .Pp .Ar history コマンドにより、以下の出力が得られたとします: .Bd -literal -offset indent \09 write michael 10 ex write.c 11 cat oldwrite.c 12 diff *write.c .Ed .Pp コマンドはイベント番号とともに出力されています。必ずしもイベント番号を 用いる必要はありませんが、プロンプト文字列に `!' を埋めることにより、 現在のイベント番号を .Ar プロンプト 中に表示させることができます。 .Pp 現在のイベント番号が 13 だとすると、以前のイベントを指定するには、 イベント番号を用いて `!11' としたり、 相対指定を用いて `!\-2' としたり(同じイベントを表します)する方法があります。 また、コマンドの単語の先頭部分を用いて指定することもできます。例えば、`!d' でイベント番号 12 を指定したり、 `!wri' でイベント番号 9 を指定できます。また、 ある文字列を含むコマンドを指定するのに `!?mic?' (これはイベント番号 9 の コマンドを示します)のような記法も使えます。これらの記法は、指定された イベントの各単語を単一の空白で区切った単語列に置換します。特殊な 場合として、`!!' は直前のコマンドを参照します。すなわち、`!!' だけを 入力することは直前のコマンドの .Ar 再実行 を意味します。 .Pp あるイベント中のいくつかの単語だけを指定するために、イベント指定に続けて `:' と単語指示子を書くことができます。イベントの単語は 0 から順に番号が -振られています。最初の単語(通常はコマンドです)が 0 で、2番目の単語 +振られています。最初の単語(通常はコマンドです)が 0 で、2 番目の単語 (第1引数)が 1 ということになります。基本的な単語指示子は以下のとおりです: .Pp .Bl -tag -width Ds -compact -offset indent .It \&0 最初の(コマンド)単語 .It Ar n .Ar n 番目の単語 .It \*(ua 最初の引数(すなわち 1 と同じ) .It $ 最後の引数 .It % 直前の .No \&? Ns Ar s Ns \&? 検索でマッチした単語 .It Ar \&x\-y .Ar x 番目から .Ar y 番目までの単語 .It Ar \&\-y .Ar `\&0\-y\' の省略形 .It * `\*(ua\-$' の省略形。イベントが1語のみからなる場合は空になる .It Ar x* .Ar `x\-$\' の省略形 .It Ar x\- .Ar `x*\' から最後の単語を除いたもの。 .El .Pp -イベント指定と単語指示子とを区切る `:' は、引数選択子が `\*(ua'、`$'、`*'、 -`\-'、`%' で始まっている場合には省略することができます。 +イベント指定と単語指示子とを区切る `:' は、引数選択子が `\*(ua', `$', `*', +`\-', `%' で始まっている場合には省略することができます。 単語指示子の直後に、 `:' に続けて 修飾子を複数個置くことができます。以下の修飾子が定義されています: .Pp .Bl -tag -width Ds -compact -offset indent .It h パス名の最後の要素を削除します(head) .It r 最後の `.xxx' 要素を削除します(root) .It e `.xxx' 以外の部分を削除します(extension) .It s Ns Ar /l/r/ Substitute .Ar l を .Ar r で置換します(substitution) .It t 最後の要素を残して、それより前のパス名の要素全てを削除します。 .It \&& 直前の修飾子の作用を繰り返します。 .It g -上記の修飾子の直前に置き、変更を、各単語に1回だけ及ぼすことを指定します。 +上記の修飾子の直前に置き、変更を、各単語に 1 回だけ及ぼすことを指定します。 例) `g&' .It a -上記の修飾子の直前に置き、一つの単語に対して可能な限り繰り返して +上記の修飾子の直前に置き、1 つの単語に対して可能な限り繰り返して 変更を行います。変更が全単語に及ぶようにするには `g' と組み合わせて使います。 .It p 置換結果を表示しますが、実行はしません(print only) .It q さらに置換が行われないように、置換結果をクォートします(quote) .It x q と同様ですが、空白、タブ、改行によって単語を分割します .El .Pp `g' が指定されなかった場合、適用可能な最初の単語のみが修飾子の影響を受けます。 置換については、適用可能な単語がなかった場合にはエラーとなります。 .Pp 置換(s/l/r/) における左辺 ( .Ar l ) は、エディタなどで使うような正規表現ではなく単なる文字列です。`/' のかわりに自由な文字を区切りに指定することができます。`\e' によって、 .Ar l または .Ar r 中の区切り文字をクォートすることができます。右辺 ( .Ar r ) 中の文字 `&' は 左辺の文字列に置換されます。`&' もまた `\e' によって クォートすることができます。 空の左辺値 .Ar l (`//') の場合、直前の左辺値 .Ar l または、 .No \&`!? Ns Ar s Ns ?' 中のコンテキストスキャン文字列 .Ar s から左辺値が取られます。置換指定の直後に改行がくる場合には、 最後の区切り文字を省略することができます。 コンテキストスキャンの後ろ側の文字 `?' も、直後に改行がくる場合、 同様に省略できます。 .Pp ヒストリは、 `!$' のようにイベント指定なしで参照することができます。 同じ行においてそれ以前にヒストリ参照が行われた場合はそのイベントを、 さもなければ直前のコマンドが参照されます。`!?foo?\*(ua !$' は `?foo?' に マッチするイベントの最初と最後の単語に置換されます。 .Pp 入力行の最初の非空白文字が `\*(ua' の場合、特殊なヒストリ参照の省略形であると みなします。これは `!:s\*(ua' と等価で、直前に入力したコマンド行の 文字列置換を行うことができます。たとえば、`\*(ualb\*(ualib' は 直前のコマンドの `lib' の綴り間違いを修正します。 最後に、後ろに続く文字とヒストリ置換とを隔離するために、 ヒストリ置換を `{' と `}' によって囲むことができます。`ls -ld ~paul' なる コマンドを実行した直後に`!{l}a' と 入力することで、`ls -ld ~paula' に展開されます。一方、`{}' を 使わずに `!la' とした場合は `la' で始まるイベントを検索します。 .Pp .Ss \' と \&" によるクォート 文字列を `\'' または `"' によって クォートすることにより、残りの置換のすべてあるいは一部を 抑制することができます。`'' によってクォートされた文字列には 本マニュアルのこれ以降に説明する置換が適用されません。`"' によって クォートされた文字列は、後述するように一部の置換が適用されます。 .Pp どちらのクォートの結果も単一の単語 (の全体または一部) となります。 ただし、`"' クォートされたコマンド置換は複数の単語になる特殊な場合が -一つだけあります(後述の +1 つだけあります(後述の .Em コマンド置換 の項を参照)。 `\'' クォートの場合は、このようなことはありません。 .Ss エイリアス置換 シェルはエイリアス(別名定義)を管理しており、 .Ar alias コマンドと .Ar unalias コマンドに より設定、表示、修正等を行うことができます。コマンド行がスキャンされたあと、 個々のコマンドに解析され、各コマンドの最初の単語に対応するエイリアスが あるかどうかチェックします。もし存在すれば、入力されたコマンド行の内容を 直前のコマンドとみなして、エイリアスの内容をヒストリ展開します。 コマンド行全体は展開結果と置き換えられます。エイリアスの内容が ヒストリ参照を含まなかった場合、入力したコマンド行の引数は変更せずに 残されます。 .Pp `ls' に対するエイリアスが `ls -l' だった場合、`ls /usr' は `ls -l /usr' に展開されます。この場合、エイリアスにはヒストリ参照がなかったため、 引数の `/usr' は変更せずに残されました。`lookup' に対するエイリアスが `grep !\*(ua /etc/passwd' だった場合、`lookup bill' は `grep bill /etc/passwd' に展開されます。 .Pp エイリアスが展開された場合、展開結果に対して単語分割とエイリアス検索が 再度行われます。展開結果の最初の単語が展開前の最初の単語と同一になった場合、 再度エイリアス検索が行われることはありません。それ以外の、エイリアスによる ループは検出され、エラー扱いとなります。 .Pp このメカニズムによってエイリアスでパーサのメタ記法を利用できます。 よって `alias print \'pr \e!* \&| lpr\'' とエイリアスすることで .Ar pr の 引数をプリンタに出力させるというようなことができます。 .Ss 変数置換 シェルは変数を管理しており、それらは 0 個またはそれ以上の単語のリストを 値として持ちます。変数のうちいくつかはシェルがセットしたり参照したりします。 たとえば、変数 .Ar argv はシェルへの引数を保持しており、この変数の値である単語は、特殊な方法で 参照されます。 .\" #### jpman kuma 96.12.05 here checked ... TO BE CONTINUED .Pp 変数の値は .Ar set および .Ar unset コマンドにより参照、変更することができます。シェルが 参照する変数のうちいくつかは、それがセットされているかどうかだけが重要 であり、値が何であっても意味を持たないものがあります。たとえば、変数 .Ar verbose は入力行がエコーされるかどうかを制御する変数であり、この変数を セットすることは、 .Nm csh に .Fl v オプションを指定したのと同じ意味になります。 .Pp 変数を数値として扱う操作もあります。`@' コマンドによって変数に対して数値演算 を適用し、演算結果を変数に代入することができます。しかしながら、変数の 値はつねに文字列として表現されます。数値演算の場合、空文字列は 0 と みなし、変数の値が複数の単語からなる場合 2 番目以降の単語は無視されます。 .Pp 入力行にエイリアス置換を行い、構文解析を行ったあと、コマンドが実行される 前に文字 `$' をキーとして変数置換を行います。`$' の直前に `\e' を置くことにより、変数置換を抑制することができます。 ただし、`"' クォート中では変数置換は .Em 必ず 行われますが、`\'' クォート中では .Em 決して行われません。 `\*(ga' クォートのなかはさらにあとで解釈されるため(後述の .Nm コマンド置換 の項を参照)、ここでは変数置換は行いません。`$' の直後に空白、タブ、 改行がくる場合、`$' はそのまま残されます。 .Pp 入出力リダイレクトは変数置換より前に解釈され、別々に変数置換が行われます。 それ以外のコマンド名と引数は同時に展開されます。このため、最初の 単語(コマンド)が展開の結果、複数の単語となったり、展開された結果の 最初の単語がコマンド名、それ以外が引数の一部になることもあります。 .Pp `"' でクォートされておらず、変数置換に `:q' 修飾子も指定されなかった 場合には、変数置換の結果にコマンドとファイル名置換が 行われます。`"' クォート内では複数の単語からなる値を持つ変数は、各単語を 1つの空白で区切った単一の単語 (の一部) に展開されます。`:q' 修飾子が 指定された場合は、各単語は 1 つの空白で区切られ、 この後のコマンドとファイル名置換を抑止するために、個々にクォートされた 単語の列に展開されます。 .Pp 変数置換には以下の形式があります。特に記述していない場合、 セットされていない変数の参照はエラーになります。 .Pp .Bl -tag -width Ds -compact -offset indent .It $name .It ${name} .\" #### modified by kuma 96.12.21 #### 変数 .Ar name -の値の各単語を一つの空白文字で区切ったものに展開されます。中括弧は +の値の各単語を 1 つの空白文字で区切ったものに展開されます。中括弧は .Ar 変数名 と後続する文字を分離し、後続する文字が変数名の一部と解釈されないように するために用いられます。シェル変数は 20 文字までの名前を持ちます。 変数名の先頭はアルファベットで、それ以降はアルファベット、数字、 アンダースコアを使用することができます。 .Ar name という名前のシェル変数は存在しないが、同名のセットされた環境変数が 存在する場合には、その値に置換されます(ただし、環境変数に対しては .Nm : 修飾子と以降に説明する書式を 用いることはできません)。 .It $name Ns Op selector .It ${name Ns [ selector ] } 変数 .Ar name の値のうちいくつかの単語を選択して展開します。 .Ar selector は 1 つの数字、範囲を示す2つの数字を `\-' でつないだもの、あるいはそのような 結果になる変数置換のいずれかです。単語は 1 から順序づけられています。 範囲の最初の数字が省略された場合は 1 が用いられます。範囲の第2の数字が 省略された場合は `$#name' が用いられます。selector として `*' が用いられた 場合には、すべての単語に展開されます。範囲の第2の数字が省略されるか、 単語数より小さい場合には、範囲が空になってもエラーとはなりません。 .It $#name .It ${#name} 変数の値の単語数に展開されます。 この機能は後述する `$argv[selector]' で有用です。 .It $0 コマンドを読み込んでいるファイル名に展開されます。ファイル名が不明の場合は エラーとなります。 .It $number .It ${number} `$argv[number]' と等価です。 .It $* `$argv[*]' と等価です。 -修飾子 `:e'、`:h'、`:t'、`:r'、`:q'、`:x' や -`:gh'、`:gt'、`:gr' を適用することができます。中括弧`{' `}' で +.El +.Pp +修飾子 `:e', `:h', `:t', `:r', `:q', `:x' や +`:gh', `:gt', `:gr' を適用することができます。中括弧 `{' `}' で 囲まれている場合は、中括弧内に修飾子が存在しなければなりません。 現在の csh の実装では、各 `$' 展開につき1つの修飾子のみ指定することができます。 -.El .Pp 以下の置換を行なう場合は `:' 修飾子を指定することはできません。 .Bl -tag -width Ds -compact -offset indent .It $?name .It ${?name} 変数 name がセットされていれば `1' に、さもなければ `0' に展開されます。 .It $?0 現在の入力ファイル名がわかっていれば `1' に、不明ならば `0' に展開されます。 .It \&$\&$\& 親のシェルの (10進の) プロセス番号に展開されます。 .It $! そのシェルから起動された最後のバックグラウンド・プロセスの (10進の) プロセス番号に展開されます。 .It $< 標準入力から1行を読み込み、その内容に展開されます。読み込んだ内容の解釈は 行いません。スクリプト中でキーボードからの入力を受けるのに用いられます。 .El .Ss コマンドとファイル名置換 残りの置換であるコマンド置換とファイル名置換は、 組み込みコマンドの引数に対しては 適用されたり、されなかったりします。 .\" #### changed by kuma 96.12.21 #### すなわち、式の中で評価が行われない部分に関しては 以下の置換が行なわれません。組み込みコマンドではないコマンドにおいては、 コマンド名は引数とは別に置換が行なわれます。 .\" #### changed by kuma 96.12.21 #### コマンド名に対する置換が生じるのは一連の置換処理の最後の方で、 入出力リダイレクトの設定後、メインシェルの子供の中で行われます。 .Ss コマンド置換 コマンド置換は、コマンドを `\*(ga' で囲むことによって指示します。 コマンドからの 出力は空白、タブ、改行によって単語に分割され、空の単語を削除したあとに 元の文字列と置換されます。 `"' の内部では、改行のみが単語分割の区切りとして扱われ、空白とタブは そのまま残されます。 .Pp どちらの場合も、コマンドの出力の最後の改行は単語の区切りとはならず、単に 削除されます。 -よってコマンド置換によって、コマンドの出力が完全な一行であっても、 +よってコマンド置換によって、コマンドの出力が完全な 1 行であっても、 単語の一部分のみを生成することが可能です。 .Ss ファイル名置換 -単語が文字 `*'、 `?'、 `['、 `{' を含んでいるか、単語の先頭文字が `~' の +単語が文字 `*', `?', `[', `{' を含んでいるか、単語の先頭文字が `~' の .\" #### modified by kuma 96.12.21 #### 場合、その単語はファイル名展開(あるいはグロブ(glob)と呼ばれます)の 候補となります。 .\" #### modified by kuma 96.12.21 #### 候補となった単語はパターンとみなされ、パターンにマッチするファイル名が アルファベット順にソートされた列に置換されます。 ファイル名置換を含む単語の列がどれもファイル名にマッチしなかった場合には エラーとなりますが、 すべての単語パターンがマッチする必要はありません。 -メタキャラクタ`*'、 `?'、`[' +メタキャラクタ`*', `?', `[' のみがパターンマッチ文字であり、`~' と `{' は省略形といったほうが近いで しょう。 .Pp ファイル名マッチにおいて、ファイル名先頭、または `/' の直後の `.' は、 `/' と同様に明示的にマッチさせなければなりません(`*' や `?' は これらにマッチしません)。 `*' は、空文字列を含むどのような文字列にもマッチします。`?' は、 どのような1文字にもマッチします。 .Sq Op ... は、括弧のなかで指定した文字のいずれかにマッチします。 .Sq Op ... 内では、文字の対を `\-' でつなぐことで、 文字の範囲を指定することができます(両側の文字も含まれます)。 .Pp ファイル名の先頭の `~' はホーム・ディレクトリを示すのに用いられます。 単独で用いられた場合には、シェルを起動したユーザのホーム・ディレクトリ .\" #### modified by kuma 96.12.21 #### (変数 .Ar home の値に反映されているとおり)に展開されます。`~' に続けてアルファベット、 数字、`-' からなる単語が続いた場合は、その単語をユーザ名とみなして、 そのユーザのホーム・ディレクトリに展開されます。たとえば、ユーザ ken の ホーム・ディレクトリが `/usr/ken' ならば、`~ken' は `/usr/ken' に、 `~ken/chmach' は `/usr/ken/chmach' に展開されます。 直後にアルファベットと `/' 以外が続く`~'と、ファイル名の先頭にない `~' は 変更されずにそのまま残されます。 .Pp メタ記法 `a{b,c,d}e' は `abe ace ade' の短縮形です。 .\" #### modified by kuma 96.12.21 #### この記法の左から右への出現順序は保存されます。 展開結果は下位のレベルで個別にソートされ、出現順序は保存されます。 この記法は入れ子にすることができます。 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' の 展開結果がいっしょに ソートされたりしていないことに注意してください)。特殊な場合として、 -単独の`{' と `}'、`{}' は変更されずにそのまま残されます。 +単独の`{' と `}', `{}' は変更されずにそのまま残されます。 .Ss 入出力 コマンドの標準入出力は、以下の方法によりリダイレクトすることができます: .Pp .Bl -tag -width Ds -compact -offset indent .It < name ファイル .Ar name (変数、コマンド、ファイル名展開を受けます)をオープンし、 コマンドの標準入力とします。 .It << word .Ar word と同一の行が出現するまで、シェルの入力を読み込みます。 .Ar word は変数、ファイル名、コマンド置換を受けません。シェル入力の行は 読み込まれるとすぐに .Ar word と比較されます(置換を行う前に)。その後、 .Ar word に -`\e'、`"'、`\''、`\*(ga' クォートが出現しないなら、読み込まれた行には +`\e', `"', `\'', `\*(ga' クォートが出現しないなら、読み込まれた行には 変数置換と .\" #### ^^^^^^^ `\'' だと思う(1次チェック者のコメント?jpman kuma 961205) .\" #### kuma agree with you, changed as specified 96.12.22 コマンド置換が適用されます。この置換を抑制するために、`\e' によって -`$'、`\e'、`\*(ga' をクォートすることができます。コマンド置換において、 +`$', `\e', `\*(ga' をクォートすることができます。コマンド置換において、 すべての空白、タブ、改行は保存されますが、最後の改行は削除されます。 読み込んだ行はすべて中間的なファイルに保存され、コマンドの標準入力として 用いられます。 .It > name .It >! name .It >& name .It >&! name ファイル .Ar name を標準出力として用います。ファイルが存在しなければ作成され、 すでにファイルが存在すればその内容は切り捨てられ、以前の内容は失われます。 .Pp 変数 .Ar noclobber がセットされている場合、ファイルが存在しないか文字型特殊ファイル (端末や `/dev/null' のような) でなければエラーになります。これは、 すでに存在するファイルを思いがけず削除してしまうことを防止します。`!' を 用いた形式を使うと、この検査を抑制することができます。 .Pp `&' を用いた形式では、標準出力とともに標準エラー出力もファイルへ リダイレクトされます。 .Ar name .\" #### modified by kuma 96.12.21 #### は、 `<' の入力ファイル名の場合と同様の展開を受けます。 .It >> name .It >>& name .It >>! name .It >>&! name `>' と同様に、ファイル .Ar name を標準出力として用います。ただし、コマンドの出力はファイルへ追加されます。 変数 .Ar noclobber がセットされている場合、 ファイルが存在しなければエラーとなります(`!' を用いることで、 この検査を抑制することができます)。 他は `>' と同様です。 .El .Pp コマンドは、シェルが起動されたときの環境を、入出力リダイレクトと パイプラインによって変更したもののなかで実行されます。以前のいくつかの シェルとは異なり、 シェルコマンドファイルから起動されたコマンドは、デフォルトでは標準入力に よってシェルコマンドファイル自体にアクセスすることはできません。 かわりに、シェルが起動した環境の標準入力をそのまま受け継いでいます。 `<<' 機構はインラインデータのために用いるべきです。 このように制限することにより、 シェルコマンドスクリプトをパイプラインの一部として用いることができます。 バックグラウンドで実行されているコマンドの標準入力も .Pa /dev/null 等にリダイレクトされることは .Ar なく 、シェルの標準入力をそのまま受け継いでいます。もし標準入力が端末で、 コマンドが端末から読み込もうとした場合、そのプロセスはブロックされ、 シェルはユーザにそのことを通知します(参照: .Sx ジョブ の項)。 .Pp 標準エラー出力もパイプにリダイレクトすることができます。単純に `\&|' の かわりに `\&|&' を使います。 .Ss 式 .\" #### modified by kuma 96.12.21 #### いくつかの組み込みコマンド(後述します)は、引数として式を取ります。式は C 言語のものと類似しており、同じ優先順位を持ちます。式は -.Nm @、 -.Ar exit、 -.Ar if、 +.Nm @ , +.Ar exit , +.Ar if , .Ar while コマンド中で用います。以下の演算子が使用可能です: .Bd -ragged -offset indent \&|\&| && \&| \*(ua & == != =~ !~ <= >= < > << >> + \- * / % ! ~ ( ) .Ed .Pp 上記の演算子は右にいくほど優先順位が高くなっています。 -`==' `!=' `=~' `!~'、`<=' `>=' `<' `>'、`<<' `>>'、`+' `\-'、 +`==' `!=' `=~' `!~', `<=' `>=' `<' `>', `<<' `>>', `+' `\-', `*' `/' `%' の 5グループは各グループ内では同じ優先度です。 -`=='、`!='、`=~'、`!~' は文字列の比較を行い、他の演算子は数値演算を -行います。`=~'、`!~' は `!='、`==' と同様ですが、右辺を +`==', `!=', `=~', `!~' は文字列の比較を行い、他の演算子は数値演算を +行います。`=~', `!~' は `!=', `==' と同様ですが、右辺を .Ar パターン -(`*'、`?'、`[...]' を含んだ) とみなして、左辺とのパターンマッチが行われます。 +(`*', `?', `[...]' を含んだ) とみなして、左辺とのパターンマッチが行われます。 これにより、シェル スクリプトにおいてパターンマッチのみが必要な局面では .Ar switch ステートメントを使わずに済ませることができます。 .Pp 先頭が `0' の文字列は 8 進数の数値とみなされます。空または省略された引数 は `0' とみなされます。すべての演算結果は 10 進数数値の文字列となります。 式の 2 つの要素が同一の単語中に出現してはいけません。つまり、 .\" #### modified by kuma 96.12.21 #### 要素の前後が、構文解析において特殊な意味を持つ -`&'、`\&|'、`<'、`>'、`('、`)' でない場合は、 +`&', `\&|', `<', `>', `(', `)' でない場合は、 その要素は空白で囲まれていることが必要です。 .Pp 数式中では、`{' と `}' で囲んだコマンドと、 以下のファイル検査演算子を用いることができます。 ファイル検査演算子は .Fl l .Ar name の形式で、 .Ic l は以下のうちのいずれかです: .Bd -literal -offset indent r 読み込みアクセス w 書き込みアクセス x 実行アクセス e 存在 o 所有 z サイズがゼロ f 通常ファイル d ディレクトリ .Ed .Pp 指定された name は、コマンド、ファイル名置換を適用したのちに 実ユーザの権限において検査されます。ファイルが存在しないか、 アクセス不可なら演算結果は false すなわち `0' になります。 コマンド実行においては、コマンドが成功したなら演算結果は true `1' に、 コマンドが 0 以外の終了ステータスを返してきたら、すなわち、 失敗なら演算結果は false `0' になります。 終了ステータスの値自体を知りたい場合は、コマンドを式以外の文脈で実行し、変数 .Ar status の値を調べます。 .Ss 制御構造 シェルにはコマンドファイル(シェル・スクリプト)中で、 あるいは(制限されてはいるが、便利な方法で)端末から、 制御の流れを変更するためのいくつかのコマンドがあります。 これらのコマンドはシェルに入力を読み直させたり、 スキップさせたりすることができます。実装の制限上、 これらのコマンドを書くことのできる位置に制限があります。 .Pp -.Ic foreach、 -.Ic switch、 -.Ic while、 +.Ic foreach , +.Ic switch , +.Ic while , 文、および、 .Ic if\-then\-else の .Ic if ステートメントは、 後述するように入力行の単一の単純コマンドとして現れる必要があります。 .Pp シェルの入力がシーク不可能な場合、 シェルは繰り返しが必要なときには入力をバッファに保存し、 .\" #### modified by kuma 96.12.23 #### この内部バッファに対してシークを行います(このため、シーク不可能な入力の場合も、 後方への goto が可能です)。 .Ss 組み込みコマンド 組み込みコマンドは通常シェルのプロセス内部で実行されます。 ただし、組み込みコマンドがパイプラインの最後以外に用いられた場合は、 サブシェル上で実行されます。 .Pp .Bl -tag -width Ds -compact -offset indent .It Ic alias .It Ic alias Ar name .It Ic alias Ar name wordlist 1行目の形式はすべてのエイリアスを出力します。2 行目の形式は .Ar name に対応したエイリアスの値を出力します。最後の形式は .Ar wordlist を .Ar name のエイリアスとして登録します。 .Ar wordlist にはコマンド置換、ファイル名置換が適用されます。 .Ar name として .Ar alias または .Ar unalias を指定することはできません。 .Pp .It Ic alloc .Nm csh が獲得したメモリのうちの使用量と空き容量を表示します。 なんらかの引数をつけると、ブロックサイズごとの使用中/空ブロック数を表示します。 ブロックサイズは 8、16、32、.. となります。 本コマンドの出力はシステムによって異なります。 VAX 以外のシステムは、異なるメモリ管理を行っているかもしれないからです。 .Pp .It Ic bg .It Ic bg \&% Ns Ar job ... 現在のジョブあるいは指定されたジョブをバックグラウンドに移動します。 もしそれらのジョブが停止されていたなら、実行が再開されます。 .Pp .It Ic break 最も内側の .Ic foreach または .Ic while ループに対応する .Ic end の後へ脱出します。同じ行にある残りのコマンドは実行されます。複数の .Ic break を同一行に記述することで複数レベルの脱出が行えます。 .Pp .It Ic breaksw .Ic switch から脱出し、 .Ic endsw のあとで実行を再開します。 .Pp .It Ic case Ar label : .Ic switch ステートメントのラベルを指定します。 .Pp .It Ic cd .It Ic cd Ar name .It Ic chdir .It Ic chdir Ar name .\" #### modified by kuma 96.12.23 #### シェルの作業ディレクトリをディレクトリ .Ar name に変更します。引数が指定されなかった場合には、 ユーザのホーム・ディレクトリに変更します。 カレント・ディレクトリにディレクトリ .Ar name がない場合(かつ .Ar name -が `/'、`./'、`../' +が `/', `./', `../' で始まっていない場合)、変数 .Ic cdpath の各要素のサブディレクトリとして .Ar name がないかどうかを調べます。最後に、シェル変数 .Ar name に `/' で始まる値が設定されているなら、 その値のディレクトリが存在しないかを調べます。 .Pp .It Ic continue 最も内側の .Ic while または .Ic foreach ループの先頭に戻ります。戻る前に、同じ行に記述されたコマンドが実行されます。 .Pp .It Ic default : .Ic switch ステートメントのデフォルトを指定します。 .Ic default は、すべての .Ic case ラベルのあとに出現しなければなりません。 .Pp .It Ic dirs ディレクトリ・スタックを表示します。 スタックの先頭(カレント・ディレクトリ)を左端にして表示します。 .Pp .It Ic echo Ar wordlist .It Ic echo Fl n Ar wordlist 指定された単語を空白で区切った文字列をシェルの標準出力に書き出します。 .Fl n オプションが指定されなければ、最後に改行が出力されます。 .Pp .It Ic else .It Ic end .It Ic endif .It Ic endsw -.Ic foreach、 -.Ic if、 -.Ic switch、 +.Ic foreach , +.Ic if , +.Ic switch , .Ic while ステートメントの項を参照してください。 .Pp .It Ic eval Ar arg ... ( .Xr sh 1 と同様)引数をシェルへの入力であるとみなして読み込み、 現在のシェルのコンテキストで実行します。 コマンド置換や変数置換の結果として生成されたコマンド列を実行する場合に用いられます。 通常は、それらの置換に先立って文法解析が行われてしまうからです。 .Ic eval の使い方の例が .Xr tset 1 にあります。 .Pp .It Ic exec Ar command 指定された command を現在のシェルと置き換えて実行します。 .Pp .It Ic exit .It Ic exit Ar (expr ) 1行目の形式では変数 .Ic status の値、2 行目の形式では式 .Ic expr の値を返り値としてシェルを終了します。 .Pp .It Ic fg .It Ic fg % Ns Ar job ... 現在のジョブあるいは指定されたジョブをフォアグラウンドに移動します。 停止していたジョブは実行を再開します。 .Pp .It Ic foreach Ar name (wordlist) .It ... .It Ic end 変数 .Ic name に .Ic wordlist の各値を順次セットしながら対応する .Ic end までのコマンドを繰り返し実行します( .Ic foreach と .Ic end .\" #### modified by kuma 96.12.23 #### は単独で行に置かなければなりません)。組み込みコマンド .Ic continue を使って中途でループの次の繰り返しを実行させたり、 .Ic break コマンドによって中途でループを脱出させたりすることができます。 このコマンドが端末から読み込まれる場合、ループすべての内容が(プロンプト ? を表示しながら)読み込まれてから実行が開始されます。 端末からループ中でタイプ・ミスした場合は修正できます。 .Pp .It Ic glob Ar wordlist .Ic echo コマンドと似ていますが、`\e' によるエスケープは解釈されず、 .\" #### modified by kuma 96.12.23 #### 単語はヌル文字によって区切られます。プログラムから、 シェルをファイル名置換のために利用する場合に便利です。 .Pp .It Ic goto Ar word .Ic word にファイル名置換、およびコマンド置換が適用されたのち、それを `label' とみなします。シェルは可能なかぎり入力を遡って読み直し、`label:' のある行を検索し、そこから実行を開始します。 ラベルの前には空白またはタブを置くことが可能です。 .Pp .It Ic hashstat コマンドを検索するのに、 内部キャッシュがどの程度効率的に働いているか (そして .Ic exec をどの程度回避できているかを)を表示します。 .\" #### modified by kuma 96.12.23 #### .Em path の要素のうち、ハッシュ関数がヒットの可能性を示すものと、 `/' で始まらないものについて .Ic exec が試みられます。 .Pp .It Ic history .It Ic history Ar n .It Ic history Fl r Ar n .It Ic history Fl h Ar n ヒストリのリストを表示します。数字 .Ar n が指定された場合には、最近の .Ar n 個のイベントが表示されます。 .Fl r オプションは表示順序を逆にします。 .\" #### modified by kuma 96.12.23 #### すなわち、最も古いものを先に表示するのではなく、 最も新しいものを先に表示します。 .Fl h オプションを指定すればイベント番号が省略されます。これは .Ic source コマンドで \-h を使って読み込むためのファイルを生成する場合に用いることができます。 .Pp .It Ic if ( Ar expr ) No command .\" #### modified by kuma 96.12.23 #### 指定された式が true と評価されたなら、単一のコマンド .Ar command が実行されます。 .Ar command .\" #### modified by kuma 96.12.23 #### に対する変数置換は、実行に先だって .Ic if コマンドの残りの部分と同時に行なわれます。 .Ar command は単純コマンドのみが許され、パイプライン、コマンドリスト、括弧でくく られたコマンドであってはいけません。入出力リダイレクションは式 .Ar expr が false と評価され、それゆえ .Ar command が実行 .Sy されなかった 場合にも処理されます(これはバグです)。 .Pp .It Ic if ( Ar expr ) Ic then .It ... .It Ic else if ( Ar expr2 ) Ic then .It ... .It Ic else .It ... .It Ic endif 式 .Ar expr が true なら最初の .Ic else までのコマンドが実行されます。さもなければ、式 .Ar expr2 が true なら次の .Ic else までのコマンドが実行されます。 いくつでも .Ic else-if の対を繰り返すことができます。最後に 1 つの .Ic endif が必要です。 最後の .Ic else 部分はあってもなくてもかまいません。 (単語 .Ic else と .Ic endif は入力行の最初に置く必要があります。また、 .Ic if は行内に単独で、または .Ic else のあとに置く必要があります)。 .Pp .It Ic jobs .It Ic jobs Fl l アクティブなジョブの一覧を出力します。 .Fl l .\" #### modified by kuma 96.12.23 #### オプションを指定すると、通常の情報に加えてプロセス ID も出力します。 .Pp .It Ic kill % Ns Ar job .It Ic kill Ar pid .It Ic kill Fl sig Ar pid ... .It Ic kill Fl l TERM(terminate) シグナルあるいは指定したシグナルを、 指定されたジョブまたはプロセスに送ります。 シグナルは番号または名前で指定できます(名前は .Pa /usr/include/signal.h にある名前から `SIG' を取り除いたものです)。 シグナル名の一覧を ``kill \-l'' により表示できます。 kill にはデフォルト動作はなく、 単に `kill' を実行しても現在のジョブにシグナルが送られるようなことはありません。 送るシグナルが TERM(terminate) または HUP(hangup) の場合、 CONT(continue) シグナルも同時に送られます。 .Pp .It Ic limit .It Ic limit Ar resource .It Ic limit Ar resource maximum-use .It Ic limit Fl h .It Ic limit Fl h Ar resource .It Ic limit Fl h Ar resource maximum-use 現在のプロセスと、それが生成するプロセスのそれぞれについて、 .\" #### modified by kuma 96.12.23 #### -指定された資源 +指定されたリソース .Ar resource を、指定された .Ar maximum-use を超えて使用しないように設定します。 .Ar maximum-use が指定されなかった場合、現在の制限値が表示されます。 .Ar resource が指定されなかった場合、すべての制限値が表示されます。 .Fl h オプションが指定された場合、 現在の制限値のかわりにハードリミットの表示/設定を行います。 .\" #### modified by kuma 96.12.23 #### ハードリミットは現在の制限値の上限の値です。 スーパーユーザのみがハードリミットを増加させることができます。 一般ユーザは現在の制限値を可能な範囲で増減することができます。 .Pp .\" #### modified by kuma 96.12.23 #### -現在のところ、制御可能な資源は、 +現在のところ、制御可能なリソースは、 .Ar cputime (各プロセスが使うことのできる最大の CPU 秒数)、 .Ar filesize (1つのファイルの最大サイズ)、 .Ar datasize ( .Xr sbrk 2 .\" #### modified by kuma 96.12.23 #### を用いてプログラムのテキスト領域の末尾を超えて増加させることのできる data+stack 領域の最大サイズ)、 .Ar stacksize .\" #### modified by kuma 96.12.23 #### (自動的に拡張されるスタックの最大サイズ)、 .Ar coredumpsize (最大のコアファイルのサイズ)です。 .Pp 最大値 .Ar maximum-use は、(整数あるいは浮動小数の) 数値とそれに続くスケールファクタによって指定します。 .Ar cputime 以外の制限値のデフォルトのスケールファクタは `k' あるいは `kilobytes'(1024 バイト)です。 .\" #### modified by kuma 96.12.23 #### スケールファクタとして `m' あるいは `megabytes' を使用することもできます。 .Ar cputime のデフォルトのスケールファクタは `seconds'(秒)です。 `m'(分)、`h'(時間) をスケールファクタとして指定したり、 `mm:ss' 形式で分秒を指定したりすることができます。 .Pp .\" #### modified by kuma 96.12.23 #### -資源名 +リソース名 .Ar resource とスケールファクタを指定する際には、 .\" #### modified by kuma 96.12.23 #### 一意に決定できるなら、名前の先頭部分だけを指定することができます .\" #### jpman kuma: not found in freebsd-2.1.5-RELEASE manpage (st を stacksize のかわりに用いる等)。 .Pp .It Ic login ログイン・シェルを終了し、 .Pa /usr/bin/login と置き換えます。これは .Xr sh 1 との互換性のために用意されたログオフの手段です。 .Pp .It Ic logout ログイン・シェルを終了します。 .Ic ignoreeof がセットされている場合に便利です。 .Pp .It Ic nice .It Ic nice Ar +number .It Ic nice Ar command .It Ic nice Ar +number command 1 行目の形式は、シェルのスケジューリング・プライオリティを 4 に設定します。 2 行目の形式は、プライオリティを指定された値 .Ar number に設定します。残りの 2 つの形式は、コマンド command をプライオリティ 4 または指定した .Ar number で実行します。 .\" #### modified by kuma 96.12.23 #### 大きい数値を指定するとプロセスが利用できる CPU がその分少なくなります。 スーパーユーザのみがプライオリティとして負の値を `nice \-number ...' のように指定することができます。 .Ar command はつねにサブシェルで実行され、 単純な .Ic if .\" #### modified by kuma 96.12.23 #### 文のコマンドと同様の制限を受けます。 .Pp .It Ic nohup .It Ic nohup Ar command 1 行目の形式は、シェル・スクリプト内で使用し、 スクリプトのそれ以降で hangup シグナルを無視するように設定します。 2 行目の形式は、指定されたコマンドが、 hangup シグナルを無視するように設定して実行します。 `&' をつけて実行されたプログラムは、 .Ic nohup を指定して実行したのと同様に hangup シグナルを無視します。 .Pp .It Ic notify .It Ic notify % Ns Ar job ... 現在のジョブまたは指定されたジョブの状態が変化したときに、 .\" #### modified by kuma 96.12.23 #### コマンド待ちかどうかに関わりなく即座に通知するように指定します。 通常は、プロンプトが表示される直前に通知が行われます。 シェル変数 .Ic notify が指定されている場合は、すべてのジョブに対して同様の設定が行われます。 .Pp .It Ic onintr .It Ic onintr Fl .It Ic onintr Ar label 割り込みに対するシェルの動作を制御します。1行目の形式は、 シェルをデフォルトの動作、すなわち、スクリプトの実行が中断される、 またはコマンド入力状態に戻るように設定します。 2 行目の形式は、すべての割り込みを無視するように設定します。 3行目の形式は、シェルが割り込みを受けるか、 チャイルドプロセスが割り込みによって停止した場合に goto label が実行されるように設定します。 .Pp シェルがバックグラウンドで、かつ、 シグナルを無視するように設定して実行されている場合は、 .Ic onintr は効力を持たず、 割り込みはシェルとそこから起動されるすべてのコマンドで 引続き無視されます。 最後に .Ic onintr 文はシステムのスタートアップ・ファイル -(/etc/csh.cshrc、/etc/csh.login) 中でも、 +(/etc/csh.cshrc, /etc/csh.login) 中でも、 割り込みが禁止されているので無視されます。 .Pp .It Ic popd .It Ic popd Ar +n ディレクトリ・スタックをポップし、 新たにスタックの先頭になったディレクトリにカレント・ディレクトリを変更します。 引数 .Ns \`+ Ar n Ns \' が指定された場合、スタックの .Ar n 番目の要素が捨てられます。ディレクトリ・スタックの要素は、 スタックの先頭から 0 から順に番号がつけられます。 .Pp .It Ic pushd .It Ic pushd Ar name .It Ic pushd Ar n 引数を指定しなかった場合、 .Ic pushd はスタックの先頭の 2 つの要素を入れ替えます。引数 .Ar name が指定された場合、 .Ic cd と同様にカレント・ディレクトリを変更したあと、 古いカレント・ディレクトリ .\" cwd の typo だと思うが わからない .\" (as in .\" .Ic csw ) .\" #### kuma agree with you on 96.12.23 #### をディレクトリ・スタックにプッシュします。 数字引数が指定された場合、ディレクトリ・スタックの .Ar n 番目の要素が スタックの先頭にくるようにローテートし、 カレント・ディレクトリをその要素が指すディレクトリに変更します。 ディレクトリ・スタックの要素は、スタックの先頭から 0 から順に番号がつけられます。 .Pp .It Ic rehash 変数 .Ic path に指定されているディレクトリ内の、ファイルに関するハッシュ・テーブルを 再計算させます。ログイン中に、新しいコマンドが .Ic path に含まれるディレクトリに追加された場合、 .\" #### modified by kuma 96.12.23 #### rehash コマンドを実行する必要があります。 -これは、あなたが個人的なディレクトリの一つにコマンドを追加したか、 +これは、あなたが個人的なディレクトリの 1 つにコマンドを追加したか、 システムの管理者がシステム・ディレクトリの内容を変更したような 場合にのみ必要です。 .Pp .It Ic repeat Ar count command 指定されたコマンド .Ar command を .Ar count 回繰り返し実行します。 .Ar command .\" #### modified by kuma 96.12.23 #### -に指定するものは、先の一行 +に指定するものは、先の 1 行 .Ic if 文で指定する .Ar command と同様の制限を受けます。 入出力リダイレクションは .Ar count が たとえ 0 であっても、必ず 1回だけ処理されます。 .Pp .It Ic set .It Ic set Ar name .It Ic set Ar name Ns =word .It Ic set Ar name[index] Ns =word .It Ic set Ar name Ns =(wordlist) 1 行目の形式はすべてのシェル変数の値を表示します。 複数の単語からなる値を持つ変数は括弧で囲まれた値のリストで表示します。 2 行目の形式は、 .Ar name に空文字列を設定します。3 行目の形式は .Ar name に単一の単語 .\" #### modified by kuma 96.12.23 .Ar word を設定します。4 行目の形式は .Ar name の .Ar index 番目の要素に .Ar word を設定します。 .Ar index 番目の要素はすでに存在していなければなりません。5 行目の形式は .Ar name に .Ar wordlist で指定した単語列を設定します。すべての形式で、 値にはコマンド置換とファイル名置換が適用されます。 .Pp 複数の変数を設定するために、set コマンドへの引数を繰り返すことができます。 ただし、引数に対する変数展開処理は、代入処理に先だって行われます。 .Pp .It Ic setenv .It Ic setenv Ar name .It Ic setenv Ar name value 1 行目の形式はすべての環境変数の一覧を出力します。 これは .Xr printenv 1 と等価です。 3 行目の形式は環境変数 .Ar name に値 .Ar value を設定します。2 行目の形式は環境変数 .Ar name .\" #### modified by kuma 96.12.23 #### に空文字列を設定します。最も一般的に用いられる環境変数である .Ev USER , .Ev TERM , .Ev PATH は .Nm csh の起動時にシェル変数 .Ar user , .Ar term , .Ar path にそれぞれ設定され、 .Nm csh から実行するプログラムの環境変数には、シェル変数 .Ic user , .Ic term , .Ic path の値が反映されます。そのため、これらの変数を明示的に .Ic setenv する必要はありません。 .Pp .It Ic shift .It Ic shift Ar variable (リスト)変数 .Ic argv .\" #### modified by kuma 96.12.23 #### の各要素を左にシフトし、 .Ic argv Ns Bq 1 の値を捨てます。 .Ic argv に値が設定されていないか、 1 つ以上の要素を持たない場合にはエラーになります。 2 行目の形式は、指定された変数 .Ar variable に対して同様の処理を行います。 .Pp .It Ic source Ar name .It Ic source Fl h Ar name シェルは、指定されたファイル .Ar name からコマンドを読み込みます。 .Ic source コマンドはネストすることができます。あまりに深くネストさせると、 .\" #### modified by kuma 96.12.23 #### ファイル識別子を使い切ってしまう場合があります。いずれかのレベルの .Ic source コマンド中でエラーが発生すると、ネストしているすべての .Ic source コマンドが中断されます。通常、 .Ic source の実行中に実行されたコマンドはヒストリに記録されませんが、 \-h オプションを指定することにより、 ファイルに記述してあるコマンドを実行せずに、 ヒストリにのみ記録することができます。 .Pp .It Ic stop .It Ic stop % Ns Ar job ... バックグラウンドで走行中の現在のジョブ、あるいは指定されたジョブを停止します。 .Pp .It Ic suspend シェル自身を停止させます。 .Ic ^Z でストップ・シグナルを送られたかのように振舞います。 .Xr su 1 によって起動したシェルを停止する場合によく用いられます。 .Pp .It Ic switch Ar (string) .It Ic case Ar str1 : .It \ \ \ \ \&... .It Ic \ \ \ \ breaksw .It \ \ \ \ \&... .It Ic default : .It \ \ \ \ \&... .It Ic \ \ \ \ breaksw .It Ic endsw .\" #### modified by kuma 96.12.23 #### 各 .Ic case ラベルを順に、指定された文字列 .Ar string でマッチングを行います。 .Ar string には、まず、コマンド置換とファイル名置換が行われます。 .Ic case ラベルには変数置換が行われ、ファイル名メタキャラクタの -`*'、`?'、`[...]' を用いることができます。 +`*', `?', `[...]' を用いることができます。 .\" #### modified by kuma 96.12.23 #### .Ic default ラベルが出てくるまでにどの .Ic case ラベルともマッチしなかった場合は、 .Ic default ラベルの直後から実行が始まります。 .Ic case ラベルと .Ic default ラベルは行の最初に書かれなければなりません。 .Ic breaksw コマンドによって .Ic endsw 以降のコマンドから実行が再開されます。 .Ic breaksw を用いない場合は、 C 言語の場合と同様に、 .Ic case ラベル、 .Ic default ラベルを通過して実行が続けられます。 .Ic default がなく、どのラベルもマッチしなかった場合には、 .Ic endsw 以降から実行が再開されます。 .Pp .It Ic time .It Ic time Ar command 1 行目の形式では、 シェルとそのチャイルドプロセスが使用した時間が表示されます。 .\" #### modified by kuma 96.12.23 #### 2 行目の形式では、指定された単純コマンドの実行時間が計測され、 .\" #### modified by kuma 96.12.23 #### 変数 .Ic time の項で説明する形式で、使用時間情報の要約が表示されます。 必要ならば、コマンド終了時に時間を表示するための追加のシェルが生成されます。 .Pp .It Ic umask .It Ic umask Ar value ファイル作成マスクを表示(第 1 の形式)または設定(第 2 の形式)します。 マスクは 8 進数で与えます。一般的な値としては、 グループにすべての権限を与え、 そのほかには読み込みと実行のみを許可する 002 や、 所有者以外には読み込みと実行しか許可しない 022 があります。 .Pp .It Ic unalias Ar pattern .Ar pattern にマッチするすべてのエイリアスを削除します。 `unalias *' とすることですべてのエイリアスを削除することができます。 削除するものがなかった場合にもエラーにはなりません。 .Pp .It Ic unhash 実行プログラムの位置検索を高速化する内部ハッシュ・テーブルの使用を禁止します。 .Pp .It Ic unlimit .It Ic unlimit Ar resource .It Ic unlimit Fl h .It Ic unlimit Fl h Ar resource -資源の制限を解除します。 +リソースの制限を解除します。 .Ar resource -が指定されない場合、すべての資源に対する制限が解除されます。 +が指定されない場合、すべてのリソースに対する制限が解除されます。 .Fl h が指定された場合、対応するハードリミットが解除されます。 これはスーパーユーザのみが行うことができます。 .Pp .It Ic unset Ar pattern 指定された .Ar pattern にマッチするすべての変数を削除します。 `unset *' と指定するとすべての変数が削除され、 悲惨な結果を生じることがあります。 .Ic unset するものがない場合もエラーになりません。 .Pp .It Ic unsetenv Ar pattern 指定された .Ar pattern にマッチするすべての環境変数を削除します。前述の .Ic setenv の項と .Xr printenv 1 を参照してください。 .Pp .It Ic wait すべてのバックグラウンドジョブの終了を待ちます。 対話的にシェルが実行されている場合、 インタラプトにより wait を停止することができます。 このとき、シェルはいまだに終了していないジョブの名前とジョブ番号を表示します。 .It Ic which Ar command .\" #### modified by kuma 96.12.23 #### .Ar command を指定したとき、シェルが実行するコマンドの位置を表示します。 .Pp .It Ic while Ar (expr) .It \&... .It Ic end 指定された式の評価結果がゼロでないかぎり、 .Ic while と対応する .Ic end の間のコマンドを繰り返し実行します。 .Ic break や .Ic continue によりループを終了したり、途中から繰り返しを再開させたりすることができます。 ( .Ic while と .Ic end は、その行に単独で書かれなければなりません。)入力が端末の場合、 .Ic foreach ステートメントの場合と同様に、 ループのすべてを入力するまでプロンプトが表示され、 すべての入力を終えた時点でループが実行されます。 .Pp .It Ic % Ns Ar job 指定されたジョブをフォアグラウンドに移動します。 .Pp .It Ic % Ns Ar job Ic & 指定されたジョブをバックグラウンドで再開実行させます。 .Pp .It Ic @ .It Ic @ Ar name Ns = Ns expr .It Ic @ Ar name[index] Ns = Ns expr 1 行目の形式は、すべてのシェル変数の値を表示します。2 行目の形式は、 指定された名前 .Ar name の変数に式 .Ar expr -の値を代入します。式のなかに `<'、`>'、`&'、`|'を含んでいる場合、 +の値を代入します。式のなかに `<', `>', `&', `|'を含んでいる場合、 少なくともそのような部分は `(' と `)' で囲まれている必要があります。 3 行目の形式は、変数の .Ar index 番目の要素に式 .Ar expr の値を代入します。 .Ar name と、その .Ar index 番目の要素はすでに存在していなければいけません。 .El .Pp -C 言語と同様に、演算子 `*='、`+=' 等が利用可能です。 +C 言語と同様に、演算子 `*=', `+=' 等が利用可能です。 変数名と演算子の間の空白はあってもなくてもかまいません。 しかしながら、式の各要素の間には空白が必須です。 さもなければ、単一の単語とみなされてしまいます。 .Pp 特別な後置演算子 `+\|+' と `\-\|\-' により変数の値を 1 だけ増加させたり、 減少させたりすることができます。たとえば、`@ i++' のように使います。 .Ss 定義済み変数と環境変数 以下の変数は、シェルにとって特別な意味があります。これらのうち、 -.Ar argv、 -.Ar cwd、 -.Ar home、 -.Ar path、 -.Ar prompt、 -.Ar shell、 +.Ar argv , +.Ar cwd , +.Ar home , +.Ar path , +.Ar prompt , +.Ar shell , .Ar status はシェルが設定します。そのうち、 .Ar cwd と .Ar status 以外の変数の設定はシェルの起動時にのみ行われます。 そのような変数は、ユーザが明示的に変更しないかぎり、 値が変化することはありません。 .Pp シェルは、環境変数 .Ev USER をシェル変数 .Ar user に、 .Ev TERM を .Ar term に、 .Ev HOME を .Ar home にそれぞれコピーします。また、 これらのシェル変数が再度セットされた場合は環境変数にコピーしなおします。 環境変数 .Ev PATH も同様に扱われます。サブシェルは環境変数によって .Ar path の値を得て、もしそれが変更されれば環境変数にコピーしなおすので .Ar \&.cshrc 以外での .Ar path 変数の設定について気をつける必要はありません。 .Bl -tag -width histchars .It Ic argv シェルへの引数が設定されます。位置パラメータは argv の値に展開されます。 すなわち、 `$1' は `$argv[1]' の値に置換されます。 .It Ic cdpath .Ar chdir .\" #### modified by kuma 96.12.23 #### コマンドにおいてサブディレクトリを検索するためのディレクトリのリストです。 .It Ic cwd .\" #### modified by kuma 96.12.23 #### カレント・ディレクトリのフルパス名です。 .It Ic echo .Fl x オプションが指定された場合にセットされます。セットすることにより、 コマンドが実行される前にコマンド名とその引数が表示されるようになります。 .\" #### modified by kuma 96.12.23 #### 組み込みコマンド以外では、表示の前にすべての展開が行われます。 組み込みコマンドではコマンド置換とファイル名置換が行われる前に表示されます。 なぜなら、これらの置換は選択的に行われるからです。 .It Ic filec ファイル名補完を有効にします。 .It Ic histchars ヒストリ置換に用いる文字を文字列で指定します。 指定した文字列の最初の文字はヒストリ置換文字(デフォルトは `!')、 2 文字目は簡易置換文字(デフォルトは `\*(ua') を指定します。 .It Ic histfile ヒストリをセーブ/リストアするパス名を指定できます。 .It Ic history ヒストリ・リストのサイズを指定します。 このサイズを超えたコマンド履歴は削除されます。 あまりに大きな値を設定すると、シェルがメモリを使いつくすかもしれません。 最後に実行したコマンドは .Ar history の値にかかわらず、つねにヒストリ・リストに保存されます。 .It Ic home .\" #### modified by kuma 96.12.23 #### シェルを起動したユーザのホーム・ディレクトリです。 起動時に環境変数から設定されます。 ファイル名置換において .Sq Pa ~ は本変数を参照して展開されます。 .It Ic ignoreeof セットされると、端末のファイル終端(EOF)を無視するようになります。 間違って control-D を押してシェルを終了させてしまうのを防ぐことができます。 .It Ic mail シェルがメールの到着をチェックするためのメールファイルを指定します。 コマンド実行が完了しプロンプトが表示されるときに、 .\" #### modified by kuma 96.12.23 #### 指定された時間が経過していればメイル到着のチェックが行われます。 最終修正時刻が最終アクセス時刻以降の場合、 シェルは `You have new mail' と出力します。 .Pp .Ar mail の値の最初の単語が数値の場合には、 その数値でメール検査の間隔を秒単位で指定します。 指定がなかった場合のデフォルト値は 10分です。 .Pp 複数のメールファイルが指定された場合、 メールが到着していた場合のメッセージは `New mail in .Ar name Ns ' となります。ここで、 .Ar name は到着したメールが あるファイル名です。 .It Ic noclobber .Sx 入出力 の項で説明したように、 出力リダイレクトによって意図せずにファイルを削除しないように制限したり、 `>>' リダイレクトがすでに存在するファイルにしか適用できないようにします。 .It Ic noglob セットされると、ファイル名展開が禁止されます。 ファイル名を扱わないシェルスクリプト内や、すでにファイル名展開を行ったあとで、 それ以上の展開を望まない場合に設定します。 .It Ic nonomatch .\" #### modified by kuma 96.12.23 #### セットされると、ファイル名展開の結果が空になってもエラーとせず、 展開前のパターンをそのまま残します。 .\" #### modified by kuma 96.12.23 #### ただし、`echo [' のような、 展開前のパターンが文法的に正しくない場合はエラーになります。 .It Ic notify セットされると、シェルがジョブの終了を随時報告するようになります。 通常はプロンプトの表示直前にのみ報告が行われます。 .It Ic path .\" #### modified by kuma 96.12.23 #### path 変数の各単語は、コマンドファイルを検索すべきディレクトリ名を表します。 空の単語はカレント・ディレクトリを示します。 .Ar path 変数が設定されて いない場合、フルパス指定によるコマンド実行のみが可能になります。 通常の検索パスは - `.'、`/bin'、`/usr/bin' です。しかし、これらの値はシステムによって異なります。 -スーパーユーザのデフォルトの検索パスは `/etc'、`/bin'、`/usr/bin' です。 + `.', `/bin', `/usr/bin' です。しかし、これらの値はシステムによって異なります。 +スーパーユーザのデフォルトの検索パスは `/etc', `/bin', `/usr/bin' です。 .Fl c オプションも .Fl t オプションも指定されなかった場合、 シェルは .Ar path 変数で指定されたディレクトリの内容をハッシュ・テーブルに保存します。 ハッシュ・テーブルは、起動時に .Ar \&.cshrc を読み込んだ後と .Ar path 変数を再設定した時に再構築されます。 シェルの実行中に、 新しいコマンドがハッシュされているディレクトリに追加された場合は、 .Ic rehash コマンドによりハッシュを再構築しなければなりません。 .\" #### modified by kuma 96.12.23 #### さもなければ、コマンドが見付からない可能性があります。 .It Ic prompt 端末上で対話的に実行されているシェルにおいて、 .\" #### modified by kuma 96.12.23 #### コマンド読み込み時に表示される文字列を指定します。 `!' が含まれる場合、現在のイベント番号に置換されます。 `\e' を指定することにより、この解釈を抑制することができます。 デフォルトの値は `% 'です。スーパーユーザの場合は `# ' となります。 .It Ic savehist ログアウト時にファイル ~/.history に保存されるコマンド履歴の数を指定 します。 .\" #### modified by kuma 96.12.23 #### この値で指定される数のイベントが保存されます。 起動時に、シェルは ~/.history の内容を読み込みます。あまりに 大きな値を指定すると、シェルの起動が遅くなる場合があります。 .Ar savehist がセットされているだけの場合は .Ar history に指定された値を使用します。 .It Ic shell シェルのフルパス名を示します。実行属性が立っているが、 .\" #### modified by kuma 96.12.23 #### システムが起動できないファイルを 実行する際に起動するシェルとして用いられます(後述の .Sx 非組み込みコマンドの実行 の項を参照)。システム依存の値で初期化されます。 .It Ic status 最後に実行したコマンドの終了ステータス値を保持します。 異常終了した場合は、値に 0200 が加算されます。 組み込みコマンドが失敗した場合は `1' に、成功した場合は `0' になります。 .It Ic time .\" #### modified by kuma 96.12.23 #### コマンドの自動計時を制御します。値が設定されている場合、 コマンドがその値よりも長く CPU 秒数を消費した場合には、 コマンド終了時にユーザ時間、システム時間、実時間と、 利用率すなわちユーザ+システム時間と実時間のパーセンテージが出力されます。 .It Ic verbose .Fl v コマンドラインオプションが指定されていた場合にセットされます。 ヒストリ置換が行われたあと、コマンドの内容が出力されます。 .El .Ss 非組み込みコマンドの実行 実行すべきコマンドが組み込みコマンドでなかった場合、シェルはコマンドを .Xr execve 2 システムコールによって起動しようとします。シェル変数 .Ar path .\" #### modified by kuma 96.12.23 #### の各単語は、シェルがコマンドを実行しようとするディレクトリ名を表します。 .Fl c オプションも .Fl t オプションも指定されなかった場合、 .\" #### modified by kuma 96.12.23 #### シェルはそれらのディレクトリ内にあるファイル名のハッシュ値を計算し、 シェル内部のテーブルに格納します。これは、 コマンドが存在する可能性のあるディレクトリだけで .Ic exec を試みるようにするためです。 この近道によって、サーチ・パスにたくさんのディレクトリが指定されている時、 コマンドの位置決定が著しく高速化されます。 この機能が( .Ic unhash .\" #### modified by kuma 96.12.23 #### コマンドによって)停止されている場合、または .Fl c または .Fl t オプションが起動時に指定された場合、または .Ar path .\" #### modified by kuma 96.12.23 #### 中の単語で `/' から始まらないものについては、ハッシュが用いられることはありません。 この場合は、 .Ar path の要素にコマンドラインで指定されたコマンドを連結した名前を持つ ファイルを実行しようと試みます。 .Pp 括弧で囲まれたコマンドは、つねにサブシェルによって実行されます。ですから、 .Pp .Dl (cd ; pwd) ; pwd .Pp はホーム・ディレクトリの値を表示しますが、カレント・ディレクトリ(ホーム・ .\" #### modified by kuma 96.12.23 #### ディレクトリの後に表示されます)は移動しません。 一方、 .Pp .Dl cd ; pwd .Pp を実行すると、カレント・ディレクトリがホーム・ディレクトリに移動します。 括弧で囲まれたコマンドは、現在のシェルのカレント・ディレクトリに 影響を与えずにコマンドを実行する場合にしばしば用いられます。 .Pp 実行属性が立っているにもかかわらず、 システムによって実行可能ではないファイルは シェルコマンドファイルであるとみなし、 サブシェルを起動してそのファイルを読み込ませます。 .Pp .Ic shell という名前のエイリアスが存在する場合、 エイリアスの値はシェルコマンドファイルを実行する場合の 引数リストの前に挿入されます。エイリアスの値の最初の単語は シェルのフルパス名でなければいけません(たとえば `$shell')。 .\" #### modified by kuma 96.12.23 #### これはエイリアス展開としては特別のもので、かなり後の時点に行われ、 引数リストを修正せずに、その前に単語を挿入するための手段を提供します。 .Ss シグナル処理 シェルは、通常 .Ar quit シグナルを無視します。バックグラウンドのジョブ( .Ic \&& または .Ic bg または .Ic %... & .\" #### modified by kuma 96.12.23 #### によるコマンド)はキーボードから入力されたシグナルに影響されません (hangup も含みます)。他のシグナルに対する挙動は親の環境を引き継ぎます。 シェル・スクリプトでの interrupt と terminate シグナルに対する処理は .Ic onintr によって制御することができます。ログイン・シェルは .Ar terminate シグナルを捕捉します。それ以外のシェルでは、 .Ar terminate シグナルはシェルの親の状態に従ってチャイルドプロセスに渡されます。 ログイン・シェルが .Pa \&.logout ファイルを読み込んでいる間は interrupt は無視されます。 .Sh 作者 William Joy。 ジョブ制御とディレクトリ・スタックは J.E. Kulp of IIASA, Laxenburg, Austria によって、 .\" #### modified by kuma 96.12.23 #### 現在とは異なる文法のものが実装されました。 ファイル名補完は Ken Greer, HP Labs が、 .\" #### modified by kuma 96.12.23 #### 8 bit クリーンな実装は Christos S. Zoulas, Cornell University によって行われました。 .Sh 関連ファイル .Bl -tag -width /etc/passwd -compact .It Pa ~/.cshrc シェルが起動されるときに読み込まれる。 .It Pa ~/.login ログイン・シェルの場合、ログイン時に `.cshrc' の後に読み込まれる。 .It Pa ~/.logout ログイン・シェルにおいてログアウト時に読み込まれる。 .It Pa /bin/sh 標準シェル。`#' で始まらないシェル・スクリプトの実行に用いる。 .It Pa /tmp/sh* `<<' の処理に用いられる一時ファイル。 .It Pa /etc/passwd `~name' 展開時に用いられるホーム・ディレクトリに関する情報を得る。 .El .Sh 制限事項 .\" #### modified by kuma 96.12.23 #### 単語の長さは 1024 文字に制限されます。引数リストは、システムによって 10240 文字に制限されています。ファイル名展開を含む引数の数は、 引数リストの文字数の 6 分の 1 に制限されています。 コマンド置換の結果は、引数リストと同数の制限があります。 ループ検出のため、1 行に対するエイリアス展開は 20 回までに制限されています。 .Sh 関連項目 .Xr sh 1 , .Xr su 1 , .Xr access 2 , .Xr execve 2 , .Xr fork 2 , .Xr killpg 2 , .Xr pipe 2 , .Xr setrlimit 2 , .Xr sigvec 2 , .Xr umask 2 , .Xr wait 2 , .Xr tty 4 , .Xr a.out 5 , .Xr environ 7 .br .Em An introduction to the C shell .Sh 歴史 .Nm csh は .Bx 3 で追加されました。 .\" #### modified by kuma 96.12.23 #### コマンドインタプリタとしては、履歴(参照: .Sx ヒストリ置換 )、ジョブ制御 (参照: .Sx ジョブ .\" #### modified by kuma 96.12.23 #### 参照)、対話的なファイル名補完とユーザ名補完(参照: .Sx ファイル名補完 .\" #### modified by kuma 96.12.23 #### )、C言語ライクな文法を採用して実装した最初のものです。 これらの機構にいくつかの追加機能(といくらかのバグの可能性)を 持つシェルは、現在ではたくさんあります。 これらは usenet から入手することができます。 .Sh バグ コマンドが停止状態から復帰したとき、もしそのコマンドが起動したときの ディレクトリとカレント・ディレクトリが異なるなら、 シェルはコマンドを起動したときのカレント・ディレクトリの値を表示します。 .\" #### modified by kuma 96.12.23 #### これは、そのジョブが内部的にディレクトリを変更した場合は誤解(間違った情報) を与える可能性があります。 .Pp シェルの組み込みコマンドは中断(suspend)も再開もできません。 `a ; b ; c' のようなコマンド列も適切には中断することができません。 たとえば、 `b' の実行を中断した場合には、 すぐに `c' の実行が開始されてしまいます。これは .Ar alias としてコマンド列を指定している場合に特に目立ちます。 このようなコマンド列は `()' で囲んでサブシェルで実行されるようにすることによって、 適切に停止させることが可能になります(`( a ; b ; c )'のように)。 .Pp プロセスを起動したあとの端末出力の制御が貧弱です。おそらく、 このために、 .\" #### modified by kuma 96.12.23 #### もっと良い仮想端末インタフェースを開発したいと考える人がいても何ら不思議はないです。 仮想端末インタフェース上なら、 もっと おもしろい端末出力の制御が可能になるでしょう。 .Pp .\" #### modified by kuma 96.12.23 #### シェル関数をシミュレートするために、エイリアスを不格好に用いてしまうことが よくあります。シェル関数がサポートされるべきです。 .Pp ループ中のコマンド入力において、 `?' プロンプトに続けて入力された内容はヒストリに残りません。 制御構造は組み込みコマンドとして解釈されるのではなく、 文法的に解釈するようにするべきです。これにより制御コマンドをどこにでも 置けるようになり、`\&|', `&', `;' との組み合わせが 自由にできるようになります。 .Pp コマンド置換の出力にも `:' 修飾子が適用できるべきです。 .Pp .\" #### modified by kuma 96.12.23 #### ファイル名補完機構の実装は不細工かつ非効率的です。 diff --git a/ja/man/man1/ctm_rmail.1 b/ja/man/man1/ctm_rmail.1 index cdd904c478..89b53482af 100644 --- a/ja/man/man1/ctm_rmail.1 +++ b/ja/man/man1/ctm_rmail.1 @@ -1,502 +1,502 @@ .\" NOTICE: This is free documentation. I hope you get some use from these .\" words. In return you should think about all the nice people who sweat .\" blood to document their free software. Maybe you should write some .\" documentation and give it away. Maybe with a free program attached! .\" .\" Author: Stephen McKay .\" .Dd January 24, 1995 .\" jpman %Id: ctm_rmail.1,v 1.3 1997/09/27 16:25:48 ryo2 Stab % .Dt CTM_MAIL 1 .Os .Sh 名称 .Nm ctm_smail, ctm_rmail .Nd メールを介しての .Nm ctm デルタの送受信 .Sh 書式 .Nm ctm_smail .Op Fl l Ar log .Op Fl m Ar maxmsgsize .Op Fl c Ar maxctmsize .Op Fl q Ar queue-dir .Ar ctm-delta .Ar mail-alias .Nm ctm_dequeue .Op Fl l Ar log .Op Fl n Ar numchunks .Ar queue-dir .Nm ctm_rmail .Op Fl Dfuv .Op Fl l Ar log .Op Fl p Ar piecedir .Op Fl d Ar deltadir .Op Fl b Ar basedir .Op Ar .Sh 解説 .Nm ctm_smail , .Nm ctm_dequeue , .Nm ctm_rmail は .Xr ctm 1 コマンドと組み合わせて、 ソースツリーへの変更を電子メールで配布するために使われます。 .Nm ctm_smail には圧縮した .Xr ctm のデルタとそれを送るメーリングリストを与えます。 するとデルタを送信できる大きさに切り分けて、メールメッセージとして エンコードしたものをメーリングリストに送ります (メールの負荷を分散させるためにキューに入れるように選択できます)。 各受信者は .Nm ctm_rmail を使い (手動または自動で) デルタのデコードと再組み立てを行い、 それをソースツリーに適用するために .Xr ctm を呼び出すようにも指定できます。 現在、 いくつかのソースツリーが、いくつかのサイトによって配布されています。 その中には .Li freefall.FreeBSD.org が配布している FreeBSD-current のソースと CVS のツリーもあります。 .Pp .Nm ctm_smail のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl m Ar maxmsgsize .Nm ctm_smail が送信できるメールメッセージの最大サイズを制限します。 メールヘッダとその他の細かい物をこの制限に入れていないため およその値となります。 指定されないとデフォルトは、メールの限界と噂される 64k に対して ヘッダのための 1535 バイトを残した 64000 バイトです。 .It Fl c Ar maxctmsize 送信されるデルタの最大サイズを制限します。この制限より大きいデルタは 謝罪メールをメーリングリストに送り出します。 これは大幅な変更でユーザのメールボックスを圧迫してしまうのを 避けるためです。これはエンコードする前のサイズなので注意して下さい。 エンコードされるとメールヘッダを付ける前でサイズは 4/3 倍になります。 指定されないと無制限になります。 .It Fl q Ar queue-dir デルタのかけらをメールする代わりに、後で .Nm ctm_dequeue を使ってメールされるように指定されたディレクトリに格納します。 この機能によって、巨大なデルタを数時間または数日にも渡って分散させ、 ネットワークのバンド幅が狭かったりメールのスプール領域が小さい 受信者へのインパクトを押えることが可能です。 .El .Pp .Ar ctm-delta は送信されるデルタで、 .Ar mail-alias はデルタを送信するメーリングリストです。 メールメッセージは .Xr sendmail 8 を使って送信されます。 .Pp .Nm ctm_dequeue のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl n Ar numchunks 1 回の .Nm ctm_dequeue の実行で送信するメールメッセージの数を制限します。 デフォルトでは、 .Nm ctm_dequeue は 1 回の実行で 1 つのメールメッセージを送信します。 .El .Pp .Ar queuedir は .Nm ctm_smail が格納したメールメッセージのあるディレクトリです。 .Ar numchunks 個までのメールメッセージが実行ごとに送信されます。 受信者のメーリングリストは、溜められたファイルに すでにエンコードされています。 .Pp .Nm ctm_smail がキューにエントリを追加している最中や、複数の .Nm ctm_smail を並行に実行している最中でも .Nm ctm_dequeue を安全に実行できますが、配布される各ツリーごとに独立した キューのディレクトリを使うべきです。 これはエントリがアルファベット順に処理されるので、デルタの 作成時刻ではなく、デルタ名に従って 1 つのツリーが他の物より 前に処理されて不公平になるからです。 .Pp .Nm ctm_rmail のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl p Ar piecedir デルタのかけらをこのディレクトリに集めます。 それぞれのかけらは 1 つのメールメッセージに対応します。 かけらは完全なデルタが出来上がると削除されます。 もし このフラグが指定されないと、入力ファイルは読まれませんが、 .Fl b フラグが指定されていれば完成しているデルタは .Xr ctm を使って適用されるかもしれません。 .It Fl d Ar deltadir このディレクトリ内の完成したデルタを集めます。デルタは、すべてのかけらが 揃っている時に 1 つ以上のかけらから組み立てられます。 .It Fl b Ar basedir 完成しているデルタを このソースツリーに適用します。このフラグが 指定されていない場合、デルタは格納されますが適用はされません。 ユーザは手動、または .Nm ctm_rmail を .Fl p フラグ無しで使ってデルタを適用できます。 もしデルタが .Ar basedir の .Li .ctm_status ファイルとマッチしない場合 (もしくは .Li .ctm_status が存在しない場合) には、デルタは適用されません。 .It Fl D .Xr ctm による適用が成功した後でデルタを削除します。 .Xr ctm はデルタのフルセットからファイルの小グループを回復する機能を 持つので、このフラグを避けて (そしてすべてのデルタを取って) おくのが 良いでしょう。 .It Fl f fork して .Xr ctm でのデルタの適用をバックグラウンドで実行します。 これは .Xr sendmail から .Nm ctm_rmail を自動的に呼び出す場合に有効です。なぜなら .Xr ctm は終了までに、とても長い時間を要し、それによって他の人のメールを 遅らせる原因になり、理論的にはリモート側の .Xr sendmail のタイムアウトによるメールの不要な再送信や、 .Xr "MH" の .Xr slocal のようなメールフィルタによる .Nm ctm_rmail の強制終了を引き起こす可能性があるからです。 膨大な数のバックグラウンドの .Xr ctm プロセスでマシンに負荷がかかる心配はありません。同時に 2 つ以上の .Xr ctm が起動されないようにロックが行われているからです。 .It Fl u 完成したデルタを適用する時に .Fl u フラグを .Xr ctm コマンドに渡します。これによって作成、変更されたファイルの 変更時刻が CTM デルタの作成時刻にセットされます。 .It Fl v 完成したデルタを適用する時に .Fl v フラグを .Xr ctm コマンドに渡します。これによってより多くの情報出力が得られます。 すべての .Xr ctm からの出力は .Nm ctm_rmail のログファイルに記録されます。 .El .Pp 引数のファイル (もし無ければ .Em 標準入力 ) がデルタのかけらとしてスキャンされます。 1 つのファイルから複数のデルタのかけらを読む事ができるので、 メールドロップ全体を 1 回のコマンドでスキャンして処理できます。 .Pp .Nm ctm_rmail を並行に (異なる入力ファイルで) 複数回起動しても安全です。 .Xr sendmail .nh がメールを非同期に配送した時にこのようなことが起こり得ます。 これは処理を順序通りに保つためにロックが行われているからです。 .Sh ファイルフォーマット 以下は実際の (とても小さい) デルタのかけらの重要部分です: .Bd -literal From: owner-src-cur To: src-cur Subject: ctm-mail src-cur.0003.gz 1/4 CTM_MAIL BEGIN src-cur.0003.gz 1 4 H4sIAAAAAAACA3VU72/bNhD9bP0VByQoEiyRSZEUSQP9kKTeYCR2gDTdsGFAwB/HRogtG5K8NCj6 v4+UZSdtUQh6Rz0eee/xaF/dzx8up3/MFlDkBNrGnbttAwyo1pxoRgoiBNX/QJ5d3c9/X8DcPGGo lggkPiXngE4W1gUjKPJCYyk5MZRbIqmNW/ASglIFcdwIzTUxaAqhnCPcBqloKEkJVNDMF0Azk+Bo dDzzk0Ods/+A5gXv9YyJHjMCtJwQNeESNma7hOmXDRxn CTM_MAIL END 61065 .Ed .Pp メッセージのサブジェクトは常に .Dq ctm-mail で始まりデルタの名前、いくつ目のかけらか、そして全部でいくつの かけらがあるのかが続きます。データは .Dq CTM_MAIL BEGIN と .Dq CTM_MAIL END という行で囲まれており、サブジェクト行の情報の複製、加えて単純な チェックサムが付きます。 .Pp デルタが .Ar maxctmsize を超えると、代わりに以下のようなメッセージが送られます: .Bd -literal From: owner-src-cur To: src-cur Subject: ctm-notice src-cur.0999.gz src-cur.0999.gz is 792843 bytes. The limit is 300000 bytes. このデルタは ftpmail か、または大学の仲良しから得られます。 .Ed .Pp これでもうあなたのものです! .Sh 使用例 .Em src-cur の 32 番目のデルタを .Em src-guys として .Xr sendmail に登録されている素晴らしいコードハッカーのグループに、 メールのサイズをおよそ 60000 バイトに制限して送るためには 以下のように出来ます: .Bd -literal -offset indent ctm_smail -m 60000 /wherever/it/is/src-cur.0032.gz src-guys .Ed .Pp メールボックスの各 .Nm ctm-mail メッセージをデコードして、それらを完全なデルタに組み立て、そして 出来上がったデルタやそこらに転がっているデルタはどれも、 以下のように適用出来ます: .Bd -literal -offset indent ctm_rmail -p ~/pieces -d ~/deltas -b /usr/ctm-src-cur $MAIL .Ed .Pp ( .Nm ctm_rmail はメッセージを削除しないので注意して下さい。 削除には どんなメールリーダでも使用できます。) .Pp .Em receiver-dude という名前の自動的にデコードとデルタの組み立てを行うけれども、 それらの適用は行わないようなメールエイリアスは、以下の行を .Pa /etc/aliases ファイルに入れる事で作成可能です ( .Pa /ctm/tmp と .Pa /ctm/deltas ディレクトリ そして .Pa /ctm/log ファイルが .Em daemon ユーザか .Em wheel グループで書き込み可能な事を仮定しています) : .Bd -literal -offset indent receiver-dude: "|ctm_rmail -p /ctm/tmp -d /ctm/deltas -l /ctm/log" owner-receiver-dude: real_dude@wherever.you.like .Ed .Pp 2 行目は、失敗した場合にそれを通常のメールボックスか、または どこか好きな所へ転送するためにあります。 .Pp 集められた全デルタを適用して、適用したものを削除するには以下のように します: .Bd -literal -offset indent ctm_rmail -D -d /ctm/deltas -b /ctm/src-cur -l /ctm/apply.log .Ed .Pp 柔軟性を最大限生かすためには、この .Xr procmail スクリプトからの引用の利用を考えてみて下さい: .Bd -literal -offset indent PATH=$HOME/bin:$PATH :0 w * ^Subject: ctm-mail cvs-cur | ctm_incoming .Ed .Pp 以下のシェルスクリプト .Pa ~/bin/ctm_incoming と一緒に使います: .Bd -literal -offset indent #! /bin/sh PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" export PATH cd $HOME/ctm && ctm_rmail -f -p pieces -d deltas -l log -b /ctm .Ed .Pp これは全部の .Xr ctm デルタを .Pa ~/ctm/deltas に置き、それらを .Pa /ctm 内のツリーに適用し、失敗したものは、すべてあなたの通常の メールボックスに落します。 .Pa ctm_incoming での .Ev PATH の操作は、このサンプルを取って来た (FreeBSD でない) マシンで .Nm ctm_rmail から .Xr ctm の実行を可能にするためのものです。 .Sh セキュリティ 自動的にメールを取ってファイルツリーへのパッチプログラムに 渡している場合、あなたのシステムへの鍵をハッカーに手渡していると 考えるかも知れません。幸い、損害を起こす窓はとても小さいのです。 .Nm ctm_rmail は、 (デルタ名中の いかなる .Dq / 文字も信用しないことによって) 与えられたディレクトリのみにしか書き込まないように注意しています。 そして最新の .Xr ctm では操作するファイルに絶対パス名と .Dq \&\.\. を許可していないので、最悪でも失われる可能性のあるのは (デルタから復元できる) 二、三のソースツリーのファイルだけなのです。 .Xr ctm はファイルにさわる前に .Xr md5 によるチェックサムが合致する事を要求するので、ソースの受信者だけが 偽造したデルタを生成できる可能性を持ち、そして そういう人達が そんなことを考えるはずもありません! :-) .Pp この可能性さえも暗号化された署名で取り除く事が可能です。 将来の強化の可能性は、 .Nm PGP -を使った安全なラッパーの提供があります。 +を使った安全なラッパの提供があります。 .\" This next request is for sections 1, 6, 7 & 8 only .Sh 環境変数 デルタを適用するのならば .Xr ctm 1 と .Xr gunzip 1 が .Ev PATH に含まれていなければなりません。 .Sh 関連ファイル .Bl -tag -width indent .It Pa QUEUEDIR/* メールメッセージとしてエンコードされて、メーリングリストに 送信されるのを待っているデルタのかけら。 .It Pa PIECEDIR/* 残りのかけらの到着を待っているデルタのかけら。 .It Pa DELTADIR/* 完成したデルタ。 .It Pa BASEDIR/.ctm_status このソースツリーに次に適用されるべきデルタの名前と番号を含むファイル。 .\" This next request is for sections 1, 6, 7 & 8 only .\" (command return values (to shell) and fprintf/stderr type diagnostics) .Sh 診断 .Nm ctm_smail , .Nm ctm_dequeue , .Nm ctm_rmail は正常に終了するとステータスとして 0 を、何らかの障害が あった場合は 1 を返します。 .Nm ctm_rmail は、メールの配送プログラムから呼ばれる事を想定しています。そして そのため入力されたメールメッセージが (送信者にではなく、 なるべく あなたの通常のメールドロップに) 返送されるべき状態に なった時にのみ障害を通知するようになっています。 いいかえれば、完成したデルタを .Xr ctm で適用する際に発生した障害はメールを返送する程に重要なエラーでは ないと判断されて、 .Nm ctm_rmail は終了ステータスとして 0 を返すということです。 .Pp 通常の操作では、 .Nm ctm_smail は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_smail: src-cur.0250.gz 1/2 sent to src-guys .Ed .Pp または、キューに入れたなら、 .Bd -literal -offset indent ctm_smail: src-cur.0250.gz 1/2 queued for src-guys .Ed .Pp .Nm ctm_dequeue は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_dequeue: src-cur.0250.gz 1/2 sent .Ed .Pp .Nm ctm_rmail は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_rmail: src-cur.0250.gz 1/2 stored ctm_rmail: src-cur.0250.gz 2/2 stored ctm_rmail: src-cur.0250.gz complete .Ed .Pp もし入力ファイルのいずれもが正しいデルタのかけらを含んでいないと、 .Nm ctm_rmail は以下のように報告します: .Bd -literal -offset indent ctm_rmail: message contains no delta .Ed .sp \n(Ppu そして終了ステータスとして 1 を返します。もしメールフィルタが 当てにならないのなら、これを使って気まぐれなメッセージを リダイレクトして本当のメールボックスに入れる事ができます。 .Pp これらのメッセージは .Em stderr かログファイルに出力されます。 .Xr ctm からのメッセージも同様にここに現れます。 エラーメッセージは それ自身が説明的であるべきです。 .\" The next request is for sections 2 and 3 error and signal handling only. .\" .Sh ERRORS .Sh 関連項目 .Xr ctm 1 , .Xr ctm 5 .\" .Sh STANDARDS .\" .Sh HISTORY .Sh 作者 Stephen McKay .\" .Sh BUGS .\" Gosh! No bugs here! .\" This message brought to you by the Coalition for More Humour in Man Pages. .\" .\" %Id: ctm_rmail.1,v 1.7.2.1 1996/12/17 14:07:51 mckay Exp % .Sh 日本語訳 野首 寛高(h-nokubi@nmit.mt.nec.co.jp): FreeBSD 用に翻訳 diff --git a/ja/man/man1/cvs.1 b/ja/man/man1/cvs.1 index b631f7f53c..6da2e4f547 100644 --- a/ja/man/man1/cvs.1 +++ b/ja/man/man1/cvs.1 @@ -1,2118 +1,2118 @@ .de Id .\" jpman %Id: cvs.1,v 1.4 1997/09/23 13:05:40 jsakai Stab % .ds Rv \\$3 .ds Dt \\$4 .. .TH CVS 1 "\*(Dt" .\" Full space in nroff; half space in troff .de SP .if n .sp .if t .sp .5 .. .\" quoted command .de ` .RB ` "\|\\$1\|" '\\$2 .. .SH "名称" cvs \- コンカレント・バージョン・システム .SH "注記" このマニュアルページは .B cvs の機能のまとめですが、より詳細な文書に関しては (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SH "書式" .TP \fBcvs\fP [ \fIcvs_options\fP ] .I cvs_command [ .I command_options ] [ .I command_args ] .SH "解説" .IX "revision control system" "\fLcvs\fR" .IX cvs "" "\fLcvs\fP \- concurrent versions system" .IX "concurrent versions system \- \fLcvs\fP" .IX "release control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system" .IX "source control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system" .IX revisions "cvs command" "" "\fLcvs\fP \- source control" .B cvs は .BR rcs ( 1 ) リビジョン管理システムのフロントエンドで、 リビジョン管理の概念を複数ファイルを集めた単一ディレクトリから リビジョン管理される複数ファイルを含む複数の階層構造を持つ ディレクトリへと拡張します。 それらのディレクトリとファイルをひとまとまりにしてソフトウェアリリースを 形成することが可能になります。 .B cvs は、それらのソフトウェアリリースの管理と複数のソフトウェア開発者が 並行してソースファイルを編集する場合の制御に必要な機能を提供するものです。 .SP .B cvs はマスターソースの単一のコピーを保持します。 このコピーはソースの``リポジトリ''と呼ばれます。 これは、以前の ソフトウェアリリースをいつでもシンボリックなリビジョンタグか、 または過去の日付のいずれかに基づいて取り出せるようにするための 全ての情報を含みます。 .SH "不可欠なコマンド" .B cvs はバラエティに富んだコマンドを提供します (書式説明における \fIcvs_command\fP)。 また分散環境での多様なソース管理要求を満たすために、 これらのコマンドの多くにはいくつものオプションが用意されています。 しかしながら、 .BR cvs で便利に仕事をするためにそれぞれの細部に渡ってマスタする 必要はありません。 実際、ソースリポジトリを使う (そしてそれに貢献する) には 5 つの コマンドで充分です。 .TP \fBcvs checkout\fP \fImodules\fP\|.\|.\|. 大部分の \fBcvs\fP での作業のために必要な準備: \fImodules\fP (名前をつけたソースの集合。 ここにはソースリポジトリへの相対パスを 使うこともできます) のソースの私的なコピーを作成します。 他人の作業に邪魔されることなく このコピーで作業することができます。 少なくとも 1 レベルのサブディレクトリが必ず作成されます。 .TP .B cvs update 他の開発者がリポジトリのソースに行った変更を あなたのコピーに 取り込みたいと思ったときに、あなたの私的なソースのディレクトリの \fI中で\fP このコマンドを実行して下さい。 .TP \fBcvs add\fP \fIfile\fP\|.\|.\|. あなたの作業ディレクトリの \fBcvs\fP のレコードに新しいファイルを 載せるには、このコマンドを使います。そのファイルは次にあなたが .` "cvs commit" を実行した時にリポジトリに追加されます。 注意: 新しいソースをソースリポジトリに登録するには .` "cvs import" コマンドを使って下さい。 .` "cvs add" はすでにチェックアウトされているモジュールに新しいファイルを 追加するときにのみ使います。 .TP \fBcvs remove\fP \fIfile\fP\|.\|.\|. (指定するファイルを消した後に) リポジトリからファイルを 消したいことを宣言する場合に、このコマンドを使います。 .` "cvs commit" を実行するまで削除は他へは影響しません。 .TP \fBcvs commit\fP \fIfile\fP\|.\|.\|. あなたの変更をソースリポジトリに取り込むことで、他の開発者へ 変更結果を ``公開'' したいときに、このコマンドを使います。 .SH "オプション" .B cvs のコマンドラインには .IR cvs_options を含めることができ、 これは .B cvs プログラム全体に適用されます。 ひとつの .IR cvs_command がソースリポジトリへの特定の動作を 指定します。 そして .I cvs_command の動作を完全に指定するために .I command_options と .I command_arguments とを含めることができます。 .SP .I 警告: .IR cvs_command とオプションの相対的な位置関係に正確さを 期さなければなりません。 なぜなら同じオプションが .I cvs_options の位置 ( .B cvs コマンドの左側) と .I command_options の位置 ( .B cvs コマンドの右側) のいずれに置かれるかで異なる意味を持つ可能性が あるためです。 .SP .IR cvs_command を省略できる状況が 2 つだけあります: .` "cvs \-H" または .` "cvs --help" は利用可能なコマンドの一覧を引き出します、そして .` "cvs \-v" または .` "cvs --version" は \fBcvs\fP それ自身のバージョン情報を表示します。 .SP .SH "CVS OPTIONS" リリース 1.6 現在、 .B cvs は、短いオプションと共に .SM GNU スタイルの長いオプションもサポートします。 現在はまだ 2、3の長いオプションしかサポートされておらず、 それらは同じ意味を持つ短いオプションの後ろにかぎ括弧で囲んで 示されています。 .SP 以下のオプションは .B cvs プログラムの全体的な制御に使います: .TP .B \-H [ --help ] 指定された .I cvs_command の用法を表示します (が、コマンドの実行は行いません)。コマンド名を 指定しないと .` "cvs \-H" は利用可能な全コマンドの要約を表示します。 .TP .B \-Q はコマンドを .I 真に 寡黙にします。 コマンドは深刻な問題についてのみ出力を行います。 .TP .B \-q はコマンドをいくぶん静かにします。 サブディレクトリを再帰的に 移動する際の報告のような通知的なメッセージが抑制されます。 .TP \fB\-b\fP \fIbindir\fP .SM RCS プログラムが置かれているディレクトリとして .I bindir を使います。 環境変数 .SM RCSBIN の設定より優先されます。 これは絶対パス名で指定しなければなりません。 .TP \fB\-d\fP \fICVS_root_directory\fP マスタとなる .SM RCS ソースリポジトリのルートディレクトリへのパス名として .I CVS_root_directory を使います。 環境変数 .SM CVSROOT の設定より優先されます。 これは絶対パスで指定しなければなりません。 .TP \fB\-e\fP \fIeditor\fP ログ情報の入力においてエディタとして .I editor を使います。 環境変数 .SM CVSEDITOR と .SM EDITOR の設定より優先されます。 .TP .B \-f .B cvs スタートアップファイル (\fI~/.cvsrc\fP) を読み込みません。 .TP .B \-l コマンドヒストリに .I cvs_command のログを取りません (しかし実行はします)。コマンドヒストリに関する 情報については .B history コマンドの説明を参照して下さい。 .TP .B \-n いかなるファイルも変更しません。 .IR cvs_command を実行しようとしますが、 経過報告のみを行います。 ファイルへの削除、更新やマージのいずれも 行いませんし、新しいファイルも作成しません。 .TP .B \-t プログラムの実行をトレースします。 .B cvs の動作のステップを示すメッセージを表示します。 不慣れなコマンドの影響の可能性を調べるのに .B \-n との組合せで特に有用です。 .TP .B \-r 新しい作業ファイルを読み出し専用にします。 環境変数 .SM CVSREAD がセットされている場合と同じ効果を持ちます。 .TP .B \-v [ --version ] .BR cvs のバージョンと著作権情報を表示します。 .TP .B \-w 新しい作業ファイルを読み書き可能にします (デフォルトです)。 環境変数 .SM CVSREAD がセットされていても無視します。 .TP .B \-x クライアントとサーバの間の通信を全て暗号化します。 現在では、Kerberos コネクション使用時のみ使用可能です。 .TP \fB\-z\fP \fIcompression\-level\fP ファイルをネットワーク経由でやりとりする際、 圧縮レベル \fIcompression\-level\fP で .B gzip を使い、やりとりするデータの圧縮と伸長を行います。リンクの両端で .SM GNU .B gzip プログラムがその時点でのサーチパス中に存在する必要があります。 .SH "使用法" .` "cvs \-H" で全般のヘルプを要求する場合を除き、 行いたい特定のリリース制御機能を選択するために、 .B cvs に対して一つの .I cvs_command を指定しなければなりません。 各 .B cvs コマンドはそれ自身のオプションと引数の集まりを受け付けます。 しかしながら、多くのオプションが複数のコマンドに渡って利用可能です。 .B \-H オプションをコマンドと共に指定することで、 各コマンドの使用法のまとめを表示することができます。 .SH "CVS のスタートアップファイル" 通常、CVS は起動時にユーザのホームディレクトリから .I .cvsrc というファイルを読み込みます。この起動時の手続きは .B \-f フラグで止めることができます。 .SP .I .cvsrc ファイルには CVS コマンドに引数リストを付けて、1 行に 1 つの コマンドを並べます。例えば \fI.cvsrc\fP に以下のように書くと: .SP diff \-c .SP .` "cvs diff" コマンドには常にコマンドラインで指定されたオプションに加えて \-c オプションが渡されるという意味になります (この場合 .` "cvs diff" を実行すると 全てにおいて context diff 形式が生成されるという 効果を持ちます)。 .SH "CVS COMMAND のまとめ" 以下は全 .B cvs コマンドの解説を要約したものです: .TP .B add 新しいファイルまたはディレクトリをリポジトリに追加します。 ファイルについては追加を同ファイルに対する .` "cvs commit" が行われるまで待ちます。 以前に .` "cvs checkout" を行うことで作成されたソースの中からのみ実行可能です。 新しいソース階層の全体を .B cvs の制御下に置くには .` "cvs import" を使って下さい。 (リポジトリを直接に変更するものではありません。 作業ディレクトリを変更します。) .TP .B admin ソースリポジトリに対して .SM RCS の制御コマンドを実行します。(リポジトリを直接に変更します。 作業ディレクトリを使用しますが変更は行いません。) .TP .B checkout 編集作業のためのソースファイルの作業ディレクトリを作成します。 (作業ディレクトリを生成または変更します。) .TP .B commit 作業ディレクトリでの変更、追加、削除部分をソースリポジトリに 反映します。(リポジトリを変更します。) .TP .B diff 作業ディレクトリのファイルとソースリポジトリ、または ソースリポジトリ中の 2 つのリビジョン間の差分を表示します。 (リポジトリ、作業ディレクトリのいずれも変更しません。) .TP .B export サイトからの出荷のための一揃いのソースファイルのコピーを用意します。 .` "cvs checkout" と違い .B cvs 管理のためのディレクトリが作られず (そしてそのため .` "cvs export" で作成されたディクトリから .` "cvs commit" を行うことはできません)、 シンボリックタグが指定されなければなりません (リポジトリを変更しません。 作業ディレクトリに似たディレクトリを 作成します)。 .TP .B history ソースリポジトリの特定のファイルまたはディレクトリにあなたや 他の人が実行した .B cvs コマンドを表示します。(リポジトリも作業ディレクトリも変更しません。) ヒストリログは .` "$CVSROOT/CVSROOT/history" ファイルが作成されることで有効になった場合にのみ記録されます。 .BR cvs ( 5 ) を参照して下さい。 .TP .B import 外部で行われた更新内容を ``ベンダ・ブランチ'' としてソースリポジトリに 取り込みます。(リポジトリを変更します。) .TP .B log .SM RCS のログ情報を表示します。 (リポジトリも作業ディレクトリも変更しません。) .TP .B rdiff リポジトリの中の 2つのリリースの間の差分の集合をパッチファイルとして 用意します。(リポジトリも作業ディレクトリも変更しません。) .TP .B release .` "cvs checkout" をキャンセルし、 全ての変更を捨て去ります。 (作業ディレクトリを削除できます。 リポジトリは変更しません。) .TP .B remove ソースリポジトリからファイルを削除します、そのファイルに .` "cvs commit" が実行されるまで保留されます。(直接リポジトリには影響しません。 作業ディレクトリを変更します.) .TP .B rtag ソースリポジトリの特定のリビジョンのファイルに明示的に シンボリックタグを指定します。 .` "cvs tag" も参照して下さい。 (リポジトリを直接変更します。 作業ディレクトリは必要なく また 変更もしません.) .TP .B status 現在のファイルの状態を表示します: 最新バージョン、作業ディレクトリの ファイルのバージョン、作業バージョンが編集されたかどうか、オプションで .SM RCS ファイル中のシンボリックタグ。(リポジトリ、作業ディレクトリとも 変更しません。) .TP .B tag リポジトリ中のファイルにシンボリックタグを指定します。 デフォルトでは、作業ディレクトリと最後に同期を取ったリビジョンに タグをつけます。 (直接リポジトリを変更します。 作業ディレクトリを使いますが 変更はしません。) .TP .B update リポジトリから変更を取り出して作業ディレクトリを最新状態にします。 可能であればマージが自動で行われます。 変更点が衝突しているために手動で解決しなければならない場合は、 警告が表示されます。(作業ディレクトリを変更します。 リポジトリは変更しません。) .SH "共通の COMMAND OPTIONS" この節では 複数の .B cvs コマンドで使用できる .I command_options について説明します。必ずしも全てのコマンドがこれら全てのオプションを サポートしているわけではありません。 コマンドの各オプションは、それが 意味を為すコマンドでのみサポートされます。しかしながら、 コマンドがそれらのオプションのひとつを持つとき、 他のコマンドでもそのオプションが同じ意味を持つと考えて差し支えありません。 (個々のコマンドと共に列挙してある別のオプションは ある .B cvs コマンドと別のコマンドで異なる意味を持つかもしれません。) .I "注意:" .B history コマンドは例外です。 このコマンドは、これら標準のオプションとも衝突するたくさんの オプションをサポートしています。 .TP \fB\-D\fP \fIdate_spec\fP \fIdate_spec\fP 以前のものの中で最も最近のリビジョンを使います (単独の 引数で、日時の表記は過去の日時を指定します)。 下請けの .SM RCS の機能により .BR co ( 1 ) に説明されているのと同様の多種多様な日時のフォーマットが サポートされますが、まったく同じというわけではありません。 特定のタイムゾーンが指定されていなければ、\fIdate_spec\fP は ローカルタイムゾーンで解釈されます。 ソースファイルの個人的なコピーを作るときに使うと、指定は ``sticky'' と なります。 つまり、\fB\-D\fP を使って作業ファイルを取り出すと、 \fBcvs\fP は指定された日時を記録します。 これは同じディレクトリでのその後の update で同じ日時を使うように するためです (これを明示的に無効にするよう指定していない場合に限ります。 \fBupdate\fP コマンドの説明を参照して下さい)。 .B \-D は .BR checkout ", " diff ", " history ", " export ", " .BR rdiff ", " rtag ", " .B update コマンドで有効です。 有効な日時指定には以下のようなものがあります: .in +1i .ft B .nf 1 month ago 2 hours ago 400000 seconds ago last year last Monday yesterday a fortnight ago 3/31/92 10:00:07 PST January 23, 1987 10:05pm 22:00 GMT .fi .ft P .in -1i .TP .B \-f \fBcvs\fP コマンドに特定の日時かタグを指定した場合、 通常は指定したタグを含まない (または指定した日時に存在しなかった) ファイルを無視します。一致するタグまたは日時が存在しなくても ファイルを取り出したいときは \fB\-f\fP オプションを使います。 (その場合、最も新しいバージョンが使われます。) .B \-f は以下のコマンドで使用できます: .BR checkout ", " export ", " .BR rdiff ", " rtag ", " update .TP .B \-H ヘルプ; そのコマンドで使用可能なオプションの説明を表示します。 これは .I 全ての .B cvs コマンドでサポートされる唯一のオプションです。 .TP \fB\-k\fP \fIkflag\fP デフォルトの .SM RCS のキーワード処理を変更します。 .BR co ( 1 ) に説明されている全ての .B \-k オプションが使用できます。\fB\-k\fP オプションは .BR add ", " checkout ", " diff ", " export ", " .BR rdiff ", " update コマンドで使用できます。 ソースファイルの個人的なコピーを作成するときに使うと \fIkflag\fP の指定は ``sticky'' になります。 つまり、このオプションを \fBcheckout\fP か \fBupdate\fP コマンドで指定すると、 \fBcvs\fP は指定した \fIkflag\fP をファイルに関連付け、 他のものを指定するまで、以降の \fBupdate\fP コマンドでそれを使い続けます。 .SP より有用な \fIkflag\fP としては \-ko と \-kb (バイナリファイル用、 .SM RCS バージョン 5.7 以降でのみ利用可)、と \-kv があります。\-kv は .B export の際、どこか別のサイトで後に .B import されてもキーワード情報が残るようにしたい場合に有用です。 .TP .B \-l ローカル; サブディレクトリを再帰的に処理するのではなく、 現ディレクトリでのみ実行します。 以下のコマンドで使用できます: .BR checkout ", " commit ", " diff ", " .BR export ", " remove ", " rdiff ", " rtag ", " .BR status ", " tag ", " update .I 注意: これは .B cvs コマンドの .I 左 に指定することのできる、全体に作用する .` "cvs \-l" オプションとは違います! .TP .B \-n .BR checkout / commit / tag / update のいずれのプログラムも .I 実行しません。 (プログラムはそれぞれの動作中にモジュールデータベースで 実行することを指定される可能性があり、このオプションはこれを バイパスします。) .BR checkout ", " commit ", " export ", " .B rtag コマンドで利用できます。 .I 警告: これは .B cvs コマンドの .I 左側 に指定できる、全体に作用する .` "cvs \-n" オプションと同じではありません。 .TP .B \-P .BR checkout " か " update によって更新されたことで空になった余分なディレクトリを 取り除きます (すなわち削除します)。 通常は、空のディレクトリ (リビジョン管理されたファイルを 含まないもの) は残されます。 .B \-P を指定すると、チェックアウトしたソースからそういったディレクトリを 黙って削除します。 これはリポジトリからはディレクトリを削除しません。あなたが チェックアウトしたコピーから削除するだけです。 このオプションは .B \-r か .B \-D オプションが .BR checkout " と " export で指定された場合に暗黙のうちに 指定されることに注意して下さい。 .TP .B \-p リポジトリから取り出されたファイルを、カレントディレクトリに 書き込むのではなく、標準出力へパイプします。 .BR checkout " と " update コマンドで使用できます。 .TP \fB\-r\fP \fItag\fP デフォルトの ``head'' リビジョンの代わりに引数 .I tag で指定されたリビジョンを使います。 \fBtag\fP と \fBrtag\fP コマンドで 付けられた任意のタグと共に、常に 2つの特別なタグが使用できます: .` "HEAD" はリポジトリ中で最も新しい有効なバージョンを指し、 そして .` "BASE" はカレントの作業ディレクトリに最後にチェックアウトした リビジョンを指します。 .SP このオプションを .` "cvs checkout" か .` "cvs update" でファイルのコピーを作成するときに使うと、 \fItag\fP の指定は ``sticky'' です: \fBcvs\fP は \fItag\fP を記憶して以降の \fBupdate\fP コマンドでも、他のものを 指定するまで、それを使い続けます。 .I tag としては .SM RCS スタイルのシンボリックまたは番号によるものが使用できます。 .SM RCS ファイルが指定されたタグを含んでいないときに警告メッセージを抑止するため 全体に作用する .B \-q オプションをコマンドオプション .B \-r と一緒に指定すると便利な場合が多くあります。 .B \-r は .BR checkout ", " commit ", " diff ", " .BR history ", " export ", " .BR rdiff ", " rtag ", " update コマンドで使用できます。 .I 警告: これは .B cvs コマンドの .I 左側 に指定し、全体に作用する .` "cvs \-r" オプションと同じではありません。 .SH "CVS COMMANDS" 以下が (最終的な) 全 .B cvs コマンドの詳細とそれぞれが受け付けるオプションです。 各コマンドの最初のサマリ行の説明は 3 種類の事柄をまとめています: .TP 1i \ \ \ \ コマンドのオプションと引数 特別なオプションが以下で説明されます。 共通のコマンドオプションは サマリ行にしか現れないかもしれません。 .TP 1i \ \ \ \ 作業ディレクトリかリポジトリか? いくつかの \fBcvs\fP コマンドは実行に作業ディレクトリが必要です。 いくつかはリポジトリが必要です。同様に、いくつかのコマンドは リポジトリを \fI変更し\fP 、いくつかは作業ディレクトリを変更し、 いくつかは何の変更も行いません。 .TP 1i \ \ \ \ 同義語 多くのコマンドには同義語があります。 同義語は正式な名前よりも覚えやすい (あるいはタイプしやすい) と 感じることでしょう。 .PP .TP \fBadd\fP [\fB\-k\fP \fIkflag\fP] [\fB\-m '\fP\fImessage\fP\fB'\fP] \fIfiles.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .B new .br .B add コマンドを使って .SM RCS ソースリポジトリに新しいファイルまたはディレクトリを作成します。 .B add で指定されるファイルまたはディレクトリは、すでに カレントディレクトリ ( .B checkout コマンドで作成されたディレクトリでなければなりません) に 存在しなければなりません。 新しいディレクトリ階層の全体をソースリポジトリに追加する (例えば、サードパーティのベンダから受け取ったファイル群のような) には、 代わりに .` "cvs import" コマンドを使います。 .SP .` "cvs add" の引数が直下のサブディレクトリを指しているなら、そのディレクトリが .SM RCS ソースリポジトリの現位置に作成され、必要な .B cvs 管理ファイルが作業ディレクトリに作成されます。 ディレクトリがすでにソースリポジトリに存在した場合でも、 .` "cvs add" はあなたのバージョンのディレクトリに管理ファイルを作成します。 これによって、あなたがソースを .B checkout した後に誰か他の人がディレクトリを作っていても .` "cvs add" でそのディレクトリをあなたの私的なソースに作成することが 可能になります。以下のようにすることができます: .SP .in +1i .ft B .nf example% mkdir new_directory example% cvs add new_directory example% cvs update new_directory .fi .ft P .in -1i .SP .` "cvs update" を使った別のアプローチもあります: .SP .in +1i .ft B .nf example% cvs update -d new_directory .fi .ft P .in -1i .SP (新しく \fIできた\fP ディレクトリをあなたの作業ディレクトリに 追加するには、おそらく .` "cvs checkout" か .` "cvs update -d" を使用する方が簡単でしょう。) .SP .` "cvs commit" で変更が恒久的なものとされるまで、追加されたファイルは .SM RCS ソースリポジトリには置かれません。 .` "cvs remove" コマンドで削除されたファイルに対して .` "cvs add" を行うと、間で .` "cvs commit" コマンドが実行されていなければファイルが復活します。 .SP 新しいファイルを .` "cvs commit" で恒久的なものにするときに、いつものように、ログメッセージを指定する 機会があります。もしファイルの .I 作成 と対応するもう一つのログメッセージを指定したいならば (例えば、ファイルの目的を説明するなど)、 .B add コマンドの .` "\-m \fImessage\fP" オプションで指定することができます。 .SP .` "-k kflag" オプションで このファイルがチェックアウトされるときの デフォルトを指定できます。 引数 .` "kflag" は .SM RCS ファイルに記録されて .` "cvs admin" で変更することができます。 展開された .SM RCS ID 文字列を持たないであろうバイナリをチェックインする場合には .` "-ko" を指定すると便利です。 .TP \fBadmin\fP [\fIrcs-options\fP] \fIfiles.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B rcs .br これは .BR rcs ( 1 ) で文書化されている .SM RCS の管理機構と対応する .B cvs のインタフェースです。 .` "cvs admin" は その全てのオプションと引数を単純に .B rcs コマンドに渡します。 なんのフィルタや変換も行いません。 しかしながら、このコマンドは再帰的に働きます。よって使用には 特別な注意を払わなければいけません。 .TP \fBcheckout\fP [\fBoptions\fP] \fImodules\fP.\|.\|. .I 以下が必要: リポジトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .BR co ", " get .br .IR modules で指定されたソースファイルのコピーを持つ 作業ディレクトリを作成します。他の大部分の .B cvs コマンドは作業ディレクトリに作用するものなので、これらを使う前に .` "cvs checkout" を実行しなくてはなりません。 .SP \fImodules\fP はいくつかのソースディレクトリとファイルを 集めたものに対するシンボル名 (それ自体は .` "modules" というモジュールとしてソースリポジトリに定義されています。 .BR cvs ( 5 ) 参照) か、あるいはリポジトリ中でのディレクトリまたはファイルへのパス名です。 .SP 指定した .I modules に応じて、 .B checkout は再帰的にディレクトリを作成して適切なソースファイルで満たします。 その後はいつでも、(他のソフトウェア開発者達がソースの彼らの分のコピーを 編集しているかどうかを気にすることなく) これらのソースファイルを編集したり、 他の人によってソースリポジトリに行われた新しい変更を取り込むために これらを更新 (update) したり、 .SM RCS あなたの作業を恒久的な変更としてリポジトリに 登録 (commit) することができます。 .SP .B checkout はディレクトリの作成に使われることに注意して下さい。 作成されるディレクトリのトップレベルは常に .B checkout が起動されたディレクトリに追加され、そして通常、指定された .IR module と同じ名前を持ちます。 .I module がエイリアスの場合は、作成されたサブディレクトリは違う名前を持つかも しれませんが、それがサブディレクトリであること、そして .B checkout はファイルが私的な作業領域に取り出される際に各ファイルへの 相対パスを表示すること (全体に作用する .B \-Q オプションを指定していなければ) は当てにできます。 .SP すでに以前の .B checkout で作成されているディレクトリで .` "cvs checkout" を実行することも許されています。これは 以下で説明する .B update コマンドに .B \-d オプションを指定するのと同じ効果を持ちます。 .SP .` "cvs checkout" で使える .I options は以下の標準のコマンドオプションです。 .BR \-P ", " \-f ", " .BI \-k " kflag" \&, .BR \-l ", " \-n ", " \-p ", " .BR \-r .IR tag ", " .BI \-D " date"\c .SP これらに加えて、以下の特別のコマンドオプションを .BR checkout で使うことができます: .SP .B \-A オプションで sticky なタグ、日付または .B \-k オプションをリセットできます。(作業ファイルを \fB\-r\fP, \fB\-D\fP, \fB\-k\fP オプションのいずれかを使って取り出すと、 \fBcvs\fP は対応するタグ、日付、\fIkflag\fP を記録して以降の 更新 (update) でそれを使い続けます。 \fB\-A\fP オプションを使って \fBcvs\fP に それらの指定を忘れさせ、ファイルの ``head'' バージョンを取り出します)。 .SP .BI \-j " branch" オプションはベースとなったリビジョンと、そこから変更された結果の リビジョンとの差分をマージします (例えば、もしタグがブランチを 指しているときは、 .B cvs は、そのブランチで行われた全ての変更を作業ファイルにマージします)。 .SP 2 つの \fB-j\fP オプションを指定すると、 .B cvs は 2 つの各々のリビジョン間での変更をマージします。 これは特定の差分を作業ファイルから ``削除'' するために使うことが できます。 .SP 加えて、各 \fB-j\fP オプションをブランチで使う場合に必要であれば 日時指定を加えることができ、選択するリビジョンを指定した日時以内に 制限できます。 日時を加える場合はタグにコロン (:) を付けて指定します。 例としては .` "cvs import" でローカルな変更と衝突する部分のあるソースを import するときに 実行するように指示されるコマンドがあります: .SP .in +1i .ft B .nf example% cvs checkout -jTAG:yesterday -jTAG module .fi .ft P .in -1i .SP .B \-N オプションと .` "\-d \fIdir\fP" を指定することで作業ディレクトリでモジュールのパスが短縮されるのを 防げます。(通常、明示的に対象ディレクトリを指定すると \fBcvs\fP は なるべくパスが短くなるようにします。) .SP .B \-c オプションで、作業ディレクトリのファイルやディレクトリに作成や変更を 行う代わりに、モジュールファイルをソートしたものを標準出力にコピー します。 .SP .BI \-d " dir" オプションで、モジュール名ではなく、 .I dir で指定した名前のディレクトリを作業ファイルのために作成します。 \fB\-N\fP を一緒に指定しない場合は、\fIdir\fP の下に作成されるパスは 可能な限り短くなります。 .SP .B \-s オプションを使って .B \-s オプションでモジュールファイルに格納されたモジュール単位の ステータス情報を表示します。 .TP \fBcommit\fP [\fB\-lnR\fP] [\fB\-m\fP '\fIlog_message\fP' | \fB\-f\fP \fIfile\fP] [\fB\-r\fP \fIrevision\fP] [\fIfiles.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B ci .br 作業ディレクトリでの変更を共有のソースリポジトリに組み込むにときには .` "cvs commit" を使います。 .SP コミットする対象となる \fIfiles\fP を指定しない場合、現在の 作業ディレクトリ中の全ファイルが調べられます。 .B commit はあなたが本当に変更したファイルだけを慎重にリポジトリで変更します。 デフォルトでは (または明示的に .B \-R オプションを指定した場合)、サブディレクトリのファイルも 調べられ、もし変更されていればコミットされます。 .B \-l オプションで現ディレクトリのみ .B コミット するように制限できます。 変更されていなくても強制的にファイルをコミットしたい場合があるかも しれません。 これは .B \-f フラグで可能で、これは同時に再帰も抑止します (もちろん .B \-R で再帰するようにできます)。 .SP .B commit は選択されたファイルがソースリポジトリの現リビジョンに対して 最新であることを確認します。 もし選択されたファイルのいずれかが まず .` "cvs update" で最新にされなければならないなら、そこで通知してコミットせずに終ります。 .B commit は .B update コマンドを呼び出しません。update すべきときであるかどうかの判断は ユーザにゆだねられます。 .SP 全てがうまくいくと、ログメッセージを入力するためにエディタが 呼び出されます。ログメッセージは一つかそれ以上のログを取る プログラムに書き込まれて .SM RCS ソースリポジトリのファイルに置かれます。 代わりにコマンドラインで .B \-m オプションと共にログメッセージを指定し、 エディタの呼び出しを抑制することができます。また .B \-F オプションで引数の \fIfile\fP にログメッセージが含まれていることを 指示することもできます。 .SP .B \-r オプションで特定のシンボリックまたは番号で指定される .SM RCS ファイル中のリビジョンとしてコミットできます。 例えば、全ファイルを .SM RCS リビジョンの ``3.0'' に上げる (変更されていないものも含めて) には、以下のようにします: .SP .in +1i .ft B .nf example% cvs commit -r3.0 .fi .ft P .in -1i .SP .B cvs はメインの幹上のリビジョン (ドットが 1 つのリビジョン) へのコミットのみ 許します。 しかしながら、 .B \-r オプションでブランチ上のリビジョン (偶数個のドットをもつリビジョン) へ コミットすることもできます。 ブランチとなるリビジョンを作成するには、通常 .BR rtag " または " tag コマンドの .B \-b オプションを使います。 その後、 .BR checkout " または " update のいずれかでソースのベースを新しく作成したブランチにすることができます。 それ以降、それらの作業ファイルで行われた全ての .B commit される変更点は自動的にブランチのリビジョンに追加され、 それによって主たる開発ラインが混乱させられることはありません。 例をあげると、製品のバージョン 1.2 へのパッチを作成しなければ ならなくなったとすると、バージョン 2.0 がすでに開発中だったとしても、 以下のようにできます: .SP .in +1i .ft B .nf example% cvs rtag -b -rFCS1_2 FCS1_2_Patch product_module example% cvs checkout -rFCS1_2_Patch product_module example% cd product_module [[ hack away ]] example% cvs commit .fi .ft P .in -1i .SP 極めて実験的なソフトウェアを開発しているとして、 前の週にチェックアウトしたなんらかのリビジョンをベースにしていると します。 あなたのグループの別の人がこのソフトウェアであなたと一緒に作業したいが、 主たる開発ラインの邪魔はしたくないと考えたなら、あなたはあなたの 変更点を新しいブランチにコミットすると良いでしょう。 すると別の人はあなたの実験的な変更をチェックアウトして .B cvs の衝突解決機能を最大限に利用することができます。 シナリオは以下のようになります: .SP .in +1i .ft B .nf example% cvs tag -b EXPR1 example% cvs update -rEXPR1 [[ hack away ]] example% cvs commit .fi .ft P .in -1i .SP 別の人は単純に .` "cvs checkout -rEXPR1 whatever_module" とすれば実験的な変更を採り入れてあなたと作業できるようになります。 .TP \fBdiff\fP [\fB\-kl\fP] [\fIrcsdiff_options\fP] [[\fB\-r\fP \fIrev1\fP | \fB\-D\fP \fIdate1\fP] [\fB\-r\fP \fIrev2\fP | \fB\-D\fP \fIdate2\fP]] [\fIfiles.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: なにも変更しません。 .br 作業ディレクトリのファイルとソースリポジトリのリビジョンを .` "cvs diff" コマンドで比較できます。もし特定のリビジョンを指定しなければ、 ベースにしたリビジョンと比較されます。 標準の .B cvs コマンドのオプション .B \-r で比較の対象となるリビジョンを指定することもできます。 最後に、 .B \-r を 2 回 使うと、リポジトリの 2 つのリビジョン間の差分を取ることができます。 過去のリビジョンとの差分を取るために .B \-D オプションを指定することもできます。 .B \-r と .B \-D オプションは常に指定された中で 2 つまでを組み合わせられます。 .SP 他の使用可能なオプションについては .BR rcsdiff ( 1 ) を参照して下さい。 .SP ファイルを何も指定しないと、 .B diff は現ディレクトリ (そして、標準オプション .BR \-l を指定していなければ そのサブディレクトリ) の全てのファイルについて、 ソースリポジトリの対応するリビジョンと異なっているもの (つまり .I あなたが 変更したファイル) または指定されたリビジョンと 異なっているものについて、その差分を表示します .TP \fBexport\fP [\-\fBf\|lNnQq\fP] \fB\-r\fP \fIrev\fP\||\|\fB\-D\fP \fIdate\fP [\fB\-d\fP \fIdir\fP] [\fB\-k\fP \fIkflag\fP] \fImodule\fP.\|.\|. .I 以下が必要: リポジトリ。 .br .I 以下を変更: 現ディレクトリ。 .br このコマンドは .` "cvs checkout" の一種です。 \fBcvs\fP の管理ディレクトリを持たない \fImodule\fP のソースのコピーが必要なときに使います。 例えば、サイト外にソースを出す準備をするために .` "cvs export" を使うことができます。 このコマンドでは日付またはタグを指定することが \fI必要\fP です。 (\fB\-D\fP または \fB\-r\fP によって)。それによって出荷したソースを 確実に再構成できるようになります。 .SP 標準でないオプションは .` "\-d \fIdir\fP" (ソースをディレクトリ \fIdir\fP に書き込みます) と .` "\-N" (モジュールパスを短縮しません) のみです。 これらは .` "cvs checkout" の同名のオプションと同じ意味を持ちます。 .SP .B export が使われるときは .B \-kv オプションが有用です。 これによって .SM RCS キーワードが、どこか別のサイトで .B import が行われたときにリビジョン情報が失われないような形に展開されるように なります。 他の \fIkflag\fP を .` "cvs export" で使用することもできます。その説明は .BR co ( 1 ) にあります。 .TP \fBhistory\fP [\fB\-\fP\fIreport\fP] [\fB\-\fP\fIflags\fP] [\fB\-\fP\fIoptions args\fP] [\fIfiles\fP.\|.\|.] .I 以下が必要: .` "$CVSROOT/CVSROOT/history" ファイル。 .br .I 以下を変更: 何も変更しません。 .br \fBcvs\fP はヒストリファイルを管理しており、各 \fBcheckout\fP, \fBcommit\fP, \fBrtag\fP, \fBupdate\fP, \fBrelease\fP コマンドの使用を記録します。 .` "cvs history" を使って、この情報を色々なフォーマットで表示することができます。 .SP .I 警告: .` "cvs history" は .` "\-f", .` "\-l", .` "\-n", .` "\-p" を .SM 共通の COMMAND OPTIONS\c \&での説明とは異なる意味に使用します。 .SP いくつかのオプション (上で \fB\-\fP\fIreport\fP となっている部分) は どんな種類のレポートを生成するかを制御します: .TP 1i .B \ \ \ \ \ \ \-c 今までの各 \fBcommit\fP (つまりリポジトリの変更) についてレポートします。 .TP 1i \fB\ \ \ \ \ \ \-m\fP \fImodule\fP 特定の \fImodule\fP についてレポートします。(コマンドラインで複数の \fB\-m\fP を指定できます。) .TP 1i .B \ \ \ \ \ \ \-o チェックアウトされたモジュールについてレポートします。 .TP 1i .B \ \ \ \ \ \ \-T 全てのタグについてレポートします。 .TP 1i \fB\ \ \ \ \ \ \-x\fP \fItype\fP 特定のレコードタイプ \fIX\fP のセットを \fBcvs\fP ヒストリから 取り出します。タイプは 1文字で表され、組み合わせて指定できます。 以下のコマンドは単一のレコードタイプを持ちます: \fBcheckout\fP (タイプ `O')、 \fBrelease\fP (タイプ `F')、\fBrtag\fP (タイプ `T')。 \fBupdate\fP は 4つのレコードタイプのうちの 1つになります: `W' は 作業用のファイルのコピーが update で (それがリポジトリから無くなって いたために) 削除された場合です; `U' は作業ファイルがリポジトリから コピーされた場合です; `G' は必要なマージが無事に終った場合です; 'C' は マージが必要だが衝突が検出された場合 (手動でのマージが必要な場合) です。 また、\fBcommit\fP では 3つのレコードタイプのうちの 1つになります: `M' はファイルが変更された場合; `A' はファイルが最初に追加された場合; `R' はファイルが削除された場合です。 .TP 1i .B \ \ \ \ \ \ \-e 全て (全レコードタイプ); 以下を指定するのと等価です。 .` "\-xMACFROGWUT" .TP 1i \fB\ \ \ \ \ \ \-z\fP \fIzone\fP ヒストリレコードを出力する際に .I zone で指定されたタイムゾーンを使います。 .B LT というゾーン名はローカルタイムの意味になります。 数値によるオフセットは時分での UTC との時差を意味します。 例えば、 .B +0530 は 5 時間と 30 分だけ UTC より前 (つまり東側) の意味になります。 .PP .RS .5i \fB\-\fP\fIflags\fP と書かれた部分のオプションは、レポートする範囲を絞ります。 引数の指定はありません。 .RE .TP 1i .B \ \ \ \ \ \ \-a 全てのユーザのデータを表示します (デフォルトでは .` "cvs history" を実行しているユーザのみのデータを表示します)。 .TP 1i .B \ \ \ \ \ \ \-l 最後の変更のみ表示します。 .TP 1i .B \ \ \ \ \ \ \-w .` "cvs history" が実行されているのと同じ作業ディレクトリから行われた変更に関する レコードのみを表示します。 .PP .RS .5i \fB\-\fP\fIoptions args\fP と書かれた部分のオプションは引数に 基づいてレポート範囲を絞ります: .RE .TP 1i \fB\ \ \ \ \ \ \-b\fP \fIstr\fP 文字列 \fIstr\fP をモジュール名、ファイル名、リポジトリパスの いずれかに含むレコードに戻って表示します。 .TP 1i \fB\ \ \ \ \ \ \-D\fP \fIdate\fP \fIdate\fP 以降のデータを表示します。 .TP 1i \fB\ \ \ \ \ \ \-p\fP \fIrepository\fP 特定のソースリポジトリのデータを表示します (複数の \fB\-p\fP オプションを同じコマンド行で指定できます)。 .TP 1i \fB\ \ \ \ \ \ \-r\fP \fIrev\fP 個々の RCS ファイルに現れるリビジョンが \fIrev\fP で指定されたリビジョンまたはタグ以降であるレコードを表示します。 各 .SM RCS ファイルについてリビジョンまたはタグが検索されます。 .TP 1i \fB\ \ \ \ \ \ \-t\fP \fItag\fP \fItag\fP で指定されるタグがヒストリファイルに最後に 追加されてからのレコードを表示します。 このオプションは、 .SM RCS ファイルではなくヒストリファイルのみ参照する点で 上記の \fB-r\fP フラグと異なり、 より高速です。 .TP 1i \fB\ \ \ \ \ \ \-u\fP \fIname\fP \fIname\fP で指定されるユーザのレコードを表示します。 .PP .TP \fBimport\fP [\fB\-\fP\fIoptions\fP] \fIrepository vendortag releasetag\fP.\|.\|. .I 以下が必要: リポジトリ、ソース配布物のディレクトリ。 .br .I 以下を変更: リポジトリ。 .br .` "cvs import" を使うことで外部の供給元 (例えばソース・ベンダ) からのソース配布物 全体をあなたのソースリポジトリのディレクトリへ取り込めます。 最初のリポジトリの作成と、外部の供給元からのモジュールへの 大規模な更新の両方にこのコマンドを使うことができます。 .SP 引数 \fIrepository\fP で CVS ルートディレクトリ下のリポジトリ用 ディレクトリ名 (またはディレクトリへのパス) を与えます。 もしディレクトリが存在しないなら、\fBimport\fP が作成します。 .SP あなたのソースリポジトリで (前回の \fBimport\fP から) 変更された ソースへの更新に \fBimport\fP を使った場合、開発の 2 本のブランチで 衝突しているファイルについて警告します。 \fBimport\fP が指示するように、 .` "cvs checkout -j" を使って差分を調整できます。 .SP デフォルトでは、ある種のファイル名が .` "cvs import" で無視されます: .SM CVS 管理、または他の一般的なソース管理システムに関連する名前; パッチファイル、オブジェクトファイル、アーカイブファイル、 エディタのバックアップファイルのための一般的な名前; そして雑多なユーティリティの加工品であることを示すその他の名前。 無視されるファイルのリストの最新については、 (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SP 外部からのソースは第一レベルの .SM RCS ブランチ、デフォルトでは .` "1.1.1" に保存されます。 以降の更新は このブランチのリーフになります。 例えば、最初に import したソース集合からのファイルはリビジョン .` "1.1.1.1" になり、 次の import による更新でファイルはリビジョン .` "1.1.1.2" になり、以下同様に続きます。 .SP 最低で 3 つの引数が必要です。ソースの集合を識別するために \fIrepository\fP が必要です。\fIvendortag\fP はブランチ全体を示す タグになります (例えば .` "1.1.1" と対応します)。 .` "cvs import" を実行する度にリーフとしてできるファイルを 識別するために少なくとも一つの \fIreleasetag\fP も指定しなければ なりません。 .SP .B cvs の標準のコマンドオプションのうちの 1 つ \fB\-m\fP が利用可能です: ログメッセージを \fB\-m\fP で指定しないと、(\fBcommit\fP でのように) メッセージを 入力できるようにエディタが起動されます。 .SP さらに 3 つの特別なオプションがあります。 .SP .` "\-d" を使って、各ファイルの最終更新日時がチェックインの日付と時刻として 使われるよう指示できます。 .SP .` "\-b \fIbranch\fP" を使って第一レベルのブランチを .` "1.1.1" 以外に指定できます。 .SP .` "\-I \fIname\fP" を使って \fBimport\fP 中に無視されるべきファイル名を指定できます。 このオプションは繰り返して指定できます。 いかなるファイルも無視されない (デフォルトで無視されるものでも) ようにするには、 .` "\-I !" と指定します。 .TP \fBlog\fP [\fB\-l\fP] \fIrlog-options [files\fP\|.\|.\|.] .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 何も変更しません。 .br .I 同義語: .B rlog .br \fIfiles\fP のログ情報を表示します。 .` "cvs log" は .SM RCS ユーティリティの \fBrlog\fP を呼び出します。 .BR rlog ( 1 ) で説明されている全てのオプションが使用できます。 \fBrlog\fP のオプションの中でも有用なものとしては、以下のものがあります: ヘッダ (タグの定義を含むが、ログの大部分は省略される) のみ表示する \fB\-h\fP ; 特定のリビジョンまたはリビジョンの範囲でログを選択する \fB\-r\fP; そして特定の日時または時刻の範囲を選択する \fB\-d\fP が あります。完全な説明は .BR rlog ( 1 ) を参照して下さい。 このコマンドは .B \-l オプションが指定されていなければ、デフォルトで再帰的に働きます。 .TP \fBrdiff\fP [\fB\-\fP\fIflags\fP] [\fB\-V\fP \fIvn\fP] [\fB\-r\fP \fIt\fP|\fB\-D\fP \fId\fP [\fB\-r\fP \fIt2\fP|\fB\-D\fP \fId2\fP]] \fImodules\|.\|.\|.\fP .I 以下が必要: リポジトリ。 .br .I 以下を変更: 何も変更しません。 .br .I 同義語: .B patch .br 2 つのリリース間の .BR patch ( 1 ) ファイルを Larry Wall 氏のフォーマットで作成します。それは直接 .B patch プログラムに入力できるもので、古いリリースを新しいリリースに更新する ために使えます。 (これは直接リポジトリを参照するため、これに先立って .BR checkout する必要のない、数少ない \fBcvs\fP コマンドのうちの 1 つです。) 差分出力は標準出力デバイスに送られます。 (標準の \fB\-r\fP と \fB\-D\fP オプションを 使って) 1 つまたは 2 つのリビジョンまたは日時の任意の組合せを指定できます。 もしリビジョンまたは日時が 1 つしか指定されないと、 そのリビジョンまたは日時とその時点での .SM RCS ファイルの ``head'' リビジョンの差分がパッチファイルに反映されます。 .SP もしソフトウェアリリースへの影響が複数ディレクトリにわたるなら、 古いソースにパッチを当てる際、 .B patch が他のディレクトリに置かれたファイルを見つけられるように、 .B \-p オプションを .B patch コマンドに指定する必要があるかもしれません。 .SP \fB\-V\fP \fIvn\fP オプションを使うと、 .SM RCS のキーワードが \fIvn\fP で指定された .SM RCS のバージョンに合わせて展開されます (展開フォーマットは .SM RCS のバージョン 5 で変更されました)。 .SP 標準オプションの \fIflags\fP \fB\-f\fP、\fB\-l\fP が このコマンドで利用可能です。他にもいくつかの 特別なオプションフラグがあります: .SP .B \-s オプションを指定すると、パッチ出力が作られません。 代わりに、2 つのリリース間で変更または追加されたファイルの要約が 標準出力デバイスに送られます。 これは、例えば、2 つの日付またはリビジョンの間で、どのファイルが 変更されたかを調べるのに便利です。 .SP .B \-t オプションを指定すると、新しい方から 2 つのリビジョンの差分が 標準出力デバイスに送られます。これはファイルへの最後の変更が 何であったかを知るのに最適です。 .SP .B \-u オプションを指定すると、パッチ出力として新しい ``unidiff'' フォーマットを使って文脈差分とします。 .SP 希望するなら、 .B \-c を使って明示的に .` "diff \-c" 形式の文脈差分を指定できます (こちらがデフォルトです)。 .TP \fBrelease\fP [\fB\-dQq\fP] \fImodules\fP\|.\|.\|. .I 以下が必要: 作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ、ヒストリログ。 .br このコマンドは .` "cvs checkout' の効果を安全にキャンセルすることになっています。 .B cvs はファイルをロックしないので、厳密にはこのコマンドを使用する必要は ありません。 単に作業ディレクトリを削除しても構いません。 しかし忘れているかも知れない変更を失う危険があり、そして .B cvs ヒストリファイルには捨ててしまったチェックアウトの記録は残りません。 .SP .` "cvs release" を使うとこれらの問題を回避できます。 このコマンドは以下の点をチェックします: コミットされていない変更が存在しないこと、 \fBcvs\fP の作業ディレクトリの直上または内部から実行していること、 ファイルが記録されたリポジトリがモジュールデータベースに 定義されたリポジトリと同じであること。 .SP これらの条件が全て真なら .` "cvs release" は その実行記録 (意図的にチェックアウトを削除した証拠) を .B cvs のヒストリログに残します。 .SP \fB\-d\fP フラグを使ってソースの作業用コピーを \fBrelease\fP が 成功したら削除するように指示できます。 .TP \fBremove\fP [\fB\-lR\fP] [\fIfiles\|.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .BR rm ", " delete .br このコマンドを使って、\fIfiles\fP をソースリポジトリから削除する つもりであることを宣言できます。大部分の .B cvs コマンドがそうであるように、 .` "cvs remove" は作業ディレクトリのファイルに作用し、リポジトリには直接には 作用しません。安全機構として、まず指定するファイルを作業ディレクトリ から削除することも必要になっています。 .SP リポジトリに .BR commit で変更を反映するまで、ファイルは実際には削除されません。 commit した時点で、ソースリポジトリの対応する .SM RCS ファイルが .` "Attic" ディレクトリ (これもソースリポジトリの中です) に .I 移動 されます。 .SP このコマンドはデフォルトで再帰的になっており、 物理的に削除された全てのファイルが次の .BR commit での削除されるようにスケジュールします。 .B \-l オプションを使うか、または実際に削除したいファイルのみを 指定することで、この再帰を抑制できます。 .TP \fBrtag\fP [\fB\-f\|alnRQq\fP] [\fB\-b\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP | \fB\-D\fP \fIdate\fP] \fIsymbolic_tag\fP \fImodules\|.\|.\|.\fP .I 以下が必要: リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B rfreeze .br このコマンドを使って、リポジトリ中の特定の、明示的に 指定されたソースバージョンにシンボリックタグを割り当てられます。 .` "cvs rtag" はリポジトリの内容に直接に作用します (これに先立って .BR checkout する必要はありません)。 作業ディレクトリの内容に基づいて タグを付けるバージョンを選択するには、代わりに .` "cvs tag" を使います。 .SP 一般に、タグ (しばしばソフトウェア配布物のシンボリックな 名前でもある) は削除されるべきではありません。 しかし完全に廃れてしまったシンボリックな名前を削除する場合 (例えば、 アルファリリースの場合など) の手段として、 .B \-d オプションが用意されています。 .SP .` "cvs rtag" はすでに存在するタグを移動しません。 しかしながら、\fB\-F\fP オプションが指定されると .` "cvs rtag" はそのファイルに既に存在する \fIsymbolic_tag\fP のインスタンスを 新しいリポジトリのバージョンへ移動します。 \fB\-F\fP オプションが無い場合、 .` "cvs rtag" を使ってすでにそのファイルに存在するタグを付けようとすると、 エラーメッセージが出力されます。 .SP \fB-b\fP オプションはタグを ``ブランチ'' タグにし、並行の、 独立した開発を可能にします。 これは以前にリリースしたソフトウェア配布物へのパッチを作成するのに 最も有用です。 .SP 標準の \fB\-r\fP と \fB\-D\fP オプションを使って、すでに特定の タグを含んでいるファイルのみにタグを付けることができます。 この方法はタグの名前を変えるのに使えるでしょう: 古いタグで指定されるファイルにのみタグを付け、 それから古いタグを削除すれば、確実に同じファイルで古いタグを 新しいタグで置き換えることができます。 .SP .B rtag はデフォルトで再帰的に実行し、引数で指定した \fImodules\fP の全てのサブディレクトリにタグをつけます。 この動作を トップレベルのディレクトリに制限するには標準の \fB\-l\fP オプションを 指定します。 また明示的に再帰を指定するには \fB\-R\fP を指定します。 .SP モジュールデータベースではタグが指定されたときに必ず実行される プログラムを指定できます。 よくある使い方は、興味を持っている グループに電子メールを送るというものです。もしそのプログラムを バイパスしたい場合は、標準の \fB\-n\fP オプションを使います。 .SP .B \-a オプションを使うと .` "Attic" の中の指定されたタグを含む削除されたファイルを .B rtag の対象にできます。 タグはそれらのファイルから削除され、開発の進展につれての シンボリックタグの再利用に便利になります (そしてファイルは以降の 配布物から削除されます)。 .TP \fBstatus\fP [\fB\-lRqQ\fP] [\fB\-v\fP] [\fIfiles\fP\|.\|.\|.] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: 何も変更しません。 .br \fIfiles\fP の現在の状態について、``sticky'' なタグ、 日付、\fB\-k\fP オプションを含む、ソースリポジトリに関する 簡潔なレポートを表示します。(``sticky'' オプションはリセットするまで .` "cvs update" がどう働くかを規定します。 .` "cvs update \-A\|.\|.\|." の説明を参照して下さい。) .SP このコマンドを用いて、作業用ソースディレクトリでの .` "cvs update" による潜在的な影響を予測することもできます。 もし \fIfiles\fP を明示的に指定しないと、\fBcvs\fP が 作業ディレクトリに置いた全てのファイルについてレポートが 表示されます。 この検索の範囲を (そのサブディレクトリではなく) カレントディレクトリ だけに制限するには、標準の \fB\-l\fP オプションフラグを使います。 \fB\-R\fP オプションによって、明示的に再帰的なステータスレポートを 指定することもできます。 .SP .B \-v オプションを指定すると .SM RCS ファイルのシンボリックタグも表示されるようになります。 .TP \fBtag\fP [\fB\-lQqR\fP] [\fB\-F\fP] [\fB\-b\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP | \fB\-D\fP \fIdate\fP] [\fB\-f\fP] \fIsymbolic_tag\fP [\fIfiles\fP\|.\|.\|.\|] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B freeze .br このコマンドは、作業ディレクトリに最も近いリポジトリのバージョンに シンボリックタグをつけるために使います。\fBrtag\fP を 使ったときのように、タグはリポジトリに直接つけられます。 .SP タグの使い方の一つは、プロジェクトのソフトウェア凍結日が やってきたときに開発中のソースの ``snapshot'' を記録するというものです。 凍結した日の後でバグが修正されたら、それらの変更されたリリースの 一部となるソースのみに再度タグをつける必要があります。 .SP シンボリックタグはどのファイルのどのリビジョンがソフトウェア配布物を 作成する際に使われたかを恒久的に記録する意味があります。 .BR checkout , .B export , .B update コマンドは、タグをつけたリリースと全く同じものを、リリースのタグが つけられて以降にファイルが変更、追加、削除されたかどうかを気にする ことなく、将来のいつでも取り出すことを可能にします。 .SP 標準の \fB\-r\fP と \fB\-D\fP オプションを使って、すでに特定の タグを含んでいるファイルのみにタグを付けることができます。 この方法はタグの名前を変えるのに使えます。 すなわち、 古いタグで指定されるファイルにのみタグを付け、 それから古いタグを削除すれば、確実に同じファイルで古いタグを 新しいタグで置き換えることができます。 .SP \fB\-r\fP または \fB\-D\fP フラグに加えて \fB\-f\fP フラグを 指定すると、コマンドラインで指定したファイルで古いタグを 持っていないか指定された日時に存在しなかったものにもタグを 付けます。 .SP デフォルト (\fB\-r\fP または \fB\-D\fP フラグが無い場合) では、 バージョンは明示的に指定されるのではなく、暗黙のうちに作業ファイルの ヒストリの \fBcvs\fP レコードから取られます。 .SP .` "cvs tag \-d \fIsymbolic_tag\fP\|.\|.\|." とすると、指定したシンボリックタグが追加されるのではなく .I 削除 されます。\fI警告\fP: タグを削除する前にその根拠をしっかり確認して下さい。 これは効率的に一部の履歴情報を捨てますが、後になってその情報が重要だったと 判明するかも知れないからです。 .SP .` "cvs tag" はすでに存在するタグを移動しません。 しかしながら、\fB\-F\fP オプションが指定されると .` "cvs tag" はそのファイルに既に存在する \fIsymbolic_tag\fP のインスタンスを 新しいリポジトリのバージョンへ移動します。 \fB\-F\fP オプションが無い場合、 .` "cvs tag" を使って すでにそのファイルに存在するタグを付けようとすると エラーメッセージが出力されます。 .SP \fB-b\fP オプションはタグを ``ブランチ'' タグにし、並行して、 独立した開発を可能にします。 これは以前にリリースしたソフトウェア配布物へのパッチを作成するために 最も有効です。 .SP 通常、 .B tag はサブディレクトリに渡って再帰的に実行します。これは 標準の \fB\-l\fP オプションを使って抑制できます。 明示的に再帰を指定するには \fB\-R\fP を使います。 .TP \fBupdate\fP [\fB\-Adf\|lPpQqR\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP|\fB\-D\fP \fIdate\fP] \fIfiles\|.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br あなたが共有のリポジトリから私的なソースのコピーを作成するために .B checkout を実行した後も、別の開発者は共有のソースへの変更を続けるでしょう。 時々、開発過程で都合のいいときに、作業ディレクトリ内から .B update コマンドを使うことで、 最後に .B checkout または .BR update してからソースリポジトリに登録された変更を、あなたの変更と 融合させることができます。 .SP .B update は進行状況をファイルごとに 1 行表示することで知らせ続けます。 各行の先頭には以下の .` "U A R M C ?" のいずれか 1 文字があり、ファイルの状態を示しています: .TP 1i \fBU\fP \fIfile\fP file はリポジトリに関して \fI最新に\fP なりました。 これはリポジトリには存在するがあなたのソースには無いもの、 およびあなたは変更していないけれどもリポジトリの 最新リビジョンでは無いものに関して行われます。 .TP 1i \fBA\fP \fIfile\fP file はソースのあなたの私的なコピーに \fI追加\fP されたもので、 file に対して .` "cvs commit" を実行したときに .SM RCS ソースリポジトリに追加されます。 これは当該ファイルを commit する必要があるという助言です。 .TP 1i \fBR\fP \fIfile\fP これはソースのあなたの私的なコピーから file が \fI削除\fP されており、 file に対して .` "cvs commit" を実行すると .SM RCS ソースリポジトリから削除されることを示します。 これは当該ファイルを commit する必要があるという助言です。 .TP 1i \fBM\fP \fIfile\fP あなたの作業ディレクトリの file は \fI変更\fP されています。 .` "M" は作業中のファイルについて 2 つの状態のうちの 1 つを示します: リポジトリ中の対応するファイルは変更されておらず、あなたのファイルは 最後に見たときのままになっている。 または、あなたのコピー同様 リポジトリのものも変更されているが、それらの変更は 衝突することなく無事にあなたの作業ディレクトリに \fI融合 (merge)\fP されました。 .TP 1i \fBC\fP \fIfile\fP \fIfile\fP へのあなたの変更とソースリポジトリからの変更との 融合を試みる間に \fI衝突 (conflict)\fP が検出されました。 現在 \fIfile\fP (あなたの作業ディレクトリのコピー) は .BR rcsmerge ( 1 ) コマンドを 2 つのバージョンに適用した出力になっています。 変更されていない あなたのファイルのコピーも作業ディレクトリに、 `\fB.#\fP\fIfile\fP\fB.\fP\fIversion\fP' という名前で置かれます。 ここで .I version は あなたの変更したファイルの出発点となった .SM RCS リビジョンです。 (ある種のシステムでは、 \& .` ".#" で始まるファイルは何日かアクセスされないと自動的に削除されるので 注意して下さい。もし元のファイルのコピーを取っておくつもりなら、 名前を変えておくのが良いでしょう。) .TP 1i \fB?\fP \fIfile\fP \fIfile\fP が あなたの作業ディレクトリにありますが、 ソースリポジトリのどれとも対応しておらず、 \fBcvs\fP が無視するファイルのリストにもありません (\fB\-I\fP オプションの説明を参照して下さい)。 .PP .RS .5i .SP .B \-A オプションを用いて sticky なタグ、日付、 .B \-k オプションをリセットできます。(\fB\-r\fP, \fB\-D\fP, \fB\-k\fP オプションの いずれかを使って作業ファイルのコピーを得ると、 \fBcvs\fP は対応するタグ、日付、\fIkflag\fP を記憶し、 以降の update で それを使い続けます。 \fB\-A\fP オプションを使って \fBcvs\fP にそれらの指定を忘れさせることで、ファイルの ``head'' バージョンを取り出します)。 .SP \fB\-j\fP\fIbranch\fP オプションは、変更結果のリビジョンと ベースにしたリビジョンの間での変更をマージします (例えば、もしタグがブランチを指しているなら、 .B cvs は、そのブランチで行われた全ての変更をあなたの作業ファイルにマージします)。 .SP 2 つの \fB-j\fP オプションを指定すると、 .B cvs は 2 つの それぞれのリビジョン間での変更をマージします。 これは特定の変更を作業ファイルから ``削除'' するのに使えます。 例えば、ファイル foo.c がリビジョン 1.6 をベースにしていて、 1.3 と 1.5 の間で行われた変更を削除したいなら、次のようにします: .SP .in +1i .ft B .nf example% cvs update -j1.5 -j1.3 foo.c # 順番に注意... .fi .ft P .in -1i .SP 加えて、各 \fB-j\fP オプションにはオプションで、ブランチと使う場合に、 日付指定を含めることが可能で、選択するリビジョンを指定した 日付の範囲内に制限できます。 オプションの日付はコロン (:) をタグに付けることで指定します。 .SP .in +1i .ft B .nf -jSymbolic_Tag:Date_Specifier .fi .ft P .in -1i .SP .B \-d オプションを使うと、もし作業ディレクトリに無いディレクトリが リポジトリにあれば作成します。(通常、update は作業ディレクトリに すでに登録されているディレクトリとファイルのみに働きます。) これは最初の \fBcheckout\fP 以降に作成されたディレクトリを 更新するのに有用です。しかし不幸にも副作用があります。 もし作業ディレクトリを作る際に慎重にリポジトリ中の特定の ディレクトリを除いた (モジュール名を使ったか明示的に必要な ファイルとディレクトリをコマンドラインで指定したかのいずれかで) とすると、 .B \-d で更新するとそれらの不要かも知れないディレクトリができてしまいます。 .SP \fB\-I\fP \fIname\fP を使うと、update の際、名前が \fIname\fP に符合する (作業ディレクトリの) ファイルを無視します。 コマンドラインで \fB\-I\fP を 2 回以上指定することで、 複数の無視するファイルを指定できます。 デフォルトで、\fBupdate\fP はあるパターンに名前がマッチするファイルを 無視します; 無視されるファイル名の最新リストについては、 (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SP いずれのファイルも無視しないようにするには .` "\-I !" を使います。 .SP 標準の \fBcvs\fP コマンドオプション \fB\-f\fP, \fB\-k\fP, \fB\-l\fP, \fB\-P\fP, \fB\-p\fP, \fB\-r\fP も \fBupdate\fP で使用可能です。 .RE .SH "関連ファイル" より詳細な .B cvs サポートファイルの情報については .BR cvs ( 5 ) を参照して下さい。 .LP .I ホームディレクトリのファイル: .TP \&.cvsrc .B cvs の初期化ファイル。このファイルの行は各 .B cvs コマンドのデフォルトのオプションの指定に使えます。例えば .` "diff \-c" と言う行は .` "cvs diff" に対して、コマンドラインで渡されたオプションに、常に .B \-c オプションが加えられて渡されることを指定します。 .TP \&.cvswrappers リポジトリのファイル CVSROOT/cvswrappers で指定されている -ものに加えて使用されるラッパーを指定します。 +ものに加えて使用されるラッパを指定します。 .LP .I 作業ディレクトリのファイル: .TP CVS \fBcvs\fP 管理ファイルのディレクトリ。 .I 削除してはいけません。 .TP CVS/Entries 作業ディレクトリのファイルのリストと状態。 .TP CVS/Entries.Backup .` "CVS/Entries" のバックアップ。 .TP CVS/Entries.Static フラグ: .` "cvs update" でそれ以上エントリを追加しません。 .TP CVS/Root チェックアウトしたときのリポジトリ ( .SM CVSROOT ) 位置へのパス名。 .SM CVSROOT 環境変数が設定されていない場合、このファイルが代わりに使用されます。 このファイルの内容と .SM CVSROOT 環境変数が異なっていると警告メッセージが出されます。 .SM CVS_IGNORE_REMOTE_ROOT 環境変数が設定されていると、このファイルは上書きされることがあります。 .TP CVS/Repository ソースリポジトリ中の対応するディレクトリへのパス名。 .TP CVS/Tag ディレクトリ毎の ``sticky'' なタグまたは日付情報を保持しています。 このファイルは .B \-r か .B \-D を .B checkout または .B update コマンドに指定して、ファイルが指定されなかったときに作成/更新されます。 .TP CVS/Checkin.prog .` "cvs commit" 時に実行するプログラム名。 .TP CVS/Update.prog .` "cvs update" 時に実行するプログラム名。 .LP .I ソースリポジトリ中のファイル: .TP $CVSROOT/CVSROOT リポジトリ全体の管理ファイルのディレクトリ。 .TP CVSROOT/commitinfo,v .` "cvs commit" のリクエストを選別するプログラムを登録します。 .TP CVSROOT/cvswrappers,v ファイルをリポジトリにチェックインそしてリポジトリから チェックアウトするときに使用される .B cvs -ラッパーコマンドを登録します。 -ラッパーはファイルまたはディレクトリが CVS で入出力される際に +ラッパコマンドを登録します。 +ラッパはファイルまたはディレクトリが CVS で入出力される際に 処理を行うことを可能にします。使い道はいろいろありますが、 その一つとして、C のファイルをチェックインする前に再フォーマットして、 リポジトリ中のコードの見た目を揃えるというものがあります。 .TP CVSROOT/editinfo,v .` "cvs commit" のログエントリの編集/確認用プログラムを登録します。 .TP CVSROOT/history \fBcvs\fP 処理のログファイル。 .TP CVSROOT/loginfo,v .` "cvs commit" のログエントリをパイプで渡すプログラムを登録します。 .TP CVSROOT/modules,v このリポジトリ中のモジュールを定義します。 .TP CVSROOT/rcsinfo,v .` "cvs commit" 操作中に使用するテンプレートへのパス名を登録します。 .TP CVSROOT/taginfo,v .` "cvs tag" と .` "cvs rtag" での確認/ログ採集のためのプログラムを登録します。 .TP MODULE/Attic 削除されたソースファイルのためのディレクトリ。 .TP #cvs.lock .SM RCS ソースリポジトリに微妙な変更を行っているときに .B cvs が作成するロックディレクトリ。 .TP #cvs.tfl.\fIpid\fP リポジトリの一時的なロックファイル。 .TP #cvs.rfl.\fIpid\fP 読みだしロック。 .TP #cvs.wfl.\fIpid\fP 書き込みロック。 .SH "環境変数" .TP .SM CVSROOT .B cvs ソースリポジトリのルートへのフルパス名 ( .SM RCS ファイルが保存されている場所) を指定します。 この情報は大部分のコマンドの実行で \fBcvs\fP から参照できなければなりません。 もし .SM CVSROOT が設定されていないか、それを上書き指定したい場合は、 コマンドライン上で与えることができます: .` "cvs \-d \fIcvsroot cvs_command\fP\|.\|.\|." もし \fBcvs\fP バイナリのコンパイル時に正しいパスが指定されているなら .SM CVSROOT を設定しなくて構いません。 .` "cvs \-v" でコンパイル時に指定されて組み込まれている全てのパス名が表示されます。 .TP .SM CVSREAD これがセットされていると、 .B checkout と .B update は作業ディレクトリのファイルを読みだし専用にするべく努力します。 これがセットされていないときは、デフォルトでは作業ファイルの 変更が許可されます。 .TP .SM RCSBIN .BR co ( 1 ) や .BR ci ( 1 ) といった .SM RCS のプログラムが置かれている場所へのフルパス名を指定します。 セットされないと、コンパイル時に設定された値が使用されます。 .` "cvs \-v" で表示される内容を参照して下さい。 .TP .SM CVSEDITOR .BR commit 中にログメッセージの記録に使われるプログラムを指定します。 設定されていないと、 .SM EDITOR 環境変数が代わりに使われます。 もし .SM EDITOR も設定されていないなら、デフォルトは .BR /usr/ucb/vi です。 .TP .SM CVS_IGNORE_REMOTE_ROOT この変数がセットされていると .B cvs は CVS/Root ファイル中のリモートのリポジトリへの参照を全て 無視します。 .TP .SM CVS_RSH .B cvs サーバを開始するときに使用するリモートシェルコマンドの 名前を決定します。 この変数が設定されていない場合は .` "rsh" が使用されます。 .TP .SM CVS_SERVER .B cvs サーバコマンドの名前を指定します。 この変数が設定されていない場合は .` "cvs" が使用されます。 .TP .SM CVSWRAPPERS .` "cvswrappers" スクリプトは、 リポジトリの .SM CVSROOT/cvswrappers とユーザのホームディレクトリの ~/.cvswrappers に -含まれるデフォルトのラッパーに加え、 +含まれるデフォルトのラッパに加え、 変数 .SM CVSWRAPPERS -を参照して、ラッパーファイルの名前を決定します。 +を参照して、ラッパファイルの名前を決定します。 .SH "作者" .TP Dick Grune .B comp.sources.unix にポストされ、1986年 12月のリリース volume6 に収められたオリジナルの .B cvs シェルスクリプト版の作者。 .B cvs の衝突を解決するアルゴリズムの大部分を作成しました。 .TP Brian Berliner .B cvs プログラム自身のコーディングとデザインを 1989年 4月に、Dick によるオリジナルをベースにして行いました。 .TP Jeff Polk Brian を助けて .B cvs のモジュールとベンダ・ブランチのサポートをデザインしました。 そして .BR checkin ( 1 ) シェルスクリプト ( .` "cvs import" の祖先) の作者でもあります。 .SH "関連項目" CVS の最も包括的なマニュアルは Per Cederqvist らによる Version Management with CVS です。 システムによっては、 .B info cvs コマンドで閲覧できたり、 cvs.ps (postscript)、cvs.texinfo (texinfo のソース)、cvs.html が 利用可能かもしれません。 .SP CVS の更新、ドキュメントに関するさらなる情報、 CVS 関連のソフトウェア、CVS の開発等については、下記をご覧ください: .in +1i .B http://www.cyclic.com .B http://www.loria.fr/~molli/cvs-index.html .in -1i .SP .BR ci ( 1 ), .BR co ( 1 ), .BR cvs ( 5 ), .BR cvsbug ( 8 ), .BR diff ( 1 ), .BR grep ( 1 ), .BR patch ( 1 ), .BR rcs ( 1 ), .BR rcsdiff ( 1 ), .BR rcsmerge ( 1 ), .BR rlog ( 1 ). .SH 日本語訳 野首 寛高(h-nokubi@nmit.mt.nec.co.jp): FreeBSD 用に翻訳 .br 酒井 淳嗣(sakai@jp.freebsd.org): FreeBSD 版の校正 diff --git a/ja/man/man1/perl.1 b/ja/man/man1/perl.1 index 845f6985ec..f16e794d1f 100644 --- a/ja/man/man1/perl.1 +++ b/ja/man/man1/perl.1 @@ -1,5933 +1,5933 @@ .rn '' }` .\" jpman %Id: perl.1,v 1.5 1997/10/11 07:57:22 horikawa Stab % ''' %RCSfile: perl.1,v %%Revision: 1.3.2.1 %%Date: 1997/10/12 08:11:42 % ''' ''' %Log: perl.1,v % ''' Revision 1.3.2.1 1997/10/12 08:11:42 jmg ''' MFC: spelling fixes ''' ''' Revision 1.4 1997/08/30 12:22:46 jmg ''' fix a few spelling changes ''' ''' Submitted by: Josh Gilliam ''' ''' Closes PR's: 4429, 4431-4438 ''' ''' PS: He has agreed to submit all contrib fixes back to the original author. ''' ''' Revision 1.3 1996/10/05 22:26:23 wosch ''' delete doubled words, e.g.: "the the" -> "the" ''' ''' Revision 1.2 1994/10/27 23:16:52 wollman ''' Convince Perl to that is is part of the system, as /usr/bin/perl (binary) ''' and /usr/share/perl (library). The latter was chosen as analogous to other ''' directories already present in /usr/share, like /usr/share/groff_font and ''' (particularly) /usr/share/mk. ''' .\" Revision 1.1.1.1 1994/09/10 06:27:36 gclarkii .\" Initial import of Perl 4.046 bmaked .\" .\" Revision 1.1.1.1 1993/08/23 21:29:37 nate .\" PERL! .\" ''' Revision 4.0.1.6 92/06/08 15:07:29 lwall ''' patch20: documented that numbers may contain underline ''' patch20: clarified that DATA may only be read from main script ''' patch20: relaxed requirement for semicolon at the end of a block ''' patch20: added ... as variant on .. ''' patch20: documented need for 1; at the end of a required file ''' patch20: extended bracket-style quotes to two-arg operators: s()() and tr()() ''' patch20: paragraph mode now skips extra newlines automatically ''' patch20: documented PERLLIB and PERLDB ''' patch20: documented limit on size of regexp ''' ''' Revision 4.0.1.5 91/11/11 16:42:00 lwall ''' patch19: added little-endian pack/unpack options ''' ''' Revision 4.0.1.4 91/11/05 18:11:05 lwall ''' patch11: added sort {} LIST ''' patch11: added eval {} ''' patch11: documented meaning of scalar(%foo) ''' patch11: sprintf() now supports any length of s field ''' ''' Revision 4.0.1.3 91/06/10 01:26:02 lwall ''' patch10: documented some newer features in addenda ''' ''' Revision 4.0.1.2 91/06/07 11:41:23 lwall ''' patch4: added global modifier for pattern matches ''' patch4: default top-of-form format is now FILEHANDLE_TOP ''' patch4: added $^P variable to control calling of perldb routines ''' patch4: added $^F variable to specify maximum system fd, default 2 ''' patch4: changed old $^P to $^X ''' ''' Revision 4.0.1.1 91/04/11 17:50:44 lwall ''' patch1: fixed some typos ''' ''' Revision 4.0 91/03/20 01:38:08 lwall ''' 4.0 baseline. ''' ''' .de Sh .br .ne 5 .PP \fB\\$1\fR .PP .. .de Sp .if t .sp .5v .if n .sp .. .de Ip .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. ''' ''' Set up \*(-- to give an unbreakable dash; ''' string Tr holds user defined translation string. ''' Bell System Logo is used as a dummy character. ''' .tr \(*W-|\(bv\*(Tr .ie n \{\ .ds -- \(*W- .if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch .if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch .ds L" "" .ds R" "" .ds L' ' .ds R' ' 'br\} .el\{\ .ds -- \(em\| .tr \*(Tr .ds L" `` .ds R" '' .ds L' ` .ds R' ' 'br\} .TH PERL 1 "\*(RP" .UC .SH 名称 perl \- 実用的抽出とレポートのための言語 .SH 書式 .B perl [options] filename args .SH 解説 .I perl は、任意のテキストファイルを走査し、そこから情報を取り出し、情報に基づ いたレポートを出力するために最適化されたインタプリタ言語です。 また、多くのシステム管理作業に適した言語でもあります。 .I perl は美しい (小さい、エレガント、最小) というよりは、むしろ実用的 (使いやすい、効率的、完全) であることをめざしています。 .I perl は、C, \fIsed\fR, \fIawk\fR, and \fIsh\fR, の最も良いところを 組み合わせてある (作者の意向としては、でありますが) ので、これらの言語に なじみのある人には、容易に使えるでしょう。 (言語歴史学者なら、\fIcsh\fR, Pascal, そして BASIC-PLUS の痕跡にさえも 気がつくでしょう。) 式の書式は、C のものに極めて似ています。 他の多くの UNIX ユーティリティと異なり、 .I perl は、データのサイズを勝手に制限するようなことはなく (メモリのある限りです)、 ファイル全体を一つの文字列として読み込んでしまえます。 再帰の深さには制限がありません。連想配列で使われるハッシュテーブルは、 パフォーマンスの低下を防ぐため、必要に応じて大きくなります。 .I perl は、大量のデータを非常に迅速に走査する洗練されたパターンマッチ テクニックを使います。 テキスト走査に最適化されてはいますが、 .I perl はバイナリデータも扱うこともできて、(dbm が使えるなら) 連想配列に似た dbm ファイルを作れます。 setuid .I perl スクリプトは、多くの馬鹿らしいセキュリティホールを防ぐデータフロー追跡 機構により、C のプログラムより安全です。 普通なら \fIsed\fR, \fIawk\fR, \fIsh\fR を使うような問題で、その能力を 越えていたり、もう少し速く走らせなければならなかったり、 くだらないことを C で書きたくないような場合に .I perl がぴったりです。 既存の .I sed や .I awk スクリプトを .I perl スクリプトにする変換プログラムもあります。 さあ、宣伝はこれで十分でしょう。 .PP まず始めに、 .I perl 次の場所からスクリプトを探します。 .Ip 1. 4 2 コマンドライン上の .B \-e スイッチで指定された行。 .Ip 2. 4 2 コマンドライン上で、最初に指定されたファイルの内容。 (#! の表記をサポートするシステムは、インタプリタをこうして起動します) .Ip 3. 4 2 標準入力から暗黙のうちに読み込まれます。これは、ファイル名の指定が一つ もない場合にだけ働きます。\*(-- .I 標準入力 スクリプトに引数を渡すには、スクリプト名として明示的に \- を 指定しなければなりません。 .PP スクリプトを見つけると、 .I perl は内部形式にコンパイルし、スクリプトが文法的に正しければ それを実行します。 .Sh "オプション" 注意: 最初にこのセクションを読んでも意味がわからないかもしれません。 簡単なリファレンスとして前半部分になっています。 .PP 一文字オプションは、次に続くオプションとくっつけてもかまいません。 #! 構造を使うスクリプトを起動する際には一つの引数しか許されないの で、特に便利です。 例: .nf .ne 2 #!/usr/bin/perl \-spi.bak # \-s \-p \-i.bak と同じ .\|.\|. .fi 以下のオプションがあります: .TP 5 .BI \-0 数字 レコードセパレータ ($/) を 8 進数で指定します。 数字がないと、ヌルキャラクタがセパレータになります。 他のコマンドラインスイッチは、前に置くか、もしくは数字の後に続けます。 例えば、ヌル文字を終端としたファイル名を表示可能なバージョンの .I find なら、このように書けます。 .nf find . \-name '*.bak' \-print0 | perl \-n0e unlink .fi 00 は特殊な値で、 .I perl はファイルをパラグラフモードで読み込みます。 0777 という値を使うと、この値の文字はないので、ファイル全体を 読み込みます。 .TP 5 .B \-a .B \-n や .BR \-p オプションと一緒に用いて、オートスプリットモードを ON にします。 .B \-n や .BR \-p オプションで自動的に生成される while ループの内側の 最初のところで、@F 配列に対して暗黙の split コマンドが行なわれます。 .nf perl \-ane \'print pop(@F), "\en";\' は、次の例と同等になります。 while (<>) { @F = split(\' \'); print pop(@F), "\en"; } .fi .TP 5 .B \-c .I perl スクリプトの文法をチェックし、実行せずに終了します。 .TP 5 .BI \-d perl デバッガのもとでスクリプトを実行します。 デバッグのセクションを参照して下さい。 .TP 5 .BI \-D 数字 デバッグフラッグをセットします。 スクリプトがどのように実行されるかを見るには、 .BR \-D14 を使います。 (これはデバッグ機能を .IR perl に組み込んでコンパイルした時にのみ動作します。) \-D1024 も有用な値で、コンパイルされた文法ツリーをリストします。 \-D512 を使うと、コンパイルされた正規表現を出力します。 .TP 5 .BI \-e " コマンドライン" 一行スクリプトを入力する場合に使えます。 複数行スクリプトを組み立てるには、複数の .B \-e コマンドを指定すればできます。 .B \-e が与えられると、 .I perl は引数のリストの中からスクリプトファイル名を探しません。 .TP 5 .BI \-i 拡張子 <> 構造で処理されるファイルをその場で修正することを指定します。 入力ファイルをリネームし、出力ファイルを元の名前でオープンし、出力ファイルを print 文のデフォルト出力にすることで処理されます。 拡張子が与えられれば、バックアップファイルの名前として元のファイル名に その拡張子を加えたものが使われます。 拡張子が与えられなければ、バックアップファイルは作成されません。 \*(L"perl \-p \-i.bak \-e "s/foo/bar/;" .\|.\|. \*(R" を実行することは、 次のスクリプトと同じです。 .nf .ne 2 #!/usr/bin/perl \-pi.bak s/foo/bar/; これは以下のものとも同等になります。 .ne 14 #!/usr/bin/perl while (<>) { if ($ARGV ne $oldargv) { rename($ARGV, $ARGV . \'.bak\'); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # 元の名前のファイルに出力する } select(STDOUT); .fi ただし、 .B \-i を用いた方法では、ファイル名が変更された時刻を知るために $ARGV と $oldargv を 比較する必要がないという点が異なります。 実際にはファイルハンドルとして ARGVOUT がセレクトされて使われます。 .I STDOUT がデフォルト出力のファイルハンドルとして保存され、 ループのあとで戻されることに注意して下さい。 .Sp 入力ファイルすべてに追加を行なう場合や、行番号をリセットしたりする場合、 各入力ファイルの終わりを知るために `eof' を使うことができます。 (eof の例を参照して下さい) .TP 5 .BI \-I ディレクトリ .B \-P と一緒に用いて C プリプロセッサにインクルードファイルの位置を 知らせます。デフォルトでは、/usr/include と /usr/lib/perl を検索します。 .TP 5 .BI \-l 8進数 行末処理を自動的に行ないます。これには二つの効果があります。 まず、 .B \-n や .B \-p と共に使われることで、行ターミネータを自動的に除きます。 二つ目は、$\e が、 .I 8進数 をセットし、print 文がすべて最後に行末文字をつけるということです。 .I 8進数 が省略された場合は、$\e に $/ の現在の値をセットします。 -例えば、行を 80 コラムに切り揃えるためには: +例えば、行を 80 桁に切り揃えるためには: .nf perl -lpe \'substr($_, 80) = ""\' .fi $\e = $/ という代入はコマンドラインスイッチが処理される時に 行なわれるので、 .B \-l スイッチに .B \-0 が続くときは、入力レコードセパレータと出力レコードセパレータが 異なることもあり得るということに注意して下さい。 .nf gnufind / -print0 | perl -ln0e 'print "found $_" if -p' .fi これは、$\e に改行をセットし、$/ にはヌル文字をセットします。 .TP 5 .B \-n スクリプトの前後に下に示すループがあるものとして .I perl を起動します。こうすると、引数のファイル全部について \*(L"sed \-n\*(R" または \fIawk\fR と同じような繰り返しが行なわれます: .nf .ne 3 while (<>) { .\|.\|. # ここにスクリプトが来ます } .fi デフォルトで入力行の出力はされないことに注意して下さい。 出力したければ .B \-p を参照して下さい。 以下は、1 週間より古いファイルすべてを削除する効率的な方法です。 .nf find . \-mtime +7 \-print | perl \-nle \'unlink;\' .fi この場合、ファイルが見つかるたびにプロセスを開始する必要がないので、 find の \-exec スイッチを使うより速くなります。 .TP 5 .B \-p スクリプトの前後に下に示すループがあるものとして .I perl を起動します。こうすると、引数のファイル全部について \fIsed\fR と同じような繰り返しが行なわれます: .nf .ne 5 while (<>) { .\|.\|. # ここにスクリプトが来ます } continue { print; } .fi 入力行は自動的に出力されることに注意して下さい。 出力を抑制したければ、 .B \-n スイッチを使って下さい。 .B \-p は、 .B \-n スイッチに優先します。 .TP 5 .B \-P .IR perl によるコンパイルの前に C プリプロセッサを通します。 (perl のコメントも cpp の命令も # の文字で始まるので、 コメントを C プリプロセッサが理解する単語、例えば \*(L"if\*(R" や \*(L"else\*(R" や \*(L"define\*(R" で始めてはなりません。) .TP 5 .B \-s コマンドライン上で、スクリプト名とファイル名の引数 (または \-\|\-) の間にある各スイッチについて基本的な解析を行ないます。 スイッチが見つかると、@ARGV から除かれ、対応する変数を .I perl スクリプト内でセットします。 以下のスクリプトでは、\-xyz スイッチをつけてスクリプトを起動したとき だけ、\*(L"true\*(R" を出力します。 .nf .ne 2 #!/usr/bin/perl \-s if ($xyz) { print "true\en"; } .fi .TP 5 .B \-S スクリプトを探すのに、環境変数 PATH を用います (スクリプト名が / で始まらないかぎり) 。 通常は、#! をサポートしないマシンにおいて #! を エミュレートするために用いられます。 次のような使い方です: .nf #!/usr/bin/perl eval "exec /usr/bin/perl \-S $0 $*" if $running_under_some_shell; .fi システムは 1 行目を無視し、スクリプトを /bin/sh に渡します。 /bin/sh は .I perl スクリプトをシェルスクリプトとして実行しようとします。シェルは 2 行目 を通常のシェルコマンドとして実行し、perl インタプリタを起動する ことになります。 システムによっては $0 は必ずしもフルパス名にならないので、 .B \-S を用いて .I perl に必要ならばスクリプトを探すように指示します。 .I perl がスクリプトを見つけたあと、解析を行ないますが、変数 $running_under_some_shell が真になることはないので、2 行目を無視します。 ファイル名などに含まれるスペースを正しく扱うには、$* よりも ${1+"$@"} の方がよいでしょうが、csh が解釈する場合には動作しません。 csh ではなく sh で起動するには、あるシステムでは #! 行を、perl で 無視されるコロンのみに書き換える必要があるかもしれません。その他の システムではこの方法は使えず、次のように、csh, sh, perl のどの下で も動作するような、とてもまわりくどい方法をとる必要があります: .nf .ne 3 eval '(exit $?0)' && eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -S $0 $argv:q' if 0; .fi .TP 5 .B \-u スクリプトのコンパイルの後、 .I perl はコアダンプします。 このコアダンプから、`undump' プログラム(提供していません)を用いて 実行可能ファイルに変換できます。 こうすると、ディスク消費が増えるかわりに (実行ファイルを strip すれば 最小にできます)、スタートアップが速くなります。 (しかし、私のマシンでは "hello world" の実行形式が約 200K の大きさ になります。) 実行形式を set-id プログラムとして走らせるのなら、通常の perl ではなく 多分 taintperl を用いてコンパイルすべきです。 ダンプする前に実行したいスクリプトがある場合は、代わりに dump 演算子を 使って下さい。 注意 : undump が使えるかどうかはプラットフォームに依存するので、perl の 移植によっては利用できないものもあるかもしれません。 .TP 5 .B \-U 安全でない操作を可能にします。 現在の所、\*(L"安全でない\*(R" 操作とは、スーパユーザ権限での 実行時にディレクトリを unlink すること、および汚れチェックで 警告が出るような setuid プログラムを走らせることだけです。 .TP 5 .B \-v .I perl のバージョンとパッチレベルを出力します。 .TP 5 .B \-w 一度だけ出てくる識別子、セットする前に使用されるスカラ変数に対して、 警告を出します。 サブルーチンが再定義されたとき、定義されていないファイルハンドルの参照 があるとき、リードオンリーでオープンしたファイルハンドルへ書き込もうと したときにも警告を出します。数値ではなさそうな値に == を使ったときや、 サブルーチンが 100 回以上再帰したときにも警告を出します。 .TP 5 .BI \-x ディレクトリ スクリプトがメッセージに埋め込まれていることを .I perl に知らせます。#! で始まり、"perl" という文字列を含む最初の行が現れる までは、ゴミとして無視されます。 その行に指定した意味のあるスイッチはすべて適用されます (ただし通常の #! 処理と同じく、スイッチのかたまり一つだけです)。 ディレクトリ名を指定すると、perl はスクリプトを実行する前にその ディレクトリに移ります。 .B \-x スイッチは、先頭のゴミを捨てるだけです。 スクリプトの後にゴミがある場合は、スクリプトは _\|_END_\|_ で終わらせなければなりません (望むなら、スクリプトで後ろのゴミの一部 または全部をファイルハンドル DATA 経由で処理することが可能です) 。 .Sh "データの型とオブジェクト" .PP .I perl には 3 種類のデータ型が有ります: スカラ、スカラ配列、 および連想配列です。 通常の配列は添え字が数字ですが、連想配列の場合は文字列です。 .PP perl における演算や値の解釈は、演算や値のコンテキスト(文脈)からの要求 にしばしば依存します。 主なコンテキストは三つ: すなわち文字列、数値、配列です。 演算の中には、配列を要求するコンテキストでは配列を、そうでなければ スカラ値を返すものもあります。 (そのような演算子についてはドキュメント内のその演算子のところに 記載されています。) スカラ値を返す演算子は、コンテキストが文字列あるいは 数値のどちらを要求しているかは考慮しませんが、スカラ変数および スカラ値は文字列あるいは数値のコンテキストの適切な方に解釈されます。 スカラはそれがヌル文字列あるいは 0 でなければ論理的に真であると 解釈されます。 演算子が返す論理値は、真の場合は 1、偽の場合は 0 または \'\' (ヌル文字列)です。 .PP 実際には、ヌル文字には二種類あります。define と undefined です。 undefined のヌル文字列は、エラー、ファイル終端、初期化されていない変数や 配列要素を参照しようとしたときなど、実際の値が存在しない場合に返ります。 undefined のヌル文字列は、最初にそれにアクセスしたときに defined となる ことがありますが、その前に defined() 演算子を用いて値が defined かどう かを知ることができます。 .PP スカラ変数への参照は、それが配列の一部であっても、常に \*(L'$\*(R' で始めます。 つまりこうです: .nf .ne 3 $days \h'|2i'# 単純なスカラ変数 $days[28] \h'|2i'# 配列 @days の 29 番目の要素 $days{\'Feb\'}\h'|2i'# 連想配列の値の一つ $#days \h'|2i'# 配列 @days の最後の添え字 しかし、配列全部や一部の取り出しは \*(L'@\*(R' で始めます: @days \h'|2i'# ($days[0], $days[1],\|.\|.\|. $days[n]) @days[3,4,5]\h'|2i'# @days[3.\|.5] と同じ @days{'a','c'}\h'|2i'# ($days{'a'},$days{'c'}) と同じ そして、連想配列全部を扱うには \*(L'%\*(R' で始めます: %days \h'|2i'# (key1, val1, key2, val2 .\|.\|.) .fi .PP これら 8 つはすべて左辺値として扱うことができます。すなわち、代入可能 ということです。 (さらに、あるコンテキストでは代入操作自体も左辺値となり得ます。 \*(-- s, tr, chop のところの例を参照して下さい。) スカラへの代入を行なうと、右辺をスカラのコンテキストで評価するのに 対し、配列や配列の一部への代入は右辺を配列のコンテキストで評価します。 .PP 配列 @days の長さを .IR csh のように \*(L"$#days\*(R" で評価してもかまいません。 (実際には、通常 0 番目の要素があるので、配列の長さではなく、最後の要素 の添え字になります。) $#days に代入すると、配列の長さが変わります。 この方法によって配列を小さくしても、実際には値は破壊されません。 すでに小さくした配列を大きくすると、もともとあった要素が元に戻ります。 大きくなりそうな配列をあらかじめ大きくしておくと、 効率をいくらか良くすることもできます。 (配列を大きくするには、配列の最後を超える要素に代 入を行なう方法もあります。この方法と、$#whatever へ代入する方法との 違いは、間の要素にヌルがセットされることです) 配列を縮めて空にするには、ヌルリスト () を代入すればできます。 次の二つは全く同等となります。 .nf @whatever = (); $#whatever = $[ \- 1; .fi .PP 配列をスカラのコンテキストで評価すると、配列の長さが返ります。 次の式は常に真となります: .nf scalar(@whatever) == $#whatever \- $[ + 1; .fi 連想配列をスカラのコンテキストで評価すると、配列が要素を含む場合 かつその場合に限り真の値を返します。 (要素がある場合に返る値は、使用している bucket の数およびアロケートさ れている bucket の数から成る文字列で、/ で区切られます。) .PP 多次元配列は直接はサポートされていませんが、連想配列を用いて複数の 添え字をエミュレートする方法については、$; 変数の項を参照して下さい。 多次元の添え字を 1 次元の添え字に変換するサブルーチンを書くことも できます。 .PP 各々のデータ型に応じて、それぞれの名前空間があります。衝突を心配する ことなく、同じ名前をスカラ変数、配列、連想配列、ファイルハンドル、 サブルーチン名、またはラベルにつけることができます。 変数や配列への参照は常に \*(L'$\*(R', \*(L'@\*(R', \*(L'%\*(R' で始まるので、\*(L"予約\*(R" 語は変数名については実際には 使用可能です。 (しかし、ラベルやファイルハンドルについては予約語は使用できません。 特殊な文字で始まらないからです。 .br ヒント: open(log,\'logfile\') より open(LOG,\'logfile\') を使った方が 良いです。大文字のファイルハンドル名を使うと、読み易さも向上し、 将来の予約語になるものとの衝突も避けることができるからです。) 大文字小文字の区別は重要です \*(--\*(L"FOO\*(R", \*(L"Foo\*(R", \*(L"foo\*(R" はすべて異なる 名前です。アルファベットで始まる名前は数字や下線を含んでもかまいません。 アルファベットで始まらない名前は 1 文字に限られます。 例えば、\*(L"$%\*(R" や \*(L"$$\*(R" です。 (ほとんどの一文字名は .IR perl の予約変数として意味があります。 詳細は後ほど述べます。) .PP 数値文字列は通常の浮動小数点や整数の形式で指定します。 .nf .ne 6 12345 12345.67 .23E-10 0xffff # 16 進 0377 # 8 進 4_294_967_296 .fi 文字列はシングルクォートまたはダブルクォートで区切られます。 動作はシェルにおけるクォートとよく似ています。 ダブルクォートで囲まれた文字列にはバックスラッシュや変数の置換が 行なわれます。シングルクォートで囲まれた文字列には行なわれません (\e\' と \e\e を除きます)。 通常のバックスラッシュ規則が改行やタブなどの文字を表すのに使え、 更に以下のちょっと変わった形式も使えます: .nf \et タブ \en 改行 \er リターン \ef フォームフィード \eb バックスペース \ea アラーム (ベル) \ee エスケープ \e033 8進文字 \ex1b 16進文字 \ec[ コントロール文字 \el 次の文字を小文字にします \eu 次の文字を大文字にします \eL \eE までを小文字にします \eU \eE までを大文字にします \eE 大小文字の修飾の終り .fi 改行を直接文字列に書き入れることもできます。すなわち、文字列は始まった 行と異なる行で終わることができることになります。これは便利ですが、 最後にクォートを忘れると、クォートを含むかなり離れた別の行を見つけるまで .I perl はエラーを報告しないでしょう。 文字列内の変数置換はスカラ変数、通常の配列、配列の一部に限られます。 (言い換えると、$ や @ で始まる識別子と、それに括弧で囲まれた添え字が ある場合だけです。) 次のコードは \*(L"The price is $100.\*(R" を出力します。 .nf .ne 2 $Price = \'$100\';\h'|3.5i'# 解釈されません print "The price is $Price.\e\|n";\h'|3.5i'# 解釈されます .fi 後に続くアルファベットや数字と区別するために、識別子を {} で囲う ことができることを覚えておいて下さい。 また、シングルクォートは識別子として有効な文字であるため、 シングルクォートで囲まれた文字列は、前の単語とは空白で区切られて いなければならないことも覚えておきましょう (パッケージの項を参照して下さい) 。 .PP プログラムのその時点での行番号とファイル名を表す _\|_LINE_\|_ と _\|_FILE_\|_ という二つの特殊な文字があります。 これらは独立したトークンとしてのみ使用でき、文字列中に 書き入れることはできません。 さらにトークン _\|_END_\|_ は、実際のファイルが終了する前で、スクリプト の論理的な終了を示すために使えます。残りのテキストはすべて無視されますが、 ファイルハンドル DATA から読むことができます。 (ファイルハンドル DATA は、メインスクリプトからのみデータを 読み込めますが、require されたファイルや評価された文字列からは 読み込めません。) ^D と ^Z の二つのコントロールキャラクタは _\|_END_\|_ と同義になります。 .PP 文法的に解釈不可能な単語は、それがシングルクォートで囲まれている かのように扱われます。このため、アルファベット、数字、下線のみからなり、 単語はアルファベットで始まらなければなりません。 ファイルハンドルやラベルと同じく、小文字のみからなる裸の単語は、 将来の予約語と衝突する危険があります。 .B \-w スイッチを使えば、perl はそのような単語について警告してくれます。 .PP 配列値をダブルクォートで囲まれた文字列に入れた場合は、配列の全要素を $" 変数で指定される区切り (デフォルトは空白) で連結して一つにした 文字列になります。 (3.0 以前のバージョンの perl では、@ はダブルクォートで囲まれた文字列 の中のメタキャラクタではなかったので、@array, $array[EXPR], @array[LIST], $array{EXPR}, @array{LIST} の文字列への挿入は、 配列がプログラムのどこかで参照されている場合、もしくは予約されている 場合にのみ起こります。) 次の二つは同等になります。 .nf .ne 4 $temp = join($",@ARGV); system "echo $temp"; system "echo @ARGV"; .fi 検索パターン (これにもダブルクォートと同じ置換が行なわれます) に おいては、あいまいな場合があります。 /$foo[bar]/ は /${foo}[bar]/ ([bar]は正規表現の文字クラス) でしょうか、 それとも /${foo[bar]}/ ([bar]は配列 @foo の添字) なのでしょうか 。 @foo が存在しないなら、それは明らかに文字クラスです。 @foo が存在するなら、perl は [bar]について考え、大抵の場合正しい類推を します。それが間違っていたり、あなたが単に偏執狂なら、 上記のように中括弧 {} を入れることで、正しい解釈をさせることができます。 .PP 行指向の引用法はシェルと同様の文法に基づいています。 << の後に引用文の終わりを示す文字列を指定すると、現在行からその文字列 が現れるまでの行すべてがその値になります。終わりを示す文字列は識別子 (単語) でも、クォートされたテキストでもかまいません。 クォートされているテキストの場合、通常クォートで囲む場合と同じく クォートの種類がテキストの扱い方を決めます。クォートされていない識別子 はダブルクォートされている場合と同じ動作となります。 (スペースを入れた場合、それは有効なヌル識別子として扱われ、 最初の空行にマッチします。 \*(--下の Merry Christmas の例を見て下さい。) 終わりを示す文字列はそれだけで (クォートされず、空白を前後につけずに) 書かれていなければなりません。 .nf print < に囲まれたファイルハンドルを評価すると、そのファイルから次の 行を読み込みます (改行が含まれるため EOF までは決して偽に成りません。 EOF では undefined 値が返ります) 。 通常はその値を変数に代入する必要がありますが、一つだけ 自動的に代入が起こる状況があります。入力シンボルだけが while ループの 条件文の中にある場合は(そしてこの場合にかぎり)、値は変数 \*(L"$_\*(R" に自動的に代入されます。 (奇妙に思うかもしれませんが、ほとんどの .I perl スクリプトにおいて、この構文を使うことになるでしょう。) とにかく、次の例はすべて同等となります。 .nf .ne 5 while ($_ = ) { print; } while () { print; } for (\|;\|;\|) { print; } print while $_ = ; print while ; .fi ファイルハンドル .IR STDIN , .IR STDOUT , .I STDERR は予約されています。 (ファイルハンドル .IR stdin , .IR stdout , .I stderr でも動作しますが、パッケージの中ではグローバルではなくローカルな識別子 として解釈されるので、働きません。) これ以外のファイルハンドルは、 .I open 関数で作成できます。 .PP 配列を探すコンテキストの中で が使われると、すべての入力行 の一行が一要素である配列が返ります。この方法で*巨大*なデータ空間が簡単 に作られるので、注意して使って下さい。 .PP ヌルファイルハンドル <> は特殊で、\fIsed\fR や \fIawk\fR の動作を エミュレートするために使えます。 <> からの入力には、標準入力やコマンドラインに並べられた全ファイルが 入ります。動作の仕方はこうなります。 <> の最初の評価では、ARGV 配列が チェックされ、それがヌルであると、$ARGV[0] は標準入力をオープンする \'-\' にセットされます。 次に ARGV 配列がファイル名のリストとして処理されます。 次のループは、 .nf .ne 3 while (<>) { .\|.\|. # 各行に対するコード } .ne 10 以下の疑似コードと同等になります。 unshift(@ARGV, \'\-\') \|if \|$#ARGV < $[; while ($ARGV = shift) { open(ARGV, $ARGV); while () { .\|.\|. # 各行に対するコード } } .fi 前者は、書くのが面倒でないというだけで、同じように動作します。 実際には、前者でも 配列 ARGV を shift し、現在のファイル名を変数 ARGV に代入します。 内部では、ファイルハンドル ARGV を使います \*(--<> は、魔術的な とまったく同義です。 (上の疑似コードでは、 を魔術的でないものとして扱うので、 動きません) .PP ファイル名のリストの配列が残っている限り、最初の <> の前に @ARGV を 変更することができます。 行番号 ($.) は入力が一つの大きなファイルであるかのように増えていきます。 (ファイル毎に行番号をリセットする方法については eof の例を参照して 下さい。) .PP .ne 5 @ARGV に自分でファイルのリストをセットしたい場合は、そうして下さい。 スクリプトにスイッチを渡したい場合、スクリプトの前の方に次のような ループを置くことでできます: .nf .ne 10 while ($_ = $ARGV[0], /\|^\-/\|) { shift; last if /\|^\-\|\-$\|/\|; /\|^\-D\|(.*\|)/ \|&& \|($debug = $1); /\|^\-v\|/ \|&& \|$verbose++; .\|.\|. # 他のスイッチ } while (<>) { .\|.\|. # 各行に対するコード } .fi <> シンボルは一回だけ*偽*を返します。 その後、もう一度呼ぶと、別の @ARGV リストを処理しているとみなして、 @ARGV がセットされていない場合は .IR STDIN から入力されることになります。 .PP カギ括弧の中の文字列がスカラ変数への参照であるとき (例えば <$foo>) 、 その変数の内容が読み込むべきファイルハンドル名となります。 .PP カギ括弧の中の文字列がファイルハンドルではないとき、検索 (glob) される ファイルパターンと解釈され、コンテキストによってファイル名の配列 またはリストの中の次のファイルが返されます。 最初に $ の解釈の一レベルが行なわれますが、<$foo> は前の段落で 説明されたような間接ファイルハンドルとなるため使えません。 強制的にファイル名検索と解釈させさければ <${foo}> のように 中括弧 {} を挿入できます。 例: .nf .ne 3 while (<*.c>) { chmod 0644, $_; } は以下と等価です。 .ne 5 open(foo, "echo *.c | tr \-s \' \et\er\ef\' \'\e\e012\e\e012\e\e012\e\e012\'|"); while () { chop; chmod 0644, $_; } .fi 実際、現在のところこのように実装されてます。 (これは、マシン上に /bin/csh がなければ、空白を含むファイル名では 動かないことを意味します。) もちろん、上の操作を行なう一番短い方法は、 .nf chmod 0644, <*.c>; .fi です。 .Sh "文法" .PP .I perl スクリプトは、一連の宣言とコマンドからなります。 .I perl の中で宣言されなければならないものは、レポートフォーマットと サブルーチンです。 これらの宣言の詳しい説明は下のセクションを参照して下さい。 初期化されていないユーザが作成したオブジェクトは、それが代入のように 明示的に定義されるまでは、ヌルまたは 0 の値であるとみなされます。 コマンド列が各入力行に対して実行される .I sed や .I awk スクリプトと違って、コマンド列は一度だけ実行されます。 入力ファイル (または複数のファイル) の各行について繰り返しを行うには 明示的にループを設けなければなりませんが、 着目するファイル、行をよりよくコントロールすることができます。 (実は、正しくありません \*(-- .B \-n や .B \-p スイッチで、暗黙のループを行なうことができます。) .PP 宣言は、コマンドを書くことができる場所ならどこにでも書くことができますが、 コマンド実行の基本的な流れには影響を与えません \*(-- 宣言は、 コンパイル時だけにしか影響を与えません。通常、すべての宣言は スクリプトの最初か最後のどちらかに置きます。 .PP .I perl は、ほとんどの部分において自由形式言語です。 (唯一の例外はフォーマット宣言で、理由は実に明白です。) コメントは、# 文字で指示され、行末までとなります。 /* */ という C のコメントを使おうとすると、コンテキストにより 除算またはパターンマッチと解釈されるので、そういうことはしないで下さい。 .Sh "複合文" .IR perl では、複数のコマンド列を中括弧 {} で囲むことで、一つのコマンドとして 扱うことになり、これをブロックと呼びます。 .PP 次のような複合コマンドは、フローコントロールに使われます: .nf .ne 4 if (EXPR) BLOCK if (EXPR) BLOCK else BLOCK if (EXPR) BLOCK elsif (EXPR) BLOCK .\|.\|. else BLOCK LABEL while (EXPR) BLOCK LABEL while (EXPR) BLOCK continue BLOCK LABEL for (EXPR; EXPR; EXPR) BLOCK LABEL foreach VAR (ARRAY) BLOCK LABEL BLOCK continue BLOCK .fi C や Pascal と違って、これらは文ではなく*ブロック*として定義されているこ とに注意して下さい。 これは、中括弧 {} が、\fI必要である\fR ことを意味します \*(-- 一つの 文を置くことは許されません。 中括弧 {} なしで書きたい場合は、別の方法があります。 以下はすべて同等のことを行ないます: .nf .ne 5 if (!open(foo)) { die "Can't open $foo: $!"; } die "Can't open $foo: $!" unless open(foo); open(foo) || die "Can't open $foo: $!"; # foo でなければ終わり open(foo) ? \'hi mom\' : die "Can't open $foo: $!"; # 最後のものは、ちょっとエキゾチック .fi .PP .I if 文は単純です。 *ブロック*は、常に中括弧 {} で囲まれるため、 .I else が、どの .I if にかかるかという曖昧さは生じません。 .I unless を .IR if の代わりに使うと、逆の意味となります。 .PP .I while 文は、式が真 (ヌル文字列または 0 でない) である限り、ブロックを 実行し続けます。 識別子とコロンからなるラベルをつけることもできます。 ラベルはループ制御文 .IR next , .IR last , .I redo (以下を参照) によって指し示すループの名前となります。 .I continue ブロックがあると、条件文が再評価される前に必ず実行され、C における .I for ループの三番目の部分と同様となります。 こうして、たとえ .I next 文で継続された場合でもループ変数はインクリメントできることになります (C の \*(L"continue\*(R" 文と同じ) 。 .PP .I while が .IR until に置き換えられると テストの意味は逆になりますが、条件判断は最初のループ の前に行なわれます。 .PP .I if や .I while 文では、\*(L"(EXPR)\*(R" をブロックに置き換えることができ、 ブロックの最後のコマンドの値が真なら、条件判断は真となります。 .PP .I for ループは、対応する .I while と全く同じように動作します: .nf .ne 12 for ($i = 1; $i < 10; $i++) { .\|.\|. } は、以下と同じになります。 $i = 1; while ($i < 10) { .\|.\|. } continue { $i++; } .fi .PP foreach ループは、通常の配列値について、配列の各要素を変数 VAR に順に セットしながら繰り返します。 その変数は、ループに対して暗黙のうちにローカルであり、それ以前の値はルー プを抜けると元の値に戻ります。 \*(L"foreach\*(R" キーワードは、実は \*(L"for\*(R" キーワードと同じで、 \*(L"foreach\*(R" を可読性のために、\*(L"for\*(R" を簡潔さのために 使うことができます。 VAR が省略されると、$_ が各値にセットされます。 ARRAY が実際の配列 (配列を返す式ではなく) の場合、ループ内の VAR を変 更することによって、配列の各要素を変更することができます。 例: .nf .ne 5 for (@ary) { s/foo/bar/; } foreach $elem (@elements) { $elem *= 2; } .ne 3 for ((10,9,8,7,6,5,4,3,2,1,\'BOOM\')) { print $_, "\en"; sleep(1); } for (1..15) { print "Merry Christmas\en"; } .ne 3 foreach $item (split(/:[\e\e\en:]*/, $ENV{\'TERMCAP\'})) { print "Item: $item\en"; } .fi .PP ブロックそれ自身 (ラベルが付いていても、付いていなくても) は、一度だけ 実行されるループと等価です。 だから、ブロックを抜けたり再実行するために、すべてのループ制御文を使う ことができます。 .I continue ブロックも付けられます。 この構成は、case 構造を作成するには特に有用です。 .nf .ne 6 foo: { if (/^abc/) { $abc = 1; last foo; } if (/^def/) { $def = 1; last foo; } if (/^xyz/) { $xyz = 1; last foo; } $nothing = 1; } .fi 同等のものを記述する方法が、既にいくつもあるので、perl には公式の switch 文がありません。 上記のものに加えて、 .nf .ne 6 foo: { $abc = 1, last foo if /^abc/; $def = 1, last foo if /^def/; $xyz = 1, last foo if /^xyz/; $nothing = 1; } または .ne 6 foo: { /^abc/ && do { $abc = 1; last foo; }; /^def/ && do { $def = 1; last foo; }; /^xyz/ && do { $xyz = 1; last foo; }; $nothing = 1; } または .ne 6 foo: { /^abc/ && ($abc = 1, last foo); /^def/ && ($def = 1, last foo); /^xyz/ && ($xyz = 1, last foo); $nothing = 1; } さらに .ne 8 if (/^abc/) { $abc = 1; } elsif (/^def/) { $def = 1; } elsif (/^xyz/) { $xyz = 1; } else {$nothing = 1;} .fi とも書けます。 これらはすべて内部で switch 構造に最適化されるため、perl は直接目的の 文にジャンプするので、同じ単純なスカラ変数を == や eq や上記のような パターンマッチで判定する限り、50 個の elsif を使っても perl がたくさん の不要な文を実行するのでは、という心配は不要となります。 (ある特定の case ステートメントが最適化されているかどうかに興味があるなら、 \-D1024 スイッチを付けて実行前に文法ツリーを表示することができます。) .Sh "単文" 単文のみがその副作用を評価される式となります。 どの単文もブロックの最後の文でない限り、セミコロンで終らなければ なりません。最後の文では、セミコロンはなくてもかまいません。 (それでも、ブロックが一行以上を含んでいるのなら、 セミコロンはあった方が望ましいです) .PP どの単文も、セミコロンで終る前に一つの修飾子を続けることができます。 可能な修飾子は以下の通りです: .nf .ne 4 if EXPR unless EXPR while EXPR until EXPR .fi .I if と .I unless 修飾子は見かけ通りの意味があります。 .I while と .I until 修飾子も見かけ通りの意味 (条件文が始めに評価されます) ですが、 do ブロックや do サブルーチンコマンドが付けられたときには異なり、 条件式が評価される前に一度だけ実行されます。 これは、以下のようなループが記述できるようにするためです: .nf .ne 4 do { $_ = ; .\|.\|. } until $_ \|eq \|".\|\e\|n"; .fi (後述の .I do 演算子を参照のこと。修飾子は、どれもループラベルを持てないため、 後に書かれたループ制御コマンドはこの構造では動かないことに 気をつけて下さい。あしからず。) .Sh "式" .I perl の式は、ほとんど C の式と同じに動作しますが、違いをここに述べます。 .PP 以下が .I perl にあって、C にないものです: .Ip ** 8 2 指数演算子。 .Ip **= 8 指数代入演算子。 .Ip (\|) 8 3 配列をヌルに初期化するために使う、ヌルリスト。 .Ip . 8 2 つの文字列の結合演算子。 .Ip .= 8 結合代入演算子。 .Ip eq 8 文字列の同値性 (== は数値の同値性) 。 覚えるためには、\*(L"eq\*(R" が文字列であると考えれば良いです。 (状況に応じて、== が文字列と数値の両方の同値性を表す .I awk に慣れている人は、ここでは明示しなければならないことに気をつけて下さい !) .Ip ne 8 文字列の非同値性 (!= は数値の非同値性) 。 .Ip lt 8 文字列の less than .Ip gt 8 文字列の greater than .Ip le 8 文字列の less than or equal .Ip ge 8 文字列の greater than or equal .Ip cmp 8 文字列の比較。 -1, 0, 1 を返します。 .Ip <=> 8 数値の比較。 -1, 0, 1 を返します。 .Ip =~ 8 2 演算には、検索、変更をデフォルトで文字列 \*(L"$_\*(R" に対して行うもの があります。 この演算子を用いると、別の文字列に対してその演算が行われます。 右の引数は、検索パターン、置換、変換です。 左の引数は、デフォルトの \*(L"$_\*(R" の代わりに検索、置換、変換が 行なわれる対象となるものです。 戻り値は、演算の成否を示します。 (右の引数が検索パターン、置換、変換以外の式なら、実行時に検索パターン として解釈されますが、パターンは式が評価される度にコンパイルされなけれ ばならないので、明示的な検索より効率的ではありません。) この演算子の優先度は単項マイナス演算子 (-) 、autoincrement/decrement (++, --) より低く、他のどの演算子よりも高くなります。 .Ip !~ 8 戻り値が否定されることを除いて =~ と同じです。 .Ip x 8 繰り返し演算子。 左オペランドを右オペランドで指定した回数だけ繰り返した文字列を返します。 配列のコンテキストでは、左オペランドが括弧に入ったリストの場合、 リストを繰り返します。 .nf print \'\-\' x 80; # ダッシュの列を出力します print \'\-\' x80; # 不正、x80 は識別子 print "\et" x ($tab/8), \' \' x ($tab%8); # タブに変換 @ones = (1) x 80; # 80 個 1 が並んだ配列 @ones = (5) x @ones; # 全要素を 5 にセット .fi .Ip x= 8 繰り返し代入演算子。 スカラに対してのみ動作します。 .Ip .\|. 8 範囲演算子。コンテキストによって、実際は二つの異なる演算子になります。 配列のコンテキストでは、左の値から右の値まで一つずつ数を増やした配列を 返します。 これは、\*(L"for (1..10)\*(R" というループや配列の切り出し (slice) を 行なうときに便利です。 .Sp スカラのコンテキストでは、.\|. は論理値を返します。 この演算子は、flip-flop のように二つの値を取り、 sed や awk やいろいろなエディタの行範囲 (comma) 演算子をエミュレート します。 各 .\|. 演算子はそれ自身の論理値を保持し、左のオペランドが偽である限り 偽となります。 左のオペランドが真になると、範囲演算子は、右のオペランドが真になるまで 真となります。その後、範囲演算子が再び偽となります。 (次に範囲指定演算子が評価されるまで、偽にはなりません。 真になったのと同じ評価を行った時 (awkと同様) に右のオペランドをテスト して、偽になることがあり得ますが、一度は真を返します。 次の評価まで右のオペランドをテストしたくなければ (sed のように) 、二つ にするかわりに三つのドット (.\|.\|.) を使って下さい。) 右のオペランドは、演算子が \*(L"偽\*(R" の状態である間は、 評価されず、左のオペランドは演算子が \*(L"真\*(R" である間は 評価されません。 || や && より優先度はやや低くなります。 戻り値は、偽ではヌル文字列に、真では (1で始まる) 連続した数に なります。 この数は、範囲指定毎にリセットされます。 連続した範囲の最後の数は、文字列 \'E0\' を持っていて、数値には影響しま せんが、終点を除きたい場合に検索のきっかけになります。 数字が 1 より大きくなるのを待つことで、始点を除くことができます。 スカラ .\|. の両方のオペランドが静的である場合、オペランドは暗黙の うちに現在の行番号を表す $. 変数と比べられます。 例: .nf .ne 6 スカラ演算子としては: if (101 .\|. 200) { print; } # 100行台を出力します next line if (1 .\|. /^$/); # ヘッダ行を読み飛ばします s/^/> / if (/^$/ .\|. eof()); # 本体をクォートします .ne 4 配列としては: for (101 .\|. 200) { print; } # $_ を 100回表示します @foo = @foo[$[ .\|. $#foo]; # 高価なノーオペレーション @foo = @foo[$#foo-4 .\|. $#foo]; # 最後の 5 要素を取り出します .fi .Ip \-x 8 ファイルテスト。 この単項演算子は一つの引数として、ファイル名またはファイルハンドルを取 り、そのファイルについて、何かが真であるかどうかを見るものです。 引数が省略されると、$_ を調べますが、例外として \-t は .IR STDIN を調べます。 真の場合は 1 を、偽の場合は \'\' を返し、ファイルが存在していない場合 は、undefined の値を返します。 優先度は、論理値や関係演算子より高くなりますが、算術演算子より低くなり ます。 演算子は以下の通りです: .nf \-r ファイルを実効 uid/gid で読み込める。 \-w ファイルに実効 uid/gid で書き込める。 \-x ファイルを実効 uid/gid で実行できる。 \-o ファイルの所有者が、実効 uid である。 \-R ファイルを実 uid/gid で読み込める。 \-W ファイルを実 uid/gid で書き込める。 \-X ファイルを実 uid/gid で実行できる。 \-O ファイルの所有者が、実 uid である。 \-e ファイルが存在する。 \-z ファイルサイズが 0 である。 \-s ファイルサイズが 0 でない (サイズを返す) 。 \-f ファイルはプレーンファイルである。 \-d ファイルはディレクトリである。 \-l ファイルはシンボリックリンクである。 \-p ファイルは名前付きパイプ (FIFO) である。 \-S ファイルはソケットである。 \-b ファイルはブロック特殊ファイルである。 \-c ファイルはキャラクタ特殊ファイルである。 \-u ファイルには setuid ビットが立っている。 \-g ファイルには setgid ビットが立っている。 \-k ファイルには sticky ビットが立っている。 \-t ファイルハンドルが tty にオープンされている。 \-T ファイルはテキストファイルである。 \-B ファイルはバイナリファイルである (\-T の逆) 。 \-M スクリプトを開始した時点でのファイルの古さ(単位は日) 。 \-A アクセス時刻と同じ。 \-C inode 変更時刻と同じ。 .fi ファイルパーミッション演算子 \-r, \-R, \-w, \-W, \-x, \-X の解釈は、 単にファイルのモードとユーザの uid, gid に基づきます。 他の理由で、実際にファイルを読み、書き、実行ができないことがあるかも しれません。 また、気をつけなけらばならないのは、スーパユーザにとって \-r, \-R, \-w, \-W は常に 1 を返し、そのモードでいずれかの実行ビットが 立っていれば、\-x, \-X も常に 1 を返すというところです。 従って、スーパユーザが実行するスクリプトは、ファイルの実際のモードを決 めるために stat() を実行したり、一時的に他の uid を立てる必要があるか もしれません。 .Sp 例: .nf .ne 7 while (<>) { chop; next unless \-f $_; # 特殊ファイルを無視 .\|.\|. } .fi \-s/a/b/ としても、否定した置換をするわけではないことに注意して 下さい。 \-exp($foo) とすると、期待通りに動きますが、\*(-- マイナスの後が一文字 の場合、ファイルテストと解釈されます。 .Sp \-T と \-B は以下のように動作します。 ファイルの先頭のブロックあたりに、変なコントロールコードや メタキャラクタのような、おかしな文字がないかどうかを調べます。 おかしな文字が (10%以上) 見つかると、それは \-B ファイル、 でなければ \-T ファイルとなります。 最初のブロックにヌルが含まれるファイルもバイナリファイルとみなされます。 \-T や \-B がファイルハンドルに使われると、最初のブロックではなく、 そのときの標準入力バッファが調べられます。 ヌルファイル(サイズ 0 のファイル)の場合やファイルハンドルをテストしていて 、それが EOF である場合、\-T と \-B は共に真を返します。 .PP すべてのファイルテスト (と stat 演算子)は、アンダライン一つ _ から 成る特殊ファイルハンドルを与えられると、システムコールを保存することに よって、その直前に行なわれたファイルテスト (または stat演算子) で使わ れた stat 構造体が使われます。 (この _ の働きは \-t では動作せず、lstat と -l が stat 構造体に 実ファイルではなく、シンボリックリンクの値を残すことを覚えて おかなければなりません。) 例: .nf print "Can do.\en" if -r $a || -w _ || -x _; .ne 9 stat($filename); print "Readable\en" if -r _; print "Writable\en" if -w _; print "Executable\en" if -x _; print "Setuid\en" if -u _; print "Setgid\en" if -g _; print "Sticky\en" if -k _; print "Text\en" if -T _; print "Binary\en" if -B _; .fi .PP C にあって、 .I perl にないもの: .Ip "単項 &" 12 アドレス演算子 .Ip "単項 *" 12 "アドレスを通しての"参照演算子 .Ip "(TYPE)" 12 型変換演算子。 .PP C のように、 .I perl は、演算子への引数が皆、静的で、副作用がない場合だけコンパイル時にある 程度の式の評価を行なってしまいます。 特に、変数置換を行なわないリテラル間での文字列の結合は、コンパイル時に 行なわれます。 バックスラッシュの解釈もコンパイル時に起こります。 .nf .ne 2 \'Now is the time for all\' . "\|\e\|n" . \'good men to come to.\' .fi これは全部、内部では一つの文字列にされてしまいます。 .PP ++ 演算子にはちょっと拡張した細工が施されています。 数値変数や数値コンテキストとして使われた変数をインクリメントすると、通 常のインクリメントになりますが、変数がヌルでない文字コンテキストとして だけ使われて来ていて、パターン /^[a\-zA\-Z]*[0\-9]*$/ にマッチする場合は、 各文字の範囲をキャリー付きで保存し、文字としてインクリメントされます: .nf print ++($foo = \'99\'); # prints \*(L'100\*(R' print ++($foo = \'a0\'); # prints \*(L'a1\*(R' print ++($foo = \'Az\'); # prints \*(L'Ba\*(R' print ++($foo = \'zz\'); # prints \*(L'aaa\*(R' .fi -- 演算子には、このような細工はありません。 .PP (配列のコンテキストにおける) 範囲演算子は、最大値と最小値が文字列の 場合に、細工した自動インクリメントアルゴリズムを使います。 すべてのアルファベット文字を得るには、 @alphabet = (\'A\' .. \'Z\'); 16 進数を得るには、 $hexdigit = (0 .. 9, \'a\' .. \'f\')[$num & 15]; 始めに 0 を付けた日付を得るには、 @z2 = (\'01\' .. \'31\'); print @z2[$mday]; と書けます。 (最後に指定された値が、細工したインクリメントの生成するシークエンスに 含まれていない場合、次の値が最後に指定された値より長くなるまでシークエ ンスを続けます。) .PP || と && は、0 や 1 を返す C のそれとは違って、最後に評価された値を 返します。 だから、ホームディレクトリをみつける移植性の高い方法は、こうなります。 .nf $home = $ENV{'HOME'} || $ENV{'LOGDIR'} || (getpwuid($<))[7] || die "You're homeless!\en"; .fi .PP 前述のリテラルや変数に合わせ、以降の節で説明する演算は 式中で項として使えます。 これらの演算の幾つかは、引数に*リスト*を取ります。 リストは、スカラや配列値からなります。 配列値がリストの中にあると、その場所に挿入されたように個々の値がリスト の中に含まれて、長い一次元配列値を作ることになります。 *リスト* の要素はコンマで区切られていなければなりません。 引数を括弧で囲んでも囲まなくても、演算をリスト出来ます。 これは関数呼び出しと同様単項演算子として、 演算を使うことができることを意味します。 関数呼び出しとして使うには、同じ行の次のトークンは左括弧でなければなり ません。 (空白が間にはさまってもかまいません。) そのような関数は、予想される通り最優先となります。 左括弧を持っていないトークンが続くとすれば、それは単項演算子で、リスト 演算子かどうかによって、優先度が決まります。 リスト演算子は最も優先度が低くなります。 すべての単項演算子は、関係演算子よりも優先されますが、算術演算子よりも 優先度は低くなります。 優先度のセクションを参照して下さい。 .PP スカラや配列のコンテキストで使われる演算子の場合、失敗すると一般に、 スカラコンテキストでは undefined 値を返し、配列のコンテキストでは ヌルリストを返します。 しかし、*リストをスカラに変換する一般的な規則はない* ということを 忘れないで下さい。 それぞれの演算子は、どの種のスカラを返すのが最も適当であるかを決めます。 ある演算子は、配列のコンテキストとして返されるようなリストの長さを返し ます。リストの最初の値を返す演算子、リストの最後の値を返す演算子、 操作に成功した回数を返す演算子などもあります。 一般に、一貫性を求めなければ、演算子は求めるものを返します。 .Ip "/PATTERN/" 8 4 m/PATTERN/ を参照して下さい。 .Ip "?PATTERN?" 8 4 これは、 .I reset 演算子呼び出しの間で一回しかマッチしないことを除けば、 /pattern/ 検索と全く同じです。 これは例えば、一群のファイルの中で、各ファイルに最初に何かが出現すること を見たいとき、便利な最適化です。 そのときのパッケージにローカルな ?? パターンだけは、リセットされます。 .Ip "accept(NEWSOCKET,GENERICSOCKET)" 8 2 accept システムコールと同じことをします。 成功すると真を、失敗すると偽を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "alarm(SECONDS)" 8 4 .Ip "alarm SECONDS" 8 指定した秒数 (実際には、1 を引いたもの) が経過したあと、自分の プロセスに SIGALRM を伝えます。 つまり、alarm(15) なら、14 秒以上経ったある時点で SIGALRM を生じます。 一度に一つのタイマしかカウントされません。呼び出される毎にそれ以前の タイマは無効となり、引数 0 で呼び出すと以前のタイマをキャンセルし て、新しいタイマは始動しません。 戻り値は、直前のタイマの残り時間です。 .Ip "atan2(Y,X)" 8 2 Y/X の アークタンジェント を .if t \-\(*p から \(*p. .if n \-π から π の範囲で返します。 .Ip "bind(SOCKET,NAME)" 8 2 bind システムコールと同じことをします。 成功すれば真を、失敗すれば偽を返します。 NAME は、ソケットに合った適切な型の pack されたアドレスでなければなりません。 プロセス間通信のセクションの例を参照して下さい。 .Ip "binmode(FILEHANDLE)" 8 4 .Ip "binmode FILEHANDLE" 8 4 バイナリファイルとテキストファイルを区別するオペレーティングシステム上 で、そのファイルを \*(L"バイナリ\*(R" として読み込まれるようにします。 バイナリモードで読み込まれないファイルは、CR LF が入力時に LF に変換 され、出力時には、LF が CR LF に変換されます。 binmode は、UNIX では無効です。 FILEHANDLE が式のときは、値がファイルハンドルの名前として扱われます。 .Ip "caller(EXPR)" .Ip "caller" 現在のサブルーチン呼び出しのコンテキストを返します: .nf ($package,$filename,$line) = caller; .fi EXPRがあると、デバッガがスタックトレースに出力して使う拡張情報も 返します。 EXPRの値は、現在のサブルーチンの前にいくつの call フレームがあるかを 示します。 .Ip "chdir(EXPR)" 8 2 .Ip "chdir EXPR" 8 2 動作しているディレクトリを、もしできるなら EXPR に変更します。 EXPRが省略されると、ホームディレクトリになります。 成功すれば 1 を、失敗すれば 0 を返します。 .IR die の例を参照して下さい。 .Ip "chmod(LIST)" 8 2 .Ip "chmod LIST" 8 2 ファイルのリストのパーミッションを変更します。 リストの最初の要素は、数値モードでなければなりません。 成功したファイルの数を返します。 .nf .ne 2 $cnt = chmod 0755, \'foo\', \'bar\'; chmod 0755, @executables; .fi .Ip "chop(LIST)" 8 7 .Ip "chop(VARIABLE)" 8 .Ip "chop VARIABLE" 8 .Ip "chop" 8 文字列の最後の文字を削り、削られた文字を返します。 基本的には、入力されたレコードの終りから改行文字を除くために使われます が、文字列のコピーをスキャンするわけではないので、s/\en// より 効率的です。 VARIABLE を省略すると、$_ を chop します。 例: .nf .ne 5 while (<>) { chop; # 最後のフィールドの \en を除く @array = split(/:/); .\|.\|. } .fi 実際には、代入を含む左辺値のいかなるものも chop できます。 .nf chop($cwd = \`pwd\`); chop($answer = ); .fi リストを chop するとすべての要素が chop され、 最後に chop された値が返されます。 .Ip "chown(LIST)" 8 2 .Ip "chown LIST" 8 2 ファイルのリストの所有者 (と所有グループ) を変えます。 リストの最初の二つの要素は数値で表した uid と gid がこの順で指定され なければなりません。 変更に成功したファイルの数を返します。 .nf .ne 2 $cnt = chown $uid, $gid, \'foo\', \'bar\'; chown $uid, $gid, @filenames; .fi .ne 23 以下は、passwd ファイルから数値でない uid を検索する例です: .nf print "User: "; $user = ; chop($user); print "Files: " $pattern = ; chop($pattern); .ie t \{\ open(pass, \'/etc/passwd\') || die "Can't open passwd: $!\en"; 'br\} .el \{\ open(pass, \'/etc/passwd\') || die "Can't open passwd: $!\en"; 'br\} while () { ($login,$pass,$uid,$gid) = split(/:/); $uid{$login} = $uid; $gid{$login} = $gid; } @ary = <${pattern}>; # ファイルを得ます if ($uid{$user} eq \'\') { die "$user not in passwd file"; } else { chown $uid{$user}, $gid{$user}, @ary; } .fi .Ip "chroot(FILENAME)" 8 5 .Ip "chroot FILENAME" 8 同名のシステムコールと同じことをします。 これが何をするのか知らないとしても、気にしないで下さい。 FILENAME を省略すると、$_ に chroot します。 .Ip "close(FILEHANDLE)" 8 5 .Ip "close FILEHANDLE" 8 ファイルハンドルに結びつけられたファイルやパイプをクローズします。 別のファイルをオープンしようとしている場合は、FILEHANDLE を閉じる 必要がありません。オープンした際に前のファイルをクローズしてくれる からです。 ( .IR open を参照して下さい) しかし、明示的に入力ファイルのクローズをすると行カウンタ ($.) が リセットされるのに対し、 .I open のときに行なわれる暗黙のクローズでは、リセットされません。 また、後でパイプの出力を見たい場合は、パイプをクローズするとパイプで 起動されたプロセスの完了を待ちます。 パイプを明示的にクローズすると、コマンド情報の戻り値が $? に 入れられます。 例: .nf .ne 4 open(OUTPUT, \'|sort >foo\'); # sort へパイプ .\|.\|. # print stuff to output close OUTPUT; # sort の終了を待ちます open(INPUT, \'foo\'); # sortの結果を得ます .fi FILEHANDLE は実際のファイルハンドル名を与える式でもかまいません。 .Ip "closedir(DIRHANDLE)" 8 5 .Ip "closedir DIRHANDLE" 8 opendir() でオープンされたディレクトリをクローズします。 .Ip "connect(SOCKET,NAME)" 8 2 connect システムコールと同じことをします。 成功すると真を、失敗すると偽を返します。 NAME はソケットに合った適当な型のパッケージアドレスでなければ なりません。 プロセス間通信のセクションの例を参照して下さい。 .Ip "cos(EXPR)" 8 6 .Ip "cos EXPR" 8 6 EXPR (ラジアンで表現) のコサインを返します。 EXPR を省略すると $_ のコサインを取ります。 .Ip "crypt(PLAINTEXT,SALT)" 8 6 C ライブラリの crypt() 関数と正確に同じように encrypt された文字列 を返します。 パスワードファイルを調べて、粗野なパスワードを見つけるのに便利です。 白い帽子をかぶっている奴だけがこれをしなければなりません。 .Ip "dbmclose(ASSOC_ARRAY)" 8 6 .Ip "dbmclose ASSOC_ARRAY" 8 dbm ファイルと連想配列の結び付きを解除します。 連想配列に残っている値は、dbm ファイルのキャッシュに何が入っているか を知りたいのでなければ、意味がないものとなります。 この関数は、ndbm を使う場合にのみ有用です。 .Ip "dbmopen(ASSOC,DBNAME,MODE)" 8 6 dbm や ndbm ファイルと連想配列を結び付けます。 ASSOC は連想配列の名前です。 (通常の open と違って、最初の引数はファイルハンドルのように見えても、 ファイルハンドルでは*ありません*) 。 DBNAME は、(.dir や .pag の拡張子を除いた) データベースの名前です。 データベースが存在しないと、(umaskで修飾された) MODE で指定された プロテクションで作成します。 古い dbm 関数しかサポートしないシステムでは、プログラムの中で一つの dbmopen しか許されないかもしれません。 dbm も ndbm もないシステムでは、dbmopen 呼び出しは致命的なエラーを生 じます。 .Sp それまでの dbmopen で関連付けられた連想配列の値は失われます。 dbm ファイルのうち、ある量の値はメモリにキャッシュされます。 デフォルトでその量は 64 ですが、dbmopen の前に連想配列の ガーベッジエントリの数をあらかじめ確保しておくことで、 増やすことができます。必要なら、reset コマンドでキャッシュを フラッシュすることができます。 .Sp dbm ファイルへの書き込み許可を持っていない場合、連想配列変数を 読み出すだけで、それをセットすることはできません。 書き込めるかどうかをテストしたければ、ファイルテストを使うか、エラーを トラップできる eval の中で、ダミーの配列エントリをセットしようと してみて下さい。 .Sp keys() や valuse() のような関数は、大きな dbm ファイルを使ったときに、 巨大な配列値を返すかもしれません。 大きな dbm ファイルで繰り返しをするときは、each() 関数を使った方が 良いかもしれません。 例: .nf .ne 6 # 履歴ファイルのオフセットを表示します dbmopen(HIST,'/usr/lib/news/history',0666); while (($key,$val) = each %HIST) { print $key, ' = ', unpack('L',$val), "\en"; } dbmclose(HIST); .fi .Ip "defined(EXPR)" 8 6 .Ip "defined EXPR" 8 左辺値 EXPR が、実際に値を持っているかどうかを表す論理値を返します。 多くの演算で、ファイル終端、初期化されていない変数、システムエラーなど の例外処理条件で undefined 値が返されます。 この関数は、本当のヌル文字列を返すかもしれない操作、特に配列要素を参照 する操作の際に、未定義のヌル文字列と定義されたヌル文字列の判別を可能に します。 配列やサブルーチンが存在するかどうかを調べることもできます。 予約済み変数を使うときは、直観的に期待するような結果になるとは保証されて いません。 例: .nf .ne 7 print if defined $switch{'D'}; print "$val\en" while defined($val = pop(@ary)); die "Can't readlink $sym: $!" unless defined($value = readlink $sym); eval '@foo = ()' if defined(@foo); die "No XYZ package defined" unless defined %_XYZ; sub foo { defined &$bar ? &$bar(@_) : die "No bar"; } .fi undef も参照して下さい。 .Ip "delete $ASSOC{KEY}" 8 6 指定した連想配列から、指定した値を削除します。 削除された値が返りますが、何も削除されなかった場合は undefined 値が 返ります。 $ENV{} から削除すると、環境変数を変更します。 dbm ファイルに結びつけられた配列を削除すると、dbm ファイルからその項 目を削除します。 .Sp 以下の例は、連想配列のすべての値を削除します: .nf .ne 3 foreach $key (keys %ARRAY) { delete $ARRAY{$key}; } .fi (しかし、 .I reset コマンドを使った方が速いでしょう。undef %ARRAY ならもっと速いでしょう) .Ip "die(LIST)" 8 .Ip "die LIST" 8 eval の外で、LIST の値を .I STDERR に表示して、そのときの $! (errno) の値で終了 (exit) します。 $! が 0 なら、($? >> 8) (\`command\` のステータス) の値で終了します。 ($? >> 8) が 0 なら、255 で終了します。 eval の中では、エラーメッセージは $@ に詰め込まれ、eval は undefined 値で終了します。 .Sp 同等の例: .nf .ne 3 .ie t \{\ die "Can't cd to spool: $!\en" unless chdir \'/usr/spool/news\'; 'br\} .el \{\ die "Can't cd to spool: $!\en" unless chdir \'/usr/spool/news\'; 'br\} chdir \'/usr/spool/news\' || die "Can't cd to spool: $!\en" .fi .Sp EXPR の値が改行で終らない場合、スクリプトの現在の行番号と (もしあれば) 入力行番号が出力され、改行が加えられます。 ヒント: \*(L", stopped\*(R" をメッセージに加えておくと、 \*(L"at foo line 123\*(R" が加えられたときにわかり易くなるので良い でしょう。 スクリプト \*(L"canasta\*(R" を走らせているとすると、 .nf .ne 7 die "/etc/games is no good"; die "/etc/games is no good, stopped"; は、多分 /etc/games is no good at canasta line 123. /etc/games is no good, stopped at canasta line 123. .fi と出力されます。 .IR exit を参照して下さい。 .Ip "do BLOCK" 8 4 BLOCK 内で指定されたうち、最後のコマンドの値を返します。 ループ修飾子に修飾されたときは、ループ条件をテストする前に BLOCK が 一度実行されます。 (他の文では、ループ修飾子は、条件を始めにテストします。) .Ip "do SUBROUTINE (LIST)" 8 3 .I sub で宣言されたサブルーチンを実行し、SUBROUTINE で最後に評価された式の値 を返します。 その名前のサブルーチンがない場合、致命的エラーを生じます。 (サブルーチンが存在しているかどうかを判定したいなら、\*(L"defined\*(R" 演算子を使うのが良いでしょう。) 配列をリストの一部として渡したいなら、各配列の前に配列の長さを付けて 渡すのが良いでしょう。 (後に出てくるサブルーチンのセクションを参照して下さい。) \*(L"do EXPR\*(R" の形との混乱を避けるため、括弧は必要となります。 .Sp SUBROUTINE は、一つのスカラ変数でもかまいません。その場合、 実行されるサブルーチン名は、変数から得られます。 .Sp 別の (好まれる) 形として、アンパサンド & を前に付ける &foo(@args) の ように、サブルーチンを呼んでもかまいません。 引数を渡さないなら、括弧を使う必要はありません。 括弧を省略すると、サブルーチンには @_ 配列は渡されません。 & 型は、defined や undef 演算子にサブルーチンを指示するのにも 使われます: .nf if (defined &$var) { &$var($parm); undef &$var; } .fi .Ip "do EXPR" 8 3 ファイル名として EXPR の値を使い、 .I perl スクリプトとして、ファイルの内容を実行します。 これは基本的に .I perl サブルーチンライブラリからサブルーチンをインクルードするという使い方を します。 .nf do \'stat.pl\'; は、 eval \`cat stat.pl\`; .fi とほとんど同じです。 違うのは、より効率的で、より簡潔で、エラーメッセージ中の現在ファイル名 は正しく、カレントディレクトリに stat.pl がなければ .B \-I で指定されたライブラリをすべて探すということです。 (予約変数のセクション中の @INC 配列を参照して下さい) 。 しかし、呼び出しのたびにファイルを解析し直すのは同じなので、ループの 内側でこのファイルを使うなら、起動時間は少し余計にかかるとしても、 \-P と #include を使った方が良いでしょう。 (この #include を使う問題点は、cpp が # コメントを認識してくれない ことです。\*(--逃げ道は、コメント単独として \*(L";#\*(R" を使うことです。) 次のものは等価ではないことに注意して下さい: .nf .ne 2 do $foo; # ファイルを eval します do $foo(); # サブルーチンを呼びます .fi ライブラリルーチンのインクルードとしては、 \*(L"require\*(R" 演算子の方がより良いことを覚えておいて下さい。 .Ip "dump LABEL" 8 6 ただちにコアダンプします。 もともと、これは、プログラムの始めにすべての変数を初期化した後に ダンプされたコアを undump プログラムを使って実行バイナリを作るために あります。 新しいバイナリが実行されるとき、"goto LABEL" を実行することから 始まります (goto が受けるすべての制限は適用されます) 。 コアダンプで止まったところから、goto で再び始まると考えれば良いです。 LABEL が省略されると、プログラムは先頭から再スタートします。 警告: ダンプされたときに open されていたどのファイルも、プログラムが 再生したときにはもう open されておらず、perlの側では混乱する可能性が あります。 \-u も参照して下さい。 .Sp 例: .nf .ne 16 #!/usr/bin/perl require 'getopt.pl'; require 'stat.pl'; %days = ( 'Sun',1, 'Mon',2, 'Tue',3, 'Wed',4, 'Thu',5, 'Fri',6, 'Sat',7); dump QUICKSTART if $ARGV[0] eq '-d'; QUICKSTART: do Getopt('f'); .fi .Ip "each(ASSOC_ARRAY)" 8 6 .Ip "each ASSOC_ARRAY" 8 連想配列の次のキーと値の 2 つの要素から成る配列を順次返し、 それを繰り返すことができます。 各エントリはランダムのように見える順序で返されます。 配列全部が読み込まれたとき、ヌル配列 (代入されると FALSE(0) 値となる) が返されます。 その後、次の each() の呼び出しで繰り返しを再び始めます。 繰り返し情報は、配列からすべての要素を読み込むことによってのみ リセットできます。 繰り返しの間は、配列を変更してはいけません。 各連想配列につき一つずつ繰り返し情報があり、プログラム中のすべての each(), keys(), values() 関数呼び出しで共有されます。 次の例は、順序は異なるものの printenv プログラムのように環境変数を 表示します: .nf .ne 3 while (($key,$value) = each %ENV) { print "$key=$value\en"; } .fi keys() 関数と values() 関数も参照して下さい。 .Ip "eof(FILEHANDLE)" 8 8 .Ip "eof()" 8 .Ip "eof" 8 次に FILEHANDLE を読んだときファイル終端であるか、 または FILEHANDLE がオープンされていないとき、1 を返します。 FILEHANDLE は実際のファイルハンドル名を値に持つ式でもかまいません。 (この関数は、実際には一文字読み込んでは、ungetc するので、対話的な コンテキストではそれほど有用ではありません。) 引数無しの eof は、最後に読んだファイルの eof 状態を返します。 空の括弧 () は、コマンドラインで指定されたファイル群からなる 擬似ファイルを指します。つまり、eof() は while (<>) の内側で最後の ファイルの終端を検出するときに意味があります。 while (<>) ループの中で各ファイルを調べたいときは、eof(ARGV) または 括弧のない eof を使って下さい。 例: .nf .ne 7 # 最後のファイルの最終行の直前にダッシュを挿入します while (<>) { if (eof()) { print "\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\en"; } print; } .ne 7 # 各入力ファイル毎に、行番号をリセットします while (<>) { print "$.\et$_"; if (eof) { # Not eof(). close(ARGV); } } .fi .Ip "eval(EXPR)" 8 6 .Ip "eval EXPR" 8 6 .Ip "eval BLOCK" 8 6 EXPR は解析され、一つの小さな .I perl プログラムであるかのように実行されます。 .I perl プログラムのコンテキストの中で実行されるので、どの変数設定、 サブルーチン、フォーマット定義もその後に残ります。 戻り値は、丁度サブルーチンと同様に、最後に評価された式が返ります。 文法エラーや実行時エラーがあるか、die 文があれば、eval により undefined が返り、$@ にエラーメッセージがセットされます。 もしエラーがなければ、$@ はヌル文字列であることが保証されます。 EXPRを省略すると、$_ を評価します。 最後のセミコロンはどれも式から除かれます。 .Sp eval はしかし、致命的エラーまでトラップするので、 (dbmopen や symlinkのような) ある機能が実装されているかどうかを 決めるには便利なことを覚えておいて下さい。 die 演算子が例外を起こすように使われるのは、perl の例外トラップ機構 でもあります。 .Sp 実行されるコードが変わらないなら、その度に再コンパイルされる時間を 費すよりは、実行時エラーをトラップする eval-BLOCK の形をとった方が良い かもしれません。 どんなエラーも起これば $@ にメッセージが返ります。 EXPR のような、シングルクォートされた文字列を評価すると、同じ効果が ありますが、eval-BLOCK の形ではコンパイル時に文法エラーを報告するのに 対し、eval-EXPR の形では $@ を通して実行時に文法エラーを報告する点が 異なります。 eval-EXPR の形は、最初に成功したときに eval-BLOCK に最適化されます。 (e 修飾子を使った場合、置換される側はシングルクォートされた文字列と みなされ、同じ最適化が起こります。) 例: .nf .ne 11 # 0 除算を致命的エラーにしません eval { $answer = $a / $b; }; warn $@ if $@; # 初回使用後、同じものに最適化されます。 eval '$answer = $a / $b'; warn $@ if $@; # コンパイル時エラー eval { $answer = }; # 実行時エラー eval '$answer ='; # sets $@ .fi .Ip "exec(LIST)" 8 8 .Ip "exec LIST" 8 6 LIST の中に一つ以上の引数があるか、LIST が一つ以上の値を持つ配列ならば、 リストの引数を付けて execvp() を呼びます。 一つのスカラ引数だけなら、引数にシェルのメタキャラクタがあるかどうか を調べます。あれば、解析のために引数を丸ごと \*(L"/bin/sh \-c\*(R" に 渡し、無ければ、引数は単語に split され、execvp() に直接渡されます。 その方が効率が良いからです。 注意: exec (と system) は出力バッファをフラッシュしないので、出力が 失われるのを避けるために $| をセットする必要があるかもしれません。 例: .nf exec \'/bin/echo\', \'Your arguments are: \', @ARGV; exec "sort $outfile | uniq"; .fi .Sp もし、最初の引数を本当に実行したいのでなく、実行しようとしている プログラムの名前を詐称したいだけなら、本当に走らせたいプログラムを変数に 割り当てて、LIST の前に変数の名前をカンマを付けずに置くように 指定できます。 (これは、たとえ単一スカラしかリストに無くても、常に多くの値を持つ リストとして LIST の解釈を強制します。) 例: .nf .ne 2 $shell = '/bin/csh'; exec $shell '-sh'; # ログインシェルのふりをします .fi .Ip "exit(EXPR)" 8 6 .Ip "exit EXPR" 8 EXPR を評価し、ただちにその値で終了します。 例: .nf .ne 2 $ans = ; exit 0 \|if \|$ans \|=~ \|/\|^[Xx]\|/\|; .fi .IR die を参照して下さい。 EXPR が省略されると、値 0 の状態で終了します。 .Ip "exp(EXPR)" 8 3 .Ip "exp EXPR" 8 .I e の EXPR 乗を返します。 EXPR を省略すると、exp($_) を返します。 .Ip "fcntl(FILEHANDLE,FUNCTION,SCALAR)" 8 4 fcntl(2) 関数の実装です。 正しい関数定義を得るには、多分 .nf require "fcntl.ph"; # 多分 /usr/local/lib/perl/fcntl.ph .fi を始めに書いておかなければならないでしょう。 もし、fcntl.ph が存在しないか、もしくは正しい定義がされていない場合、 のような C のヘッダファイルに基づいて、 自分で何とかしなければなりません。 (perl kit から来る h2ph と呼ばれる perl スクリプトがあり、 このことを助けてくれるでしょう) 引数の処理と戻り値を返すことは、 この後に書かれている ioctl のように動作します。 fcntl は、fcntl(2) が実装されていないマシンで使われると 致命的エラーを生じます。 .Ip "fileno(FILEHANDLE)" 8 4 .Ip "fileno FILEHANDLE" 8 4 ファイルハンドルに対するファイルディスクリプタを返します。 select() のビットマップを構成するのに便利です。 FILEHANDLE が式だと、その値がファイルハンドルの名前と解釈されます。 .Ip "flock(FILEHANDLE,OPERATION)" 8 4 ファイルハンドルに対し flock(2) を呼びます。 OPERATION の定義については、flock(2) のマニュアルを参照して下さい。 成功すれば真を、失敗すれば偽を返します。 flock(2) が実装されていないマシンで使うと、致命的エラーになります。 以下は、BSD システムのメールボックスにメールを追加します。 .nf .ne 20 $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; sub lock { flock(MBOX,$LOCK_EX); # 待っている間に、他の誰かが追加する # 場合のために... seek(MBOX, 0, 2); } sub unlock { flock(MBOX,$LOCK_UN); } open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}") || die "Can't open mailbox: $!"; do lock(); print MBOX $msg,"\en\en"; do unlock(); .fi .Ip "fork" 8 4 fork() システムコールを実行します。 親プロセスに子の pid を返し、子プロセスには 0 を返します。 注意: フラッシュされていないバッファは、両方のプロセスでフラッシュ されずに残ります。これは二重出力を避けるために、$| をセットする必要が あるかもしれないということを意味します。 .Ip "getc(FILEHANDLE)" 8 4 .Ip "getc FILEHANDLE" 8 .Ip "getc" 8 FILEHANDLE に結びつけられた入力ファイルから、次の文字を返します。 EOF ではヌルを返します。 FILEHANDLE を省略すると、STDIN から読み込み ます。 .Ip "getlogin" 8 3 現在のログイン状況が /etc/utmp から得られれば、それを返します。 得られなければ、getpwuid を使って下さい。 $login = getlogin || (getpwuid($<))[0] || "Somebody"; .Ip "getpeername(SOCKET)" 8 3 SOCKET 接続の向こう側の pack された sockaddr アドレスを返します。 .nf .ne 4 # 内部 sockaddr $sockaddr = 'S n a4 x8'; $hersockaddr = getpeername(S); .ie t \{\ ($family, $port, $heraddr) = unpack($sockaddr,$hersockaddr); 'br\} .el \{\ ($family, $port, $heraddr) = unpack($sockaddr,$hersockaddr); 'br\} .fi .Ip "getpgrp(PID)" 8 4 .Ip "getpgrp PID" 8 指定された PID に対する現在のプロセスグループを返します。 現在のプロセスでは 0 です。 getpgrp(2) が実装されていないマシンで使うと、致命的エラーになります。 EXPR が省略されると、現在のプロセスのプロセスグループが返ります。 .Ip "getppid" 8 4 親プロセスのプロセス ID を返します。 .Ip "getpriority(WHICH,WHO)" 8 4 プロセス、プロセスグループ、ユーザの現在のプライオリティを返します。 (getpriority(2)を参照して下さい。) getpriority(2) を実装していないマシンで使うと致命的エラーになります。 .Ip "getpwnam(NAME)" 8 .Ip "getgrnam(NAME)" 8 .Ip "gethostbyname(NAME)" 8 .Ip "getnetbyname(NAME)" 8 .Ip "getprotobyname(NAME)" 8 .Ip "getpwuid(UID)" 8 .Ip "getgrgid(GID)" 8 .Ip "getservbyname(NAME,PROTO)" 8 .Ip "gethostbyaddr(ADDR,ADDRTYPE)" 8 .Ip "getnetbyaddr(ADDR,ADDRTYPE)" 8 .Ip "getprotobynumber(NUMBER)" 8 .Ip "getservbyport(PORT,PROTO)" 8 .Ip "getpwent" 8 .Ip "getgrent" 8 .Ip "gethostent" 8 .Ip "getnetent" 8 .Ip "getprotoent" 8 .Ip "getservent" 8 .Ip "setpwent" 8 .Ip "setgrent" 8 .Ip "sethostent(STAYOPEN)" 8 .Ip "setnetent(STAYOPEN)" 8 .Ip "setprotoent(STAYOPEN)" 8 .Ip "setservent(STAYOPEN)" 8 .Ip "endpwent" 8 .Ip "endgrent" 8 .Ip "endhostent" 8 .Ip "endnetent" 8 .Ip "endprotoent" 8 .Ip "endservent" 8 これらのルーチンは、システムライブラリ中の同名の関数を実行します。 配列のコンテキストの中では、これらの各 get ルーチンの戻り値は、 以下のようになります: .nf ($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell) = getpw.\|.\|. ($name,$passwd,$gid,$members) = getgr.\|.\|. ($name,$aliases,$addrtype,$length,@addrs) = gethost.\|.\|. ($name,$aliases,$addrtype,$net) = getnet.\|.\|. ($name,$aliases,$proto) = getproto.\|.\|. ($name,$aliases,$port,$proto) = getserv.\|.\|. .fi (もしエントリが存在しなければ、ヌルリストになります。) .Sp スカラのコンテキストでは、 name による検索でない場合には name が得られ、 name による検索の場合には name 以外が得られます。 (エントリが存在しない場合は、undefined 値となります。) 例: .nf $uid = getpwnam $name = getpwuid $name = getpwent $gid = getgrnam $name = getgrgid $name = getgrent 他 .fi getgr.\|.\|. の返す $menbers 値は、空白で区切られたグループメンバの ログイン名のリストです。 .Sp gethost.\|.\|. 関数では、h_errno 変数が C でサポートされていれば、 関数のコールが失敗したとき $? を介して返されます。 成功した関数コールの返す @addrs 値は、相当するシステムライブラリ 呼び出しに返された raw address のリストです。 インターネットドメイン (INET) では、各アドレスは 4 バイト長で 以下のように書くと unpack できます。 .nf ($a,$b,$c,$d) = unpack('C4',$addr[0]); .fi .Ip "getsockname(SOCKET)" 8 3 pack された、SOCKET接続のこちら側の sockaddr アドレスを返します。 .nf .ne 4 # An internet sockaddr $sockaddr = 'S n a4 x8'; $mysockaddr = getsockname(S); .ie t \{\ ($family, $port, $myaddr) = unpack($sockaddr,$mysockaddr); 'br\} .el \{\ ($family, $port, $myaddr) = unpack($sockaddr,$mysockaddr); 'br\} .fi .Ip "getsockopt(SOCKET,LEVEL,OPTNAME)" 8 3 要求したソケットのオプションを返します。エラーの場合は undefined を 返します。 .Ip "gmtime(EXPR)" 8 4 .Ip "gmtime EXPR" 8 time 関数に返された時刻を、Greenwich timezone として 9 要素の配列に 変換します。 通常は次のように使います: .nf .ne 3 .ie t \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); 'br\} .el \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); 'br\} .fi すべての配列要素は数値で、構造体 tm から直接得られるものです。 これにより $mon は 0.\|.11 の範囲で $wday は 0.\|.6 の範囲であることに なります。 EXPR を省略すると、gmtime(time) を実行します。 .Ip "goto LABEL" 8 6 LABEL というラベルを付けられた文を探し、そこから実行を再開します。 現在のところ、プログラムの本体内で do {} 構造の内側が 入れ子になっていない文にしか行けません。 この文は効率的には実装されておらず、 .IR sed -to- perl 翻訳プログラムを簡単にできるようにするためだけあります。 翻訳された .I sed スクリプトの一貫性のサポートはしますが、このセマンティックスを私がいつ 変更するかわからないので、自らの責任で使って下さい。 全く使わない方が良いでしょう。 .Ip "grep(EXPR,LIST)" 8 4 LIST の各要素に対して (ローカルには各要素を $_ にセット) 、EXPR を 評価して、式が真であると評価された要素だけからなる配列を返します。 スカラのコンテキストでは、式が真になった回数を数値で返します。 .nf @foo = grep(!/^#/, @bar); # コメントを除きます .fi $_ は配列値への参照なので、配列の要素を変更する場合に使えることを 覚えておきましょう。 これは便利ですが、LIST が名前のついた配列でないと、おかしな結果を 引き起こすことになります。 .Ip "hex(EXPR)" 8 4 .Ip "hex EXPR" 8 10 進値 EXPR を 16 進文字列にして返します。 (0 または 0x で始まる文字列を解釈するなら、oct() を参照して下さい。) EXPR を省略すると $_ を使います。 .Ip "index(STR,SUBSTR,POSITION)" 8 4 .Ip "index(STR,SUBSTR)" 8 4 STR の中で、POSITION かそれ以降に最初に SUBSTR が現れる位置を返します。 POSITION を省略すると、文字列の先頭から検索します。 戻り値は、0 か $[ 変数に設定されたものがベースになります。 SUBSTR がみつからないと、ベースから 1 を引いた値を返し、通常 \-1 に なります。 .Ip "int(EXPR)" 8 4 .Ip "int EXPR" 8 EXPR の整数部を返します。 EXPR が省略されると、$_ を使います。 .Ip "ioctl(FILEHANDLE,FUNCTION,SCALAR)" 8 4 これは、ioctl(2) 関数を実装しています。 正しい関数定義を得るには、多分始めの方で .nf require "ioctl.ph"; # 多分 /usr/local/lib/perl/ioctl.ph .fi と書かなければならないでしょう。 ioctl.ph が存在しないか、または正しく定義されていない場合、 のような C のヘッダファイルから自分自身でなんとかしな ければなりません。 (perl キットにある h2ph というスクリプトがこの助けになるでしょう。) SCALAR は、FUNCTIONに依存して、参照または書き込みがされます。 FUNCTION \*(--SCALAR の文字列値へのポインタは、実際の ioctl 呼び出しの 第 3 引数に渡されます。 (SCALAR が文字列値でなく数値であった場合、文字列値へのポインタでなく 数値そのものが渡されます。これが真であることを保証するには、このスカラを 使う前に 0 を加えて下さい。) ioctl() に使われる構造体の値を扱うには、pack() 関数と unpack() 関数が 便利です。 次の例は、DEL に erase 文字をセットします。 .nf .ne 9 require 'ioctl.ph'; $sgttyb_t = "ccccs"; # chars 4 個と short 1 個 if (ioctl(STDIN,$TIOCGETP,$sgttyb)) { @ary = unpack($sgttyb_t,$sgttyb); $ary[2] = 127; $sgttyb = pack($sgttyb_t,@ary); ioctl(STDIN,$TIOCSETP,$sgttyb) || die "Can't ioctl: $!"; } .fi ioctl (と fcntl) の戻り値は以下の通りです: .nf .ne 4 OS の戻り値:\h'|3i'perlの戻り値: -1\h'|3i' undefined 値 0\h'|3i' 文字列 "0 but true" それ以外\h'|3i' その数 .fi このように、perl は成功時に真を、失敗時に偽を返しますが、 オペレーティングシステムから返される実際の値も簡単に判定することができます: .nf ($retval = ioctl(...)) || ($retval = -1); printf "System returned %d\en", $retval; .fi .Ip "join(EXPR,LIST)" 8 8 .Ip "join(EXPR,ARRAY)" 8 分割されている LIST や ARRAY の文字列を、フィールドセパレータとして 値 EXPR をはさんだ一つの文字列につなげて、その文字列を返します。 例: .nf .ie t \{\ $_ = join(\|\':\', $login,$passwd,$uid,$gid,$gcos,$home,$shell); 'br\} .el \{\ $_ = join(\|\':\', $login,$passwd,$uid,$gid,$gcos,$home,$shell); 'br\} .fi .IR split を参照して下さい。 .Ip "keys(ASSOC_ARRAY)" 8 6 .Ip "keys ASSOC_ARRAY" 8 名前のついた連想配列のすべてのキーからなる普通の配列を返します。 キーは、見かけ上ランダムな順で返されますが、values() 関数や each() 関数 (これによって連想配列は変更されません) が生成するものと同じ順になります。 以下は、環境変数を表示する別の方法です: .nf .ne 5 @keys = keys %ENV; @values = values %ENV; while ($#keys >= 0) { print pop(@keys), \'=\', pop(@values), "\en"; } キーでソートすると: .ne 3 foreach $key (sort(keys %ENV)) { print $key, \'=\', $ENV{$key}, "\en"; } .fi .Ip "kill(LIST)" 8 8 .Ip "kill LIST" 8 2 プロセスのリストにシグナルを送ります。 リストの最初の要素は、送られるシグナルでなければなりません。 シグナル送信に成功したプロセスの数を返します。 .nf $cnt = kill 1, $child1, $child2; kill 9, @goners; .fi シグナルが負の場合、プロセスの代わりにプロセスグループを kill します。 (System Vでは、負の \fIプロセス\fR 番号はプロセスグループも kill しますが、互換性はありません。) クォートでくくられたシグナル名も使えます。 .Ip "last LABEL" 8 8 .Ip "last" 8 .I last コマンドは、(ループ内で使われるような) C の .I break 文に似ていて、該当するループを直ちに終了します。 LABEL が省略されると、このコマンドは最も内側のループを抜けます。 .I continue ブロックがあったとしても、実行されません: .nf .ne 4 line: while () { last line if /\|^$/; # ヘッダが終ったら抜けます .\|.\|. } .fi .Ip "length(EXPR)" 8 4 .Ip "length EXPR" 8 EXPR の値の文字列長を返します。 EXPR を省略すると、$_ の長さを返します。 .Ip "link(OLDFILE,NEWFILE)" 8 2 OLDFILE にリンクされた NEWFILE を作成します。 成功すると 1 を、失敗すると 0 を返します。 .Ip "listen(SOCKET,QUEUESIZE)" 8 2 listen システムコールと同じことを行ないます。 成功すると真を、失敗すると偽を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "local(LIST)" 8 4 閉じたブロック、サブルーチン、eval 、\*(L"do\*(R" に局所的な 変数リストを宣言します。 リストされたすべての要素は左辺値として妥当なものでなければなりません。 この演算子は、LIST 内のその時点での変数を隠れたスタックに保存し、 ブロックやサブルーチンや eval を抜けるときに戻すように動作します。 これは、呼ばれたサブルーチンもグローバル変数でなく、ローカル変数を 参照することを意味します。 そうしたければ、LIST に代入してローカル変数を初期化してもかまいません。 (初期値が特定の値として与えられていなければ、undefined 値として 生成されます。) 普通、これはサブルーチンのパラメータに名前をつけるのに使われます。 例: .nf .ne 13 sub RANGEVAL { local($min, $max, $thunk) = @_; local($result) = \'\'; local($i); # 多分 $thunk は $i を参照しています for ($i = $min; $i < $max; $i++) { $result .= eval $thunk; } $result; } .ne 6 if ($sw eq \'-v\') { # グローバルな配列でローカルな配列を初期化します local(@ARGV) = @ARGV; unshift(@ARGV,\'echo\'); system @ARGV; } # @ARGV が元に戻されます .ne 6 # 一時的に digits という連想配列に追加をしています。 if ($base12) { # (注意: これが効率的と言いたいわけではありません) local(%digits) = (%digits,'t',10,'e',11); do parse_num(); } .fi local() は実行時のコマンドで、ループ終了時に全部を一度に開放するまでは、 ループを通るたびに実行され、毎回スタックを消費していきます。 .Ip "localtime(EXPR)" 8 4 .Ip "localtime EXPR" 8 time 関数に返された時刻を、ローカルタイムゾーンとして解析された 9 要素の 配列に変換します。 通常次のように使われます: .nf .ne 3 .ie t \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 'br\} .el \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 'br\} .fi すべての配列要素は数字で、構造体 tm から直接得られたものです。 これにより $mon は 0.\|.11 の範囲で $wday は 0.\|.6 の範囲であることに なります。 EXPR を省略すると、localtime(time) を実行します。 .Ip "log(EXPR)" 8 4 .Ip "log EXPR" 8 EXPR の (底が .IR e の) 対数を返します。 EXPR を省略すると、$_ の log を返します。 .Ip "lstat(FILEHANDLE)" 8 6 .Ip "lstat FILEHANDLE" 8 .Ip "lstat(EXPR)" 8 .Ip "lstat SCALARVARIABLE" 8 stat() 関数と同じことを実行しますが、シンボリックリンクでは指している 先のファイルの代わりにシンボリックリンク自身の状態を返します。 シンボリックリンクが実装されていないシステムでは、通常の stat を 実行します。 .Ip "m/PATTERN/gio" 8 4 .Ip "/PATTERN/gio" 8 パターンマッチに合う文字列を検索し、真 (1) か偽 (\'\') を 返します。 =~ や !~ を介した文字列の指定がなければ、文字列 $_ が検索されます。 (=~ で指定された文字列は、左辺値である必要はありません。 式の評価結果でもかまいませんが、=~ はどちらかというと優先度が高いことを 覚えておいて下さい。) 正規表現のセクションを参照して下さい。 .Sp / が区切り文字である場合、始めの \*(L'm\*(R' は省略可能です。\*(L'm\*(R' が あると、英数字以外のどの文字でも区切りにできます。 これは、特に \*(L'/\*(R' を含む UNIX のパス名へのマッチに便利です。 最後の区切りの後にオプション文字 \*(L'i\*(R' が続くと、マッチングが 大文字小文字の区別なく行なわれます。 PATTERN は、スカラ変数への参照を含んでいてもよく、それはパターン検索 が評価される毎に挿入されます (パターンはリコンパイルされます) 。 ( $) と $| は文字列終端のテストに見えるため、挿入は行なわれません。) パターンを一度だけコンパイルさせたい場合は、後ろの区切り文字 の後に \*(L"o\*(R" を加えて下さい。 これにより、余分な実行時再コンパイルを避けられるので、挿入したい値が スクリプトの動いている間中、変わらないときには便利です。 PATTERN がヌル文字に評価されたときは、最後に成功した正規表現が代わりに 使われます。 .Sp 配列値が必要なコンテキストで使われると、パターンマッチはパターンの中で マッチした subexpression を括弧でくくったものすなわち、 ($1, $2, $3.\|.\|.) からなる配列を返します。 この場合、実際には $1, $2 等をセットは*せず*、 $+, $`, $&, $' もセットしません。 マッチが失敗すると、ヌル配列が返ります。 マッチが成功しても括弧がないと、配列値 (1) が返ります。 .Sp 例: .nf .ne 4 open(tty, \'/dev/tty\'); \|=~ \|/\|^y\|/i \|&& \|do foo(\|); # y なら foo を実行 if (/Version: \|*\|([0\-9.]*\|)\|/\|) { $version = $1; } next if m#^/usr/spool/uucp#; .ne 5 # 恵まれない人の grep $arg = shift; while (<>) { print if /$arg/o; # 一度だけコンパイル } if (($F1, $F2, $Etc) = ($foo =~ /^(\eS+)\es+(\eS+)\es*(.*)/)) .fi この最後の例は、$foo を最初の二語と残りに split し、三つのフィールド を $F1 、$F2 、$Etc に代入します。 どれかの変数が代入された場合、すなわちパターンがマッチした場合、 この条件は真となります。 .Sp \*(L"g\*(R" 修飾子は、グローバルパターンマッチの指定です\*(--つまり、 文字列の中でできるだけ多くのマッチを行ないます。 どのように振舞うかは、コンテキストに依存します。 配列のコンテキストでは、正規表現の中ですべての括弧にマッチした文字列の リストを返します。括弧がなければ、パターン全体を囲む括弧があるか のようにマッチした文字列すべてのリストを返します。 スカラのコンテキストでは、文字列を通してマッチする毎に*真*を返し、 マッチしなかったとき*偽*を返します。 (言いかえると、最後にテストした 場所を覚えていて、そこから再び検索を始めるということです。) 最後のマッチから文字列が変更されていないことを仮定しています。 マッチとマッチの間で文字列を変更することは、未定義な動作を引き起こす かもしれません。 (実際には substr()を使って、全文字列の長さを変えずにその場で変更する なら、できます。しかし、一般にはそういう変更は s///g を使うべきです。) 例: .nf # 配列のコンテキスト ($one,$five,$fifteen) = (\`uptime\` =~ /(\ed+\e.\ed+)/g); # スカラのコンテキスト $/ = ""; $* = 1; while ($paragraph = <>) { while ($paragraph =~ /[a-z][\'")]*[.!?]+[\'")]*\es/g) { $sentences++; } } print "$sentences\en"; .fi .Ip "mkdir(FILENAME,MODE)" 8 3 FILENAME で指定されたディレクトリを、(umask で修飾された) MODE で指定 されたパーミッションで作成します。 成功すると 1 を、失敗すると 0 を返し、$! (errno) をセットします。 .Ip "msgctl(ID,CMD,ARG)" 8 4 System V IPC 関数の msgctl を呼びます。 CMD が &IPC_STAT なら、ARG は 返された msqid_ds 構造を保持する変数でなければなりません。 ioctl のように、エラーのときは undefined 値を、0 のとき には "0 but true" を、でなければ実際の戻り値を返します。 .Ip "msgget(KEY,FLAGS)" 8 4 System V IPC 関数の msgget を呼びます。成功時はメッセージキュー ID を、 エラーが起これば undefined value を返します。 .Ip "msgsnd(ID,MSG,FLAGS)" 8 4 System V IPC 関数の msgsnd を呼び、メッセージ MSGS をメッセージキュー ID に送信します。 MSG は、pack("L", $type) で作られる long integer のメッセージ型で始めなければなりません。成功すれば真を、エラーが起こる と偽を返します。 .Ip "msgrcv(ID,VAR,SIZE,TYPE,FLAGS)" 8 4 System V IPC 関数 msgrcv を呼び、 メッセージキュー ID からメッセージを受け取り、 最大メッセージサイズ SIZE で変数 VAR に格納します。 メッセージを受け取ると、VAR に最初に格納されたものがメッセージ型 となり、VAR の最大長は、SIZE にメッセージ型のサイズを加えたものに なることに注意して下さい。 成功すると真を、エラーでは偽を返します。 .Ip "next LABEL" 8 8 .Ip "next" 8 .I next コマンドは、C の .I continue 文と同様に、ループの次の繰り返しを始めます。 .nf .ne 4 line: while () { next line if /\|^#/; # コメントを捨てます .\|.\|. } .fi 上の例で .I continue ブロックがあると、行が捨てられた場合でも実行されることを覚えておいて 下さい。 LABEL が省略されると、このコマンドは最も内側のループを続けます。 .Ip "oct(EXPR)" 8 4 .Ip "oct EXPR" 8 10 進数 EXPR を、8 進文字列にして返します。 (EXPRが 0x で始まる文字列なら、10 進の代わりに 16 進として変換します。) 以下は、10 進、8 進、16 進の標準的な記法を扱います。 .nf $val = oct($val) if $val =~ /^0/; .fi EXPR が省略されると、$_ を使います。 .Ip "open(FILEHANDLE,EXPR)" 8 8 .Ip "open(FILEHANDLE)" 8 .Ip "open FILEHANDLE" 8 EXPR で与えられたファイル名のファイルをオープンし、FILEHANDLE に結び つけます。 FILEHANDLE が式の場合、その値を実際にファイルハンドルが求める名前 として使います。 EXPR が省略されると、FILEHANDLE と同名のスカラ変数が保持する値が ファイル名となります。 ファイル名の前に \*(L"<\*(R" を付けるか、何も付けない場合、ファイルは 入力用にオープンされます。 ファイル名が \*(L">\*(R" で始まると、ファイルは出力用にオープンされます。 ファイル名が \*(L">>\*(R" で始まると、ファイルは追加書き込み用に オープンされます。 (\'>\' や \'<\' の前に \'+\' を付けると、ファイルを読み書き両用に できます。) ファイル名が \*(L"|\*(R" で始まると、ファイル名は出力がパイプされる コマンドと解釈され、ファイル名が \*(L"|\*(R" で終ると、入力が パイプされるコマンドと解釈されます。 (入出力共パイプするコマンドは必要がないでしょう。) \'\-\' をオープンすると .I STDIN を、\'>\-\' をオープンすると .IR STDOUT をオープンします。 open は成功したとき、0 でない値を、失敗したとき undefined 値を 返します。 open がパイプを含む場合、戻り値はサブプロセスの pid となります。 例: .nf .ne 3 $article = 100; open article || die "Can't find article $article: $!\en"; while (
) {\|.\|.\|. .ie t \{\ open(LOG, \'>>/usr/spool/news/twitlog\'\|); # (ログ保存) 'br\} .el \{\ open(LOG, \'>>/usr/spool/news/twitlog\'\|); # (ログ保存) 'br\} .ie t \{\ open(article, "caesar <$article |"\|); # 記事を decrypt 'br\} .el \{\ open(article, "caesar <$article |"\|); # 記事を decrypt 'br\} .ie t \{\ open(extract, "|sort >/tmp/Tmp$$"\|); # $$ は現在のプロセス 'br\} .el \{\ open(extract, "|sort >/tmp/Tmp$$"\|); # $$ は現在のプロセス 'br\} .ne 7 # 引数リストのファイルを、それがインクルードするものも # 含めて処理します foreach $file (@ARGV) { do process($file, \'fh00\'); # no pun intended } sub process { local($filename, $input) = @_; $input++; # 文字列インクリメント unless (open($input, $filename)) { print STDERR "Can't open $filename: $!\en"; return; } .ie t \{\ while (<$input>) { # 間接指定に注意 'br\} .el \{\ while (<$input>) { # 間接指定に注意 'br\} if (/^#include "(.*)"/) { do process($1, $input); next; } .\|.\|. # 続く } } .fi Bourne shell の慣習により、EXPR は \*(L">&\*(R" で始めるような指定も できます。その場合、文字列の残りはファイルハンドル (数字なら ファイルディスクリプタ) の名前と解釈され、dup して open します。 >>, <, +>, +>>, +< の後に & を使ってもかまいません。 指定するモードは、元のファイルハンドルのモードと一致していなくては なりません。 以下は、 .I STDOUT と .IR STDERR を保存し、リダイレクトを行なって、その後で書き戻します: .nf .ne 21 #!/usr/bin/perl open(SAVEOUT, ">&STDOUT"); open(SAVEERR, ">&STDERR"); open(STDOUT, ">foo.out") || die "Can't redirect stdout"; open(STDERR, ">&STDOUT") || die "Can't dup stdout"; select(STDERR); $| = 1; # バッファリングしません select(STDOUT); $| = 1; # バッファリングしません print STDOUT "stdout 1\en"; # これもサブプロセスで print STDERR "stderr 1\en"; # 動作します close(STDOUT); close(STDERR); open(STDOUT, ">&SAVEOUT"); open(STDERR, ">&SAVEERR"); print STDOUT "stdout 2\en"; print STDERR "stderr 2\en"; .fi コマンド \*(L"\-\*(R" でパイプをオープンする、すなわち \*(L"|\-\*(R" や \*(L"\-|\*(R" をオープンすると、暗黙のうちに fork され、open の 戻り値として親プロセスには、子プロセスの pid が返され、子プロセスには 0 が返されます。 (open が成功したかどうかは、defined($pid) を使って判断して下さい。) ファイルハンドルは、親にとって普通の挙動をしますが、子には .IR STDOUT / STDIN にパイプされたファイルハンドルの i/o となります。 子プロセスでファイルハンドルがオープンされず、\*(--新しく ファイルハンドルは、新しい .I STDIN から .IR STDOUT へのパイプとなります。 よく使われるのは、普通のパイプのオープンと同様、パイプコマンドの 実行状態をコントロールしたいとき、setuid されたプログラムを走らせるとき、 シェルコマンドでメタキャラクタのチェックをする必要がないときです。 次の二つは、それぞれある程度同等です: .nf .ne 5 open(FOO, "|tr \'[a\-z]\' \'[A\-Z]\'"); open(FOO, "|\-") || exec \'tr\', \'[a\-z]\', \'[A\-Z]\'; open(FOO, "cat \-n '$file'|"); open(FOO, "\-|") || exec \'cat\', \'\-n\', $file; .fi パイプされたファイルハンドルを明示的に close すると、親プロセスは 子プロセスが終了するのを待つことになり、$? に状態を返します。 fork を行う操作では、両方のプロセスでフラッシュされないバッファが そのまま残ることに注意して下さい。これは、二重出力を避けるために $| を セットした方が良いことを意味します。 .Sp open に渡されたファイル名は、前後の空白が除かれます。 意図的に変な文字を含むファイル名を持つファイルをオープンしたいときは、 前後の空白もこのように守ってやる必要があります: .nf .ne 2 $file =~ s#^(\es)#./$1#; open(FOO, "< $file\e0"); .fi .Ip "opendir(DIRHANDLE,EXPR)" 8 3 EXPR という名前のディレクトリを readdir(), telldir(), seekdir(), rewinddir(), closedir() で処理できるようにオープンします。 成功すると真を返します。 DIRHANDLE は、FILEHANDLE とは別個のそれ自身の名前空間を持ちます。 .Ip "ord(EXPR)" 8 4 .Ip "ord EXPR" 8 EXPR の最初の文字のアスキー値を数値で返します。 EXPR が省略されると、$_ を使います。 ''' Comments on f & d by gnb@melba.bby.oz.au 22/11/89 .Ip "pack(TEMPLATE,LIST)" 8 4 配列または値のリストを引数に取り、バイナリ構造体にパックし、 構造体を含む文字列を返します。 TEMPLATE は値の順序と型を与える文字のシークエンスで、以下のように なります: .nf A アスキー文字列(スペースが padding される) a アスキー文字列(ヌルが padding される) c signed char C unsigned char s signed short S unsigned short i signed integer I unsigned integer l signed long L unsigned long n short (\*(L"network\*(R" order) N long (\*(L"network\*(R" order) f 単精度浮動小数点 (native format) d 倍精度浮動小数点 (native format) p 文字列へのポインタ v short (\*(L"VAX\*(R" (little-endian) order) V long (\*(L"VAX\*(R" (little-endian) order) x null byte X Back up a byte @ 絶対位置にまでヌルで埋める u uuencode された文字列 b ビット文字列 (vec()のような昇順). B ビット文字列 (降順). h 16 進文字列 (低 nybble が先). H 16 進文字列 (高 nybble が先). .fi どの文字も繰り返し回数を表す数を続けることができます。 "a", "A", "b", "B", "h", "H" 以外の型では、pack 関数は LIST から回数を指定された数だけ値を取ります。 繰り返し数として * を使うと、残りすべての分だけ繰り返します。 "a" と "A" の型は値一つしか取りませんが、繰り返し指定を文字列長 として pack するので、ヌルや空白での padding が必要になります。 (unpack するときは、"A" は、後に続く空白を削りますが、"a" はしません。) 同様に、"b" と "B" フィールドは、指定したビット長を pack します。 "h" と "H" フィールドは、指定した長さの nybbles をパックします。 実数 (float と double) は、そのマシンの機械語フォーマットのみです。 浮動小数点フォーマット関係の多様性と標準の \*(L"network\*(R" 表現が 無いことから、交換することはできません。これは、 あるマシンで pack された浮動小数点データは、他のマシンでは、 たとえ両方が IEEE 浮動小数点数演算を行っていても (メモリ表現の endian は IEEE の仕様には無いから)、 読めないかもしれないということを意味します。 perl は、すべての数値計算を内部的には double を用い、 double -> float -> double という変換は精度を失うだろうということに 注意して下さい (すなわち、unpack("f",pack("f", $foo)) は一般に $foo にはなりません) 。 .br 例: .nf $foo = pack("cccc",65,66,67,68); # foo は "ABCD" $foo = pack("c4",65,66,67,68); # 上と同じ $foo = pack("ccxxcc",65,66,67,68); # foo は "AB\e0\e0CD" $foo = pack("s2",1,2); # little-endian の "\e1\e0\e2\e0" # big-endian の "\e0\e1\e0\e2" $foo = pack("a4","abcd","x","y","z"); # "abcd" $foo = pack("aaaa","abcd","x","y","z"); # "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\e0\e0\e0\e0\e0\e0\e0" $foo = pack("i9pl", gmtime); # 実際の tm 構造体 (少なくとも私のシステムでは) sub bintodec { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } .fi 一般に unpack 関数でも同じテンプレートが使われます。 .Ip "pipe(READHANDLE,WRITEHANDLE)" 8 3 相当するシステムコールのように一対の接続されたパイプをオープンします。 パイプでつながったプロセスのループを設定するときは、注意深くしないと デッドロックを起こすことがあることに気をつけて下さい。 それに加えて、perl のパイプは標準入力のバッファリングを使うので、 アプリケーションに依っては、$| をセットして コマンド毎に WRITEHANDLE をフラッシュする必要があるかもしれません。 [perl バージョン 3.0 パッチレベル 9 以上が必要] .Ip "pop(ARRAY)" 8 .Ip "pop ARRAY" 8 6 配列の最後の値を取り出し、配列の長さを 1 だけ短くします。 .nf $tmp = $ARRAY[$#ARRAY\-\|\-]; .fi 同じ結果となります。 配列に要素がない場合は、undefined 値を返します。 .Ip "print(FILEHANDLE LIST)" 8 10 .Ip "print(LIST)" 8 .Ip "print FILEHANDLE LIST" 8 .Ip "print LIST" 8 .Ip "print" 8 文字列または、カンマ区切りの文字列のリストを表示します。 成功すると、0 以外を返します。 FILEHANDLE は、ファイルハンドルの名前を保持したスカラ変数名でも かまいません。これにより 1 レベルの間接指定ができます。 (注意: FILEHANDLE が変数で次のトークンが項の場合、+ を挿入するか 引数に括弧を付けないと、演算子として解釈の間違いをするかもしれません。) FILEHANDLE が省略されると、デフォルトで標準出力 (または最後に select された出力チャンネル\*(-- select()を参照して下さい) に出力します。 LIST が省略されると、$_ を .IR STDOUT に出力します。 デフォルト出力チャンネルを .I STDOUT 以外に設定するには、select 演算子を使って下さい。 print は LIST を取るので、LIST の中のものは何でも配列のコンテキストで 評価され、サブルーチン呼び出しなら配列のコンテキストで評価された式を 持つことになるのを覚えておきましょう。 また、print キーワードの後に左括弧を置くときは、対応する右括弧が print の引数の終りを示す \*(--すなわち + を挿入するか、括弧をすべての引数に付ける のでなければ、左括弧を置いてはいけません。 .Ip "printf(FILEHANDLE LIST)" 8 10 .Ip "printf(LIST)" 8 .Ip "printf FILEHANDLE LIST" 8 .Ip "printf LIST" 8 \*(L"print FILEHANDLE sprintf(LIST)\*(R" と同等です。 .Ip "push(ARRAY,LIST)" 8 7 ARRAY (@ は省略可能) をスタックとして扱い、LIST の値を ARRAY の終りに 追加します。 ARRAY の長さは、LIST の長さだけ増えます。 これは、以下と同じことになります。 .nf for $value (LIST) { $ARRAY[++$#ARRAY] = $value; } .fi が、より効率的です。 .Ip "q/STRING/" 8 5 .Ip "qq/STRING/" 8 .Ip "qx/STRING/" 8 これは、実際には関数ではありませんが、クォートされた文字列に バックスラッシュをたくさん置き過ぎるのを避けるための、単なる 簡略記法です。 q 演算子はシングルクォートを生成し、qq 演算子はダブルクォートを 生成します。 qx 演算子は、バッククォートを生成します。 英数字でない文字なら、改行を含めて何でも、/ の代わりに区切り文字 にできます。 区切りが ( か { なら、終了の区切りは、対応する ) か } になります。 (埋め込み文字としての } には通常通り \ が必要になります。) 例: .nf .ne 5 $foo = q!I said, "You said, \'She said it.\'"!; $bar = q(\'This is it.\'); $today = qx{ date }; $_ .= qq *** The previous line contains the naughty word "$&".\en if /(ibm|apple|awk)/; # :-) .fi .Ip "rand(EXPR)" 8 8 .Ip "rand EXPR" 8 .Ip "rand" 8 ランダムな 0 から EXPR までの小数点数を返します。 (EXPR は正でなければなりません。) EXPR が省略されると、0 から 1 の範囲の値が返されます。 srand() を参照して下さい。 .Ip "read(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "read(FILEHANDLE,SCALAR,LENGTH)" 8 5 指定された FILEHANDLE から、LENGTH バイトのデータを読み込み、変数 SCALAR に格納します。 実際に読み込めたバイト数を返し、エラーの場合は undef を返します。 SCALAR は実際に読み込まれた長さに合わせて、伸縮します。 読んだデータを文字列の始めでなく、他の場所に格納するために、OFFSET を 指定することもできます。 これは、実際には stdio の fread コールで実装されています。 本当の read システムコールを使うには、sysread を参照して下さい。 .Ip "readdir(DIRHANDLE)" 8 3 .Ip "readdir DIRHANDLE" 8 opendir() にオープンされたディレクトリ内の、次のディレクトリエントリを 返します。 配列のコンテキストの中で使うと、残りすべてのディレクトリエントリを 返します。 エントリが残っていない場合、スカラのコンテキストでは undefined が、 配列のコンテキストではヌルリストを返します。 .Ip "readlink(EXPR)" 8 6 .Ip "readlink EXPR" 8 シンボリックリンクが実装されていれば、シンボリックリンクの値を返します。 実装されていなければ、致命的エラーを返します。 システムエラーが起こったときは、undefined 値を返し、$! (errno) を セットします。 EXPR を省略すると、$_ を使います。 .Ip "recv(SOCKET,SCALAR,LEN,FLAGS)" 8 4 ソケットからメッセージを受け取ります。指定した SOCKET ファイルハンドル から、LENGTH バイトのデータを受け取り、変数 SCALAR に格納します。 sender のアドレスを返し、エラーの場合は undefined 値を返します。 SCALAR は、実際に読み込まれた長さに合わせて、伸縮します。 同名のシステムコールと同じフラグを用います。 .Ip "redo LABEL" 8 8 .Ip "redo" 8 .I redo コマンドは、条件を再評価することなしに、ループブロックのコマンドを 再開します。 .I continue ブロックがあっても実行されません。 LABEL が省略されると、最も内側のループを参照します。 通常このコマンドは、入力された内容について、自分自身をだますような プログラムで使われます: .nf .ne 16 # 単純化した Pascal のコメント除去 # (警告: 文字列中には { や } はないものと仮定しています) line: while () { while (s|\|({.*}.*\|){.*}|$1 \||) {} s|{.*}| \||; if (s|{.*| \||) { $front = $_; while () { if (\|/\|}/\|) { # コメント終了? s|^|$front{|; redo line; } } } print; } .fi .Ip "rename(OLDNAME,NEWNAME)" 8 2 ファイル名を変更します。 成功すると 1 を、失敗すると 0 を返します。 ファイルシステムの境界を越えては働きません。 .Ip "require(EXPR)" 8 6 .Ip "require EXPR" 8 .Ip "require" 8 EXPR か EXPR が与えられなければ $_ で指定された、ライブラリファイルを インクルードします。 以下のようなサブルーチンと同じ意味になります: .nf sub require { local($filename) = @_; return 1 if $INC{$filename}; local($realfilename,$result); ITER: { foreach $prefix (@INC) { $realfilename = "$prefix/$filename"; if (-f $realfilename) { $result = do $realfilename; last ITER; } } die "Can't find $filename in \e@INC"; } die $@ if $@; die "$filename did not return true value" unless $result; $INC{$filename} = $realfilename; $result; } .fi 同じ名前で指定されたファイルは、二度はインクルードされないことに 注意して下さい。 どの初期化コードの起動も成功したこと示すため、ファイルの最後の文で、 真を返さなければなりません。だから、慣習的にそういうファイルは、 必ず真を返すということが確かでなければ、\*(L"1;\*(R" で 終るようにします。 .Ip "reset(EXPR)" 8 6 .Ip "reset EXPR" 8 .Ip "reset" 8 一般にループの終りで変数をクリアするのに .I continue ブロックの中で使われ、再びそれが働くように ?? 検索をリセットします。 式は 1 文字ずつ分けてリストしたもの (ハイフンで範囲指定) として解釈されます。 それらの文字の一つで始まる変数や配列はみな初期状態にリセットされます。 式を省略すると、一度だけマッチする検索 (?pattern?) をリセットし、 再びマッチするようにします。 現パッケージ内の変数と検索のみをリセットします。 常に 1 を返します。 例: .nf .ne 3 reset \'X\'; \h'|2i'# すべての X 変数をリセットします reset \'a\-z\';\h'|2i'# 小文字の変数すべてをリセットします。 reset; \h'|2i'# ?? 検索をリセットします。 .fi 注意: ARGV や ENV を消してしまうため、\*(L"A\-Z\*(R" をリセットする のは勧められません。 .Sp dbm 連想配列に reset を使っても、dbm ファイルを変更しません。 (しかし、perl がキャッシュしたエントリは皆フラッシュするので、 dbm ファイルを共有している場合は、便利です。便利でないかもしれませんが。) .Ip "return LIST" 8 3 指定した値で、サブルーチンから返ります。 (サブルーチンは、自動的に最後に評価された式の値を返すことに 注意して下さい。 これは、好まれる方法です\*(--明示的な .I return の使用で、やや遅くなります。) .Ip "reverse(LIST)" 8 4 .Ip "reverse LIST" 8 配列のコンテキストでは、LIST の要素を逆順に並べた配列を返します。 スカラのコンテキストでは、LIST の最初の要素のバイト列を逆順にした 文字列を返します。 .Ip "rewinddir(DIRHANDLE)" 8 5 .Ip "rewinddir DIRHANDLE" 8 DIRHANDLE に関し、readdir() で読み始める現在位置を、 ディレクトリの先頭にセットします。 .Ip "rindex(STR,SUBSTR,POSITION)" 8 6 .Ip "rindex(STR,SUBSTR)" 8 4 STR 内で、SUBSTR が最後に現れる位置を返す他は、index と全く同じに 動作します。 POSITION が指定されると、その位置の前で最後に現れた位置を返します。 .Ip "rmdir(FILENAME)" 8 4 .Ip "rmdir FILENAME" 8 FILENAME で指定されたディレクトリが空なら消去します。 成功すると 1 を、失敗すると 0 を返し、$! (errno) をセットします。 FILENAME が省略されると、$_ を使います。 .Ip "s/PATTERN/REPLACEMENT/gieo" 8 3 パターンに合う文字列を検索し、見つかると置換テキストに置き換えて、 置換が行なわれた数を返します。 でなければ、偽 (0) を返します。 \*(L"g\*(R" はオプションです。もしあれば、マッチしたパターンはすべて 置換されることを意味します。 \*(L"i\*(R" もオプションです。もしあれば、マッチングは大文字小文字の 区別なく行なわれることを意味します。 \*(L"e\*(R" もオプションです。もしあれば、置換文字列は ダブルクォートで囲まれた文字列のようにというより、 式として評価されなければならないことを意味します。 英数字でない文字ならなんでも、/ に置き換えて区切り文字にできます。 シングルクォートが使われると、置換文字列の中で変数の挿入が 行なわれません (e 修飾子はこれに優先します)。 バッククォート ` が使われると、置換文字列はコマンドとして実行され、 その出力が実際の置換テキストとして使われることになります。 PATTERN が <>, () で区切られると、REPLACEMENT は、それ自身のクォートを 持ち、それは <>, () であっても、そうでなくても良いことになります。 例えば、s(foo)(bar) や s/bar/ のように。 =~ や !~ 演算子を介する文字列指定がされなかったときは、$_ 文字列が 検索、置換されます。 (=~ で指定された文字列は、スカラ変数、配列の要素、それらへの代入等で なくてはなりません。すなわち左辺値ということです。) パターンが、文字列の終りをテストする $ でなく、変数に見える $ を含む 場合は、その変数が実行時にパターンに挿入されます。 初回だけ変数が挿入されてコンパイルされるパターンを使いたいなら、 終りに \*(L"o\*(R" を付けて下さい。 PATTERN がヌル文字列に評価されたときは、代わりに最後に成功した正規表現 が使われます。 正規表現のセクションを参照して下さい。 例: .nf s/\|\e\|bgreen\e\|b/mauve/g; # wintergreen を変更しません $path \|=~ \|s|\|/usr/bin|\|/usr/local/bin|; s/Login: $foo/Login: $bar/; # 実行時パターン ($foo = $bar) =~ s/bar/foo/; $_ = \'abc123xyz\'; s/\ed+/$&*2/e; # \*(L'abc246xyz\*(R' になる s/\ed+/sprintf("%5d",$&)/e; # \*(L'abc 246xyz\*(R' になる s/\ew/$& x 2/eg; # \*(L'aabbcc 224466xxyyzz\*(R' になる s/\|([^ \|]*\|) *\|([^ \|]*\|)\|/\|$2 $1/; # 始めの2フィールドを交換 .fi (最後の例では \|\e\| の代わりに $ を使っていることに注意。 正規表現のセクションを参照して下さい。) .Ip "scalar(EXPR)" 8 3 EXPR を強制的にスカラのコンテキストで解釈させて、EXPR の値を返します。 .Ip "seek(FILEHANDLE,POSITION,WHENCE)" 8 3 FILEHANDLE のポインタを、丁度 stdio の fseek() のように任意の 位置にします。 FILEHANDLE は、ファイルハンドルの名前を与える式でもかまいません。 成功すると 1 を、失敗すると 0 を返します。 .Ip "seekdir(DIRHANDLE,POS)" 8 3 DIRHANDLE について readdir() の読む現在位置をセットします。 POS は、telldir() の返す値でなければなりません。 相当するシステムライブラリルーチン同様、directory compaction について は同じ注意が必要です。 .Ip "select(FILEHANDLE)" 8 3 .Ip "select" 8 3 現在 select されたファイルハンドルを返します。 FILEHANDLE を与えられると、出力用の現在のデフォルトファイルハンドルを セットします。 これには二つの効果があります。一つは、ファイルハンドルの無い .I write や .I print が、デフォルトでこの FILEHANDLE に行なわれるということです。 二つ目は、出力に関連する変数参照が、この出力チャンネルを参照する ということです。 例えば、form フォーマットの先頭を、一つ以上の出力チャンネルに セットしなければならないとき、次のようにすると良いでしょう: .nf .ne 4 select(REPORT1); $^ = \'report1_top\'; select(REPORT2); $^ = \'report2_top\'; .fi FILEHANDLE は、実際のファイルハンドルの名前を与える式でもかまいません。 このように: .nf $oldfh = select(STDERR); $| = 1; select($oldfh); .fi .Ip "select(RBITS,WBITS,EBITS,TIMEOUT)" 8 3 これは、ビットマスクを指定して select システムコールを呼び出しします。 ビットマスクは、以下のように fileno() や vec() を使って作成されます。 .nf $rin = $win = $ein = ''; vec($rin,fileno(STDIN),1) = 1; vec($win,fileno(STDOUT),1) = 1; $ein = $rin | $win; .fi たくさんのファイルハンドルを select したいときは、サブルーチンを書いた 方が良いかもしれません。 .nf sub fhbits { local(@fhlist) = split(' ',$_[0]); local($bits); for (@fhlist) { vec($bits,fileno($_),1) = 1; } $bits; } $rin = &fhbits('STDIN TTY SOCK'); .fi 通常の使い方は、 .nf ($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout); また、何かが ready となるまでブロックしておくには、こうなります。 .ie t \{\ $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef); 'br\} .el \{\ $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef); 'br\} .fi ビットマスクはどれも undef にもできます。 TIMEOUT は秒で指定され、小数点数でもかまいません。 注意: すべての実装で $timeleft を返せるわけではありません。 できない場合、常に与えられた $timeout に等しい値の $timeleft を 返します。 .Ip "semctl(ID,SEMNUM,CMD,ARG)" 8 4 System V IPC 関数の semctl を呼び出します。 CMD が &IPC_STAT か &GETALL なら、ARG は返って来た semid_ds 構造体か、セマフォ値配列を 保持する変数でなければなりません。 ioctl 同様、エラーの場合 undefined 値が、0 の場合 "0 but true" が、 それ以外の場合実際の戻り値が返されます。 .Ip "semget(KEY,NSEMS,SIZE,FLAGS)" 8 4 System V IPC 関数 semget を呼び出します。セマフォ id を返し、エラーの 場合は undefined 値を返します。 .Ip "semop(KEY,OPSTRING)" 8 4 シグナルや wait のようなセマフォ操作を実行する System V IPC 関数 semop を呼び出します。 OPSTRING は、semop 構造体に pack された配列でなければなりません。 各 semop 構造体は \&'pack("sss", $semnum, $semop, $semflag)' で 生成できます。セマフォ操作の数は、OPSTRING の長さによります。 成功すると真を、エラーでは偽を返します。例として、以下のコードでは セマフォ id $semid のセマフォ $semnum を待ちます。 .nf $semop = pack("sss", $semnum, -1, 0); die "Semaphore trouble: $!\en" unless semop($semid, $semop); .fi セマフォにシグナルを送るには、"-1" を "1" にします。 .Ip "send(SOCKET,MSG,FLAGS,TO)" 8 4 .Ip "send(SOCKET,MSG,FLAGS)" 8 ソケットにメッセージを送ります。 同名のシステムコールと同じフラグを用います。 接続されていないソケットでは、送り先を TO として指定しなければ なりません。送った文字数を返します。エラーの場合は undefined 値を 返します。 .Ip "setpgrp(PID,PGRP)" 8 4 指定した PID のカレントプロセスグループをセットします。 PID は、 カレントプロセスでは 0 です。 setpgrp(2) が実装されていないマシンでは、致命的エラーとなります。 .Ip "setpriority(WHICH,WHO,PRIORITY)" 8 4 プロセス、プロセスグループ、ユーザのカレントプライオリティを セットします。 (setpriority(2) を参照して下さい。) setpriority(2) が実装されていないマシンでは、致命的エラーになります。 .Ip "setsockopt(SOCKET,LEVEL,OPTNAME,OPTVAL)" 8 3 リクエストされたソケットオプションをセットします。 エラーでは undefined を返します。 引数を渡したいので無ければ、OPTVAL は undef 値を指定しても かまいません。 .Ip "shift(ARRAY)" 8 6 .Ip "shift ARRAY" 8 .Ip "shift" 8 配列の最初の要素を配列から除き、その要素を返します。 配列は 1 だけ短くなり、他のすべての要素はずれます。 配列に要素がないときは、undefined 値を返します。 ARRAY を省略すると、メインプログラムでは @ARGV 配列を shift し、 サブルーチンでは @_ 配列を shift します。 (これは、辞書的に決められています) unshift(), push(), pop() を参照して下さい。 shift() と unshift() は、push() と pop() が配列の右端に行なうのと 同じことを、配列の左端で行ないます。 .Ip "shmctl(ID,CMD,ARG)" 8 4 System V IPC 関数 shmctl を呼び出します。 CMD が &IPC_STAT のとき、 ARG は、返された shmid_ds 構造体を保持する変数でなくてはなりません。 ioctl 同様の戻り値を返します。エラーでは undefined 値を、0 では "0 but true" を、それ以外では実際の値を返します。 .Ip "shmget(KEY,SIZE,FLAGS)" 8 4 System V IPC 関数 shmget を呼び出します。 共有メモリのセグメント id を返します。エラーでは、undefined 値を 返します。 .Ip "shmread(ID,VAR,POS,SIZE)" 8 4 .Ip "shmwrite(ID,STRING,POS,SIZE)" 8 Syste V の共有メモリセグメント ID を、位置 POS から始まる サイズ SIZE にて attach し、copy in/out し、detach することで、読み込み と書き込みを行ないます。 読み込み時、VAR は読まれたデータを保持する変数でなければ なりません。書き込み時に、STRING が長過ぎると、SIZE バイトだけが 使われます。STRING が短過ぎると、SIZE バイトを埋めるのにヌルが 書き込まれます。成功すると真を、エラーでは偽を返します。 .Ip "shutdown(SOCKET,HOW)" 8 3 ソケット接続を HOW で指示された流儀に従ってシャットダウンします。 同名のシステムコールと同様に HOW を解釈します。 .Ip "sin(EXPR)" 8 4 .Ip "sin EXPR" 8 EXPR (ラジアンで表現) のサインを返します。 EXPR を省略すると $_ のサインを取ります。 .Ip "sleep(EXPR)" 8 6 .Ip "sleep EXPR" 8 .Ip "sleep" 8 EXPR 秒間スクリプトを止めます。 EXPR がなければ永久に止めます。 プロセスに SIGALRM を送ることで、割り込まれます。 実際に sleep した秒数を返します。 sleep() は、しばしば alarm() を使って実装されているので、おそらく alarm() と sleep() は 混在させることはできないでしょう。 .Ip "socket(SOCKET,DOMAIN,TYPE,PROTOCOL)" 8 3 指定された種類のソケットをオープンして、ファイルハンドル SOCKET に 結びつけます。 DOMAIN, TYPE, PROTOCOL は、同名のシステムコールと同様に指定します。 perl ライブラリファイルから簡単に適当な値を得るには、h2ph を sys/soket.h に対して実行する必要があるかもしれません。 成功すると真を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "socketpair(SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL)" 8 3 指定されたドメインの指定された型で、無名のソケットペアを生成します。 DOMAIN, TYPE, PROTOCOL は、同名のシステムコールと同じように指定します。 実装されていない場合は、致命的エラーとなります。 成功すると真を返します。 .Ip "sort(SUBROUTINE LIST)" 8 9 .Ip "sort(LIST)" 8 .Ip "sort SUBROUTINE LIST" 8 .Ip "sort BLOCK LIST" 8 .Ip "sort LIST" 8 LIST をソートし、ソート済みの配列値を返します。 存在しない配列値は、削られます。 SUBROUTINE や BLOCK が省略されると、標準的な文字の比較による順でソート します。 0 より小さい整数、0 、0 より大きい整数を返すような SUBROUTINE の名前 を指定すると、配列の要素の並べ方に従って順に並べ直します。 (<=> と cmp 演算子は、このようなルーチンでは非常に便利です) SUBROUTINE は、スカラ変数名でもかまいません。その値として使用する サブルーチンの名前が入っていれば良いのです。 SUBROUTINE 名の代わりに、BLOCK を指定して、 無名のインラインソートサブルーチンとして用いることもできます。 .Sp 効率を良くするため、通常のサブルーチン呼び出しコードをバイパスしています。 そのため、次のような影響があります。 サブルーチンは再帰的であってはならず、 比較される 2 要素は @_ を介してではなく、$a と $b を介して サブルーチンに渡されます。 (以下の例を参照して下さい。) これらは参照渡しなので、$a や $b を変更してはいけません。 .Sp 例: .nf .ne 2 # 辞書順のソート @articles = sort @files; .ne 2 # 同じものだが、明示的なソートルーチン @articles = sort {$a cmp $b} @files; .ne 2 # 同じものだが逆順 @articles = sort {$b cmp $a} @files; .ne 2 # 数値的に昇順でソート @articles = sort {$a <=> $b} @files; .ne 2 # 数値的に降順でソート @articles = sort {$b <=> $a} @files; .ne 5 # 明示的にサブルーチン名を使ったソート sub byage { $age{$a} <=> $age{$b}; # 整数と仮定 } @sortedclass = sort byage @class; .ne 9 sub reverse { $b cmp $a; } @harry = (\'dog\',\'cat\',\'x\',\'Cain\',\'Abel\'); @george = (\'gone\',\'chased\',\'yz\',\'Punished\',\'Axed\'); print sort @harry; # AbelCaincatdogx と出力 print sort reverse @harry; # xdogcatCainAbel と出力 print sort @george, \'to\', @harry; # AbelAxedCainPunishedcatchaseddoggonetoxyz と出力 .fi .Ip "splice(ARRAY,OFFSET,LENGTH,LIST)" 8 8 .Ip "splice(ARRAY,OFFSET,LENGTH)" 8 .Ip "splice(ARRAY,OFFSET)" 8 配列から OFFSET と LENGTH で指定された要素を除き、LIST の要素と 入れ替えます。 配列から除かれた要素を返します。 配列は必要に応じて伸縮されます。 LENGTH を省略すると、OFFSET から先はすべて除かれます。 以下は皆同等となります。 ($[ == 0 であると仮定した場合) .nf push(@a,$x,$y)\h'|3.5i'splice(@a,$#a+1,0,$x,$y) pop(@a)\h'|3.5i'splice(@a,-1) shift(@a)\h'|3.5i'splice(@a,0,1) unshift(@a,$x,$y)\h'|3.5i'splice(@a,0,0,$x,$y) $a[$x] = $y\h'|3.5i'splice(@a,$x,1,$y); 次の例では、配列長は配列の前に渡されると仮定しています: sub aeq { # compare two array values local(@a) = splice(@_,0,shift); local(@b) = splice(@_,0,shift); return 0 unless @a == @b; # 同じ長さ? while (@a) { return 0 if pop(@a) ne pop(@b); } return 1; } if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... } .fi .Ip "split(/PATTERN/,EXPR,LIMIT)" 8 8 .Ip "split(/PATTERN/,EXPR)" 8 8 .Ip "split(/PATTERN/)" 8 .Ip "split" 8 文字列を文字列の配列に分けて、その配列を返します。 (配列のコンテキストではない場合、見つかったフィールドの数を返し、 split したものは @_ 配列に入れます。 (配列のコンテキストでは、パターン区切りとして ?? を使うことで強制的に @_ に split させられますが、それでも配列値を返します。)) EXPR を省略すると、$_ 文字列を split します。 PATTERN も省略すると、空白文字 (/[\ \et\en]+/) で split します。 PATTERN にマッチするものは何でもフィールドを分ける区切りと解釈されます。 (区切りは 1 文字より長くてもよいことに注意して下さい。) LIMIT が指定されると、それを越えない数に split されます (少ない場合も あります) 。 LIMIT が指定されないと、後に続くヌルフィールドは除かれます (pop()を使う人は良く覚えておいた方がよいでしょう) 。 ヌル文字にマッチするパターン (ヌルパターン // と混同しないで下さい。 // はヌル文字にマッチするパターンの一つにすぎません。) は、 マッチするすべての点で EXPR を一文字ずつに split します。 例えば: .nf print join(\':\', split(/ */, \'hi there\')); .fi は、\*(L'h:i:t:h:e:r:e\*(R' を出力します。 .Sp LIMIT パラメータは、行を部分的に split することに使われます。 .nf ($login, $passwd, $remainder) = split(\|/\|:\|/\|, $_, 3); .fi (リストに代入するとき、LIMIT が省略されていると perl は不必要な動作を 避けるためにリストの変数の数より一つ大きい LIMIT を与えます。 上記のリストでは LIMIT はデフォルトで 4 だったはずです。 時間に制限のあるアプリケーションでは、本当に必要な数以上のフィールドに は split しないようにすべきです。) .Sp PATTERN が括弧を含むときは、区切りとしてマッチする文字列により、 更に配列要素が作成されます。 .Sp split(/([,-])/,"1-10,20"); .Sp は以下の配列値を作ります。 .Sp (1,'-',10,',',20) .Sp パターン /PATTERN/ は、実行時に変わるパターンを指定する式で 置き換え可能です。 (実行時コンパイルを一回にしたければ、/$variable/o を使って下さい。) 特別なケースとして空白 (\'\ \') を指定すると、引数無しで split する 場合と同様ですが、先頭に空白があってもヌルフィールドは作られません。 つまり split(\'\ \') は、 .IR awk のデフォルトの動作をエミュレートすることができるわけで、split(/\ /) は先頭に空白があると、最初にその数だけヌルフィールドを作ります。 .Sp 例: .nf .ne 5 open(passwd, \'/etc/passwd\'); while () { .ie t \{\ ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(\|/\|:\|/\|); 'br\} .el \{\ ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(\|/\|:\|/\|); 'br\} .\|.\|. } .fi (上の例の $shell は改行文字を含みます。 chop() を参照して下さい。) .IR join を参照して下さい。 .Ip "sprintf(FORMAT,LIST)" 8 4 通常の printf 変換でフォーマットされる文字列を返します。 * 文字はサポートされていません。 .Ip "sqrt(EXPR)" 8 4 .Ip "sqrt EXPR" 8 EXPR の平方根を返します。 EXPR を省略すると、$_ の平方根を返します。 .Ip "srand(EXPR)" 8 4 .Ip "srand EXPR" 8 .I rand 演算子のために、乱数用の seed をセットします。 EXPR を省略すると、srand(time) を実行します。 .Ip "stat(FILEHANDLE)" 8 8 .Ip "stat FILEHANDLE" 8 .Ip "stat(EXPR)" 8 .Ip "stat SCALARVARIABLE" 8 EXPR という名前のファイルや FILEHANDLE でオープンされたファイルの 情報を示す 13 要素の配列を返します。 stat が失敗するとヌルリストを返します。 普通次のように使います: .nf .ne 3 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); .fi stat に特殊ファイルハンドル _ を渡すと、stat は実行されず最後に 行なわれた stat やファイルテストで使われた stat 構造体の内容を 返します。 例: .nf .ne 3 if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\en"; } .fi (この例は、NFS 下でデバイス番号が負になるマシンでのみ動作します。) .Ip "study(SCALAR)" 8 6 .Ip "study SCALAR" 8 .Ip "study" SCALAR (指定しなければ $_) について、それが次に変更される前に多くの パターンマッチを予想してあらかじめ行います。 検索をするパターンの性質や数、検索される文字列中の文字の出現頻度分布 によっては、時間を節約できるかもしれませんし、できないかもしれません。 \*(--多分これを使った場合と使わない場合で、実行時どちらが速いかを 比べてみたいでしょう。たくさんの短い定数文字列(より複雑なパターンの 定数部を含む)をスキャンするループで最も恩恵にあずかれるでしょう。 一度に一つの study しか効果がありません。\*(--別のスカラを study すると、先に study したものは \*(L"unstudied\*(R" となってしまいます。 (study の動作の仕方は次の通りです: 検索される文字列のすべての文字の リンクリストを作ります。そうすると例えば、どこに \*(L'k\*(R' の文字が あるかがすべてわかるわけです。いくつかの C のプログラムと英文から 作成された統計頻度表に基づき、各検索文字について、最も頻度が少ない 文字を選びます。この \*(L"頻度が少ない\*(R" 文字を調べるのです。) .Sp 次の例は、あるパターンを含むすべての行の前にインデックスを含むエントリを 挿入します: .nf .ne 8 while (<>) { study; print ".IX foo\en" if /\ebfoo\eb/; print ".IX bar\en" if /\ebbar\eb/; print ".IX blurfl\en" if /\ebblurfl\eb/; .\|.\|. print; } .fi /\ebfoo\eb/ を検索するとき、\*(L'f\*(R' は \*(L'o\*(R' よりも頻度が 少ないため、$_ の中で \*(L'f\*(R' を含む位置が探されます。 一般に、病的な場合を除いて、これは非常にうまくいきます。 唯一、最初の時点でリンクリストを作成するためにかかる以上の 時間を節約できるかが問題になります。 .Sp 実行するまで解らない文字列を検索しなければならない場合、全ループを 一つの文字列として解析し eval することで、すべてのパターンを毎回 再コンパイルするのを避けることができることを覚えておきましょう。 それに加えて全ファイルが 1 レコードになるように $/ を undef すると、 大変速くなり、fgrep のように特殊化したプログラムより速くなることも 多いです。 以下の例は、ファイルのリスト (@files) と単語のリスト (@words) を 検索し、マッチするファイル名を出力します: .nf .ne 12 $search = \'while (<>) { study;\'; foreach $word (@words) { $search .= "++\e$seen{\e$ARGV} if /\e\eb$word\e\eb/;\en"; } $search .= "}"; @ARGV = @files; undef $/; eval $search; # これは(メモリ不足で)泣きそう $/ = "\en"; # 普通の入力区切りに戻そう foreach $file (sort keys(%seen)) { print $file, "\en"; } .fi .Ip "substr(EXPR,OFFSET,LEN)" 8 2 .Ip "substr(EXPR,OFFSET)" 8 2 EXPR から部分文字列を取り出し、それを返します。 $[ をセットしない限り、最初の文字はオフセット 0 です。 OFFSET が負だと、文字列の終りから OFFSET だけ離れた位置から始めます。 LEN を省略すると、終端までのすべての文字列を返します。 substr() 関数は左辺値としても使えます。その場合 EXPR は左辺値 でなくてはなりません。 LEN より短いものを代入すると、文字列は短くなり、長いものを代入すると それを含められるように長くなります。 文字列を同じ長さに保つためには、sprintf() を使ってパディングまたは 切り捨てをしなければならないかもしれません。 .Ip "symlink(OLDFILE,NEWFILE)" 8 2 OLDFILE へのシンボリックリンク NEWFILE を作成します。 成功すると 1 を、失敗すると 0 を返します。 シンボリックリンクをサポートしないシステムでは、実行時に致命的エラー となります。 これをチェックするには、eval を使います: .nf $symlink_exists = (eval \'symlink("","");\', $@ eq \'\'); .fi .Ip "syscall(LIST)" 8 6 .Ip "syscall LIST" 8 リストの最初の要素で指定されたものに、残りの要素を引数として付けて、 システムコールを呼び出します。 実装されていないと致命的エラーとなります。 引数は次のように解釈されます: 与えられた引数が数字なら、引数は 整数として渡されます。そうでなければ、文字列へのポインタが渡されます。 結果が受け取れるように、書き込まれるべき文字列を十分長くしておくのは、 あなたの責任です。 数字の引数がリテラルでなく、それまで数字のコンテキストで解釈されて いなかったものなら、強制的に数字に見せるように、 0 を足す必要があるかもしれません。 .nf # h2ph を実行しておく必要があるかもしれません require 'syscall.ph'; syscall(&SYS_write, fileno(STDOUT), "hi there\en", 9); .fi .Ip "sysread(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "sysread(FILEHANDLE,SCALAR,LENGTH)" 8 5 システムコール read(2) を使って、指定した FILEHANDLE から LENGTH バイトのデータを読み込み、変数 SCALAR に格納します。 これは標準入出力を経由しないので、read と混在して使うと、 混乱するかもしれません。 実際に読み込まれたバイト数を返します。エラーの場合は undef を返します。 SCALAR は実際に読み込まれた長さによって伸縮します。 文字列の始めでなく途中にデータを格納するように、OFFSET を指定できます。 .Ip "system(LIST)" 8 6 .Ip "system LIST" 8 \*(L"exec LIST\*(R" と全く同じことを行ないますが、違いは最初に fork が 実行されて、親プロセスは子プロセスが終了するのを待つことです。 引数の処理は、引数の数によって変わることに注意して下さい。 戻り値は、wait() で返るプログラムの終了時ステータスになります。 実際の終了時ステータスを得るには、256 で割って下さい。 .IR exec を参照。 .Ip "syswrite(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "syswrite(FILEHANDLE,SCALAR,LENGTH)" 8 5 システムコール write(2) を使って、指定した FILEHANDLE に 変数 SCALAR から LENGTH バイトのデータを書き込みます。 これは標準入出力を経由しないので、print と混在して使うと、 混乱するかもしれません。 実際に書き込まれたバイト数を返します。エラーの場合は undef を返します。 OFFSET で、文字列の始めでなく途中からデータを読むように指定できます。 .Ip "tell(FILEHANDLE)" 8 6 .Ip "tell FILEHANDLE" 8 6 .Ip "tell" 8 FILEHANDLE の現在のファイル位置を返します。 FILEHANDLE は、実際のファイルハンドルの名前を与える式でもかまいません。 FILEHANDLE を省略すると、最後に読んだファイルを使います。 .Ip "telldir(DIRHANDLE)" 8 5 .Ip "telldir DIRHANDLE" 8 DIRHANDLE について readdir() ルーチンの現在の位置を返します。 この値は、ディレクトリの特定の位置をアクセスするために、seekdir() の 引数に使います。 相当するシステムライブラリルーチン同様、directory compaction について は同じ注意が必要です。 .Ip "time" 8 4 1970 年 1 月 1 日 00:00:00 (UTC) からの通算の秒数(閏秒無し)を返します。 gmtime() や localtime() に使うことができます。 .Ip "times" 8 4 現在のプロセスと子プロセスのユーザ、システム時間(秒)からなる 4 要素の 配列を返します。 .Sp ($user,$system,$cuser,$csystem) = times; .Sp .Ip "tr/SEARCHLIST/REPLACEMENTLIST/cds" 8 5 .Ip "y/SEARCHLIST/REPLACEMENTLIST/cds" 8 SEARCHLIST にある文字が出現したら、すべて REPLACEMENTLIST の相当する 文字に変換します。 変換または削除された文字の数を返します。 =~ や !~ 演算子を介した文字列の指定をしなかった場合、$_ 文字列が 変換されます。 (=~ で指定した文字列は、スカラ変数か配列の要素かそれらへの代入 でなければいけません。つまり、左辺値ということになります。) .I sed 信者のために、 .I tr の別名 .I y が用意されています。 SEARCHLIST が [], <>, () で区切られていると、REPLACEMENTLIST は、 それ自身のクォートを持ち、それは [], <>, () であっても、そうでなくても 良いことになります。例えば、 tr[A-Z][a-z] または tr(+-*/)/ABCD/ のようになります。 .Sp c 修飾子が指定されると、SEARCHLIST の文字セットは補間されます。 d 修飾子が指定されると、SEARCHLIST で指定された文字で REPLACEMENTLIST に対応するものがないものは皆、削除されます。 (これは、SEARCHLIST で見つかったものを何でも削除してしまう ような .I tr プログラムの挙動よりも、やや柔軟です。) s 修飾子が指定されると、変換されて同じ文字が続いたとき、 それを 1 文字に縮めます。 .Sp d 修飾子が使われると、REPLACEMENTLIST は常に指定された通りに 解釈されます。それ以外の場合で、REPLACEMENTLIST が SEARCHLIST より 短いときは、同じ長さになるまで最後の文字が繰り返されます。 REPLACEMENTLIST がヌルだと、SEARCHLIST がコピーされます。 これは、あるクラスに含まれる文字をカウントしたり、あるクラスの文字の 重複を縮めるときに便利です。 .Sp 例: .nf $ARGV[1] \|=~ \|y/A\-Z/a\-z/; \h'|3i'# 小文字に統一します $cnt = tr/*/*/; \h'|3i'# $_ の中の * を数えます $cnt = tr/0\-9//; \h'|3i'# $_ の中の数字を数えます tr/a\-zA\-Z//s; \h'|3i'# bookkeeper \-> bokeper ($HOST = $host) =~ tr/a\-z/A\-Z/; y/a\-zA\-Z/ /cs; \h'|3i'# アルファベット以外を 1 文字の空白にします tr/\e200\-\e377/\e0\-\e177/;\h'|3i'# 8 ビット目を消します .fi .Ip "truncate(FILEHANDLE,LENGTH)" 8 4 .Ip "truncate(EXPR,LENGTH)" 8 FILEHANDLE や EXPR の名前のファイルを指定した長さに切り詰めます。 システムに truncate が実装されていないと、致命的エラーになります。 .Ip "umask(EXPR)" 8 4 .Ip "umask EXPR" 8 .Ip "umask" 8 プロセスに umask をセットし、変更前の値を返します。 EXPR が省略されると、単に現在の umask を返します。 .Ip "undef(EXPR)" 8 6 .Ip "undef EXPR" 8 .Ip "undef" 8 EXPR の値を undefined とします。これは左辺値でなければなりません。 スカラ値、配列全体、サブルーチン名 (& を使う) の場合でのみ使えます。 (undef は、多分ほとんどの予約変数、dbm 配列値では期待する動作となりません。) undef は、常に undefined 値を返します。 EXPR を省略することもできます。その場合は何も undef されませんが、 それでも undefined 値を得ることができます。 例えば、サブルーチンから return するときです。 例: .nf .ne 6 undef $foo; undef $bar{'blurfl'}; undef @ary; undef %assoc; undef &mysub; return (wantarray ? () : undef) if $they_blew_it; .fi .Ip "unlink(LIST)" 8 4 .Ip "unlink LIST" 8 リストに含まれるファイルを削除します。 削除に成功したファイルの数を返します。 .nf .ne 2 $cnt = unlink \'a\', \'b\', \'c\'; unlink @goners; unlink <*.bak>; .fi 注意: unlink は、自分がスーパユーザで .IR perl に .B \-U フラグを付けている場合を除くとディレクトリを消去はしません。 これらの条件がそろったとしても、ディレクトリの unlink は システムにダメージを与えることがあるので、気をつけて下さい。 代わりに rmdir を使って下さい。 .Ip "unpack(TEMPLATE,EXPR)" 8 4 unpack は pack の逆を行ないます: 構造体を示す文字列を引数に取り、 それを配列値に出力し、配列値を返します。 (スカラのコンテキストでは、生成された最初の値のみを返します。) TEMPLATE は、pack 関数と全く同じフォーマットになります。 以下は、substr を実行するサブルーチンです: .nf .ne 4 sub substr { local($what,$where,$howmuch) = @_; unpack("x$where a$howmuch", $what); } .ne 3 そして、 sub ord { unpack("c",$_[0]); } .fi というのもあります。 更に、フィールドの前に %<数字> の添字を付けることにより、 項目そのものの代わりに、項目の<数字>ビットのチェックサムが欲しいと いう指定になります。 デフォルトは、16 ビットのチェックサムです。 次の例で、System V の sum プログラムと同じ数が計算されます: .nf .ne 4 while (<>) { $checksum += unpack("%16C*", $_); } $checksum %= 65536; .fi .Ip "unshift(ARRAY,LIST)" 8 4 視点によって、 .IR shift の逆、または .IR push の逆を行ないます。 LIST を配列の前に付け加え、新しい配列の要素の数を返します。 .nf unshift(ARGV, \'\-e\') unless $ARGV[0] =~ /^\-/; .fi .Ip "utime(LIST)" 8 2 .Ip "utime LIST" 8 2 リストの各ファイルのアクセス時刻と最終変更時刻を変えます。 リストの最初の二つの要素には、*数値*で表されたアクセス時刻と変更時刻が この順で入っていなければなりません。 変更に成功したファイルの数が返ります。 各ファイルの inode 変更時刻には現在時間がセットされます。 以下は、\*(L"touch\*(R" コマンドの例です: .nf .ne 3 #!/usr/bin/perl $now = time; utime $now, $now, @ARGV; .fi .Ip "values(ASSOC_ARRAY)" 8 6 .Ip "values ASSOC_ARRAY" 8 名前付き連想配列のすべての値からなる普通の配列を返します。 値は、見かけ上ランダムな順で返るように見えますが、同じ連想配列に対して、 keys() 関数 や each() 関数が生成するものと同じ順になります。 keys() と each() を参照して下さい。 .Ip "vec(EXPR,OFFSET,BITS)" 8 2 文字列を unsigned integer のベクトルとして扱い、指定した ビットフィールドの値を返します。 代入もできます。 BITSは、2 の累乗で 1 から 32 まででなければなりません。 .Sp vec() に生成されたベクトルは、論理演算子 |, &, ^ で操作することができ、 両方のオペランドが文字列のとき、 ビットベクトル演算をするものとみなされます。 古いプログラムを守るために、プログラム中に少なくとも一つの vec() が ないと、この解釈はなされません。 .Sp ビットベクトルを 0 や 1 の文字列や配列に変換するには、 以下を使って下さい: .nf $bits = unpack("b*", $vector); @bits = split(//, unpack("b*", $vector)); .fi ビットの正確な長さがわかるならば、* の代わりに使うことができます。 .Ip "wait" 8 6 子プロセスが終了するのを待ち、死んだプロセスの pid を返します。 子プロセスがないときは、-1 を返します。 終了時ステータスは $? に返されます。 .Ip "waitpid(PID,FLAGS)" 8 6 特定の子プロセスが終了するのを待ち、死んだプロセスの pid を返します。 そのような子プロセスがなければ、-1 を返します。 終了時ステータスは $? に返されます。 次のように書くと、 .nf require "sys/wait.h"; .\|.\|. waitpid(-1,&WNOHANG); .fi どのプロセスに対しても、non-blocking wait を実行できます。 non-blocking wait は、 .I waitpid (2) か、または .I wait4 (2) システムコールをサポートしているマシンでのみ使えます。 しかし、FLAGS 0 での 特殊な pid の wait はどこでも実装されています。 (perl は、終了したものの perl スクリプトには採り入れられていない プロセスのステータス値を覚えていることでシステムコールをエミュレート します。) .Ip "wantarray" 8 4 現在実行しているサブルーチンのコンテキストが配列値なら真を返します。 スカラのコンテキストに見えれば、偽を返します。 .nf return wantarray ? () : undef; .fi .Ip "warn(LIST)" 8 4 .Ip "warn LIST" 8 \*(L"die\*(R" と同じようなメッセージを標準エラー出力に出しますが、 終了しません。 .Ip "write(FILEHANDLE)" 8 6 .Ip "write(EXPR)" 8 .Ip "write" 8 指定したファイルに、関連付けられたフォーマットを使って、 フォーマットレコード (複数行も可) を書き込みます。 デフォルトで、フォーマットはファイルハンドルと同じ名前を持つものに なりますが、$~ 変数にフォーマットの名前を明示的に割り当てることで、 現在の出力チャンネル ( .IR select を参照して下さい) に対するフォーマットをセットしてもかまいません。 .Sp 最上位の form 生成は自動的に行なわれます: フォーマットされたレコードに対して、現在のページに十分な空きがない 場合、改頁が書き込まれて、次のページに移ります。 新しいページのヘッダには、特別なページ先頭フォーマットが使われ、 その後レコードが書き込まれます。 デフォルトでページ先頭フォーマットは、 ファイルハンドルの名前に \*(L"_TOP\*(R" を付け加えたものになりますが、 ファイルハンドルが select されているときは、$^ 変数に名前を割り当てる ことで、好きなフォーマットを動的にセットしてもかまいません。 現在のページに残っている行数は、変数 $- に保持されていますが、0 を セットすることがで、強制的に新しいページに移ることができます。 .Sp FILEHANDLE が指定されないと、現在のデフォルト出力チャンネルに 出力されます。デフォルト出力は、起動時 .I STDOUT ですが、 .I select 演算子で変更できます。 FILEHANDLE が EXPR のとき、その式が実行時に評価され、結果の文字列が FILEHANDLE の名前として用いられます。 フォーマットについての詳細は、後述のフォーマットのセクションを 参照して下さい。 .Sp write は read の*逆ではない*ことに注意して下さい。 .Sh "優先度" .I perl の演算子は次のような結合規則と優先度を持っています: .nf なし\h'|1i'print printf exec system sort reverse \h'1.5i'chmod chown kill unlink utime die return 左から右\h'|1i', 右から左\h'|1i'= += \-= *= など 右から左\h'|1i'?: なし\h'|1i'.\|. 左から右\h'|1i'|| 左から右\h'|1i'&& 左から右\h'|1i'| ^ 左から右\h'|1i'& なし\h'|1i'== != <=> eq ne cmp なし\h'|1i'< > <= >= lt gt le ge なし\h'|1i'chdir exit eval reset sleep rand umask なし\h'|1i'\-r \-w \-x など 左から右\h'|1i'<< >> 左から右\h'|1i'+ \- 左から右\h'|1i'* / % x 左から右\h'|1i'=~ !~ 右から左\h'|1i'! ~ 単項の- 右から左\h'|1i'** なし\h'|1i'++ \-\|\- 左から右\h'|1i'\*(L'(\*(R' .fi 始めの方で述べたように、リストを引数にする演算子 (print 他) や、 任意の単項演算子 (chdir 他) のすぐ後に同じ行の次のトークンとして 左括弧がある場合、括弧の中の演算子と引数は、丁度通常の ファンクションコールと同様に再優先とみなされます。 例: .nf chdir $foo || die;\h'|3i'# (chdir $foo) || die chdir($foo) || die;\h'|3i'# (chdir $foo) || die chdir ($foo) || die;\h'|3i'# (chdir $foo) || die chdir +($foo) || die;\h'|3i'# (chdir $foo) || die しかし、* は || よりも優先度が高いので: chdir $foo * 20;\h'|3i'# chdir ($foo * 20) chdir($foo) * 20;\h'|3i'# (chdir $foo) * 20 chdir ($foo) * 20;\h'|3i'# (chdir $foo) * 20 chdir +($foo) * 20;\h'|3i'# chdir ($foo * 20) rand 10 * 20;\h'|3i'# rand (10 * 20) rand(10) * 20;\h'|3i'# (rand 10) * 20 rand (10) * 20;\h'|3i'# (rand 10) * 20 rand +(10) * 20;\h'|3i'# rand (10 * 20) .fi 括弧がないと、print, sort, chmod といったリストを引数に持つ演算子は、 演算子の左側を見ているか右側を見ているかによって、非常に高くも 非常に低くもなります。 例えば、次の例で .nf @ary = (1, 3, sort 4, 2); print @ary; # 1324 を出力 .fi sort の右側のコンマは、sort の前に評価されますが、左側のコンマは、 後で評価されます。 言い換えると、リストを引数に取る演算子は、それに続くすべての引数を 拾う傾向にあり、前の式にしたがって単一の命令語のように振舞います。 括弧に注意深くなければいけないことを覚えておいて下さい: .nf .ne 3 # これらを評価すると、print を実行する前に exit します。 print($foo, exit); # 明らかにやりたいこととは違います print $foo, exit; # これもそう .ne 4 # これらは、exit を評価する前に print を実行します。 (print $foo), exit; # これはやりたいことです print($foo), exit; # これもそう print ($foo), exit; # さらにこれも また、これは print ($foo & 255) + 1, "\en"; .fi 多分一目見て期待する動作とは違うことを実行するでしょう。 .Sh "サブルーチン" サブルーチンは次のように宣言されます: .nf sub NAME BLOCK .fi .PP ルーチンに渡されたすべての引数は、配列 @_ に入ります。 これは、($_[0], $_[1], .\|.\|.) です。 配列 @_ はローカル配列ですが、その値は実際のスカラパラメータへの参照 になります。 サブルーチンの戻り値は、最後の式が評価されたときの値で、配列値にも スカラ値にもなり得ます。 また、リターン文は戻り値を指定してサブルーチンを抜けることにも 使われます。 ローカル変数を作成するには、 .I local 演算子を参照して下さい。 .PP サブルーチンは、 .I do 演算子かまたは & 演算子を使って呼ばれます。 .nf .ne 12 例: sub MAX { local($max) = pop(@_); foreach $foo (@_) { $max = $foo \|if \|$max < $foo; } $max; } .\|.\|. $bestday = &MAX($mon,$tue,$wed,$thu,$fri); .ne 21 例: # 行を取得し、空白で始まる行は # 続きの行として結合されます。 sub get_line { $thisline = $lookahead; line: while ($lookahead = ) { if ($lookahead \|=~ \|/\|^[ \^\e\|t]\|/\|) { $thisline \|.= \|$lookahead; } else { last line; } } $thisline; } $lookahead = ; # 最初の行を取得します while ($_ = do get_line(\|)) { .\|.\|. } .fi .nf .ne 6 引数に名前を付けるには、ローカルリストへの配列の代入を使います: sub maybeset { local($key, $value) = @_; $foo{$key} = $value unless $foo{$key}; } .fi 代入は値をコピーするので、これは参照呼び出しを値呼び出しに換える効果も あります。 .Sp サブルーチンは再帰的に呼び出せます。 サブルーチンが & の型を使って呼び出されるとき、引数リストは省略 できます。 省略されると、サブルーチンには @_ 配列がセットされません; その代わり、呼び出し時に @_ 配列は、サブルーチンには可視となります。 .nf do foo(1,2,3); # 三つの引数を渡します &foo(1,2,3); # 上と同じです do foo(); # ヌルリストを渡します &foo(); # 上と同じです &foo; # 引数を渡しません\*(--より効率的 .fi .Sh "参照渡し" サブルーチンへ配列の値を渡すのではなく、その名前を渡して、サブルーチン がローカルなコピーに対してではなくグローバルな配列を変更できるように したいときがあるでしょう。 perl では名前を持つすべてのオブジェクトに対して、その名前の前に * を つけて参照できます: *foo のように。 これが評価されると、ファイルハンドル、フォーマット、サブルーチンを含む、 その名前を持つすべてのオブジェクトを表すスカラ値となります。 local() 演算子に代入されたとき、その名前がそれに代入された * 値を 参照するようになります。 例: .nf sub doubleary { local(*someary) = @_; foreach $elem (@someary) { $elem *= 2; } } do doubleary(*foo); do doubleary(*bar); .fi *name への代入は今のところ local() の中でしか勧められません。 実際には *name への代入はどこででもできますが、それ以前の *name への 参照が永遠に尾を引くかもしれません。 これにより困ったことになるかもしれませんし、ならないかもしれません。 .Sp スカラはすでに参照渡しですが、このメカニズムを用いなくても、 関心のある $_[nnn] への明示的な参照を行うことで、スカラの引数を 変更することができます。 すべての要素をスカラで渡すことで、すべての配列の要素を変更することが できますが、push や pop 、配列のサイズの変更には * メカニズムを 使わなければなりません。 どんな場合でも、* メカニズムは多分、より効率が良いはずです。 .Sp *name 値は表示不能なバイナリデータを含むので、print の引数または printf や sprintf の %s 引数として使われると、表示を綺麗にするため '*name' と いう値になります。 .Sp 通常 LIST メカニズムはすべての配列値をマージしてしまって、個々の配列を 取り出せなくなってしまうので、配列を変更したくないとしても、 このメカニズムは一つの LIST にたくさんの配列を渡すのに便利です。 .Sh "正規表現" パターンマッチで使われるパターンは、バージョン 8 regexp ルーチンで供給 されているものと同じ正規表現です。 (実際、このルーチンは Henry Spencer の自由に再配布可能な再実装 V8 ルーチン から抜き取って使われています。) それに加えて、\ew は英数字 (\*(L"_\*(R" を含む) にマッチし、 \eW は非英数字にマッチします。 単語境界は \eb に、非単語境界は \eB に。 空白文字は \es に、非空白文字は \eS に。 数字は \ed に、非数字は \eD にマッチします。 \ew, \es, \ed はキャラクタクラスでも使えます。 また、\en, \er, \ef, \et, \eNNN は通常と同じ意味となります。 キャラクタクラスの中では、\eb は単語境界ではなく、 バックスペースを表します。 選択候補は、| で区切ります。 括弧構造 \|(\ .\|.\|.\ \|) を使うと、\e<数字> はその数字番目の 部分文字列にマッチします。 (パターンの外では、数字の前に \e の代わりに常に $ を用いなければ なりません。$<数字> (と $\`, $&, $\') の有効範囲は、閉じたブロックの 終りか、eval 文字列か、次のパターンマッチまでとなります。 \e<数字> 記述は、ときに現在のパターンの外に作用しますが、それに頼って はいけません。) 括弧は好きなだけたくさん使ってかまいません。9 個以上の部分文字列が あると、変数 $10, $11, ... が対応する部分文字列を参照します。 後方参照の前に少なくともその数の左括弧があると、パターンの中では、 \e10, \e11 等が部分文字列を後方参照します。 そうでなければ (以前との互換性のために) \e10 は \e010 のバックスペースと 同じ、\e11 は \e011 のタブと同じというようになります。 (\e1 から \e9 は常に後方参照です。) .PP $+ は、最後の括弧でマッチしたものを返します。 $& は、マッチした文字列全体を返します。 ($0 が同じものを返していましたが、今は違います。) $\` はマッチした文字列の前の全文字列を返します。 $\' はマッチした文字列の後の全文字列を返します。 例: .nf s/\|^\|([^ \|]*\|) \|*([^ \|]*\|)\|/\|$2 $1\|/; # 最初の二語を交換 .ne 5 if (/\|Time: \|(.\|.\|):\|(.\|.\|):\|(.\|.\|)\|/\|) { $hours = $1; $minutes = $2; $seconds = $3; } .fi デフォルトで、^ 文字は文字列の先頭に、$ 文字は文字列の最後 (または最後の改行文字の前) にマッチすることが保障されており、 .I perl は文字列が一行しか含んでいないという仮定のもとで、 ある最適化を行なっています。 改行が埋め込まれた場合の ^ や $ の振舞いは、矛盾を生じるでしょう。 しかし、^ が文字列内の任意の改行の後に、$ が改行の前にマッチするよう な、文字列を複数行バッファとして使いたい場合があるかもしれません。 少々のオーバヘッドを覚悟すれば、変数 $* に 1 をセットすることで、 それができます。 $* を 0 に設定し直せば、 .I perl は元の動作に戻ります。 .PP 複数行の置換を用意にするために、. 文字は改行文字にはマッチしません (たとえ $* が 0 であっても) 。 特に次の例では、改行文字が $_ 文字列に残ります: .nf $_ = ; s/.*(some_string).*/$1/; 改行文字が要らないなら、次のどれかを試して下さい。 s/.*(some_string).*\en/$1/; s/.*(some_string)[^\e000]*/$1/; s/.*(some_string)(.|\en)*/$1/; chop; s/.*(some_string).*/$1/; /(some_string)/ && ($_ = $1); .fi 正規表現のどの要素の後でも中括弧で囲んだ数字を {n,m} の形で 置くことができ、n で要素がマッチする最小の回数を、m で最大の回数を 指定します。 {n} の形は、{n,n} と同等で、正確に n 回にマッチします。 {n,} の形は、n 回以上にマッチします。 (中括弧が他のコンテキストの中に出て来た場合は、通常の文字として 扱われます。) * 修飾子は {0,} と、+ 修飾子は {1,} と、? 修飾子は {0,1} と 同等となります。 n と m のサイズには制限がありませんが、大きい数字はより多くのメモリを 消費するでしょう。 .Sp .I perl では、 \eb, \ew, \en のような バックスラッシュのつくメタキャラクタは、すべて英数字であること に気がつかれることでしょう。 他の正規表現言語とは違って、英数字でないバックスラッシュシンボルは ありません。 従って、\e\e, \e(, \e), \e<, \e>, \e{, \e} というようなものは皆、 メタキャラクタではなく、文字そのものとして解釈されます。 これにより、メタキャラクタに含まれるのではないかと心配になるような 文字列をパターンに使って、引用することが容易になります。 英数字でないすべての文字の引用は、このようにします: .nf $pattern =~ s/(\eW)/\e\e$1/g; .fi .Sh "フォーマット" .I write 演算子で使う出力レコードフォーマットは、次のように 宣言します: .nf .ne 3 format NAME = FORMLIST . .fi NAME を省略すると、\*(L"STDOUT\*(R" フォーマットが定義されます。 FORMLIST は複数行から成り、各行は次の三つの型のいずれかとなります: .Ip 1. 4 コメント .Ip 2. 4 一つの出力行のフォーマットを示す \*(L"picture\*(R" 行 .Ip 3. 4 picture 行に値を与える引数行 .PP picture 行は、その中で値が置換される特定のフィールドを除けば、 見た目そのままに出力されます。 各 picture フィールドは、@ か ^ で始まります。 @ フィールド (配列の先頭の @ と混乱しないように) は通常の場合 で、^ フィールドは基本的な複数行テキストブロックを埋めるのに 使われます。 フィールドの長さは、<, >, | の繰り返しで埋めることで指定し、それぞれ 左寄せ、右寄せ、センタリングを意味します。 右寄せの別な形として、# 文字を (それに . を付けても良い) 数字フィールドの指定として使うこともできます。 (@ のかわりに ^ を使うと、undefined なフィールドが空白になります。) これらのフィールドに与えられた値が改行を含むと、改行までのテキスト のみが出力されます。 特殊フィールド @* は複数行の値の出力に使われます。 その行に書かれているのは @* だけでなくてはいけません。 .PP 値は、次の行で指定され、picture フィールドと同じ順となります。 値はカンマで区切られていなければなりません。 .PP @ でなく ^ で始まる picture フィールドは、特別な扱いになります。 指定する値は、テキスト文字列が入っているスカラ変数名でなければ いけません。 .I perl は、フィールドに入れられるだけたくさんのテキストを入れ、変数が次に参照 されるときに続きが出力されるように、文字列の先頭からそのテキストを削ります。 通常、テキストのブロックを出力するには、垂直なスタックの中にフィールド の一続きを入れて使います。 全部を入れるにはテキストが長すぎるとき、そうしたければ 最後のフィールドを .\|.\|. で終らせることもできます。 変数 $: を好きな文字のリストにすることで、テキストを分割する文字を 変えることができます。 .PP ^ フィールドを使うと、可変長のレコードを生成するので、テキストの フォーマットを短くしたいとき、チルダ (~) 文字を行のどこかに入れて 空行を抑制することができます。 (可読性を高めるため、普通はできれば行頭に入れるべきです。) チルダは出力時には空白に変換されます。 一つ目に続けて二つ目のチルダを書くと、行中のすべてのフィールドが なくなるまで、その行を繰り返します。 (いろいろな @ のフィールドを使うとき、与える式はいつも同じ値ではない方が 良いでしょう。) .PP 例: .nf .lg 0 .cs R 25 .ft C .ne 10 # /etc/passwd ファイルの形式 format STDOUT_TOP = \& Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ \&. format STDOUT = @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<< $name, $login, $office,$uid,$gid, $home \&. .ne 29 # バグレポート形式 format STDOUT_TOP = \& Bug Reports @<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>> $system, $%, $date ------------------------------------------------------------------ \&. format STDOUT = Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $subject Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $index, $description Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $priority, $date, $description From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $from, $description Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $programmer, $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<... \& $description \&. .ft R .cs R .lg .fi 同じ出力チャンネルに対して、write を使って出力を混ぜることはできます が、$\- (ページの残り行数) を自分でいじらなければなりません。 .PP ほとんどが空白のフィールドがたくさんあるとき、 レコード間で reset 演算子を使うことを考えるべきです。 効率的であるというだけでなく、別のフィールドを加えてしまい、0 に し忘れてしまうというバグを防ぐことができます。 .Sh "プロセス間通信" perl の プロセス間通信(IPC)の能力は Berkeley のソケット機構に 基づいています。 ソケットが無ければ、このセクションは無視できます。 この呼び出しは、同名のシステムコールに相当しますが、 二つの理由で大抵引数は異なります。 一つ目は、perl のファイルハンドルは C ファイルディスクリプタとは 異なる動作をするということです。 二つ目は、perl は文字列の長さを知っているので、その情報を渡さなくても 良いということです。 以下がクライアントのサンプル (未テスト) です: .nf ($them,$port) = @ARGV; $port = 2345 unless $port; $them = 'localhost' unless $them; $SIG{'INT'} = 'dokill'; sub dokill { kill 9,$child if $child; } require 'sys/socket.ph'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\ed+$/; .ie t \{\ ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname); 'br\} .el \{\ ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname); 'br\} ($name, $aliases, $type, $len, $thataddr) = gethostbyname($them); $this = pack($sockaddr, &AF_INET, 0, $thisaddr); $that = pack($sockaddr, &AF_INET, $port, $thataddr); socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; bind(S, $this) || die "bind: $!"; connect(S, $that) || die "connect: $!"; select(S); $| = 1; select(stdout); if ($child = fork) { while (<>) { print S; } sleep 3; do dokill(); } else { while () { print; } } .fi これがサーバ側です: .nf ($port) = @ARGV; $port = 2345 unless $port; require 'sys/socket.ph'; $sockaddr = 'S n a4 x8'; ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\ed+$/; $this = pack($sockaddr, &AF_INET, $port, "\e0\e0\e0\e0"); select(NS); $| = 1; select(stdout); socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; bind(S, $this) || die "bind: $!"; listen(S, 5) || die "connect: $!"; select(S); $| = 1; select(stdout); for (;;) { print "Listening again\en"; ($addr = accept(NS,S)) || die $!; print "accept ok\en"; ($af,$port,$inetaddr) = unpack($sockaddr,$addr); @inetaddr = unpack('C4',$inetaddr); print "$af $port @inetaddr\en"; while () { print; print NS; } } .fi .Sh "予約変数" 次の変数名は、 .IR perl にとって特別な意味があります。 これらのうち幾つかはアルファベットのシンボルにもしても良かったのですが、 reset \*(L"a\-zA\-Z\*(R" で予約変数まで消されてしまうようなことに したくなかったのです。 そのため、これらのおかしなシンボル名に悩まされなければならないでしょう。 そのうち多くは筋が通ったニーモニック (記憶方法) で、シェルのものと 類似になっています。 .Ip $_ 8 入力およびパターン検索のデフォルト。 次の組はそれぞれ同等です: .nf .ne 2 while (<>) {\|.\|.\|. # while の中でのみ同等 while ($_ = <>) {\|.\|.\|. .ne 2 /\|^Subject:/ $_ \|=~ \|/\|^Subject:/ .ne 2 y/a\-z/A\-Z/ $_ =~ y/a\-z/A\-Z/ .ne 2 chop chop($_) .fi (覚え方: 下線は実行されるとわかる。) .Ip $. 8 最後に読み込まれたファイルハンドルの現在の行番号。 読み出し専用。 明示的なファイルハンドルの close でのみ行番号がリセットされることを 覚えておいて下さい。 <> は明示的な close を行なわないので、ARGV ファイル全部を通して行番号 が増えていきます (eof の例を参照して下さい) 。 (覚え方: 多くのプログラムは . を現在行番号の意味で使う。) .Ip $/ 8 入力レコードの区切り文字。デフォルトは改行。 ヌル文字列にセットされると空行を区切りとして扱うことも含めて、 .IR awk の RS 変数と同じ働きをします。 複数文字にセットすると複数文字区切りにマッチさせることができます。 ファイルに空行が連続してあるとき、 この変数を "\en\en" にセットすると、"" にセットする場合と 少々異なる意味を持つことに注意して下さい。 "" にセットすると、二つかそれ以上の連続した空行を一つの空行として 扱います。 "\en\en" にセットすると、空行の後にたとえ改行文字が 続いていても、次の段落に含まれているものと盲目的に解釈されます。 (覚え方: / は詩をクォートするとき行境界の区切りとして使える。) .Ip $, 8 print 演算子のための出力フィールド区切り文字。 通常は、print 演算子は単にカンマ区切りで指定したフィールドを 出力します。より .IR awk に似た挙動をさせるためには、フィールド間に出力する文字を 指定する .IR awk の OFS 変数と同じものを、この変数をセットして下さい。 (覚え方: print文に , があるとき出力すべきもの。) .Ip $"" 8 $, と似ていますが、この変数の異なる点は、"" で囲まれた 文字列 (または同様な挿入文字) に挿入される配列値に適用されることです。 デフォルトは空白文字です。 (覚え方: これは明白。) .Ip $\e 8 print 演算子の出力レコードセパレータ文字。 通常 print 演算子は、後に改行やレコードセパレータ文字を続いていないと 推定して、単にカンマ区切りの指定フィールドを出力します。 より .IR awk に似た挙動をさせるためには、print の終りに出力する文字を指定する .IR awk の ORS 変数と同じものをこの変数にセットして下さい。 (覚え方: print の終りに \en を加える代わりに $\e をセット。) / にも似ていますが、 .IR perl から \*(L"得る\*(R" ものです。) .Ip $# 8 数字の出力のための出力フォーマット。 この変数は .IR awk の OFMT 変数を半分だけ受け継いでいます。 しかし .I awk と .I perl では、実際に何が数字であるかという概念の異なることがしばしばあります。 初期値も、%.6g でなく %.20g ですので、 .IR awk の値を得るには、明示的に $# をセットする必要があります。 (覚え方: # は数字の記号。) .Ip $% 8 現在 select されている出力チャンネルの現在のページ番号。 (覚え方: % は nroff におけるページ番号。) .Ip $= 8 現在 select されている出力チャンネルの現在のページ長 (出力可能行) 。 デフォルトは 60 。 (覚え方: = は平行線。) .Ip $\- 8 現在 select されている出力チャンネルのページの残り行数。 (覚え方: 1 ページの行数 \- 出力済み行数) .Ip $~ 8 現在 select されている出力チャンネルの現在のレポートフォーマット名。 デフォルトは、ファイルハンドル名。 (覚え方: $^ の仲間。) .Ip $^ 8 現在 select されている出力チャンネルの現在のページ先頭フォーマット名。 デフォルトは、ファイルハンドル名に \*(L"_TOP\*(R" を加えたもの。 (覚え方: 先頭ページを指す。) .Ip $| 8 0 でない値をセットすると、現在 select されている出力チャンネルに write や print が行なわれる毎にフラッシュします。 デフォルトは 0 。 通常 .I STDOUT は、端末に出力するときは行バッファが使われ、それ以外では ブロックバッファが使われることに注意して下さい。 この変数をセットするのは、 .I perl スクリプトを rsh の基で走らせている時等、 パイプに出力している時に、 出力が起こる度に確認したい場合に便利です。 (覚え方: パイプを常に動かしておきたい。) .Ip $$ 8 .I perl が走らせているスクリプトのプロセス番号。 (覚え方: シェルと同じ。) .Ip $? 8 最後に close したパイプや (\`\`) コマンドや .I system 演算子の戻り値。 これは、wait() システムコールが返すステータスなので、サブプロセスの 終了値は実際は ($? >> 8) です。 プロセスを終了させたシグナルがあった場合、$? & 255 は どのシグナルであるか、dump された core があるかどうかを返します。 (覚え方: sh や ksh と同じ。) .Ip $& 8 4 最後に成功したパターンマッチでマッチした文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: あるエディタの & と同じ。) .Ip $\` 8 4 最後にパターンマッチに成功したパターンの前にある文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: \` は大抵クォートされた文字列の前。) .Ip $\' 8 4 最後にパターンマッチに成功したパターンの後ろにある文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: \' は大抵クォートされた文字列の後。) 例: .nf .ne 3 $_ = \'abcdefghi\'; /def/; print "$\`:$&:$\'\en"; # abc:def:ghi を出力 .fi .Ip $+ 8 4 最後に検索したパターンの最後の括弧にマッチします。 これは、複数候補のパターンマッチでどちらにマッチするかわからない ときに便利です。 例: .nf /Version: \|(.*\|)|Revision: \|(.*\|)\|/ \|&& \|($rev = $+); .fi (覚え方: 正で、前方を見ること。) .Ip $* 8 2 文字列内で、複数行のマッチを行なうとき 1 をセットし、 パターンマッチの最適化の目的で、単一行を含む文字列であると .I perl に決め打ちにさせるときに 0 とします。 $* が 0 のときに複数の改行を含む文字列のパターンマッチをすると、 混乱した結果となります。 デフォルトは 0 。 (覚え方: * は複数のものにマッチする。) この変数は、^ や $ の解釈に影響するだけであるということに 注意して下さい。 改行のリテラルは、when $* == 0 としても検索できます。 .Ip $0 8 .I perl 起動したスクリプトのファイル名を保持しています。 $0 修飾子への代入は、ps(1) プログラムの引数の部分を参照して下さい。 (覚え方: sh や ksh と同じ) .Ip $<数字> 8 最後に行なったパターンマッチで対応する数字番目の括弧のサブパターン。 入れ子になったブロック内で既に終了したパターンマッチの数は含まれません。 (覚え方: \e数字と同じ。) .Ip $[ 8 2 配列中の最初の要素や部分文字列の最初の文字の添字。 デフォルトは 0 ですが、index() や substr() 関数の 添字のつけ方や評価に関して、 .I perl を .I awk (や Fortran) の動作にさせるには、この変数に 1 をセットすることでできます。 (覚え方: [ は添字の始まり。) .Ip $] 8 2 \*(L"perl -v\*(R" で出力される文字列。 これは、perl インタープリタが正しいバージョンの範囲でスクリプトを 実行しているかどうかを決めるために、スクリプトの始めの方で使われます。 数値のコンテキストで使われると、バージョン + パッチレベル / 1000 を 返します。 例: .nf .ne 8 # getcがつかえるかどうかを調べます ($version,$patchlevel) = $] =~ /(\ed+\e.\ed+).*\enPatch level: (\ed+)/; print STDERR "(No filename completion available.)\en" if $version * 1000 + $patchlevel < 2016; また、数値で使われると、 warn "No checksumming!\en" if $] < 3.019; .fi (覚え方: このバージョンの perl は right(正しい、右) 括弧に入ってるか? ) .Ip $; 8 2 多次元配列エミュレーションの際の添字の区切り。 連想配列の要素を次のように参照するとき、 .nf $foo{$a,$b,$c} 実際には $foo{join($;, $a, $b, $c)} を意味しますが、 @foo{$a,$b,$c} # スライス\*(--@ に注意 と書いてはいけません。 ($foo{$a},$foo{$b},$foo{$c}) .fi を意味することになってしまうからです。 デフォルトは "\e034" で、 .IR awk の SUBSEP と同じです。 キーとしてバイナリデータを使うと、$; として安全な値はないだろうという ことに気をつけて下さい。 (覚え方: カンマ (文法上添字の区切り) はセミコロンの半分。 これは、ちょっとひどいね。でも、$, は他のもっと重要なことに 取られているので。) .Ip $! 8 2 数値のコンテキストで使うと、通常の警告の文字列と共に errono の 現在の値を返します。 (これは、システムエラーのような特別なエラーを除くと、$! の値に 依存した動作をさせてはいけないということを意味します。) 文字列のコンテキストで使うと、相当するシステムエラー文字列を返します。 errno をセットするために $! に代入することができます。 例えば、エラー番号 n に対して $! が文字列を返したいときや、 die 演算子に終了値をセットしたいときなどです。 (覚え方: 一体何が爆発したの? ) .Ip $@ 8 2 最後に評価したコマンドからくる perl の文法エラーメッセージ。 ヌルなら、最後の評価が、正常に解析、実行されたことになります (起動された演算は普通の形で失敗したかもしれません) 。 (覚え方: 文法エラーはどこに \*(L"アット (at where)\*(R" ?) .Ip $< 8 2 現在のプロセスの実 uid 。 (覚え方: setuid で走らせているとき、*どこから* きた uid か。) .Ip $> 8 2 現在のプロセスの実効 uid 。 例: .nf .ne 2 $< = $>; # 実効 uid に実 uid をセットします ($<,$>) = ($>,$<); # 実 uid と実効 uid を取り換えます .fi (覚え方: setuid で走らせているとき、*行く先の* uid 。) 注意: $< と $> は setreuid() をサポートしているマシンでだけ 交換できます。 .Ip $( 8 2 現在のプロセスの実 gid 。 同時に複数グループのメンバとなることをサポートしたマシンで、 属しているグループの空白区切りのリストが得られます。 最初の数は getgid() の返すもので、残りが getgroups() の返すものです。 残りの中には最初の数値と同じものも含まれているかもしれません。 (覚え方: 括弧は GROUP に使われる。 setgid スクリプトを走らせているとき、 実 gid は LEFT(残っている、左) のグループ。) .Ip $) 8 2 現在のプロセスの実効 gid 。 同時に複数グループのメンバとなることをサポートしたマシンで、 属しているグループの空白区切りのリストが得られます。 最初の数は getegid() の返すもので、残りが getgroups() の返すものです。 残りの中には最初の数値と同じものも含まれているかもしれません。 (覚え方: 括弧は GROUP に使われる。 setgid スクリプトを走らせているとき、 実効 gid はあなたの RIGHT(正しい、右の)グループ。) .Sp 注意: $<, $>, $(, $) は、相当する set[re][ug]id() ルーチンを サポートしているマシンでだけセットできます。 $( と $) は setregid() をサポートしているマシンでだけ交換できます。 .Ip $: 8 2 format の (^ で始まる) 継続フィールドを埋めるように文字列を分ける 際の直前の文字列セット。 デフォルトは "\ \en-" で、空白やハイフンで分けられます。 (覚え方: 詩では \*(L"コロン\*(R" は行の一部) .Ip $^D 8 2 デバッグフラグの現在の値。 (覚え方: .B \-D スイッチの値。) .Ip $^F 8 2 最大システムファイルディスクリプタ数。通常は 2 。 システムファイルディスクリプタは、子プロセスに渡されますが、 それより数字が上のファイルディスクリプタは渡されません。 open する間は、たとえ open に失敗したとしても、 システムファイルディスクリプタは保存されます。 open が試みられる前に、通常のディスクリプタは close されます。 .Ip $^I 8 2 ファイルをその場で変更する場合の拡張子の値。 その場で変更できないようにするには、この変数を undef します。 (覚え方: .B \-i スイッチの値) .Ip $^L 8 2 改ページするために出力するフォーマット。デフォルトは \ef です。 .Ip $^P 8 2 デバッガが、自分自身をデバッグしないためにクリアする内部フラグ。 これをクリアしておくと、デバッグを不可能にさせられると考えられます。 .Ip $^T 8 2 スクリプトが走り始めた時刻を、epoch からの秒で保持します。 .B \-M , .B \-A , .B \-C ファイルテストで返された値は、この変数の値に基づいています。 .Ip $^W 8 2 警告スイッチの現在の値。 (覚え方: .B \-w スイッチに関係する。) .Ip $^X 8 2 argv[0] から来る、起動された perl 自身の名前。 .Ip $ARGV 8 3 <> から読み込んでいるとき、読み込み中のファイル名を保持します。 .Ip @ARGV 8 3 配列 ARGV は、スクリプトに渡されたコマンドライン引数を保持します。 $ARGV[0] はコマンド名ではなく、最初の引数なので、$#ARGV は一般に 引数の数 -1 です。 コマンド名については、$0 を参照して下さい。 .Ip @INC 8 3 配列 INC は、 .I perl スクリプトが \*(L"do EXPR\*(R" や \*(L"require\*(R" で評価されるときに 探されるべきディレクトリのリストを保持します。 初期値として、 .B \-I コマンドラインスイッチの引数、 これに続きデフォルトの .I perl ライブラリ (おそらく \*(L"/usr/share/perl\*(R")、 これに続きカレントディレクトリを示す \*(L".\*(R" です。 .Ip %INC 8 3 連想配列 INC は、\*(L"do\*(R" や \*(L"require\*(R" を介してインクルー ドされる各ファイル名のためのエントリを含んでいます。 キーは、指定したファイル名で、値は実際にファイルが見つかった 位置の値です。 この配列は、\*(L"require\*(R" コマンドが与えるファイルが既に インクルード済みかどうかを決めるのに使われます。 .Ip $ENV{expr} 8 2 連想配列 ENV は、現在の環境変数を保持しています。 ENV へ値を設定すると、子プロセスの環境が変わります。 .Ip $SIG{expr} 8 2 連想配列 SIG は、各シグナルハンドラをセットするのに使われます。 例: .nf .ne 12 sub handler { # 第一引数はシグナル名 local($sig) = @_; print "Caught a SIG$sig\-\|\-shutting down\en"; close(LOG); exit(0); } $SIG{\'INT\'} = \'handler\'; $SIG{\'QUIT\'} = \'handler\'; .\|.\|. $SIG{\'INT\'} = \'DEFAULT\'; # デフォルト動作に戻す $SIG{\'QUIT\'} = \'IGNORE\'; # SIGQUIT を無視する .fi SIG 配列は、perl スクリプトで実際にシグナル用にセットされた値を 保持しています。 .Sh "パッケージ" perl は、パッケージ間で異なる名前空間持つメカニズムを用意しており、 各々の変数がぶつからないように、パッケージを守っています。 デフォルトで、perl スクリプトはパッケージ \*(L"main\*(R" として コンパイルを始めます。 .I package 宣言を使うことによって、名前空間を切り替えることができます。 パッケージ宣言の有効範囲は、宣言それ自身から、閉じたブロックの終端まで です (local() 演算子と同じ有効範囲) 。 普通 \*(L"require\*(R" 演算子によりインクルードされたファイルの中の 最初の宣言として使われます。 複数箇所で同一パッケージに入ることが出来ます; ブロック中でコンパイラがどのシンボルテーブルを使うかに影響するだけです。 他のパッケージの変数やファイルハンドルは、識別子の前にパッケージ名と シングルクォートを付けることで、参照できます。 パッケージ名がヌルの場合、\*(L"main\*(R" と解釈されます。 .PP 文字で始まる識別子は、パッケージシンボルテーブルに保存されます。 それ以外のすべてのシンボルは、パッケージ \*(L"main\*(R" に保持されます。 更に、識別子 STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC, SIG は、 たとえ組み込みの変数、関数と異なる目的で使われたとしても、 強制的にパッケージ \*(L"main\*(R" に属するものとして扱われます。 仮に、\*(L"m\*(R", \*(L"s\*(R", \*(L"y\*(R" と呼ばれるパッケージを 持っていたとすると、パターンマッチ、代入、変換として解釈されるので、 識別子を適した形で使うことができないことに注意しましょう。 .PP eval された文字列は、eval がコンパイルされたパッケージ内で コンパイルされます。 (しかし、$SIG{} への代入は、main パッケージで指定された シグナルハンドラと解釈されます。パッケージ内でシグナルハンドラを 持ちたい場合、シグナルハンドラ名を適切に指定して下さい。) 例えば、perl ライブラリ内の perldb.pl を調べてみましょう。 これは始めに DB パッケージに切り替わり、デバッガがデバッグしようとして いるスクリプト内の変数を変更しないようになっています。 しかし、いろいろな時点で、main パッケージのコンテキストのいろいろな 式を評価するために、これは main パッケージに一時的に戻って来ています。 .PP パッケージのシンボルテーブルは、パッケージ名の前に下線のついた連想配列に 蓄えられることになります。 連想配列の各エントリの値は、*name 表記を使うときに参照しようと しているものになります。 実際、次の例は同じ効果 (もちろん main パッケージの場合) がありますが、 最初のものの方がコンパイル時にシンボルテーブルを見るので、 より効率が良くなります: .nf .ne 2 local(*foo) = *bar; local($_main{'foo'}) = $_main{'bar'}; .fi 例えば、以下によりパッケージ内のすべての変数を出力できます。 これは perl ライブラリの dumpvar.pl から取ってます: .nf .ne 11 package dumpvar; sub main'dumpvar { \& ($package) = @_; \& local(*stab) = eval("*_$package"); \& while (($key,$val) = each(%stab)) { \& { \& local(*entry) = $val; \& if (defined $entry) { \& print "\e$$key = '$entry'\en"; \& } .ne 7 \& if (defined @entry) { \& print "\e@$key = (\en"; \& foreach $num ($[ .. $#entry) { \& print " $num\et'",$entry[$num],"'\en"; \& } \& print ")\en"; \& } .ne 10 \& if ($key ne "_$package" && defined %entry) { \& print "\e%$key = (\en"; \& foreach $key (sort keys(%entry)) { \& print " $key\et'",$entry{$key},"'\en"; \& } \& print ")\en"; \& } \& } \& } } .fi たとえサブルーチンがパッケージ dumpvar でコンパイルされるとしても、 サブルーチン名がパッケージ \*(L"main\*(R" に挿入されるように、 サブルーチン名の前にパッケージ名をつけなければならないことに注意して 下さい。 .Sh "スタイル" 各々のプログラマは、フォーマットに関してもちろん自分自身の好みが あるでしょうが、自分のプログラムを読み易くするための一般的な ガイドラインがあります。 .Ip 1. 4 4 あることを特別な方法で*できる*からといって、そうしなければならない ということはありません。 .I perl は、一つのことをするときに、幾つかの方法があるように設計されている ので、最も読み易いものを選ぶように考えて下さい。 例えば open(FOO,$foo) || die "Can't open $foo: $!"; は、 die "Can't open $foo: $!" unless open(FOO,$foo); よりも良いです。なぜなら、後者の方法は文の主題を修飾子内に隠しているからです。 一方、 print "Starting analysis\en" if $verbose; は $verbose && print "Starting analysis\en"; より良いです。主となるのは、ユーザが -v を打ったかどうかでは ないからです。 .Sp 同様に、演算子がデフォルトの引数を仮定しているからといって、 それはデフォルトを用いなければならないということではありません。 デフォルトというものは、ちょっとしたプログラムを書く、怠け者の システムプログラマのためにあります。 読み易いプログラムをしたければ、引数を付けるようにして下さい。 .Sp 同じようなこととして、 あちこちで括弧を省略 .I できる ということは、以下のように書けということではありません: .nf return print reverse sort num values array; return print(reverse(sort num (values(%array)))); .fi 疑わしいときは、括弧をつけて下さい。 もしかすると、物好きな輩が、vi で % キーを叩くかもしれません。 .Sp たとえ疑わしくなかったとしても、自分の後でそのコードを管理する人間の 精神衛生上好ましいですし、その人が間違ったところに括弧をつける可能性も 大いにあります。 .Ip 2. 4 4 無理にこじつけて、ループの先頭や終わりで終了しようとしないで下さい。 .I perl には、真ん中からでも抜けられるように "last" 演算子が 用意されているのですから。 少々はみ出しても、より見易くなるようにして下さい: .nf .ne 7 line: for (;;) { statements; last line if $foo; next line if /^#/; statements; } .fi .Ip 3. 4 4 ループラベルを使うのを恐がらないで下さい\*(--多重ループの抜けだしがで きるようにするためだけでなく、可読性を高めるためにあるのですから。 最後の例を参照して下さい。 .Ip 4. 4 4 可搬性のため、すべてのマシンには実装されていない機能を使うときは、 失敗しないかどうか、eval の中で構成を確かめてみて下さい。 どのバージョンやパッチレベルで特定の仕様が実装されているかを 知っているなら、$] を調べて、実装されているかどうかを確認できます。 .Ip 5. 4 4 覚え易い識別子を選んで下さい。 .Ip 6. 4 4 一貫性を持たせましょう。 .Sh "デバッグ" .I perl に .B \-d スイッチを付けて起動すると、デバッグモニタの基でスクリプトが走ります。 最初の実行文の前で一時停止し、以下のようなコマンド入力を促します: .Ip "h" 12 4 ヘルプメッセージを出力する。 .Ip "T" 12 4 スタックトレース。 .Ip "s" 12 4 シングルステップ。 次の文の始めに達するまでを実行します。 .Ip "n" 12 4 次。 サブルーチンコール内では止まらずに、次の文に達するまで実行します。 .Ip "f" 12 4 終了。 現在のサブルーチンが終了するまで、文を実行し続けます。 .Ip "c" 12 4 継続。 次のブレークポイントに達するまで実行します。 .Ip "c line" 12 4 指定した行まで実行します。 指定した行に、一回きりのブレークポイントを挿入します。 .Ip "" 12 4 最後に実行した n または s を繰り返します。 .Ip "l min+incr" 12 4 min 行目から incr+1 行を表示します。 min を省略すると、最後に表示した残りから始めます。 incr を省略すると、前回の incr 値が使われます。 .Ip "l min-max" 12 4 指定範囲内の行を表示します。 .Ip "l line" 12 4 指定行を表示します。 .Ip "l" 12 4 次のウィンドウを表示します。 .Ip "-" 12 4 前のウィンドウを表示します。 .Ip "w line" 12 4 その行と前後のウィンドウを表示します。 .Ip "l subname" 12 4 サブルーチンを表示します。 長いサブルーチンの場合は、始めの方だけを表示します。 それ以上表示するには、\*(L"l\*(R" を使って下さい。 .Ip "/pattern/" 12 4 正規表現の前方検索。最後の / は省略可能です。 .Ip "?pattern?" 12 4 正規表現の後方検索。最後の ? は省略可能です。 .Ip "L" 12 4 ブレークポイントまたはアクションの設定された行を表示します。 .Ip "S" 12 4 すべてのサブルーチン名を表示します。 .Ip "t" 12 4 トレースモードを on/off するトグル。 .Ip "b line condition" 12 4 ブレークポイントをセットします。 line を省略すると、実行されようとしている行にセットされます。 condition が指定されると、 ブレークポイントの文に達する毎に condition が評価され、 condition が真のときだけブレークします。 ブレークポイントは実行文の先頭にだけセットできます。 .Ip "b subname condition" 12 4 ブレークポイントをサブルーチンの最初の実行文にセットします。 .Ip "d line" 12 4 ブレークポイントを削除します。 line を省略すると、実行しようとしている行のブレークポイントが 削除されます。 .Ip "D" 12 4 すべてのブレークポイントを削除します。 .Ip "a line command" 12 4 行にアクションをセットします。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "A" 12 4 すべての行のアクションを削除します。 .Ip "< command" 12 4 デバッガがプロンプトを出す前に実行するアクションをセットする。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "> command" 12 4 コマンドを入力してスクリプト実行に移る時に、 プロンプトの後に実行するアクションをセットします。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "V package" 12 4 パッケージ内のすべての変数をリストします。 デフォルトは、メインパッケージです。 .Ip "! number" 12 4 デバッグコマンドの再実行を行ないます。 number が省略されると、直前のコマンドを再実行します。 .Ip "! -number" 12 4 幾つか前のコマンドを再実行します。 .Ip "H -number" 12 4 最後の n 個のコマンドを表示します。 1 文字より長いコマンドをリストします。 number を省略すると、すべてをリストします。 .Ip "q or ^D" 12 4 終了します。 .Ip "command" 12 4 コマンドを perl の文として実行します。 足りないセミコロンは補われます。 .Ip "p expr" 12 4 \*(L"print DB'OUT expr\*(R" と同じことです。 DB'OUT ファイルハンドルは、どこに STDOUT がリダイレクトされているか に関わらず、/dev/tty にオープンされます。 .PP デバッガを変更したいときは、perldb.pl ファイルを perl のライブラリ から、カレントディレクトリにコピーして、必要に応じて修正して下さい。 (コマンドラインに -I. を付けなければならないでしょう。) 初期化コードを含む .perldb ファイルを設定することで、カスタマイズが できます。例えば、以下のようなエイリアスを作ることができます: .nf $DB'alias{'len'} = 's/^len(.*)/p length($1)/'; $DB'alias{'stop'} = 's/^stop (at|in)/b/'; $DB'alias{'.'} = 's/^\e./p "\e$DB\e'sub(\e$DB\e'line):\et",\e$DB\e'line[\e$DB\e'line]/'; .fi .Sh "setuid スクリプト" .I perl は、安全な setuid スクリプトや setgid スクリプトを簡単に書けるように デザインされています。 スクリプトの各行が何回も置換されるシェルとは違って、 .I perl は、隠された \*(L"わけの判らないもの\*(R" を少なくして、より伝統的な 評価機構を使っています。 それに加え、この言語は組み込み機構をより多く備えていて、目的を達成する ために外部の (すなわち信頼できない可能性がある) プログラムに 頼らなければならないことは、ほとんどありません。 .PP パッチが当たっていない 4.2 または 4.3bsd カーネルでは、 setuid スクリプトは本質的に危険をはらんでいますが、このカーネルの 機能は無効にできます。 この場合、 perl スクリプトに (無意味な) setuid/gid ビットが付いていると、 .I perl は setuid と setgid 機構をエミュレートできます。 カーネルの機能が無効でない場合、 .I perl は setuid スクリプトが安全でないことをうるさく訴えるでしょう。 カーネルの setuid スクリプト機能を無効にするか、そうでなければ -スクリプトに C のラッパーをかぶせる必要があるでしょう。 +スクリプトに C のラッパをかぶせる必要があるでしょう。 .PP perl が setuid スクリプトを実行しているとき、明らかなトラップに はまらないように特別な注意を払います。 (いくつかの点で、perl スクリプトは同等の C プログラムより安全です。) コマンドライン引数と環境変数と入力は、\*(L"汚れ\*(R" とみなされ、 サブシェルを起動するコマンドや、ファイル、ディレクトリ、プロセスを 変更するようなコマンドの中では、直接にも間接的にも使われません。 それ以前に汚れた値を参照したような式の中でセットされた変数も、 また汚れていることなります。 (汚れた値が変数に影響することが、たとえ論理的に不可能だとしても) .br 例えば: .nf .ne 5 $foo = shift; # $foo は汚れています $bar = $foo,\'bar\'; # $bar も汚れています $xxx = <>; # 汚れています $path = $ENV{\'PATH\'}; # 汚れていますが、以下を見て下さい $abc = \'abc\'; # 汚れていません .ne 4 system "echo $foo"; # 危険です system "/bin/echo", $foo; # 安全です (shを使わないので) system "echo $bar"; # 危険です system "echo $abc"; # PATH がセットされるまで、 # 安全ではありません .ne 5 $ENV{\'PATH\'} = \'/bin:/usr/bin\'; $ENV{\'IFS\'} = \'\' if $ENV{\'IFS\'} ne \'\'; $path = $ENV{\'PATH\'}; # 汚れていません system "echo $abc"; # もはや汚れていません! .ne 5 open(FOO,"$foo"); # OK open(FOO,">$foo"); # 駄目です open(FOO,"echo $foo|"); # 駄目だけど.. open(FOO,"-|") || exec \'echo\', $foo; # OK $zzz = `echo $foo`; # 危険。 zzz は汚れてます。 unlink $abc,$foo; # 危険 umask $foo; # 危険 .ne 3 exec "echo $foo"; # 危険 exec "echo", $foo; # 安全 (sh を使いません) exec "sh", \'-c\', $foo; # 安全と見なされてしまう、嗚呼 .fi 汚れは、各スカラ値と関係するので、配列の要素は汚れているものも、 汚れていないものもあります。 .PP 何か安全でないことをしようとすると、 \*(L"Insecure dependency\*(R" とか \*(L"Insecure PATH\*(R" というような 致命的エラーになります。 それでも、危険なシステムコールや exec を書くことができますが、 上記の最後の例のようなことを明示的に行なった場合に限るということを 覚えておいて下さい。 サブパターンを参照することでも、汚れの機構を避けることが できます \*(--\c .I perl は、$1, $2 などを使った部分文字列の参照では、自分のしていることを 知っているはずだと解釈します。 次のようなパターンの場合です: .nf $ARGV[0] =~ /^\-P(\ew+)$/; $printer = $1; # 汚れていません .fi これは、\ew+ がシェルのメタキャラクタにマッチしないので、 まず安全です。 .+ を使うと危険でしょうが、 .I perl はそこまで調べないので、パターン指定には注意を払うべきです。 これは、ファイル操作をしたいときに ($> を $< と同じにしなければ) 、 ユーザが与えるファイル名を汚さないための唯一の機構です。 .PP 汚れた値を使うことを気にしないような他の操作でもトラブルを起こす場合が あります。 ユーザが与えたファイル名を扱うファイルテストは、慎重に使って下さい。 できれば、$> = $< というようにセットした後で open して下さい。 .I perl では、汚れたファイルをオープンして読みだすことが制限されないので、 出力する内容については注意して下さい。 汚れの機構は、ばかな間違いを防ぐように作られているのであって、 考える必要がなくなるようにするためではありません。 .SH 環境 .Ip HOME 12 4 chdir に引数がないときに使われます。 .Ip LOGDIR 12 4 chdir に引数が無く、HOME がセットされていないときに使われます。 .Ip PATH 12 4 サブプロセスを実行するとき、および \-S が使われたときは スクリプトを探す際に使われます。 .Ip PERLLIB 12 4 標準ライブラリやカレントディレクトリを見る前に、perl ライブラリ ファイルを探すディレクトリのコロン区切りのリストです。 .Ip PERLDB 12 4 デバッガコードを得るのに使われるコマンドのことです。セットされて いないと、 .br require 'perldb.pl' を使います。 .PP これらを別にすると、 .I perl は、スクリプト実行時と子プロセスに渡された環境変数しか使いません。 しかし、setuid で走っているスクリプトは、だまされないようにするために 何より先に以下の行を実行しておいた方が良いでしょう: .nf .ne 3 $ENV{\'PATH\'} = \'/bin:/usr/bin\'; # 必要なパスを入れましょう $ENV{\'SHELL\'} = \'/bin/sh\' if $ENV{\'SHELL\'} ne \'\'; $ENV{\'IFS\'} = \'\' if $ENV{\'IFS\'} ne \'\'; .fi .SH 作者 Larry Wall .br MS-DOS への移植 Diomidis Spinellis .SH 関連ファイル /tmp/perl\-eXXXXXX .B \-e コマンドのためのテンポラリファイル .SH 関連項目 a2p awk から perl への変換プログラム .br s2p sed から perl への変換プログラム .SH 診断 コンパイルエラーは、エラーの行番号と次にあるべきトークンか、または 調べられたトークンの型を教えてくれます。 ( .B \-e スイッチで .I perl に渡されたスクリプトの場合、各 .B \-e が一行に数えられます。) .PP setuid スクリプトには、更に \*(L"Insecure dependency\*(R" のような エラーメッセージを生じるという制約があります。 setuid スクリプトのセクションを参照して下さい。 .SH トラップ .IR awk に慣れたユーザは、以下のことに特に注意を払わなければなりません: .Ip * 4 2 .I perl では、(ブロックの終わりを除く) すべての単文の後にセミコロンが必要です。 改行は文の区切りではありません。 .Ip * 4 2 if や while には、中括弧 {} が必要です。 .Ip * 4 2 .IR perl では、変数は $ か @ で始まります。 .Ip * 4 2 配列の添字は、$[ をセットしなければ 0 で始まります。 substr() と index() の文字位置も同様です。 .Ip * 4 2 配列の添字が数字であるか文字列であるかを決めなければなりません。 .Ip * 4 2 連想配列は、参照するだけでは存在することになりません。 .Ip * 4 2 比較の際には、文字列比較か、数値比較かを決めなければなりません。 .Ip * 4 2 入力行を読み込んだだけでは、split は行なわれません。自分で split して、 配列に入れなければなりません。 そして、 .I split 演算子は、異なる引数を取ります。 .Ip * 4 2 現在の入力行は、通常 $0 ではなく $_ です。 一般に改行コードは除かれません。 ($0 は実行されたプログラム名です。) .Ip * 4 2 $<数字> は、フィールドの参照ではありません\*(--最後にマッチした パターンの部分文字列を参照します。 .Ip * 4 2 .I print 文は $, と $\e を設定しなければ、フィールド区切りやレコード区切りを 出力しません。 .Ip * 4 2 ファイルに出力する前には、オープンしなければなりません。 .Ip * 4 2 範囲演算子は \*(L".\|.\*(R" であって、コンマではありません。 (コンマ演算子は、C と同じ動作です。) .Ip * 4 2 マッチ演算子は、\*(L"~\*(R" でなく \*(L"=~\*(R" です。 (\*(L"~\*(R" は C と同じく補数の演算子です。) .Ip * 4 2 指数演算子は、\*(L"^\*(R" でなく \*(L"**\*(R" 演算子です。 (\*(L"^\*(R" は、C と同じく XOR 演算子です。) .Ip * 4 2 結合演算子は \*(L".\*(R" であり、ヌル文字列ではありません。 (ヌル文字列を使うと 3 番目の / が除算演算子と解釈されるため、 \*(L"/pat/ /pat/\*(R" が解析不能になります。\*(--トークン解析は、実際 のところ /, ?, < のような演算子ではコンテキストにやや敏感です。 そして、実は、. 自身は数字の始めになり得ます。) .Ip * 4 2 .IR next , .IR exit, .I continue の動作は異なります。 .Ip * 4 2 次の変数の動作は異なります。 .nf Awk \h'|2.5i'Perl ARGC \h'|2.5i'$#ARGV ARGV[0] \h'|2.5i'$0 FILENAME\h'|2.5i'$ARGV FNR \h'|2.5i'$. \- 何か FS \h'|2.5i'(何でもよい) NF \h'|2.5i'$#Fld かそのようなもの NR \h'|2.5i'$. OFMT \h'|2.5i'$# OFS \h'|2.5i'$, ORS \h'|2.5i'$\e RLENGTH \h'|2.5i'length($&) RS \h'|2.5i'$/ RSTART \h'|2.5i'length($\`) SUBSEP \h'|2.5i'$; .fi .Ip * 4 2 疑わしいときは、 .I awk のプログラムを a2p に通して、出て来たもの見て下さい。 .PP C に洗脳されたプログラマは、次のことを特に心に留めておかなければなりま せん: .Ip * 4 2 if や while には、中括弧 {} が必要です。 .Ip * 4 2 \*(L"else if\*(R" でなく、\*(L"elsif\*(R" を使わなければなりません。 .Ip * 4 2 .I break や .I continue は、それぞれ .I last や .IR next になります。 .Ip * 4 2 switch 文はありません。 .Ip * 4 2 .IR perl では、 変数は $ か @ で始まります。 .Ip * 4 2 printf には * は実装されていません。 .Ip * 4 2 コメントは、/* でなく # で始まります。 .Ip * 4 2 何者のアドレスを得ることもできません。 .Ip * 4 2 ARGV は大文字でなければなりません。 .Ip * 4 2 link, unlink, rename 等のシステムコールは、成功時に 0 でな く、非 0 を返します。 .Ip * 4 2 シグナルハンドラは、数字ではなくシグナル名を扱います。 .PP 経験豊かな .I sed プログラマは、次のことを心に留めておかなければなりません: .Ip * 4 2 置換の後方参照では、\e でなく $ を使います。 .Ip * 4 2 パターンマッチメタキャラクタ (, ), | の前にはバックスラッシュをつけません。 .Ip * 4 2 範囲演算子は、コンマでなく .\|. です。 .PP 鋭い shell プログラマは、次のことを心に留めておかなければなりません: .Ip * 4 2 `` 演算子のコマンド内では、'' にくくられていないと変数置換が行なわれます。 .Ip * 4 2 `` 演算子は csh と違って、戻り値の変換をしません。 .Ip * 4 2 シェル (特に csh) は、各コマンド行で複数レベルの置換を行ないます。 .I perl は、"", ``, <>, // のような決まった構造においてのみ、置換が行なわれます。 .Ip * 4 2 シェルは、スクリプトを一度に少しだけ解釈します。 .I perl は、すべてのプログラムを実行前にコンパイルします。 .Ip * 4 2 引数は、$1, $2,.. ではなく、@ARGV を介して利用できます。 .Ip * 4 2 環境は、変数として自動的に利用可能とはなりません。 .SH 訂正と追加 perl の本、 .I Programming\0Perl には以下のような省略と抜けがあります。 .PP 5 ページの例 .nf eval "/usr/bin/perl は、以下でなければいけません。 eval "exec /usr/bin/perl .fi .PP 195 ページの System V の sum 相当のプログラムは、極めて小さなファイル でしか動作しません。大きなファイルでは、以下を使って下さい。 .nf undef $/; $checksum = unpack("%32C*",<>) % 32767; .fi .PP alarm と sleep に関する記述は、シグナル SIGALARM と言っていますが、 SIGALRM でなければなりません。 .PP $/ の初期値をセットする .B \-0 スイッチは、この本が出版後に perl に追加されました。 .PP .B \-l スイッチでは、自動行末処理を行なうようになっています。 .PP qx// 構造は バックスラッシュ `` と同義です。 .PP $0 は、 .I ps (1) の引数表示を変更するために、代入可能となりました。 .PP 新しい @###.## フォーマットは、フォーマットの記述から 偶然省略されました。 .PP s///ee が置換式の多重評価を生じることが、出版時に 知られていませんでした。これは、仕様と解釈されるべきです。 .PP (LIST) x $count は、配列の繰り返しを実行します。 .PP 正規表現には、括弧の数に制限がなくなっています。 .PP ダブルクォート "" のコンテキストでは、更に以下のエスケープがサポート されています: \ee, \ea, \ex1b, \ec[, \el, \eL, \eu, \eU, \eE 最後の 5 つの制御コードは、大文字小文字の変換です。 .PP .B $/ 変数には、複数の区切り文字をセットできます。 .PP 通常のパターンマッチに g 修飾子が使えます。 これにより、文字列から複数のマッチを検索することで、 パターンマッチを繰り返します。 .PP $^T を除いて、すべての $^X 変数が増えてます。 .PP FILEHANDLE に対するデフォルトのページ先頭フォーマットは、top でなく FILEHANDLE_TOP になっています。 .PP eval {} と sort {} 構造は、version 4.018 で追加されました。 .PP pack と unpack の v と V (リトルエンディアン) テンプレートオプションは、 vertion 4.019 で追加されました。 .SH バグ .PP .I perl 型のキャスト、atof() 、sprintf() のようないろいろな操作は、 マシンの定義に左右されます。 .PP あるストリームで、stdio が各 read や write の間に seek や eof を 必要とする場合、 .IR perl はそのようにします。 (これは、sysread() と syswrite() には適用されません。) .PP どの組み込みデータタイプも勝手なサイズ制限は持っていません (メモリサイズは別です) が、それでもいくらかは限界はあります: 識別子は 255 文字以上にはできませんし、 \-S を使うとき、PATH の要素は 255 を超えてはいけません。 正規表現は、内部的に 32767 バイトを超えられません。 .PP .I perl は、実は 病理学的折衷主義のがらくたリスター (Pathologically Eclectic Rubbish Lister) なんですが、私がそう言ったとは誰にも話さないで下さい。 .rn }` '' diff --git a/ja/man/man1/ps.1 b/ja/man/man1/ps.1 index 3bf8c655ae..fafa2dee95 100644 --- a/ja/man/man1/ps.1 +++ b/ja/man/man1/ps.1 @@ -1,525 +1,525 @@ .\" Copyright (c) 1980, 1990, 1991, 1993, 1994 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)ps.1 8.3 (Berkeley) 4/18/94 .\" %Id: ps.1,v 1.11.2.2 1998/02/18 22:54:59 dima Exp % .\" jpman %Id: ps.1,v 1.2 1997/05/20 01:19:55 mutoh Stab % .\" .Dd April 18, 1994 .Dt PS 1 .Os BSD 4 .Sh 名称 .Nm \&ps .Nd プロセスの状態の表示 .Sh 書式 .Nm \&ps .Op Fl aCcefhjlmrSTuvwx .Op Fl M Ar core .Op Fl N Ar system .Op Fl O Ar fmt .Op Fl o Ar fmt .Op Fl p Ar pid .Op Fl t Ar tty .Op Fl W Ar swap .br .Nm \&ps .Op Fl L .Sh 解説 .Nm \&ps は、制御端末を持つ自分(あなた)のプロセスの情報を、 ヘッダ行に続いて表示します。 この情報はプロセス .Tn ID 順に整列されます。 .Pp 表示される情報は、一連のキーワードによって選ばれます .Pf ( Fl L , .Fl O , .Fl o オプションを参照)。 デフォルトの出力フォーマットは、各プロセス毎に、 プロセス .Tn ID , 制御端末・ cpu 時間(ユーザ時間とシステム時間の両方)・ プロセス状態・プロセスに関連するコマンドから成ります。 .Pp プロセスファイルシステム ( .Xr procfs 5 参照) は、 .Nm が実行されている時にマウントされているべきです。そうでない場合、 全ての情報が利用可能になるわけではありません。 .Pp オプションを以下に示します。 .Bl -tag -width indent .It Fl a 自分のプロセスに加え自分以外のプロセスの情報も同様に表示します。 .It Fl c -``コマンド'' コラム出力を全てのコマンドラインを表示するのではなく、 -実行名だけを表示するように変更します。 +``コマンド'' 桁の出力を、全てのコマンドラインを表示するのではなく、 +実行形式名だけを表示するように変更します。 .It Fl C cpu パーセンテージの計算を、``常駐'' 時間を無視する ``生'' cpu 時間を使う方法に変更します(通常これは影響ありません)。 .It Fl e 環境(変数)も同時に表示します。 .It Fl f より詳しいプロセス情報を得るように、働きます。 .It Fl h ページ毎に一つヘッダが入るようにします。 .It Fl j 次のキーワードに関する情報を表示します: user, pid, ppid, pgid, sess, jobc, state, tt, time, command。 .It Fl L 有効なキーワードの一覧を表示します。 .It Fl l 次のキーワードに関する情報を表示します: uid, pid, ppid, cpu, pri, nice, vsz, rss, wchan, state, tt, time, command。 .It Fl M 名前リストの値を取り出すとき、 デフォルトの .Dq Pa /dev/kmem の代わりに、指定した .Ar core から取り出します。 .It Fl m プロセス .Tn ID 順ではなく、メモリ使用量順に整列します。 .It Fl N デフォルトの .Dq Pa /kernel の代わりに、指定された .Ar system から名前リストを取り出します。 .It Fl O デフォルトで表示される情報に加え、 指定されたキーワードに関する情報を、 プロセス .Tn ID の後に挿入する形式で表示します。 .\"キーワードの列 .\".Ar fmt .\"は、空白あるいはカンマで区切って指定します。 .\"(訳中)2.2.1Rの記述には確認できないのでコメントアウトしました。 .\" 2.2.1R 対象(1997/05/16) Takeshi MUTOH 各キーワードの後ろには、等号 (``='') と文字列を追加しても構いません。 この場合、標準のヘッダの代わりに指定された文字列が表示されます。 .It Fl o 指定されたキーワードに関する情報を、表示します。 .\"キーワードの列 .\".Ar fmt .\"は、空白あるいはカンマで区切って指定します。 .\"(訳中)2.2.1Rの記述には確認できないのでコメントアウトしました。 .\" 2.2.1R 対象(1997/05/16) Takeshi MUTOH 各キーワードの後ろには、等号(``='')と文字列を追加しても構いません。 この場合、標準のヘッダの代わりに指定された文字列が表示されます。 .It Fl p 指定したプロセス .Tn ID に関する情報を表示します。 .It Fl r プロセス .Tn ID 順ではなく、現在の cpu 利用率順に整列します。 .It Fl S プロセス時間を計算するのに、 終了した子プロセスの時間を親プロセスに合計するように変更します。 .It Fl T 標準入力のデバイスに取り付けられたプロセスの情報を表示します。 .It Fl t 指定された端末デバイスに取り付けられたプロセスの情報を表示します。 .It Fl U 指定された .Tn username に属するプロセスを表示します。 .It Fl u 次のキーワードに関する情報を表示します: user, pid, %cpu, %mem, vsz, rss, tt, state, start, time, command。 .Fl u オプションを指定すると .Fl r オプションも暗に指定したことになります。 .It Fl v 次のキーワードに関する情報を表示します: pid, state, time, sl, re, pagein, vsz, rss, lim, tsiz, %cpu, %mem, command。 .Fl v オプションを指定すると .Fl m オプションも暗に指定したことになります。 .It Fl W デフォルトの .Dq Pa /dev/drum の代わりに指定したファイルからスワップ情報を取り出します。 .It Fl w デフォルトの現行ウィンドウ幅ではなく、132桁幅で表示します。 一度より多く .Fl w オプションを指定すると、 .Nm \&ps はウィンドウ幅にかかわらず、必要なだけの幅を使用します。 .It Fl x 制御端末のないプロセスの情報も表示します。 .El .Pp 有効なキーワードの全リストを以下に示します。 いくつかのキーワードに関してはさらに詳しく述べます。 .Bl -tag -width indent .It %cpu プロセスの cpu 利用率です。実時間で最近 1 分間の減衰平均です。 計算の基点となる時間は変化するので (プロセスはまだ生れたばかりかもしれないので)、 .Tn \&%CPU フィールド全部の合計は 100% を越える可能性もあります。 .It %mem プロセスで使われている実メモリのパーセンテージです。 .It flags インクルードファイル .Aq Pa sys/proc.h でプロセスに定義されたフラグです。 .Bl -column SNOCLDSTOP SNOCLDSTOP .It Dv "P_ADVLOCK" Ta No "0x00001 プロセスは POSIX 提案ロックを保持している" .It Dv "P_CONTROLT" Ta No "0x00002 制御端末を持っている" .It Dv "P_INMEM" Ta No "0x00004 メモリに読み込まれている" .It Dv "P_NOCLDSTOP" Ta No "0x00008 子プロセスが停止しても SIGCHLD を送らない" .It Dv "P_PPWAIT" Ta No "0x00010 親プロセスが、子プロセスが exec/exit するのを待っている" .It Dv "P_PROFIL" Ta No "0x00020 プロファイル付きで実行された" .It Dv "P_SELECT" Ta No "0x00040 選択されている;wakeup/waiting は危険である" .It Dv "P_SINTR" Ta No "0x00080 スリープは停止可能" .It Dv "P_SUGID" Ta No "0x00100 最後の実行以来 特権セット id されている" .It Dv "P_SYSTEM" Ta No "0x00200 システム proc: sigs や stat や swap が無い" .It Dv "P_TIMEOUT" Ta No "0x00400 スリープ中にタイムアウトした" .It Dv "P_TRACED" Ta No "0x00800 デバッグプロセスはトレースされている" .It Dv "P_WAITED" Ta No "0x01000 デバッグプロセスは子プロセスを待っている" .It Dv "P_WEXIT" Ta No "0x02000 終了動作中" .It Dv "P_EXEC" Ta No "0x04000 プロセスは exec で呼ばれた" .It Dv "P_NOSWAP" Ta No "0x08000 別のフラグがスワップアウトを妨げている" .It Dv "P_PHYSIO" Ta No "0x10000 物理 I/O をおこなっている" .It Dv "P_OWEUPC" Ta No "0x20000 次の ast プロセスが addupc() 呼び出しの借り" .It Dv "P_SWAPPING" Ta No "0x40000 プロセスはスワップされている" .El .It lim .Xr setrlimit 2 の呼び出しで指定される、メモリ使用量のソフトリミットです。 .It lstart コマンドの実行が始まった正確な時刻を、 .Xr strftime 3 に記述された ``%c'' フォーマットで表示します。 .It nice プロセススケジューリングにおける増加値です .Ns ( Xr setpriority 2 参照)。 .\" .Ns により ( と setpriority が離れるのを防ぐ .\" by horikawa@jp.freebsd.org (Feb 9 1997) .It rss プロセスの実メモリ(常駐分)の大きさ(1024バイト単位)です。 .It start コマンドが開始された時間です。 コマンドが開始されたのが 24 時間以内なら、 開始時刻は .Xr strftime 3 で記述された``%l:ps.1p''フォーマットで表示されます。 コマンドが開始されたのが7日以内なら、 開始時刻は``%a6.15p''フォーマットで表示されます。 さもなくば、開始時刻は``%e%b%y''フォーマットで表示されます。 .It state プロセスの状態を文字の列で表示します。例えば、 .Dq Tn RWNA の最初の文字は、プロセスが runnable 状態であることを示しています。 .Pp .Bl -tag -width indent -compact .It D プロセスはディスク(あるいは他の割り込み不可能な短期間の)待ち状態です。 .It I プロセスは idle 状態(20秒以上 sleep している)です。 .It R プロセスは runnable 状態です。 .It S プロセスは 20 秒未満の sleep 状態です。 .It T プロセスは stop している状態です。 .It Z プロセスは死んでいる状態(``ゾンビ'')です。 .El .Pp さらにこの後に文字があれば、さらなる状態情報を示します。 .Pp .Bl -tag -width indent -compact .It + プロセスはその制御端末のフォアグラウンドプロセスグループに属しています。 .It < プロセスは .Tn CPU のスケジュール優先度が上げられています。 .It > プロセスはメモリ要求に対するソフトリミットが指定されており、 現在そのリミットを越えています。 このようなプロセスは(必然的に)スワップされていません。 .It A プロセスはランダムなページ置換( .Xr vadvise 2 における .Dv VA_ANOM のことで、例えば、 .Xr lisp 1 でのガーベージコレクション)を要求しました。 .It E プロセスは終了しようとしています。 .It L プロセスは実メモリ中にロックされたページ (例えば、raw .Tn I/O 用)を持っています。 .It N プロセスは .Tn CPU スケジューリング優先度( .Xr setpriority 2 参照)が下げられています。 .It S プロセスは .Tn FIFO ページ置換( .Xr vadvise 2 における .Dv VA_SEQL のことで、 例えば、仮想記憶の多量のデータを順次アクセスする 大規模画像処理プログラム)を要求しました。 .It s プロセスはセッションリーダです。 .It V プロセスは .Xr vfork 2 の間、一時中断されています。 .It W プロセスはスワップアウトされています。 .It X プロセスはトレースされているか、デバッグされています。 .El .It tt もしあれば、制御端末のパス名の省略形です。 省略形は .Dq Pa /dev/tty に続く2文字か、コンソール場合の ``co'' です。 もはやプロセスがその制御端末に到達できない(即ち、revoke された)場合、 後に ``-'' が付きます。 .It wchan プロセスが待っているイベント(システム内のアドレス)。 数字で表示される時には、アドレスの最初の部分は削られて その結果が16進で表示されます。例えば 0x80324000 では 324000 と表示されます。 .El .Pp キーワード command には、 すでに終了しているのに親がまだ wait してくれていない プロセス(即ちゾンビ)は ``'' と表示されます。 終了しようとしてブロックされているプロセスは ``'' と表示されます。 .Nm \&ps は、メモリやスワップ領域を検査して、 プロセスが生成されたときのファイル名や引数を推測します。 この方法は、本質的に少々信頼できるものではなく、 プロセスはとにかくこの情報を破壊することができます。 だから、表示されるコマンド名や引数をあまり信用しすぎてはなりません。 一方、キーワード ucomm (アカウンティング名)は信用できます。 .Sh キーワード 以下は有効なキーワードとその意味の全リストです。 そのうちいくつかは別名があります。 .Pp .Bl -tag -width sigignore -compact .It %cpu cpu 使用率(別名 pcpu) .It %mem メモリ使用率(別名 pmem) .It acflag アカウンティングフラグ(別名 acflg) .It command コマンド名と引数 .It cpu 短期間 cpu 使用係数(スケジューリング用) .It flags 16 進数のプロセスフラグ(別名 f) .It inblk 総ブロック読み出し数(別名 inblock) .It jobc ジョブコントロール数 .It ktrace トレース中フラグ .It ktracep トレース中の vnode .It lim メモリ利用のリミット .It logname プロセスを開始したユーザのログイン名 .It lstart 開始時刻 .It majflt 総ページフォールト数 .It minflt 総ページ再生数 .It msgrcv 総メッセージ受信数(パイプ/ソケットからの読み込み) .It msgsnd 総メッセージ送信数(パイプ/ソケットへの書き込み) .It nice nice 値(別名 ni) .It nivcsw 総強制的コンテキストスィッチ数 .It nsigs 総シグナル受け入れ数(別名 nsignals) .It nswap 総スワップイン/スワップアウト数 .It nvcsw 総自発的コンテキストスィッチ数 .It nwchan wait チャネル(アドレスで表示) .It oublk 総ブロック書き込み数(別名oublock) .It p_ru リソース利用量(ゾンビに対してのみ有効) .It paddr スワップアドレス .It pagein ページイン数(majflt と同じ) .It pgid プロセスグループ番号 .It pid プロセス .Tn ID .It poip 進行中のページアウト数 .It ppid 親プロセス .Tn ID .It pri スケジューリング優先度 .It re 実メモリ常駐時間(秒単位; 127 = 無限) .It rgid 実グループ .Tn ID .It rlink run 行列における逆リンク(あるいは 0) .It rss 常駐セットサイズ .It rsz 常駐セットサイズ+(テキストのサイズ/テキストの利用総数) (別名rssize) .\" つまり、共通テキストを複数プロセスで分担しているわけだ .It rtprio 実時間優先度(101 = 実時間プロセスではない) .It ruid 実ユーザ .Tn ID .It ruser ユーザ名(ruid から得られたもの) .It sess セッションポインタ .It sig 遅延されたシグナル(別名 pending) .It sigcatch 捕獲されたシグナル(別名 caught) .It sigignore 無視されたシグナル(別名 ignored) .It sigmask ブロックされたシグナル(別名 blocked) .It sl sleep 時間(秒単位; 127 = 無限) .It start 開始時刻 .It state 記号でのプロセス状態(別名 stat) .It svgid setgid プログラムでの saved gid .It svuid setuid プログラムでの saved uid .It tdev 制御端末のデバイス番号 .It time ユーザ + システムの合計 cpu 時間(別名 cputime) .It tpgid 制御端末プロセスグループ .Tn ID .\".It trss .\"text resident set size (in Kbytes) .\"テキスト常駐セットサイズ(Kbyte単位) .It tsess 制御端末セッションポインタ .It tsiz テキストサイズ(Kbyte 単位) .It tt 制御端末名(2 文字の省略形) .It tty 制御端末の完全な名前 .It uprocp プロセスポインタ .It ucomm アカウンティングで使われるコマンド名 .It uid 実効ユーザ .Tn ID .It upr システムコールから帰る時のスケジューリング優先度(別名 usrpri) .It user ユーザ名(uid から得たもの) .It vsz kByte 単位の仮想記憶サイズ(別名vsize) .It wchan wait チャネル(シンボル名で表示) .It xstat 終了ステータスまたは stop ステータス (stop プロセスかゾンビプロセスの時のみに有効) .El .Sh 関連ファイル .Bl -tag -width /var/run/kvm_kernel.db -compact .It Pa /dev スペシャルファイルとデバイスの名前 .It Pa /dev/drum デフォルトのスワップデバイス .It Pa /dev/kmem デフォルトのカーネルメモリデバイス .It Pa /var/run/dev.db .Pa /dev 名前データベース .It Pa /var/run/kvm_kernel.db システム(カーネル)の名前リストデータベース .It Pa /kernel デフォルトのシステムの名前リスト .El .Sh 関連項目 .Xr kill 1 , .Xr w 1 , .Xr kvm 3 , .Xr strftime 3 , .Xr pstat 8 .Sh バグ .Nm \&ps はシステムより速く実行できず、 他のプロセスと同様にスケジュールされて実行されるので、 表示される情報は正確ではあり得ません。 diff --git a/ja/man/man8/named.8 b/ja/man/man8/named.8 index 807e53297f..95a320a02c 100644 --- a/ja/man/man8/named.8 +++ b/ja/man/man8/named.8 @@ -1,492 +1,493 @@ .\" ++Copyright++ 1985 .\" - .\" Copyright (c) 1985 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" - .\" Portions Copyright (c) 1993 by Digital Equipment Corporation. .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies, and that .\" the name of Digital Equipment Corporation not be used in advertising or .\" publicity pertaining to distribution of the document or software without .\" specific, written prior permission. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL .\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT .\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS .\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS .\" SOFTWARE. .\" - .\" --Copyright-- .\" .\" @(#)named.8 6.6 (Berkeley) 2/14/89 .\" jpman %Id: named.8,v 1.4 1997/11/11 13:59:51 horikawa Stab % .\" .TH NAMED 8 "June 20, 1995" .UC 4 .SH 名称 named \- インターネットドメインネームサーバ .SH 書式 .B named [ .B \-d .I debuglevel ] [ .B \-p .IR port# [\fB/\fP\fIlocalport#\fP] ] [{\-b} .I bootfile ] [ .B \-q ] [ .B \-r ] .SH 解説 .I Named はインターネットドメインネームサーバです。 インターネットドメインネームシステムの詳細な情報については RFC 1033, 1034, 1035 を参照してください。 パラメータがない場合は .I named はデフォルトのブートファイルである .IR /etc/named.boot の初期化データを読み込み、問い合わせに対し待機します。 .PP 指定できるオプションは以下の通りです。 .TP .B \-d デバッグ情報を出力します。 ``d''に続く数字には出力するメッセージのレベルを指定します。 .TP .B \-p 標準でないポート番号を指定します。 デフォルトは getservbyname(3) によって、 サービス ``domain'' に対して返される標準のポート番号となります。 このオプションでは2つのポートをスラッシュ(``\fB/\fP'')で続けて 指定することができます。 この場合は最初のポートがリモートサーバに接続する際に使用され、 後のポートはローカルで実行されている .IR named のサービスポートとなります。 これはおもにデバッグのために使用されます。 .TP .B \-b ブートファイルを指定します。 この指定はオプションであり、 ダッシュで始まるファイルを指定することが可能となります。 .TP .B \-q \fInamed\fP が \fIQRYLOG\fP を定義してコンパイルされている場合に、 全ての問い合わせのトレースを行ないます。 \fI注釈:\fP このオプションはブートファイル中の ``options query-log'' の指定と同等です。 .TP .B \-r 再帰的なネームサーバの問い合わせを抑止します。 問い合わせに対してはローカルゾーン(プライマリもしくはセカンダリ)からのみ 回答されます。 この指定はルートサーバにて使用することができます。 \fI注釈:\fP このオプションはブートファイル中の ``options no-recursion'' の指定と同等です。 .PP その他の引数はブートファイル名として扱われます。 複数のブートファイルが指定された場合は、最後の指定が有効となります。 .PP ブートファイルにはネームサーバが得るべき初期データの所在の情報が含まれます。 ブートファイル中の各行を次の行に引き続いて書くことはできません。 以下に簡単な例を示します。 .in +2m .nf ; ; boot file for name server ; directory /usr/local/adm/named .ta \w'check-names\ 'u +\w'6.32.128.IN-ADDR.ARPA\ 'u +\w'128.32.137.8 128.32.137.3\ 'u ; type domain source host/file backup file cache . root.cache primary Berkeley.EDU berkeley.edu.zone primary 32.128.IN-ADDR.ARPA ucbhosts.rev secondary CC.Berkeley.EDU 128.32.137.8 128.32.137.3 cc.zone.bak secondary 6.32.128.IN-ADDR.ARPA 128.32.137.8 128.32.137.3 cc.rev.bak primary 0.0.127.IN-ADDR.ARPA localhost.rev forwarders 10.0.0.78 10.2.0.78 limit transfers-in 10 limit datasize 64M limit files 256 options forward-only query-log fake-iquery check-names primary fail check-names secondary warn check-names response ignore .DT .fi .in ``directory'' 行はサーバのワーキングディレクトリを指定します。 この指定はプライマリゾーンファイル中にて \s-1$INCLUDE\s+1 が、 正しく機能する為に重要となります。 .LP ``cache'' 行は ``root.cache'' におけるデータがバックアップキャッシュに 置かれることを指定します。 これはおもにルートドメインサーバの位置のようなデータを指定するために 使われます。 このキャッシュは通常は使われませんが、現在のルートサーバをみつけるための -ヒント ``hint'' として使われます。 +「ヒント」として使われます。 ``root.cache'' ファイルは ``berkeley.edu.zone'' と同じフォーマットです。 複数の ``cache'' ファイルを指定することもできます。 ``root.cache'' ファイルは \s-1FTP.RS.INTERNIC.NET\s+1 から 定期的に取得するべきです。 なぜならば、それにはルートサーバのリストが含まれており、 リストは定期的に変更されているためです。 .LP 例における最初の ``primary'' 行ではファイル ``berkeley.edu.zone'' が ``Berkeley.EDU'' ゾーンにおける信頼すべきデータを含んでいることを 宣言しています。 ``berkeley.edu.zone'' ファイルは RFC 883 に記述されている -マスターファイルフォーマットのデータが含まれています。 -全てのドメイン名は起点 (ここの例では ``Berkeley.EDU'' ) に対し -相対的に指定されます。(詳細は後述。) +マスタファイルフォーマットのデータが含まれています。 +全てのドメイン名は起点 (ここの例では ``Berkeley.EDU'') に対し +相対的に指定されます (詳細は後述)。 2番目の ``primary'' 行ではファイル ``ucbhosts.rev'' が ドメイン ``32.128.IN-ADDR.ARPA'' の信頼すべきデータを含んでいることを 宣言しています。 これはネットワーク 128.32 におけるアドレスをホスト名に変換するために 使われます。 -それぞれのマスターファイルは +それぞれのマスタファイルは そのゾーンの SOA レコードで始めなければなりません。(下記参照) .LP 例における最初の ``secondary'' 行では ``CC.Berkeley.EDU'' 以下の全ての信頼すべきデータは 128.32.137.8 にあるネームサーバから転送されることを指定しています。 データの転送に失敗したら 128.32.137.3 と、 この行で指定された他のアドレス (10 個まで) を順に試みます。 セカンダリコピーもここで指定されているドメインについての 信頼すべきデータとなります。 -この行における最初の4つ組ドットアドレス表記でないものは +この行における最初の 4 つ組ドットアドレス表記でないものは、 転送されたゾーンのバックアップをとるファイル名として扱われます。 ネームサーバはこのバックアップファイルがブート時に存在すれば、 -ゾーン情報を読み込み、マスターサーバに接続できない場合でも +ゾーン情報を読み込み、マスタサーバに接続できない場合でも 完全なコピーとしてゾーン情報を供給します。 -ドメインの新しいコピーがマスターサーバのいずれかから自動ゾーン転送されれば、 +ドメインの新しいコピーがマスタサーバのいずれかから自動ゾーン転送されれば、 このファイルは更新されます。 ファイル名が指定されなければ、 一時ファイルが使用されゾーン転送が成功した後に削除されます。 これは不要なトラフィックを発生するため、おすすめできません。 -2番目の ``secondary'' 行ではサブネット 128.32.136 におけるアドレスから -ホスト名へのマッピングはその前のゾーンと同じマスターサーバから得ることを +2番目の ``secondary'' 行では、サブネット 128.32.136 におけるアドレスから +ホスト名へのマッピングは、その前のゾーンと同じマスタサーバから得ることを 宣言しています。 .LP -``forwarders'' 行では他のサーバからの再帰的な問い合わせを +``forwarders'' 行では、他のサーバからの再帰的な問い合わせを サイト単位で受け持つサーバのアドレスを指定しています。 ブートファイルに 1 つか複数のフォーワーダが指定してあると、 サーバはキャッシュに含まれていない全てのデータの問い合わせを 先ずフォーワーダに送ります。 -各々のフォーワーダには応答が返ってくるか、 -指定されている全てのフォーワーダに問い合わせが終るまで順に問い合わされます。 +応答が返ってくるか、 +指定されている全てのフォーワーダに問い合わせが終るまで、 +各々のフォーワーダに順に問い合わせます。 フォーワーダから応答が返って来ない場合、 -サーバは ``forward-only'' モードでなければ +サーバは、``forward-only'' モードでなければ、 forwarder 行が指定されていない場合と同様に処理を続けます。 この問い合わせの転送機能はマスタサーバにサイト単位の大きなキャッシュを 生成し、 外部のサーバとのリンクのためのトラフィックを軽減するのに役立ちます。 また、インターネットへの直接アクセスはできないが、 外部のアドレスを検索できるようなサーバを運用することが可能となります。 .LP ``slave'' 行は古いソフトウェアとの互換性のために設けられています。 これは ``options forward-only'' と同一です。 .LP -``sortlist'' 行は他のネットワークより優先するネットワークを指定するのに +``sortlist'' 行は、他のネットワークより優先するネットワークを指定するのに 使われます。 サーバと同じネットワーク上のホストからのアドレスの問い合わせには、 先ずローカルネットワークアドレスにリストされているもの、 次にソートされたリストから、そして最後にその他のアドレスから応答が返されます。 .LP ``xfrnets'' の指定 (例では使われていない) は単純なアクセス制御を行なうために 使われます。 この指定があれば、ネームサーバは ``xfrnets'' にて指定されたネットワーク上の ホストからのゾーン情報の転送の要求にのみ応答を返します。 これは古い中間的なサーバとの互換性を取るために ``tcplist'' として 指定することもできます。 .LP -``include'' の指定 (例では使われていない) は他のファイルの内容があたかも +``include'' の指定 (例では使われていない) は、他のファイルの内容があたかも ``include'' の指定がある場所におかれているように扱うために使われます。 この指定はゾーンが多数あるか、ゾーンを論理的にグループ化し多数の人によって メンテナンスしている場合に有用です。 ``include'' の指定は引数をひとつ取り、そこでインクルードするファイル名を 指定します。 ファイル名の前後に引用符は必要ありません。 .LP -``bogusns'' の指定 (例では使われていない) は指定されているネームサーバアドレス -(これはドメイン名ではなく 4つ組ドット表記にて指定される) +``bogusns'' の指定 (例では使われていない) は、 +指定されているネームサーバアドレス +(これはドメイン名ではなく 4 つ組ドット表記にて指定される) には問い合わせをしないことを \s-1BIND\s+1 に指示します。 -この指定はある特定のサーバのゾーンやキャッシュのデータが不正であることが +この指定は、ある特定のサーバのゾーンやキャッシュのデータが不正であることが あらかじめ分かっていて、 問題が修正されるまでデータの汚染を防止したい場合に有用です。 .LP ``limit'' の指定は \s-1BIND\s+1 の内部の制限を変更する場合に使用します。 制限にはシステムによるもの (例えば \fBdatasize\fP) と \s-1BIND\s+1 自身によるもの (例えば \fBtransfers-in\fP) があります。 limit の名称に続く数字はその後に続く ``k'', ``m'', ``g'' のいずれかによって 各々キロバイト、メガバイト、ギガバイトの単位となります。 \fBdatasize\fP の引数はカーネルによって設定されるプロセスのデータサイズです。 \fI注釈:\fP これを実現する関数が提供されていないシステムもあります。 そのようなシステムで ``limit'' に \fBdatasize\fP のパラメータを使用すると 警告メッセージが出力されます。 \fBtransfers-in\fP の引数は \s-1BIND\s+1 が一度に生成する \fInamed-xfer\fP サブプロセスの数を指定します。 \fBtransfers-per-ns\fP の引数はいくつかのリモートネームサーバに対し、 同時にゾーン転送を開始する最大の数となります。 \fBfiles\fP の引数はプロセスが使えるファイル記述子の数を設定します。 \fI注釈:\fP これを実現する関数が提供されていないシステムもあります。 そのようなシステムで ``limit'' に \fBfiles\fP のパラメータを使用すると 警告メッセージが出力されます。 .LP ``options'' の指定は \s-1BIND\s+1 の動作を変更するブール値の設定を行ないます。 ひとつの指定中に複数のオプションを指定することが可能です。 現在定義されているオプションには次のものがあります。 \fBno-recursion\fP これは \s-1BIND\s+1 に対し、 信頼できない名前に対する問い合わせを受け取った場合に実際のデータではなく、 照会先を返すよう指示します。 そのサーバが他のホストの \fIresolv.conf\fP ファイル中に記述されている場合は、 このオプションは指定しないでください。 -\fBno-fetch-glue\fP これは応答中の付属データ ``additional data'' セクションを +\fBno-fetch-glue\fP これは応答中の「付属データ(additional data)」セクションを 生成する時に、 -\s-1BIND\s+1 が missiong glue をフェッチしないようにします。 +\s-1BIND\s+1 が存在しない糊 (missing glue) をフェッチしないようにします。 これは、\fBno-recursion\fP と共に用いられ、 \s-1BIND\s+1 のキャッシュサイズが大きくなったり、壊れたりするのを防ぐのに 使われます。 \fBquery-log\fP 全ての問い合わせのログを syslog(8) 経由で採取します。 これを指定すると大量のデータを生成しますので、無闇には指定しないで下さい。 \fBforward-only\fP フォーワーダにのみ問い合わせます。 通常、この指定はサーバを運用したいが、 サーバが物理的もしくは管理上の理由によりインターネットに アクセスできない場合に使われます。 -\fBfake-iquery\fP 逆引き ``inverse queries'' に対してエラーではなく、 +\fBfake-iquery\fP 「逆引き (inverse queries)」に対してエラーではなく、 にせの応答を返すことを \s-1BIND\s+1 に指示します。 これはクライアントにマイクロコンピュータやSunOSのホストが沢山ある場合に 役に立ちます。 .LP ``check-names'' では、 その引数として ``primary'', ``secondary'', ``response'' を指定することにより、 \s-1BIND\s+1 に対してそれぞれ、 プライマリゾーンファイル、 セカンダリゾーンファイル、 再帰問い合わせに対する応答 (例えば、ファイアウォール中から問い合わせ転送に対する応答) の中の名称をチェックすることを指示します。 また、それぞれ名称の各タイプについて、 ゾーン情報が読み込まれていなかったり、 応答がキャッシュや転送されない場合の \s-1BIND\s+1 の振舞を、 引数に ``fail'', ``warn'', ``ignore''を指定することによってそれぞれ、 失敗する、 -システムのログにメッセージを残すような単に警告する、 +システムのログにメッセージを残す、 不正な名称を無視し従来の方法で処理する、というように指定することができます。 名称は、それがホスト名の場合は RFC 952 に準拠していれば正しいものと判断され、 ホスト名以外の場合は表示可能な \s-1ASCII\s+1 文字でのみ構成されていれば 正しいものと判断されます。 .LP ``max-fetch'' の指定 (例では使われていない) は 古いソフトウェアとの互換性を取るためのもので、 ``limit transfers-in'' と同一です。 .PP -マスターファイルは制御情報とゾーン中のオブジェクトの +マスタファイルは制御情報とゾーン中のオブジェクトの 資源レコードのリストからなり、次の形式を取ります。 .RS .nf $INCLUDE $ORIGIN .fi .RE ここで、 .I domain -にはルートの場合は "." を、現在の起点の場合は "@"、 +にはルートの場合は "." を、現在の起点の場合は "@" を、 それら以外では通常のドメイン名を指定します。 .I domain が ``.'' で終っていない通常のドメイン名である場合は、 現在の起点がドメインに追加されます。 ``.'' で終るドメイン名は変更されません。 .I opt_domain フィールドにはインクルードファイル中のデータの起点を定義します。 これはインクルードファイルの最初の行の前に $ORIGIN 宣言を置くことと等価です。 このフィールドはオプショナルです。 .I opt_domain や、インクルードファイル中の $ORIGIN 宣言は そのファイル自身の現在の起点を変更することはありません。 .I opt_ttl フィールドはオプションであり、 time-to-live フィールドを指定する整数値となります。 このデフォルト値はゼロであり、 そのゾーンの SOA レコードに指定された最小値を意味します。 .I opt_class フィールドはオブジェクトのアドレスの型を指定します。 現在はDARPAインターネットに接続するオブジェクトである .BR IN のみがサポートされています。 .I type フィールドには以下のトークンのうちひとつが含まれます。 括弧中におのおの .I resource_record_data フィールドに指定すべきデータを示しています。 .TP "\w'MINFO 'u" A ホストアドレス (4つ組ドット) .IP NS 信頼できるネームサーバ (ドメイン) .IP MX -メールエクスチェンジャー (ドメイン) +メールエクスチェンジャ (ドメイン) 優先順位 (0..32767) に引続き指定します。 優先順位は小さい値が優先順位の高いことを示します。 .IP CNAME 別名に対応した正式名 (ドメイン) .IP SOA オーソリティゾーンデータの開始を示します。 -(ホストの属するドメイン、メインテーナーのドメインアドレス、 +(ホストの属するドメイン、メンテナのドメインアドレス、 シリアル番号、その後にリフレッシュ、リトライ、有効期限、最小 TTL (RFC 883を参照) の各値を秒で指定したパラメータが続く)。 .IP NULL -ヌルリソースレコード (形式、データなし) +ヌルリソースレコード (形式やデータはありません) .IP RP いくつかのドメイン名の責任者 (メールアドレスか参照できるテキスト) .IP PTR ドメイン名のポインタ (ドメイン) .IP HINFO ホスト情報 (CPUタイプ、OSタイプ) .PP 通常は行末でリソースレコードは終了しますが、 左括弧と右括弧で囲まれた場合は複数行にまたがることが可能となります。 セミコロンから行末まではコメントとして扱われます。 .PP ここには示されていませんが、このほかのタイプのリソースレコードも存在します。 リソースレコードのすべてのタイプを知るには \s-1BIND\s+1 Operations Guide (``\s-1BOG\s+1'') を参照する必要があるでしょう。 新しい RFC にていくつかのリソースタイプが標準化されていますが、 このバージョンの \s-1BIND\s+1 ではまだ実装されていません。 .PP -各マスターゾーンファイルはそのゾーンの SOA レコードで始まらなければなりません。 +各マスタゾーンファイルはそのゾーンの SOA レコードで始まらなければなりません。 以下に SOA レコードの例を示します。 .LP .nf @ IN SOA ucbvax.Berkeley.EDU. rwh.ucbvax.Berkeley.EDU. ( .ta \w'x\ IN\ SOA\ 'u +\w'1989020501\ 'u 1989020501 ; serial 10800 ; refresh 3600 ; retry 3600000 ; expire 86400 ) ; minimum .fi .LP SOA ではシリアル番号を指定します。 -シリアル番号はマスターファイルを更新するたびに変更する必要があります。 +シリアル番号はマスタファイルを更新するたびに変更する必要があります。 シリアル番号 (serial) は少数点つきの数字を指定することもできますが、 整数への変換は乗算や加算ではなく文字列としてつなげて行っているため、 あまり賢い方法とはいえません。 年月日と 0〜99 のシリアル番号を使用することで、 このフィールドのサイズである符号なしの 32 ビット以内に収まります。 -このやり方はグレゴリー暦の 4294年には考え直す必要があることは確かですが、 +このやり方はグレゴリ暦の 4294 年には考え直す必要があることは確かですが、 それについては心配する必要はないでしょう。 セカンダリサーバは秒で指定されたリフレッシュ時間 (refresh) の間隔で シリアル番号をチェックします。 シリアル番号に変更があれば、新しいデータを読み込むために ゾーン情報が転送されます。 -リフレッシュ時間が過ぎてもマスターサーバに接続できない場合は、 +リフレッシュ時間が過ぎてもマスタサーバに接続できない場合は、 リトライ時間 (retry) の間隔でリフレッシュが試みられます。 -期限切れ時間 (expire) が過ぎてマスターサーバに接続できない場合は、 +期限切れ時間 (expire) が過ぎてマスタサーバに接続できない場合は、 セカンダリサーバはそのゾーンの全てのデータを破棄します。 最小値 (minimum) はファイル中の生存時間 (``\s-1TTL\s+1'') が 明示的に指定されていないレコードの生存時間となります。 .SH 注釈 ブートファイルでの ``domain'' と ``suffixes'' の指定は廃止され、 -もっと便利なリゾルバベースの部分的修飾ドメイン名 -(partially qualified domain names) の接尾辞の実装に取って代わりました。 -以前のメカニズムではかなりの状況下で、 -特にローカルネームサーバが完全な情報を持っていない場合に -うまく動作しないことがありました。 +もっと便利なリゾルバベースの実装、すなわち部分的な形のドメイン名 +(partially qualified domain names) の接尾辞に置き変えられました。 +以前のメカニズムでは多くの状況下で失敗することがあり、 +特にローカルネームサーバが完全な情報を持っていない場合に失敗しました。 .sp 以下に各シグナルを .IR kill (1) コマンドによってサーバに送った場合の効果を示します。 .IP SIGHUP サーバは named.boot を読み、データベースをロードし直します。 サーバがコンパイルオプションの FOCED_RELOAD を定義されて コンパイルされている場合は、 SIGHUPを送るとサーバは全てのセカンダリゾーンのシリアル番号もチェックします。 通常、シリアル番号は SOA 中に指定された間隔でのみチェックされます。 .IP SIGINT 現在のデータベースとキャッシュの内容を /var/tmp/named_dump.db にダンプします。 .IP SIGIOT サーバが -DSTATS 付きでコンパイルされていれば、 統計データを /var/tmp/named.stats にダンプします。 統計データはこのファイルの末尾に追加されます。 いくつかのシステムでは SIGIOT ではなく SIGABRT で統計データのダンプを行います。 .IP SIGSYS サーバがプロファイリング (サーバの fork, chdir と exit) を 有効にされてコンパイルされていれば、 プロファイリングデータを /var/tmp にダンプします。 .IP SIGTERM プライマリおよびセカンダリのデータベースファイルをダンプします。 サーバが動的更新を有効にしてコンパイルされていれば、 シャットダウン時に更新されたデータをセーブするために使用されます。 .IP SIGUSR1 デバッグ機能を有効にします。 SIGUSR1が送られるたびにデバッグレベルが上がります。 (SIGUSR1がない古いシステムではSIGEMTが使われます。) .IP SIGUSR2 デバッグ機能を完全に無効にします。 (SIGUSR2がない古いシステムではSIGFPEが使われます。) .IP SIGWINCH 全てのサーバに入力される問い合わせの syslog(8) による ログ採取の有無を切り替えます。 (ログ採取はサーバが QRYLOG オプションを指定されて コンパイルされている必要があります。) .SH 関連ファイル .nf .ta \w'/var/tmp/named_dump.db 'u -/etc/named.boot ネームサーバ コンフィギュレーション ブートファイル +/etc/named.boot ネームサーバの設定ブートファイル /etc/named.pid プロセス ID (旧システム) /var/run/named.pid プロセス ID (新システム) /var/tmp/named_dump.db ネームサーバデータベースのダンプ /var/tmp/named.run デバッグ出力 -/var/tmp/named.stats ネームサーバ 統計データ +/var/tmp/named.stats ネームサーバの統計データ .fi .SH 関連項目 kill(1), gethostbyname(3), signal(2), resolver(3), resolver(5), hostname(7), RFC 882, RFC 883, RFC 973, RFC 974, RFC 1033, RFC 1034, RFC 1035, RFC 1123, \fIName Server Operations Guide for \s-1BIND\s+1\fR diff --git a/ja/man/man8/named.restart.8 b/ja/man/man8/named.restart.8 index 67bcfd0265..867b865854 100644 --- a/ja/man/man8/named.restart.8 +++ b/ja/man/man8/named.restart.8 @@ -1,74 +1,74 @@ .\" ++Copyright++ 1987, 1993 .\" - .\" Copyright (c) 1987, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" - .\" Portions Copyright (c) 1993 by Digital Equipment Corporation. .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies, and that .\" the name of Digital Equipment Corporation not be used in advertising or .\" publicity pertaining to distribution of the document or software without .\" specific, written prior permission. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL .\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT .\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS .\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS .\" SOFTWARE. .\" - .\" --Copyright-- .\" .\" from hostname.7 6.4 (Berkeley) 1/16/90 .\" jpman %Id: named.restart.8,v 1.2 1997/05/17 16:56:47 horikawa Stab % .\" .TH NAMED.RESTART 8 "June 26, 1993" .UC 5 .SH 名称 named.restart \- ネームサーバを停止し、再起動する .SH 解説 このコマンドは実行中のネームサーバに \s-1SIGKILL\s+1 を送り、 -.IR /etc/sysconfig -にネームサーバが実行されるよう記述されていれば、新たに起動します。 +新たに起動します。 +.SH バグ ネームサーバが実際に動作しているか確認をしないため、古い PID キャッシュ ファイルが残っていると無関係なプロセスを停止させてしまうことがあり得ます。 .PP 古いサーバにシグナルを送った後、プロセスの完了を待たずに新しいサーバを起動 します。完了に時間がかかり、古いサーバが残ったまま新しいサーバが起動して 致命的エラーとなると、ネームサーバの動作していない状態に放置されることに なります。 .SH 関連項目 named(8), named.reload(8) .\" translated to japanese by Mochida Shuji 1995/03/31 diff --git a/ja_JP.eucJP/man/man1/a2p.1 b/ja_JP.eucJP/man/man1/a2p.1 index 6b3481ac8a..40c9922daf 100644 --- a/ja_JP.eucJP/man/man1/a2p.1 +++ b/ja_JP.eucJP/man/man1/a2p.1 @@ -1,218 +1,218 @@ .rn '' }` .\" jpman %Id: a2p.1,v 1.3 1997/07/22 14:10:51 konuma Stab % ''' %Header: /home/ncvs/src/gnu/usr.bin/perl/x2p/a2p.1,v 1.1.1.1 1994/09/10 06:27:55 gclarkii Exp % ''' ''' %Log: a2p.1,v % ''' Revision 1.1.1.1 1994/09/10 06:27:55 gclarkii ''' Initial import of Perl 4.046 bmaked ''' ''' .\" Revision 1.1.1.1 1993/08/23 21:30:10 nate .\" PERL! .\" ''' Revision 4.0 91/03/20 01:57:11 lwall ''' 4.0 baseline. ''' ''' Revision 3.0 89/10/18 15:34:22 lwall ''' 3.0 baseline ''' ''' Revision 2.0.1.1 88/07/11 23:16:25 root ''' patch2: changes related to 1985 awk ''' ''' Revision 2.0 88/06/05 00:15:36 root ''' Baseline version 2.0. ''' ''' .de Sh .br .ne 5 .PP \fB\\$1\fR .PP .. .de Sp .if t .sp .5v .if n .sp .. .de Ip .br .ie \\n.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. ''' ''' Set up \*(-- to give an unbreakable dash; ''' string Tr holds user defined translation string. ''' Bell System Logo is used as a dummy character. ''' .tr \(*W-|\(bv\*(Tr .ie n \{\ .ds -- \(*W- .if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch .if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch .ds L" "" .ds R" "" .ds L' ' .ds R' ' 'br\} .el\{\ .ds -- \(em\| .tr \*(Tr .ds L" `` .ds R" '' .ds L' ` .ds R' ' 'br\} .TH A2P 1 LOCAL .SH 名称 a2p - Awk から Perl へのトランスレータ .SH 書式 .B a2p [options] filename .SH 解説 .I a2p はコマンドラインで指定された (あるいは標準入力からの) awk スクリプトを とり、同等の働きをする .I perl スクリプトを標準出力に出力します。 .Sh オプション オプションには以下のものがあります: .TP 5 .B \-D デバッグフラグをセットします。 .TP 5 .B \-F awk スクリプトが常にこの -F スイッチ付きで実行されることを指定します。 .TP 5 .B \-n 入力を分割して配列に格納する必要がない場合、 入力フィールドの名前を指定します。 例えば、パスワードファイルを処理する awk スクリプトを変換する場合、 このように指定します: .sp a2p -7 -nlogin.password.uid.gid.gcos.shell.home .sp フィールド名の区切りには任意のデリミタが使用できます。 .TP 5 .B \- a2p は、入力が常に指定した数のフィールドから成っていることを仮定します。 .Sh 考察 a2p は人間と同じぐらいうまい変換はできませんが、 大抵の場合はそこそこうまく処理します。 場合によっては、 生成された perl スクリプトを吟味し、少し手を加えたいと思うことも あるでしょう。 以下にいくつかの場合を、順不同で説明します。 .PP 文字列を表す式のまわりに int() を付け、 数値として解釈されるようにする awk イディオムが あります (その引数は常に整数型なのですが)。 これは一般に perl では不要ですが、 a2p は引数が常に整数となるかどうか判断できないので、 このイディオムはそのまま残します。 ユーザはこれを取り除くことができます。 .PP perl では数値比較と文字列比較は区別されています。 awk ではどちらにも同じ演算子が用いられ、 実行時にどちらの比較を行うかが決定されます。 この点で a2p は awk エミュレーションを完全には行おうとしません。 その代わり、a2p はどちらの種類の比較を行おうとしているのか推測します。 これはほとんどの場合正しいものですが、だまされることもあります。 推測を行った部分には \*(L"#???\*(R" というコメントが付与されますので、 それらの部分を調べ、中身をチェックすべきです。 ユーザは、少なくとも一度は \-w スイッチ付きで perl を走らせるとよいでしょう。 こうすると、eq を使うべきところで == を使っている場合に警告を受けます。 .PP 存在しない配列要素でも、単にそれを参照しただけで存在するようになるか、 という点で、perl は awk の動作をエミュレートしようとしません。 何らかの理由で、このメカニズムに依存して後続の for...in のために ヌルエントリを作成しようとする場合、 perl ではヌルエントリは作成されません。 .PP a2p が、(Fld1, Fld2, Fld3...) のような、変数のリストへの代入を行う行を 分割する場合、 上に述べた \-n オプションを用いて再度 a2p を走らせた方がいいかもしれません。 これにより、スクリプト内のフィールドに名前を付けます。 そうではなく、分割して配列に格納する場合、 その分割はおそらくどこかでフィールド数を参照しているでしょう。 .PP awk の exit ステートメントは必ずしも exit せず、 END ブロックがあればそこへ処理が移ります。 ある条件下で END ブロックをバイパスするような細工を END ブロックに 仕掛けてある awk スクリプトは、 END ブロック内の条件文を取り除き、perl スクリプトから直接 exit するように 修正することで簡単化できます。 .PP perl には 2 種類の配列、すなわち数値でインデックスされる配列と連想配列とが あります。 通常、awk の配列は連想配列に変換されますが、 もしそのインデックスが常に数値であるとわかったら、 配列添字の {...} を [...] に変更できます。 連想配列に対する繰り返し処理は関数 keys() を用いて行われますが、 数値配列に対してはそうではありません。 問題となっている配列の繰り返し操作を行うあらゆるループ構造を 修正する必要があるかもしれません。 .PP awk は起動時、OFMT の値が %.6g であると仮定しています。 perl でこれに相当する変数 $# は、初期値として %.20g を持っています。 OFMT のデフォルト値を用いる場合は $# を明示的に設定して下さい。 .PP awk スクリプトでは、行の先頭付近で行分割 (split) 操作が暗黙的に 繰り返されます。 場合によっては、全体レコードをテストする何らかの条件文より下に これを移動させることができます。 そうすることで無用な行分割処理を避けることができます。 .PP 美的理由から配列の基底 $[ を元々の 1 から perl でのデフォルトである 0 に 変更したいこともあるでしょう。 しかし、全ての配列添字式だけでなく、全ての substr() および index() 関数も 適合するように修正しなければならないことを忘れないで下さい。 .PP "# awk は馬鹿だからこうやって工夫してます" といった気の利いたコメントは、 そのまま修正されずに渡されます。 .PP awk スクリプトはしばしばシェルスクリプトに埋め込まれ、 awk の入出力がパイプで接続されます。 -こういったシェルスクリプトのラッパーも perl スクリプトに取り込める場合が +こういったシェルスクリプトのラッパも perl スクリプトに取り込める場合が かなりあります。 perl なら入出力パイプを開始でき、 awk が自分ではできなかった他の処理も行うことができるからです。 .PP 特殊変数 RSTART および RLENGTH を参照するスクリプトは、 これらの変数を定義するパターン照合のスコープの中で参照されている限り、 変数 $`, $&, $' を参照することで簡単化できる場合がかなりあります。 .PP 生成された perl スクリプトには、 getline および print に関する awk の意味規則に対処するための サブルーチンが定義されている場合があります。 a2p は通常、効率よりも正確さを選ぶからです。 ほとんどの場合、ご丁寧に意味規則に対処してくれるサブルーチンを捨てて、 もっと効率的なコードに書き換えることができます。 .PP 効率を上げるために、 サブルーチンで最後に実行される return ステートメントから キーワード return を取り除くことができる場合があります。 a2p は最も一般的な場合は見つけますが、 稀にある埋め込まれたブロックを解析したりしません。 .PP ARGV[0] は $ARGV0 に変換されますが、ARGV[n] は $ARGV[$n] に変換されます。 ARGV[0] を含めて繰り返し処理を行おうとするループは、 うまくいきません。 .SH 環境変数 a2p は環境変数を参照しません。 .SH 作者 Larry Wall .SH 関連ファイル .SH 関連項目 perl perl コンパイラ/インタプリタ .br s2p sed から perl へのトランスレータ .SH 診断 .SH バグ 実行時にオペランドを調べることで、文字列演算か数値演算かの選択で awk の エミュレーションを行うことは可能でしょうが、 プログラムは肥大し、非効率的になるでしょう。 なお、a2p の推測はほとんど常に正しく行われます。 .PP awk 文法ツリー用の領域は現在のところ静的に確保しており、 不足する可能性があります。 .rn }` '' diff --git a/ja_JP.eucJP/man/man1/csh.1 b/ja_JP.eucJP/man/man1/csh.1 index 5a2ead2d67..3cc1301443 100644 --- a/ja_JP.eucJP/man/man1/csh.1 +++ b/ja_JP.eucJP/man/man1/csh.1 @@ -1,2190 +1,2188 @@ .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)csh.1 8.2 (Berkeley) 1/21/94 .\" jpman %Id: csh.1,v 1.2 1997/04/08 00:35:51 h-nokubi Stab % .\" %Id: csh.1,v 1.5.2.1 1997/02/28 07:54:29 mpp Exp % .\" .\" Japanese translation for jpman-0.2 checked by jpman project 96.12.23 .\" .Dd January 21, 1994 .Dt CSH 1 .Os BSD 4 .Sh 名称 .Nm csh .Nd C 言語ライクな文法を持つシェル(コマンドインタプリタ) .Sh 書式 .Nm csh .Op Fl bcefimnstvVxX .Op arg ... .Nm csh .Op Fl l .Sh 解説 .Nm csh は、履歴(参照: .Nm ヒストリ置換 の項)、ジョブ制御(参照: .Nm ジョブ の項)、対話的なファイル名とユーザ名の補完(参照: .Nm ファイル名補完 の項)、C 言語ライクな文法を特徴とするコマンドインタプリタです。 対話的なログイン・シェル、また シェル・スクリプトのコマンド・プロセッサの両方の用途で使われます。 .Ss 引数リスト処理 シェルへの最初の引数(第 0 引数)が .Ql Fl \& で始まる場合、シェルはログイン・シェルとなります。 シェルを .Ql Fl l フラグを指定して起動することでもログイン・シェルにできます。 .Pp 残りのフラグは以下のように解釈されます: .Bl -tag -width 5n .It Fl b このフラグは、オプションの処理を強制的に中断させる場合に使用します。この フラグ以降の引数はすべて、オプションではない引数として処理されます。 これにより、シェル・スクリプトに混乱やごまかしを行わずにオプションを 渡すことが可能になります。 set-user ID スクリプトは本オプションなしでは実行できません。 .It Fl c コマンドを本フラグの次にくる 1 つの引数から読み込みます。 この引数は省略できません。残りの引数は .Ar argv に代入されます。 .It Fl e 起動したコマンドが異常終了したり、0 でない終了ステータスを返したときに、 ただちにシェルを終了します。 .It Fl f 起動したユーザのホーム・ディレクトリにある .Pa \&.cshrc を捜さず、また読み込まないため高速に起動します。 .It Fl i たとえ端末上で実行されていなくても、対話的に動作しプロンプトを表示します。 入力と出力が端末である場合、本オプションなしでもシェルは対話的に動作します。 .It Fl l ログイン・シェルとなります。( .Fl l が、指定された唯一のフラグの場合にのみ有効です。) .It Fl m シェルは、実効ユーザに属していなくても .Pa .cshrc をロードします。 .Xr su 1 は .Fl m をシェルに渡すことができます。 .It Fl n コマンドの解析は行いますが、実行しません。シェル・スクリプトの 文法検査に役立ちます。 .It Fl s 標準入力からコマンドを読み込みます。 .It Fl t 入力から1行だけ読み込み、それを実行します。改行の直前に .Ql \e を置くことで、次の行への継続を行うことができます。 .It Fl v .Ar verbose 変数を設定します。これにより、ヒストリ置換された状態のコマンド行を 表示するようになります。 .It Fl x .Ar echo 変数を設定します。これにより、実行直前に、実行するコマンドを 表示するようになります。 .It Fl V .Pa .cshrc を実行するより前に .Ar verbose 変数を設定します。 .It Fl X .Pa .cshrc を実行するより前に .Ar echo 変数を設定します。 .El .Pp .Fl X に対する .Fl x の関係は、ちょうど .Fl V に対する .Fl v の関係に相当します。 .Pp フラグ引数の処理のあと、もし引数が残っていて、かつ、 -.Fl c -、 -.Fl i -、 -.Fl s -、 +.Fl c , +.Fl i , +.Fl s , .Fl t のいずれのフラグも指定されていなければ、残っている最初の引数は コマンドファイル名であるとみなされます。シェルはこのファイルをオープンし、 `$0' による置換に備えてファイル名を保存します。多くのシステムは version 6 または version 7 の標準のシェルを使っており、また、それらの シェル・スクリプトは本シェルとは互換性がないので、 スクリプトの先頭の文字が `#' でない場合、 つまりスクリプトがコメントから始まらない場合、 本シェルはそれらの `標準' シェルを起動して実行します。 残りの引数は変数 .Ar argv に初期値として設定されます。 .Pp .Nm csh は、実行開始に際し、まず、ファイル .Pa /etc/csh.cshrc を読み込み実行します。ログイン・シェルであれば、さらに、ファイル .Pa \&/etc/csh.login を読み込み実行します。 次にシェルを起動したユーザの .Ar ホーム ・ディレクトリにあるファイル .Pa \&.cshrc を読み込み実行します。ログイン・シェルであるなら、 さらに、同じディレクトリのファイル .Pa \&.login を読み込み、実行します。 .Pa \&.login の通常の使い方としては、ユーザが CRT 画面の設定のために ``stty crt'' を実行したり、 .Xr tset 1 を実行したりするために用いられます。 .Pp 通常、シェルはプロンプト `% ' を表示し、端末からコマンドを読み込みます。 引数の処理やコマンド・スクリプトを含むファイルの処理については後述します。 .Pp シェルは以下の動作を繰り返します: 読み込んだ行を .Ar 単語 に分解します。この単語の列をコマンド履歴に格納し、解析します。 最後にその行の各コマンドを実行します。 .Pp ログイン・シェルが終了するとき、ユーザの .Ar ホーム -・ディレクトリのファイル +ディレクトリのファイル .Pa .logout と .Pa /etc/csh.logout を読み込み実行します。 .Ss 字句構造 シェルは、読み込んだ行を空白とタブを区切りとして単語に分割します。ただし、 以下の例外があります。文字 `&' `\&|' `;' `<' `>' `(' `)' -は独立した単語となります。`&&'、`\&|\&|'、`<<'、`>>' のように +は独立した単語となります。`&&', `\&|\&|', `<<', `>>' のように 2つ繰り返されている場合はペアで1単語を形成します。 これらのメタキャラクタは、直前に `\e' を置くことによって、単語の一部としたり、 特別な意味を無視させることができます。改行の直前に `\e' を置くと、 単一の空白と等価になります。 .Pp 対応したクォート記号 -`'\|'、`\*(ga'、`"'、に狭まれた文字列は、単語の一部分となります。 +`'\|', `\*(ga', `"' に狭まれた文字列は、単語の一部分となります。 このような文字列中のメタキャラクタやブランク、 タブによって単語が分割されることはありません。 これらのクォートの意味はあとで説明します。 `\'' または `"' の内側で改行文字の直前に `\e' を置くと、 改行文字そのものになります。 .Pp シェルの入力が端末からではない場合、 `#' 文字から改行まではコメントとして扱われます。 -直前に `\e' を置くか `\`'、`\''、`"" でクォートすることにより、 +直前に `\e' を置くか `\`', `\'', `"" でクォートすることにより、 この意味を抑制することができます。 .Ss コマンド 単純コマンドは単語の列であり、最初の単語が実行すべきコマンドを示します。 `\&|' 記号で区切られた、単純コマンドあるいは単純コマンドの列は パイプラインを形成します。パイプラインの各コマンドの出力は、次のコマンドの 入力に接続されます。パイプラインの列を `;' によって区切ることで逐次実行が 行えます。パイプラインの列に続けて `&' を置くと、そのパイプラインの終了を 待つことなく、次のパイプラインが実行されます。 .Pp -上記のいずれかを `('と`)' で囲むことにより、単純コマンドを形成することが +上記のいずれかを `(' と `)' で囲むことにより、単純コマンドを形成することが できます (これはパイプライン等の構成要素として使えます)。 また、パイプラインを `\&|\&|' または `&&' で区切ることにより、C -言語のように、第2のパイプラインが第1のパイプラインが失敗あるいは +言語のように、第 2 のパイプラインが第 1 のパイプラインが失敗あるいは 成功したときにのみ実行させることができます( .Em 式 の項参照)。 .Ss ジョブ シェルはパイプラインの各々に対し .Ar ジョブ -を一つづつ関連付けます。シェルは、現在実行中のジョブの一覧表を保持しており、 +を 1 つづつ関連付けます。シェルは、現在実行中のジョブの一覧表を保持しており、 これは、 .Ar jobs コマンドによって表示することができます。 ジョブには整数の番号が割り当てられます。ジョブが `&' を用いて非同期に 起動された場合、シェルは以下のような出力を行います: .Bd -filled -offset indent .Op 1 1234 .Ed .Pp -これは、非同期に起動したジョブがジョブ番号 1 であり、プロセスID が 1234 である +これは、非同期に起動したジョブがジョブ番号 1 であり、プロセス ID が 1234 である (トップレベルの) プロセスを 1 つ持っていることを示します。 .Pp もし、あるジョブを実行中に他のことをしたくなった場合、 .Nm ^Z キー (control-Z) を押すことにより実行中のジョブに STOP シグナルを 送信することができます。通常、シェルはそのジョブが停止した(Stopped)ことを 出力し、プロンプトを表示します。ここで、停止したジョブの状態を操作することが できます。つまり、 .Ar bg コマンドにより停止したプロセスを .Em バックグラウンド で走行させたり、他のコマンドを実行してから、停止していたジョブを .Ar fg コマンドにより .Em フォアグラウンド で再実行させることなどができます。 .Nm ^Z は即座に効力を発揮し、インタラプトと同様に、それまで待たされていた 出力とまだ読み込まれていない入力は捨てられます。 ほかに特殊キーとして .Nm ^Y があり、これを押すと、プログラムが .Xr read 2 によって読み込もうとした時点で STOP シグナルが送信されます。 これは、実行中のジョブに対していくつかの入力を先に入力しておき、 先行入力を読み終えた時点でジョブを停止させたいときに便利です。 .Pp バックグラウンドで実行しているジョブが端末からの入力を試みた場合、その ジョブは停止します。通常、バックグラウンドジョブが端末に出力することは 可能ですが、これは、コマンド ``stty tostop'' により禁止することができます。 もし、この tty オプションを指定したなら、バックグラウンドで実行している ジョブは、端末から入力を試みたときと同様に、端末に出力を試みたときに 停止します。 .Pp シェルでジョブを参照するにはいくつかの方法があります。文字 `%' は ジョブ名を表すのに用いられます。番号 1 のジョブを参照する場合は `%1' とします。 単にジョブ名を入力した場合、そのジョブはフォアグラウンドに移動されます。 -すなわち`%1' は `fg %1' と等価で、番号 1 のジョブをフォアグラウンドで +すなわち `%1' は `fg %1' と等価で、番号 1 のジョブをフォアグラウンドで 実行させます。同様に `%1 &' は番号 1 のジョブをバックグラウンドで 走行させます。ジョブはそのジョブを起動したときにタイプされた文字列の 先頭部分によって参照することもできます。ただし、この先頭部分は あいまいでない必要があります。すなわち、`%ex' は、`ex' という文字列で -始まる名前のサスペンドされたジョブが一つしかない場合に限り、サスペンドされた +始まる名前のサスペンドされたジョブが 1 つしかない場合に限り、サスペンドされた .Xr ex 1 のジョブを再開します。文字列 .Ar string -を含むジョブが一つしかない場合、`%?string' と入力することで、 +を含むジョブが 1 つしかない場合、`%?string' と入力することで、 それを指定することもできます。 .Pp シェルは現在のジョブと直前のジョブを覚えています。jobs コマンドの 出力では、`+' 記号が付加されているのが現在のジョブ、`\-' 記号が 付加されているのが直前のジョブです。`%+' は現在のジョブ、`%\-' は 直前のジョブの省略形です。後述する .Ar ヒストリ の文法から類推される記法として、`%%' があります。 これもまた現在のジョブの省略形です。 .Pp ジョブ制御機構を用いるには、 .Xr stty 1 のオプション .Ic new を設定しておく必要があります。ジョブ制御機構は、 .Em 新型 の端末ドライバの実装の上に構築されているからです。 新型の端末ドライバにより、ジョブを停止させるためのシグナルを キーボードから入力できるわけです。 新型の端末ドライバのオプション設定については stty(1) を参照してください。 .Ss 状態通知 シェルは、プロセスが状態の変化を起こすと、すぐにそれを検知します。通常、 プロンプトが表示される直前にのみ、あるジョブが停止し、それ以上処理が 進まなくなったことを通知します。これは、ユーザの仕事を邪魔しないように するためです。 しかしながら、シェル変数 .Ar notify をセットすることにより、シェルにバックグラウンド・ジョブの状態が 変化したことをただちに通知させることができます。 また、シェルコマンド .Ar notify により、特定のジョブの状態の変化をただちに通知させる ようにマークすることもできます。引数なしの .Ar notify は現在のプロセスに対してマークをつけます。 バックグラウンド・ジョブの開始直後に単に `notify' と打つと そのジョブをマークします。 .Pp 停止したジョブがある状態でシェルを終了しようとすると、`You have stopped jobs.' という警告を受けます。このとき、 .Ar jobs コマンドによりどのジョブが停止中であるのかを確認することができます。 警告を受けた直後に .Ar jobs コマンドで確認した場合と、 -警告を受けた直後にもう一度シェルを終了させようとした場合には、 -シェルは2度目の警告を行わず、停止中のジョブは終了させてから +警告を受けた直後に再度シェルを終了させようとした場合には、 +シェルは 2 度目の警告を行わず、停止中のジョブは終了させてから シェルを終了します。 .Ss ファイル名補完 シェル変数 .Ar filec がセットされてファイル名補完機能が有効になっている場合、 ( .Ic set の項参照) .Nm csh はファイル名やユーザ名の補完を対話的に行います。文字列に続けて エスケープ文字 (エスケープキー、または control-[) キーを端末から 入力することにより補完が行われます。 たとえば、以下のファイルがカレント・ディレクトリにあったとします。 .Bd -literal -offset indent DSC.OLD bin cmd lib xmpl.c DSC.NEW chaosnet cmtest mail xmpl.o bench class dev mbox xmpl.out .Ed .Pp ここで、以下のように入力します。 .Pp .Dl % vi ch .Pp このとき、 .Nm csh は ``ch'' を補完し、それにマッチする唯一のファイル名 ``chaosnet'' にします。補完後の入力行は以下のようになります。 .Pp .Dl % vi chaosnet .Pp 以下のように入力した場合は、 .Pp .Dl % vi D .Pp .Nm csh は、次のように補完を行います。 .Pp .Dl % vi DSC. .Pp ここで、端末ベルを鳴らし、補完が完了しなかったことをユーザに伝えます。 なぜなら、``D'' で始まるファイル名が複数あったからです。 .Pp 不完全なファイル名に続いて end-of-file 文字(通常は control-D)を入力すると、 名前の補完を行うかわりに、その名前にマッチするファイル名の一覧を出力します。 たとえば、以下のように入力すると、 .Pp .Dl % vi D .Pp ``D'' で始まるファイル名の一覧が以下のように出力されます: .Pp .Dl DSC.NEW DSC.OLD .Pp このとき、入力行は変化しません。 .Pp エスケープ文字と、end-of-file 文字を用いる同様の機構は、 ユーザ名を補完する場合にも用いることができます。この場合、``~'' で 名前を開始します。たとえば、次のように入力すると、 .Pp .Dl cd ~ro .Pp 以下のように補完されます。 .Pp .Dl cd ~root .Pp シェル変数 .Ar nobeep をセットすることにより、複数の候補があったり、補完に 失敗した場合に端末ベルを鳴らすのを禁止することができます。 .Pp 通常、そのディレクトリにあるすべてのファイル名が補完の候補となります。 ある特定の拡張子を持つファイルを補完の候補から外すのに、変数 .Ar fignore を用いる ことができます。以下のコマンドで、変数 .Ar fignore を設定すると、 .Pp .Dl % set fignore = (.o .out) .Pp 以下のように入力した場合に、 .Pp .Dl % vi x .Pp 次のように補完が行われます。 .Pp .Dl % vi xmpl.c .Pp つまり、"xmpl.o" と "xmpl.out" が無視されて補完が行われました。もし、 .Ar fignore で無視するように指定されたファイル名しか補完の対象になり得なかった場合、 .Ar fignore の設定は無視されます。また、 .Ar fignore は end-of-file 文字によるファイル名の一覧には影響を与えません。 一覧ではすべてのファイル名が出力されます。 .Ss 置換 ここからは、シェルが入力に対して行うさまざまな置換を、 処理が行われる順に記述します。 .Ss ヒストリ置換 ヒストリ置換は、以前に入力されたコマンド中の単語を、 新たなコマンドの一部として置き換えることで、 コマンドの繰り返し実行を容易にしたり、直前のコマンドの引数を次のコマンドで 再び使用したり、直前に入力した行の綴り間違いを修正する際に、 タイプ入力の手間を減らし、自信をもって修正できるようにするための機能です。 ヒストリ置換は文字 `!' により始まり、入力ストリームの .Ar どの位置にでも 置くことができます(ただし、入れ子にすることは .Nm できません )。`\e' を `!' の前に置くことにより、`!' の特殊な意味を打ち消すことが できます。また、利便のために、`!' の直後に空白、タブ、改行文字、 -`='、`(' が続いた場合、ヒストリ置換は行われず、入力された文字がそのまま +`=', `(' が続いた場合、ヒストリ置換は行われず、入力された文字がそのまま 用いられます(ヒストリ置換は、入力行が `\*(ua' で始まっている場合にも 起こります。これについては後述します)。入力行にヒストリ置換が含まれている 場合は、実行直前にヒストリ置換を行った結果が端末に出力されます。 .Pp -端末から入力された、1つあるいはそれ以上の単語からなるコマンドは +端末から入力された、1 つあるいはそれ以上の単語からなるコマンドは ヒストリ・リストに記録されます。ヒストリ置換は、この記録された 単語の列を入力ストリームに挿入することにより行われます。 ヒストリ・リストの大きさは、変数 .Ar history により制御されます。直前のコマンドは .Ar history の値に関わらず必ず 保存されます。記録されているコマンドは 1 から順にイベント番号が 割り当てられます。 .Pp .Ar history コマンドにより、以下の出力が得られたとします: .Bd -literal -offset indent \09 write michael 10 ex write.c 11 cat oldwrite.c 12 diff *write.c .Ed .Pp コマンドはイベント番号とともに出力されています。必ずしもイベント番号を 用いる必要はありませんが、プロンプト文字列に `!' を埋めることにより、 現在のイベント番号を .Ar プロンプト 中に表示させることができます。 .Pp 現在のイベント番号が 13 だとすると、以前のイベントを指定するには、 イベント番号を用いて `!11' としたり、 相対指定を用いて `!\-2' としたり(同じイベントを表します)する方法があります。 また、コマンドの単語の先頭部分を用いて指定することもできます。例えば、`!d' でイベント番号 12 を指定したり、 `!wri' でイベント番号 9 を指定できます。また、 ある文字列を含むコマンドを指定するのに `!?mic?' (これはイベント番号 9 の コマンドを示します)のような記法も使えます。これらの記法は、指定された イベントの各単語を単一の空白で区切った単語列に置換します。特殊な 場合として、`!!' は直前のコマンドを参照します。すなわち、`!!' だけを 入力することは直前のコマンドの .Ar 再実行 を意味します。 .Pp あるイベント中のいくつかの単語だけを指定するために、イベント指定に続けて `:' と単語指示子を書くことができます。イベントの単語は 0 から順に番号が -振られています。最初の単語(通常はコマンドです)が 0 で、2番目の単語 +振られています。最初の単語(通常はコマンドです)が 0 で、2 番目の単語 (第1引数)が 1 ということになります。基本的な単語指示子は以下のとおりです: .Pp .Bl -tag -width Ds -compact -offset indent .It \&0 最初の(コマンド)単語 .It Ar n .Ar n 番目の単語 .It \*(ua 最初の引数(すなわち 1 と同じ) .It $ 最後の引数 .It % 直前の .No \&? Ns Ar s Ns \&? 検索でマッチした単語 .It Ar \&x\-y .Ar x 番目から .Ar y 番目までの単語 .It Ar \&\-y .Ar `\&0\-y\' の省略形 .It * `\*(ua\-$' の省略形。イベントが1語のみからなる場合は空になる .It Ar x* .Ar `x\-$\' の省略形 .It Ar x\- .Ar `x*\' から最後の単語を除いたもの。 .El .Pp -イベント指定と単語指示子とを区切る `:' は、引数選択子が `\*(ua'、`$'、`*'、 -`\-'、`%' で始まっている場合には省略することができます。 +イベント指定と単語指示子とを区切る `:' は、引数選択子が `\*(ua', `$', `*', +`\-', `%' で始まっている場合には省略することができます。 単語指示子の直後に、 `:' に続けて 修飾子を複数個置くことができます。以下の修飾子が定義されています: .Pp .Bl -tag -width Ds -compact -offset indent .It h パス名の最後の要素を削除します(head) .It r 最後の `.xxx' 要素を削除します(root) .It e `.xxx' 以外の部分を削除します(extension) .It s Ns Ar /l/r/ Substitute .Ar l を .Ar r で置換します(substitution) .It t 最後の要素を残して、それより前のパス名の要素全てを削除します。 .It \&& 直前の修飾子の作用を繰り返します。 .It g -上記の修飾子の直前に置き、変更を、各単語に1回だけ及ぼすことを指定します。 +上記の修飾子の直前に置き、変更を、各単語に 1 回だけ及ぼすことを指定します。 例) `g&' .It a -上記の修飾子の直前に置き、一つの単語に対して可能な限り繰り返して +上記の修飾子の直前に置き、1 つの単語に対して可能な限り繰り返して 変更を行います。変更が全単語に及ぶようにするには `g' と組み合わせて使います。 .It p 置換結果を表示しますが、実行はしません(print only) .It q さらに置換が行われないように、置換結果をクォートします(quote) .It x q と同様ですが、空白、タブ、改行によって単語を分割します .El .Pp `g' が指定されなかった場合、適用可能な最初の単語のみが修飾子の影響を受けます。 置換については、適用可能な単語がなかった場合にはエラーとなります。 .Pp 置換(s/l/r/) における左辺 ( .Ar l ) は、エディタなどで使うような正規表現ではなく単なる文字列です。`/' のかわりに自由な文字を区切りに指定することができます。`\e' によって、 .Ar l または .Ar r 中の区切り文字をクォートすることができます。右辺 ( .Ar r ) 中の文字 `&' は 左辺の文字列に置換されます。`&' もまた `\e' によって クォートすることができます。 空の左辺値 .Ar l (`//') の場合、直前の左辺値 .Ar l または、 .No \&`!? Ns Ar s Ns ?' 中のコンテキストスキャン文字列 .Ar s から左辺値が取られます。置換指定の直後に改行がくる場合には、 最後の区切り文字を省略することができます。 コンテキストスキャンの後ろ側の文字 `?' も、直後に改行がくる場合、 同様に省略できます。 .Pp ヒストリは、 `!$' のようにイベント指定なしで参照することができます。 同じ行においてそれ以前にヒストリ参照が行われた場合はそのイベントを、 さもなければ直前のコマンドが参照されます。`!?foo?\*(ua !$' は `?foo?' に マッチするイベントの最初と最後の単語に置換されます。 .Pp 入力行の最初の非空白文字が `\*(ua' の場合、特殊なヒストリ参照の省略形であると みなします。これは `!:s\*(ua' と等価で、直前に入力したコマンド行の 文字列置換を行うことができます。たとえば、`\*(ualb\*(ualib' は 直前のコマンドの `lib' の綴り間違いを修正します。 最後に、後ろに続く文字とヒストリ置換とを隔離するために、 ヒストリ置換を `{' と `}' によって囲むことができます。`ls -ld ~paul' なる コマンドを実行した直後に`!{l}a' と 入力することで、`ls -ld ~paula' に展開されます。一方、`{}' を 使わずに `!la' とした場合は `la' で始まるイベントを検索します。 .Pp .Ss \' と \&" によるクォート 文字列を `\'' または `"' によって クォートすることにより、残りの置換のすべてあるいは一部を 抑制することができます。`'' によってクォートされた文字列には 本マニュアルのこれ以降に説明する置換が適用されません。`"' によって クォートされた文字列は、後述するように一部の置換が適用されます。 .Pp どちらのクォートの結果も単一の単語 (の全体または一部) となります。 ただし、`"' クォートされたコマンド置換は複数の単語になる特殊な場合が -一つだけあります(後述の +1 つだけあります(後述の .Em コマンド置換 の項を参照)。 `\'' クォートの場合は、このようなことはありません。 .Ss エイリアス置換 シェルはエイリアス(別名定義)を管理しており、 .Ar alias コマンドと .Ar unalias コマンドに より設定、表示、修正等を行うことができます。コマンド行がスキャンされたあと、 個々のコマンドに解析され、各コマンドの最初の単語に対応するエイリアスが あるかどうかチェックします。もし存在すれば、入力されたコマンド行の内容を 直前のコマンドとみなして、エイリアスの内容をヒストリ展開します。 コマンド行全体は展開結果と置き換えられます。エイリアスの内容が ヒストリ参照を含まなかった場合、入力したコマンド行の引数は変更せずに 残されます。 .Pp `ls' に対するエイリアスが `ls -l' だった場合、`ls /usr' は `ls -l /usr' に展開されます。この場合、エイリアスにはヒストリ参照がなかったため、 引数の `/usr' は変更せずに残されました。`lookup' に対するエイリアスが `grep !\*(ua /etc/passwd' だった場合、`lookup bill' は `grep bill /etc/passwd' に展開されます。 .Pp エイリアスが展開された場合、展開結果に対して単語分割とエイリアス検索が 再度行われます。展開結果の最初の単語が展開前の最初の単語と同一になった場合、 再度エイリアス検索が行われることはありません。それ以外の、エイリアスによる ループは検出され、エラー扱いとなります。 .Pp このメカニズムによってエイリアスでパーサのメタ記法を利用できます。 よって `alias print \'pr \e!* \&| lpr\'' とエイリアスすることで .Ar pr の 引数をプリンタに出力させるというようなことができます。 .Ss 変数置換 シェルは変数を管理しており、それらは 0 個またはそれ以上の単語のリストを 値として持ちます。変数のうちいくつかはシェルがセットしたり参照したりします。 たとえば、変数 .Ar argv はシェルへの引数を保持しており、この変数の値である単語は、特殊な方法で 参照されます。 .\" #### jpman kuma 96.12.05 here checked ... TO BE CONTINUED .Pp 変数の値は .Ar set および .Ar unset コマンドにより参照、変更することができます。シェルが 参照する変数のうちいくつかは、それがセットされているかどうかだけが重要 であり、値が何であっても意味を持たないものがあります。たとえば、変数 .Ar verbose は入力行がエコーされるかどうかを制御する変数であり、この変数を セットすることは、 .Nm csh に .Fl v オプションを指定したのと同じ意味になります。 .Pp 変数を数値として扱う操作もあります。`@' コマンドによって変数に対して数値演算 を適用し、演算結果を変数に代入することができます。しかしながら、変数の 値はつねに文字列として表現されます。数値演算の場合、空文字列は 0 と みなし、変数の値が複数の単語からなる場合 2 番目以降の単語は無視されます。 .Pp 入力行にエイリアス置換を行い、構文解析を行ったあと、コマンドが実行される 前に文字 `$' をキーとして変数置換を行います。`$' の直前に `\e' を置くことにより、変数置換を抑制することができます。 ただし、`"' クォート中では変数置換は .Em 必ず 行われますが、`\'' クォート中では .Em 決して行われません。 `\*(ga' クォートのなかはさらにあとで解釈されるため(後述の .Nm コマンド置換 の項を参照)、ここでは変数置換は行いません。`$' の直後に空白、タブ、 改行がくる場合、`$' はそのまま残されます。 .Pp 入出力リダイレクトは変数置換より前に解釈され、別々に変数置換が行われます。 それ以外のコマンド名と引数は同時に展開されます。このため、最初の 単語(コマンド)が展開の結果、複数の単語となったり、展開された結果の 最初の単語がコマンド名、それ以外が引数の一部になることもあります。 .Pp `"' でクォートされておらず、変数置換に `:q' 修飾子も指定されなかった 場合には、変数置換の結果にコマンドとファイル名置換が 行われます。`"' クォート内では複数の単語からなる値を持つ変数は、各単語を 1つの空白で区切った単一の単語 (の一部) に展開されます。`:q' 修飾子が 指定された場合は、各単語は 1 つの空白で区切られ、 この後のコマンドとファイル名置換を抑止するために、個々にクォートされた 単語の列に展開されます。 .Pp 変数置換には以下の形式があります。特に記述していない場合、 セットされていない変数の参照はエラーになります。 .Pp .Bl -tag -width Ds -compact -offset indent .It $name .It ${name} .\" #### modified by kuma 96.12.21 #### 変数 .Ar name -の値の各単語を一つの空白文字で区切ったものに展開されます。中括弧は +の値の各単語を 1 つの空白文字で区切ったものに展開されます。中括弧は .Ar 変数名 と後続する文字を分離し、後続する文字が変数名の一部と解釈されないように するために用いられます。シェル変数は 20 文字までの名前を持ちます。 変数名の先頭はアルファベットで、それ以降はアルファベット、数字、 アンダースコアを使用することができます。 .Ar name という名前のシェル変数は存在しないが、同名のセットされた環境変数が 存在する場合には、その値に置換されます(ただし、環境変数に対しては .Nm : 修飾子と以降に説明する書式を 用いることはできません)。 .It $name Ns Op selector .It ${name Ns [ selector ] } 変数 .Ar name の値のうちいくつかの単語を選択して展開します。 .Ar selector は 1 つの数字、範囲を示す2つの数字を `\-' でつないだもの、あるいはそのような 結果になる変数置換のいずれかです。単語は 1 から順序づけられています。 範囲の最初の数字が省略された場合は 1 が用いられます。範囲の第2の数字が 省略された場合は `$#name' が用いられます。selector として `*' が用いられた 場合には、すべての単語に展開されます。範囲の第2の数字が省略されるか、 単語数より小さい場合には、範囲が空になってもエラーとはなりません。 .It $#name .It ${#name} 変数の値の単語数に展開されます。 この機能は後述する `$argv[selector]' で有用です。 .It $0 コマンドを読み込んでいるファイル名に展開されます。ファイル名が不明の場合は エラーとなります。 .It $number .It ${number} `$argv[number]' と等価です。 .It $* `$argv[*]' と等価です。 -修飾子 `:e'、`:h'、`:t'、`:r'、`:q'、`:x' や -`:gh'、`:gt'、`:gr' を適用することができます。中括弧`{' `}' で +.El +.Pp +修飾子 `:e', `:h', `:t', `:r', `:q', `:x' や +`:gh', `:gt', `:gr' を適用することができます。中括弧 `{' `}' で 囲まれている場合は、中括弧内に修飾子が存在しなければなりません。 現在の csh の実装では、各 `$' 展開につき1つの修飾子のみ指定することができます。 -.El .Pp 以下の置換を行なう場合は `:' 修飾子を指定することはできません。 .Bl -tag -width Ds -compact -offset indent .It $?name .It ${?name} 変数 name がセットされていれば `1' に、さもなければ `0' に展開されます。 .It $?0 現在の入力ファイル名がわかっていれば `1' に、不明ならば `0' に展開されます。 .It \&$\&$\& 親のシェルの (10進の) プロセス番号に展開されます。 .It $! そのシェルから起動された最後のバックグラウンド・プロセスの (10進の) プロセス番号に展開されます。 .It $< 標準入力から1行を読み込み、その内容に展開されます。読み込んだ内容の解釈は 行いません。スクリプト中でキーボードからの入力を受けるのに用いられます。 .El .Ss コマンドとファイル名置換 残りの置換であるコマンド置換とファイル名置換は、 組み込みコマンドの引数に対しては 適用されたり、されなかったりします。 .\" #### changed by kuma 96.12.21 #### すなわち、式の中で評価が行われない部分に関しては 以下の置換が行なわれません。組み込みコマンドではないコマンドにおいては、 コマンド名は引数とは別に置換が行なわれます。 .\" #### changed by kuma 96.12.21 #### コマンド名に対する置換が生じるのは一連の置換処理の最後の方で、 入出力リダイレクトの設定後、メインシェルの子供の中で行われます。 .Ss コマンド置換 コマンド置換は、コマンドを `\*(ga' で囲むことによって指示します。 コマンドからの 出力は空白、タブ、改行によって単語に分割され、空の単語を削除したあとに 元の文字列と置換されます。 `"' の内部では、改行のみが単語分割の区切りとして扱われ、空白とタブは そのまま残されます。 .Pp どちらの場合も、コマンドの出力の最後の改行は単語の区切りとはならず、単に 削除されます。 -よってコマンド置換によって、コマンドの出力が完全な一行であっても、 +よってコマンド置換によって、コマンドの出力が完全な 1 行であっても、 単語の一部分のみを生成することが可能です。 .Ss ファイル名置換 -単語が文字 `*'、 `?'、 `['、 `{' を含んでいるか、単語の先頭文字が `~' の +単語が文字 `*', `?', `[', `{' を含んでいるか、単語の先頭文字が `~' の .\" #### modified by kuma 96.12.21 #### 場合、その単語はファイル名展開(あるいはグロブ(glob)と呼ばれます)の 候補となります。 .\" #### modified by kuma 96.12.21 #### 候補となった単語はパターンとみなされ、パターンにマッチするファイル名が アルファベット順にソートされた列に置換されます。 ファイル名置換を含む単語の列がどれもファイル名にマッチしなかった場合には エラーとなりますが、 すべての単語パターンがマッチする必要はありません。 -メタキャラクタ`*'、 `?'、`[' +メタキャラクタ`*', `?', `[' のみがパターンマッチ文字であり、`~' と `{' は省略形といったほうが近いで しょう。 .Pp ファイル名マッチにおいて、ファイル名先頭、または `/' の直後の `.' は、 `/' と同様に明示的にマッチさせなければなりません(`*' や `?' は これらにマッチしません)。 `*' は、空文字列を含むどのような文字列にもマッチします。`?' は、 どのような1文字にもマッチします。 .Sq Op ... は、括弧のなかで指定した文字のいずれかにマッチします。 .Sq Op ... 内では、文字の対を `\-' でつなぐことで、 文字の範囲を指定することができます(両側の文字も含まれます)。 .Pp ファイル名の先頭の `~' はホーム・ディレクトリを示すのに用いられます。 単独で用いられた場合には、シェルを起動したユーザのホーム・ディレクトリ .\" #### modified by kuma 96.12.21 #### (変数 .Ar home の値に反映されているとおり)に展開されます。`~' に続けてアルファベット、 数字、`-' からなる単語が続いた場合は、その単語をユーザ名とみなして、 そのユーザのホーム・ディレクトリに展開されます。たとえば、ユーザ ken の ホーム・ディレクトリが `/usr/ken' ならば、`~ken' は `/usr/ken' に、 `~ken/chmach' は `/usr/ken/chmach' に展開されます。 直後にアルファベットと `/' 以外が続く`~'と、ファイル名の先頭にない `~' は 変更されずにそのまま残されます。 .Pp メタ記法 `a{b,c,d}e' は `abe ace ade' の短縮形です。 .\" #### modified by kuma 96.12.21 #### この記法の左から右への出現順序は保存されます。 展開結果は下位のレベルで個別にソートされ、出現順序は保存されます。 この記法は入れ子にすることができます。 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' の 展開結果がいっしょに ソートされたりしていないことに注意してください)。特殊な場合として、 -単独の`{' と `}'、`{}' は変更されずにそのまま残されます。 +単独の`{' と `}', `{}' は変更されずにそのまま残されます。 .Ss 入出力 コマンドの標準入出力は、以下の方法によりリダイレクトすることができます: .Pp .Bl -tag -width Ds -compact -offset indent .It < name ファイル .Ar name (変数、コマンド、ファイル名展開を受けます)をオープンし、 コマンドの標準入力とします。 .It << word .Ar word と同一の行が出現するまで、シェルの入力を読み込みます。 .Ar word は変数、ファイル名、コマンド置換を受けません。シェル入力の行は 読み込まれるとすぐに .Ar word と比較されます(置換を行う前に)。その後、 .Ar word に -`\e'、`"'、`\''、`\*(ga' クォートが出現しないなら、読み込まれた行には +`\e', `"', `\'', `\*(ga' クォートが出現しないなら、読み込まれた行には 変数置換と .\" #### ^^^^^^^ `\'' だと思う(1次チェック者のコメント?jpman kuma 961205) .\" #### kuma agree with you, changed as specified 96.12.22 コマンド置換が適用されます。この置換を抑制するために、`\e' によって -`$'、`\e'、`\*(ga' をクォートすることができます。コマンド置換において、 +`$', `\e', `\*(ga' をクォートすることができます。コマンド置換において、 すべての空白、タブ、改行は保存されますが、最後の改行は削除されます。 読み込んだ行はすべて中間的なファイルに保存され、コマンドの標準入力として 用いられます。 .It > name .It >! name .It >& name .It >&! name ファイル .Ar name を標準出力として用います。ファイルが存在しなければ作成され、 すでにファイルが存在すればその内容は切り捨てられ、以前の内容は失われます。 .Pp 変数 .Ar noclobber がセットされている場合、ファイルが存在しないか文字型特殊ファイル (端末や `/dev/null' のような) でなければエラーになります。これは、 すでに存在するファイルを思いがけず削除してしまうことを防止します。`!' を 用いた形式を使うと、この検査を抑制することができます。 .Pp `&' を用いた形式では、標準出力とともに標準エラー出力もファイルへ リダイレクトされます。 .Ar name .\" #### modified by kuma 96.12.21 #### は、 `<' の入力ファイル名の場合と同様の展開を受けます。 .It >> name .It >>& name .It >>! name .It >>&! name `>' と同様に、ファイル .Ar name を標準出力として用います。ただし、コマンドの出力はファイルへ追加されます。 変数 .Ar noclobber がセットされている場合、 ファイルが存在しなければエラーとなります(`!' を用いることで、 この検査を抑制することができます)。 他は `>' と同様です。 .El .Pp コマンドは、シェルが起動されたときの環境を、入出力リダイレクトと パイプラインによって変更したもののなかで実行されます。以前のいくつかの シェルとは異なり、 シェルコマンドファイルから起動されたコマンドは、デフォルトでは標準入力に よってシェルコマンドファイル自体にアクセスすることはできません。 かわりに、シェルが起動した環境の標準入力をそのまま受け継いでいます。 `<<' 機構はインラインデータのために用いるべきです。 このように制限することにより、 シェルコマンドスクリプトをパイプラインの一部として用いることができます。 バックグラウンドで実行されているコマンドの標準入力も .Pa /dev/null 等にリダイレクトされることは .Ar なく 、シェルの標準入力をそのまま受け継いでいます。もし標準入力が端末で、 コマンドが端末から読み込もうとした場合、そのプロセスはブロックされ、 シェルはユーザにそのことを通知します(参照: .Sx ジョブ の項)。 .Pp 標準エラー出力もパイプにリダイレクトすることができます。単純に `\&|' の かわりに `\&|&' を使います。 .Ss 式 .\" #### modified by kuma 96.12.21 #### いくつかの組み込みコマンド(後述します)は、引数として式を取ります。式は C 言語のものと類似しており、同じ優先順位を持ちます。式は -.Nm @、 -.Ar exit、 -.Ar if、 +.Nm @ , +.Ar exit , +.Ar if , .Ar while コマンド中で用います。以下の演算子が使用可能です: .Bd -ragged -offset indent \&|\&| && \&| \*(ua & == != =~ !~ <= >= < > << >> + \- * / % ! ~ ( ) .Ed .Pp 上記の演算子は右にいくほど優先順位が高くなっています。 -`==' `!=' `=~' `!~'、`<=' `>=' `<' `>'、`<<' `>>'、`+' `\-'、 +`==' `!=' `=~' `!~', `<=' `>=' `<' `>', `<<' `>>', `+' `\-', `*' `/' `%' の 5グループは各グループ内では同じ優先度です。 -`=='、`!='、`=~'、`!~' は文字列の比較を行い、他の演算子は数値演算を -行います。`=~'、`!~' は `!='、`==' と同様ですが、右辺を +`==', `!=', `=~', `!~' は文字列の比較を行い、他の演算子は数値演算を +行います。`=~', `!~' は `!=', `==' と同様ですが、右辺を .Ar パターン -(`*'、`?'、`[...]' を含んだ) とみなして、左辺とのパターンマッチが行われます。 +(`*', `?', `[...]' を含んだ) とみなして、左辺とのパターンマッチが行われます。 これにより、シェル スクリプトにおいてパターンマッチのみが必要な局面では .Ar switch ステートメントを使わずに済ませることができます。 .Pp 先頭が `0' の文字列は 8 進数の数値とみなされます。空または省略された引数 は `0' とみなされます。すべての演算結果は 10 進数数値の文字列となります。 式の 2 つの要素が同一の単語中に出現してはいけません。つまり、 .\" #### modified by kuma 96.12.21 #### 要素の前後が、構文解析において特殊な意味を持つ -`&'、`\&|'、`<'、`>'、`('、`)' でない場合は、 +`&', `\&|', `<', `>', `(', `)' でない場合は、 その要素は空白で囲まれていることが必要です。 .Pp 数式中では、`{' と `}' で囲んだコマンドと、 以下のファイル検査演算子を用いることができます。 ファイル検査演算子は .Fl l .Ar name の形式で、 .Ic l は以下のうちのいずれかです: .Bd -literal -offset indent r 読み込みアクセス w 書き込みアクセス x 実行アクセス e 存在 o 所有 z サイズがゼロ f 通常ファイル d ディレクトリ .Ed .Pp 指定された name は、コマンド、ファイル名置換を適用したのちに 実ユーザの権限において検査されます。ファイルが存在しないか、 アクセス不可なら演算結果は false すなわち `0' になります。 コマンド実行においては、コマンドが成功したなら演算結果は true `1' に、 コマンドが 0 以外の終了ステータスを返してきたら、すなわち、 失敗なら演算結果は false `0' になります。 終了ステータスの値自体を知りたい場合は、コマンドを式以外の文脈で実行し、変数 .Ar status の値を調べます。 .Ss 制御構造 シェルにはコマンドファイル(シェル・スクリプト)中で、 あるいは(制限されてはいるが、便利な方法で)端末から、 制御の流れを変更するためのいくつかのコマンドがあります。 これらのコマンドはシェルに入力を読み直させたり、 スキップさせたりすることができます。実装の制限上、 これらのコマンドを書くことのできる位置に制限があります。 .Pp -.Ic foreach、 -.Ic switch、 -.Ic while、 +.Ic foreach , +.Ic switch , +.Ic while , 文、および、 .Ic if\-then\-else の .Ic if ステートメントは、 後述するように入力行の単一の単純コマンドとして現れる必要があります。 .Pp シェルの入力がシーク不可能な場合、 シェルは繰り返しが必要なときには入力をバッファに保存し、 .\" #### modified by kuma 96.12.23 #### この内部バッファに対してシークを行います(このため、シーク不可能な入力の場合も、 後方への goto が可能です)。 .Ss 組み込みコマンド 組み込みコマンドは通常シェルのプロセス内部で実行されます。 ただし、組み込みコマンドがパイプラインの最後以外に用いられた場合は、 サブシェル上で実行されます。 .Pp .Bl -tag -width Ds -compact -offset indent .It Ic alias .It Ic alias Ar name .It Ic alias Ar name wordlist 1行目の形式はすべてのエイリアスを出力します。2 行目の形式は .Ar name に対応したエイリアスの値を出力します。最後の形式は .Ar wordlist を .Ar name のエイリアスとして登録します。 .Ar wordlist にはコマンド置換、ファイル名置換が適用されます。 .Ar name として .Ar alias または .Ar unalias を指定することはできません。 .Pp .It Ic alloc .Nm csh が獲得したメモリのうちの使用量と空き容量を表示します。 なんらかの引数をつけると、ブロックサイズごとの使用中/空ブロック数を表示します。 ブロックサイズは 8、16、32、.. となります。 本コマンドの出力はシステムによって異なります。 VAX 以外のシステムは、異なるメモリ管理を行っているかもしれないからです。 .Pp .It Ic bg .It Ic bg \&% Ns Ar job ... 現在のジョブあるいは指定されたジョブをバックグラウンドに移動します。 もしそれらのジョブが停止されていたなら、実行が再開されます。 .Pp .It Ic break 最も内側の .Ic foreach または .Ic while ループに対応する .Ic end の後へ脱出します。同じ行にある残りのコマンドは実行されます。複数の .Ic break を同一行に記述することで複数レベルの脱出が行えます。 .Pp .It Ic breaksw .Ic switch から脱出し、 .Ic endsw のあとで実行を再開します。 .Pp .It Ic case Ar label : .Ic switch ステートメントのラベルを指定します。 .Pp .It Ic cd .It Ic cd Ar name .It Ic chdir .It Ic chdir Ar name .\" #### modified by kuma 96.12.23 #### シェルの作業ディレクトリをディレクトリ .Ar name に変更します。引数が指定されなかった場合には、 ユーザのホーム・ディレクトリに変更します。 カレント・ディレクトリにディレクトリ .Ar name がない場合(かつ .Ar name -が `/'、`./'、`../' +が `/', `./', `../' で始まっていない場合)、変数 .Ic cdpath の各要素のサブディレクトリとして .Ar name がないかどうかを調べます。最後に、シェル変数 .Ar name に `/' で始まる値が設定されているなら、 その値のディレクトリが存在しないかを調べます。 .Pp .It Ic continue 最も内側の .Ic while または .Ic foreach ループの先頭に戻ります。戻る前に、同じ行に記述されたコマンドが実行されます。 .Pp .It Ic default : .Ic switch ステートメントのデフォルトを指定します。 .Ic default は、すべての .Ic case ラベルのあとに出現しなければなりません。 .Pp .It Ic dirs ディレクトリ・スタックを表示します。 スタックの先頭(カレント・ディレクトリ)を左端にして表示します。 .Pp .It Ic echo Ar wordlist .It Ic echo Fl n Ar wordlist 指定された単語を空白で区切った文字列をシェルの標準出力に書き出します。 .Fl n オプションが指定されなければ、最後に改行が出力されます。 .Pp .It Ic else .It Ic end .It Ic endif .It Ic endsw -.Ic foreach、 -.Ic if、 -.Ic switch、 +.Ic foreach , +.Ic if , +.Ic switch , .Ic while ステートメントの項を参照してください。 .Pp .It Ic eval Ar arg ... ( .Xr sh 1 と同様)引数をシェルへの入力であるとみなして読み込み、 現在のシェルのコンテキストで実行します。 コマンド置換や変数置換の結果として生成されたコマンド列を実行する場合に用いられます。 通常は、それらの置換に先立って文法解析が行われてしまうからです。 .Ic eval の使い方の例が .Xr tset 1 にあります。 .Pp .It Ic exec Ar command 指定された command を現在のシェルと置き換えて実行します。 .Pp .It Ic exit .It Ic exit Ar (expr ) 1行目の形式では変数 .Ic status の値、2 行目の形式では式 .Ic expr の値を返り値としてシェルを終了します。 .Pp .It Ic fg .It Ic fg % Ns Ar job ... 現在のジョブあるいは指定されたジョブをフォアグラウンドに移動します。 停止していたジョブは実行を再開します。 .Pp .It Ic foreach Ar name (wordlist) .It ... .It Ic end 変数 .Ic name に .Ic wordlist の各値を順次セットしながら対応する .Ic end までのコマンドを繰り返し実行します( .Ic foreach と .Ic end .\" #### modified by kuma 96.12.23 #### は単独で行に置かなければなりません)。組み込みコマンド .Ic continue を使って中途でループの次の繰り返しを実行させたり、 .Ic break コマンドによって中途でループを脱出させたりすることができます。 このコマンドが端末から読み込まれる場合、ループすべての内容が(プロンプト ? を表示しながら)読み込まれてから実行が開始されます。 端末からループ中でタイプ・ミスした場合は修正できます。 .Pp .It Ic glob Ar wordlist .Ic echo コマンドと似ていますが、`\e' によるエスケープは解釈されず、 .\" #### modified by kuma 96.12.23 #### 単語はヌル文字によって区切られます。プログラムから、 シェルをファイル名置換のために利用する場合に便利です。 .Pp .It Ic goto Ar word .Ic word にファイル名置換、およびコマンド置換が適用されたのち、それを `label' とみなします。シェルは可能なかぎり入力を遡って読み直し、`label:' のある行を検索し、そこから実行を開始します。 ラベルの前には空白またはタブを置くことが可能です。 .Pp .It Ic hashstat コマンドを検索するのに、 内部キャッシュがどの程度効率的に働いているか (そして .Ic exec をどの程度回避できているかを)を表示します。 .\" #### modified by kuma 96.12.23 #### .Em path の要素のうち、ハッシュ関数がヒットの可能性を示すものと、 `/' で始まらないものについて .Ic exec が試みられます。 .Pp .It Ic history .It Ic history Ar n .It Ic history Fl r Ar n .It Ic history Fl h Ar n ヒストリのリストを表示します。数字 .Ar n が指定された場合には、最近の .Ar n 個のイベントが表示されます。 .Fl r オプションは表示順序を逆にします。 .\" #### modified by kuma 96.12.23 #### すなわち、最も古いものを先に表示するのではなく、 最も新しいものを先に表示します。 .Fl h オプションを指定すればイベント番号が省略されます。これは .Ic source コマンドで \-h を使って読み込むためのファイルを生成する場合に用いることができます。 .Pp .It Ic if ( Ar expr ) No command .\" #### modified by kuma 96.12.23 #### 指定された式が true と評価されたなら、単一のコマンド .Ar command が実行されます。 .Ar command .\" #### modified by kuma 96.12.23 #### に対する変数置換は、実行に先だって .Ic if コマンドの残りの部分と同時に行なわれます。 .Ar command は単純コマンドのみが許され、パイプライン、コマンドリスト、括弧でくく られたコマンドであってはいけません。入出力リダイレクションは式 .Ar expr が false と評価され、それゆえ .Ar command が実行 .Sy されなかった 場合にも処理されます(これはバグです)。 .Pp .It Ic if ( Ar expr ) Ic then .It ... .It Ic else if ( Ar expr2 ) Ic then .It ... .It Ic else .It ... .It Ic endif 式 .Ar expr が true なら最初の .Ic else までのコマンドが実行されます。さもなければ、式 .Ar expr2 が true なら次の .Ic else までのコマンドが実行されます。 いくつでも .Ic else-if の対を繰り返すことができます。最後に 1 つの .Ic endif が必要です。 最後の .Ic else 部分はあってもなくてもかまいません。 (単語 .Ic else と .Ic endif は入力行の最初に置く必要があります。また、 .Ic if は行内に単独で、または .Ic else のあとに置く必要があります)。 .Pp .It Ic jobs .It Ic jobs Fl l アクティブなジョブの一覧を出力します。 .Fl l .\" #### modified by kuma 96.12.23 #### オプションを指定すると、通常の情報に加えてプロセス ID も出力します。 .Pp .It Ic kill % Ns Ar job .It Ic kill Ar pid .It Ic kill Fl sig Ar pid ... .It Ic kill Fl l TERM(terminate) シグナルあるいは指定したシグナルを、 指定されたジョブまたはプロセスに送ります。 シグナルは番号または名前で指定できます(名前は .Pa /usr/include/signal.h にある名前から `SIG' を取り除いたものです)。 シグナル名の一覧を ``kill \-l'' により表示できます。 kill にはデフォルト動作はなく、 単に `kill' を実行しても現在のジョブにシグナルが送られるようなことはありません。 送るシグナルが TERM(terminate) または HUP(hangup) の場合、 CONT(continue) シグナルも同時に送られます。 .Pp .It Ic limit .It Ic limit Ar resource .It Ic limit Ar resource maximum-use .It Ic limit Fl h .It Ic limit Fl h Ar resource .It Ic limit Fl h Ar resource maximum-use 現在のプロセスと、それが生成するプロセスのそれぞれについて、 .\" #### modified by kuma 96.12.23 #### -指定された資源 +指定されたリソース .Ar resource を、指定された .Ar maximum-use を超えて使用しないように設定します。 .Ar maximum-use が指定されなかった場合、現在の制限値が表示されます。 .Ar resource が指定されなかった場合、すべての制限値が表示されます。 .Fl h オプションが指定された場合、 現在の制限値のかわりにハードリミットの表示/設定を行います。 .\" #### modified by kuma 96.12.23 #### ハードリミットは現在の制限値の上限の値です。 スーパーユーザのみがハードリミットを増加させることができます。 一般ユーザは現在の制限値を可能な範囲で増減することができます。 .Pp .\" #### modified by kuma 96.12.23 #### -現在のところ、制御可能な資源は、 +現在のところ、制御可能なリソースは、 .Ar cputime (各プロセスが使うことのできる最大の CPU 秒数)、 .Ar filesize (1つのファイルの最大サイズ)、 .Ar datasize ( .Xr sbrk 2 .\" #### modified by kuma 96.12.23 #### を用いてプログラムのテキスト領域の末尾を超えて増加させることのできる data+stack 領域の最大サイズ)、 .Ar stacksize .\" #### modified by kuma 96.12.23 #### (自動的に拡張されるスタックの最大サイズ)、 .Ar coredumpsize (最大のコアファイルのサイズ)です。 .Pp 最大値 .Ar maximum-use は、(整数あるいは浮動小数の) 数値とそれに続くスケールファクタによって指定します。 .Ar cputime 以外の制限値のデフォルトのスケールファクタは `k' あるいは `kilobytes'(1024 バイト)です。 .\" #### modified by kuma 96.12.23 #### スケールファクタとして `m' あるいは `megabytes' を使用することもできます。 .Ar cputime のデフォルトのスケールファクタは `seconds'(秒)です。 `m'(分)、`h'(時間) をスケールファクタとして指定したり、 `mm:ss' 形式で分秒を指定したりすることができます。 .Pp .\" #### modified by kuma 96.12.23 #### -資源名 +リソース名 .Ar resource とスケールファクタを指定する際には、 .\" #### modified by kuma 96.12.23 #### 一意に決定できるなら、名前の先頭部分だけを指定することができます .\" #### jpman kuma: not found in freebsd-2.1.5-RELEASE manpage (st を stacksize のかわりに用いる等)。 .Pp .It Ic login ログイン・シェルを終了し、 .Pa /usr/bin/login と置き換えます。これは .Xr sh 1 との互換性のために用意されたログオフの手段です。 .Pp .It Ic logout ログイン・シェルを終了します。 .Ic ignoreeof がセットされている場合に便利です。 .Pp .It Ic nice .It Ic nice Ar +number .It Ic nice Ar command .It Ic nice Ar +number command 1 行目の形式は、シェルのスケジューリング・プライオリティを 4 に設定します。 2 行目の形式は、プライオリティを指定された値 .Ar number に設定します。残りの 2 つの形式は、コマンド command をプライオリティ 4 または指定した .Ar number で実行します。 .\" #### modified by kuma 96.12.23 #### 大きい数値を指定するとプロセスが利用できる CPU がその分少なくなります。 スーパーユーザのみがプライオリティとして負の値を `nice \-number ...' のように指定することができます。 .Ar command はつねにサブシェルで実行され、 単純な .Ic if .\" #### modified by kuma 96.12.23 #### 文のコマンドと同様の制限を受けます。 .Pp .It Ic nohup .It Ic nohup Ar command 1 行目の形式は、シェル・スクリプト内で使用し、 スクリプトのそれ以降で hangup シグナルを無視するように設定します。 2 行目の形式は、指定されたコマンドが、 hangup シグナルを無視するように設定して実行します。 `&' をつけて実行されたプログラムは、 .Ic nohup を指定して実行したのと同様に hangup シグナルを無視します。 .Pp .It Ic notify .It Ic notify % Ns Ar job ... 現在のジョブまたは指定されたジョブの状態が変化したときに、 .\" #### modified by kuma 96.12.23 #### コマンド待ちかどうかに関わりなく即座に通知するように指定します。 通常は、プロンプトが表示される直前に通知が行われます。 シェル変数 .Ic notify が指定されている場合は、すべてのジョブに対して同様の設定が行われます。 .Pp .It Ic onintr .It Ic onintr Fl .It Ic onintr Ar label 割り込みに対するシェルの動作を制御します。1行目の形式は、 シェルをデフォルトの動作、すなわち、スクリプトの実行が中断される、 またはコマンド入力状態に戻るように設定します。 2 行目の形式は、すべての割り込みを無視するように設定します。 3行目の形式は、シェルが割り込みを受けるか、 チャイルドプロセスが割り込みによって停止した場合に goto label が実行されるように設定します。 .Pp シェルがバックグラウンドで、かつ、 シグナルを無視するように設定して実行されている場合は、 .Ic onintr は効力を持たず、 割り込みはシェルとそこから起動されるすべてのコマンドで 引続き無視されます。 最後に .Ic onintr 文はシステムのスタートアップ・ファイル -(/etc/csh.cshrc、/etc/csh.login) 中でも、 +(/etc/csh.cshrc, /etc/csh.login) 中でも、 割り込みが禁止されているので無視されます。 .Pp .It Ic popd .It Ic popd Ar +n ディレクトリ・スタックをポップし、 新たにスタックの先頭になったディレクトリにカレント・ディレクトリを変更します。 引数 .Ns \`+ Ar n Ns \' が指定された場合、スタックの .Ar n 番目の要素が捨てられます。ディレクトリ・スタックの要素は、 スタックの先頭から 0 から順に番号がつけられます。 .Pp .It Ic pushd .It Ic pushd Ar name .It Ic pushd Ar n 引数を指定しなかった場合、 .Ic pushd はスタックの先頭の 2 つの要素を入れ替えます。引数 .Ar name が指定された場合、 .Ic cd と同様にカレント・ディレクトリを変更したあと、 古いカレント・ディレクトリ .\" cwd の typo だと思うが わからない .\" (as in .\" .Ic csw ) .\" #### kuma agree with you on 96.12.23 #### をディレクトリ・スタックにプッシュします。 数字引数が指定された場合、ディレクトリ・スタックの .Ar n 番目の要素が スタックの先頭にくるようにローテートし、 カレント・ディレクトリをその要素が指すディレクトリに変更します。 ディレクトリ・スタックの要素は、スタックの先頭から 0 から順に番号がつけられます。 .Pp .It Ic rehash 変数 .Ic path に指定されているディレクトリ内の、ファイルに関するハッシュ・テーブルを 再計算させます。ログイン中に、新しいコマンドが .Ic path に含まれるディレクトリに追加された場合、 .\" #### modified by kuma 96.12.23 #### rehash コマンドを実行する必要があります。 -これは、あなたが個人的なディレクトリの一つにコマンドを追加したか、 +これは、あなたが個人的なディレクトリの 1 つにコマンドを追加したか、 システムの管理者がシステム・ディレクトリの内容を変更したような 場合にのみ必要です。 .Pp .It Ic repeat Ar count command 指定されたコマンド .Ar command を .Ar count 回繰り返し実行します。 .Ar command .\" #### modified by kuma 96.12.23 #### -に指定するものは、先の一行 +に指定するものは、先の 1 行 .Ic if 文で指定する .Ar command と同様の制限を受けます。 入出力リダイレクションは .Ar count が たとえ 0 であっても、必ず 1回だけ処理されます。 .Pp .It Ic set .It Ic set Ar name .It Ic set Ar name Ns =word .It Ic set Ar name[index] Ns =word .It Ic set Ar name Ns =(wordlist) 1 行目の形式はすべてのシェル変数の値を表示します。 複数の単語からなる値を持つ変数は括弧で囲まれた値のリストで表示します。 2 行目の形式は、 .Ar name に空文字列を設定します。3 行目の形式は .Ar name に単一の単語 .\" #### modified by kuma 96.12.23 .Ar word を設定します。4 行目の形式は .Ar name の .Ar index 番目の要素に .Ar word を設定します。 .Ar index 番目の要素はすでに存在していなければなりません。5 行目の形式は .Ar name に .Ar wordlist で指定した単語列を設定します。すべての形式で、 値にはコマンド置換とファイル名置換が適用されます。 .Pp 複数の変数を設定するために、set コマンドへの引数を繰り返すことができます。 ただし、引数に対する変数展開処理は、代入処理に先だって行われます。 .Pp .It Ic setenv .It Ic setenv Ar name .It Ic setenv Ar name value 1 行目の形式はすべての環境変数の一覧を出力します。 これは .Xr printenv 1 と等価です。 3 行目の形式は環境変数 .Ar name に値 .Ar value を設定します。2 行目の形式は環境変数 .Ar name .\" #### modified by kuma 96.12.23 #### に空文字列を設定します。最も一般的に用いられる環境変数である .Ev USER , .Ev TERM , .Ev PATH は .Nm csh の起動時にシェル変数 .Ar user , .Ar term , .Ar path にそれぞれ設定され、 .Nm csh から実行するプログラムの環境変数には、シェル変数 .Ic user , .Ic term , .Ic path の値が反映されます。そのため、これらの変数を明示的に .Ic setenv する必要はありません。 .Pp .It Ic shift .It Ic shift Ar variable (リスト)変数 .Ic argv .\" #### modified by kuma 96.12.23 #### の各要素を左にシフトし、 .Ic argv Ns Bq 1 の値を捨てます。 .Ic argv に値が設定されていないか、 1 つ以上の要素を持たない場合にはエラーになります。 2 行目の形式は、指定された変数 .Ar variable に対して同様の処理を行います。 .Pp .It Ic source Ar name .It Ic source Fl h Ar name シェルは、指定されたファイル .Ar name からコマンドを読み込みます。 .Ic source コマンドはネストすることができます。あまりに深くネストさせると、 .\" #### modified by kuma 96.12.23 #### ファイル識別子を使い切ってしまう場合があります。いずれかのレベルの .Ic source コマンド中でエラーが発生すると、ネストしているすべての .Ic source コマンドが中断されます。通常、 .Ic source の実行中に実行されたコマンドはヒストリに記録されませんが、 \-h オプションを指定することにより、 ファイルに記述してあるコマンドを実行せずに、 ヒストリにのみ記録することができます。 .Pp .It Ic stop .It Ic stop % Ns Ar job ... バックグラウンドで走行中の現在のジョブ、あるいは指定されたジョブを停止します。 .Pp .It Ic suspend シェル自身を停止させます。 .Ic ^Z でストップ・シグナルを送られたかのように振舞います。 .Xr su 1 によって起動したシェルを停止する場合によく用いられます。 .Pp .It Ic switch Ar (string) .It Ic case Ar str1 : .It \ \ \ \ \&... .It Ic \ \ \ \ breaksw .It \ \ \ \ \&... .It Ic default : .It \ \ \ \ \&... .It Ic \ \ \ \ breaksw .It Ic endsw .\" #### modified by kuma 96.12.23 #### 各 .Ic case ラベルを順に、指定された文字列 .Ar string でマッチングを行います。 .Ar string には、まず、コマンド置換とファイル名置換が行われます。 .Ic case ラベルには変数置換が行われ、ファイル名メタキャラクタの -`*'、`?'、`[...]' を用いることができます。 +`*', `?', `[...]' を用いることができます。 .\" #### modified by kuma 96.12.23 #### .Ic default ラベルが出てくるまでにどの .Ic case ラベルともマッチしなかった場合は、 .Ic default ラベルの直後から実行が始まります。 .Ic case ラベルと .Ic default ラベルは行の最初に書かれなければなりません。 .Ic breaksw コマンドによって .Ic endsw 以降のコマンドから実行が再開されます。 .Ic breaksw を用いない場合は、 C 言語の場合と同様に、 .Ic case ラベル、 .Ic default ラベルを通過して実行が続けられます。 .Ic default がなく、どのラベルもマッチしなかった場合には、 .Ic endsw 以降から実行が再開されます。 .Pp .It Ic time .It Ic time Ar command 1 行目の形式では、 シェルとそのチャイルドプロセスが使用した時間が表示されます。 .\" #### modified by kuma 96.12.23 #### 2 行目の形式では、指定された単純コマンドの実行時間が計測され、 .\" #### modified by kuma 96.12.23 #### 変数 .Ic time の項で説明する形式で、使用時間情報の要約が表示されます。 必要ならば、コマンド終了時に時間を表示するための追加のシェルが生成されます。 .Pp .It Ic umask .It Ic umask Ar value ファイル作成マスクを表示(第 1 の形式)または設定(第 2 の形式)します。 マスクは 8 進数で与えます。一般的な値としては、 グループにすべての権限を与え、 そのほかには読み込みと実行のみを許可する 002 や、 所有者以外には読み込みと実行しか許可しない 022 があります。 .Pp .It Ic unalias Ar pattern .Ar pattern にマッチするすべてのエイリアスを削除します。 `unalias *' とすることですべてのエイリアスを削除することができます。 削除するものがなかった場合にもエラーにはなりません。 .Pp .It Ic unhash 実行プログラムの位置検索を高速化する内部ハッシュ・テーブルの使用を禁止します。 .Pp .It Ic unlimit .It Ic unlimit Ar resource .It Ic unlimit Fl h .It Ic unlimit Fl h Ar resource -資源の制限を解除します。 +リソースの制限を解除します。 .Ar resource -が指定されない場合、すべての資源に対する制限が解除されます。 +が指定されない場合、すべてのリソースに対する制限が解除されます。 .Fl h が指定された場合、対応するハードリミットが解除されます。 これはスーパーユーザのみが行うことができます。 .Pp .It Ic unset Ar pattern 指定された .Ar pattern にマッチするすべての変数を削除します。 `unset *' と指定するとすべての変数が削除され、 悲惨な結果を生じることがあります。 .Ic unset するものがない場合もエラーになりません。 .Pp .It Ic unsetenv Ar pattern 指定された .Ar pattern にマッチするすべての環境変数を削除します。前述の .Ic setenv の項と .Xr printenv 1 を参照してください。 .Pp .It Ic wait すべてのバックグラウンドジョブの終了を待ちます。 対話的にシェルが実行されている場合、 インタラプトにより wait を停止することができます。 このとき、シェルはいまだに終了していないジョブの名前とジョブ番号を表示します。 .It Ic which Ar command .\" #### modified by kuma 96.12.23 #### .Ar command を指定したとき、シェルが実行するコマンドの位置を表示します。 .Pp .It Ic while Ar (expr) .It \&... .It Ic end 指定された式の評価結果がゼロでないかぎり、 .Ic while と対応する .Ic end の間のコマンドを繰り返し実行します。 .Ic break や .Ic continue によりループを終了したり、途中から繰り返しを再開させたりすることができます。 ( .Ic while と .Ic end は、その行に単独で書かれなければなりません。)入力が端末の場合、 .Ic foreach ステートメントの場合と同様に、 ループのすべてを入力するまでプロンプトが表示され、 すべての入力を終えた時点でループが実行されます。 .Pp .It Ic % Ns Ar job 指定されたジョブをフォアグラウンドに移動します。 .Pp .It Ic % Ns Ar job Ic & 指定されたジョブをバックグラウンドで再開実行させます。 .Pp .It Ic @ .It Ic @ Ar name Ns = Ns expr .It Ic @ Ar name[index] Ns = Ns expr 1 行目の形式は、すべてのシェル変数の値を表示します。2 行目の形式は、 指定された名前 .Ar name の変数に式 .Ar expr -の値を代入します。式のなかに `<'、`>'、`&'、`|'を含んでいる場合、 +の値を代入します。式のなかに `<', `>', `&', `|'を含んでいる場合、 少なくともそのような部分は `(' と `)' で囲まれている必要があります。 3 行目の形式は、変数の .Ar index 番目の要素に式 .Ar expr の値を代入します。 .Ar name と、その .Ar index 番目の要素はすでに存在していなければいけません。 .El .Pp -C 言語と同様に、演算子 `*='、`+=' 等が利用可能です。 +C 言語と同様に、演算子 `*=', `+=' 等が利用可能です。 変数名と演算子の間の空白はあってもなくてもかまいません。 しかしながら、式の各要素の間には空白が必須です。 さもなければ、単一の単語とみなされてしまいます。 .Pp 特別な後置演算子 `+\|+' と `\-\|\-' により変数の値を 1 だけ増加させたり、 減少させたりすることができます。たとえば、`@ i++' のように使います。 .Ss 定義済み変数と環境変数 以下の変数は、シェルにとって特別な意味があります。これらのうち、 -.Ar argv、 -.Ar cwd、 -.Ar home、 -.Ar path、 -.Ar prompt、 -.Ar shell、 +.Ar argv , +.Ar cwd , +.Ar home , +.Ar path , +.Ar prompt , +.Ar shell , .Ar status はシェルが設定します。そのうち、 .Ar cwd と .Ar status 以外の変数の設定はシェルの起動時にのみ行われます。 そのような変数は、ユーザが明示的に変更しないかぎり、 値が変化することはありません。 .Pp シェルは、環境変数 .Ev USER をシェル変数 .Ar user に、 .Ev TERM を .Ar term に、 .Ev HOME を .Ar home にそれぞれコピーします。また、 これらのシェル変数が再度セットされた場合は環境変数にコピーしなおします。 環境変数 .Ev PATH も同様に扱われます。サブシェルは環境変数によって .Ar path の値を得て、もしそれが変更されれば環境変数にコピーしなおすので .Ar \&.cshrc 以外での .Ar path 変数の設定について気をつける必要はありません。 .Bl -tag -width histchars .It Ic argv シェルへの引数が設定されます。位置パラメータは argv の値に展開されます。 すなわち、 `$1' は `$argv[1]' の値に置換されます。 .It Ic cdpath .Ar chdir .\" #### modified by kuma 96.12.23 #### コマンドにおいてサブディレクトリを検索するためのディレクトリのリストです。 .It Ic cwd .\" #### modified by kuma 96.12.23 #### カレント・ディレクトリのフルパス名です。 .It Ic echo .Fl x オプションが指定された場合にセットされます。セットすることにより、 コマンドが実行される前にコマンド名とその引数が表示されるようになります。 .\" #### modified by kuma 96.12.23 #### 組み込みコマンド以外では、表示の前にすべての展開が行われます。 組み込みコマンドではコマンド置換とファイル名置換が行われる前に表示されます。 なぜなら、これらの置換は選択的に行われるからです。 .It Ic filec ファイル名補完を有効にします。 .It Ic histchars ヒストリ置換に用いる文字を文字列で指定します。 指定した文字列の最初の文字はヒストリ置換文字(デフォルトは `!')、 2 文字目は簡易置換文字(デフォルトは `\*(ua') を指定します。 .It Ic histfile ヒストリをセーブ/リストアするパス名を指定できます。 .It Ic history ヒストリ・リストのサイズを指定します。 このサイズを超えたコマンド履歴は削除されます。 あまりに大きな値を設定すると、シェルがメモリを使いつくすかもしれません。 最後に実行したコマンドは .Ar history の値にかかわらず、つねにヒストリ・リストに保存されます。 .It Ic home .\" #### modified by kuma 96.12.23 #### シェルを起動したユーザのホーム・ディレクトリです。 起動時に環境変数から設定されます。 ファイル名置換において .Sq Pa ~ は本変数を参照して展開されます。 .It Ic ignoreeof セットされると、端末のファイル終端(EOF)を無視するようになります。 間違って control-D を押してシェルを終了させてしまうのを防ぐことができます。 .It Ic mail シェルがメールの到着をチェックするためのメールファイルを指定します。 コマンド実行が完了しプロンプトが表示されるときに、 .\" #### modified by kuma 96.12.23 #### 指定された時間が経過していればメイル到着のチェックが行われます。 最終修正時刻が最終アクセス時刻以降の場合、 シェルは `You have new mail' と出力します。 .Pp .Ar mail の値の最初の単語が数値の場合には、 その数値でメール検査の間隔を秒単位で指定します。 指定がなかった場合のデフォルト値は 10分です。 .Pp 複数のメールファイルが指定された場合、 メールが到着していた場合のメッセージは `New mail in .Ar name Ns ' となります。ここで、 .Ar name は到着したメールが あるファイル名です。 .It Ic noclobber .Sx 入出力 の項で説明したように、 出力リダイレクトによって意図せずにファイルを削除しないように制限したり、 `>>' リダイレクトがすでに存在するファイルにしか適用できないようにします。 .It Ic noglob セットされると、ファイル名展開が禁止されます。 ファイル名を扱わないシェルスクリプト内や、すでにファイル名展開を行ったあとで、 それ以上の展開を望まない場合に設定します。 .It Ic nonomatch .\" #### modified by kuma 96.12.23 #### セットされると、ファイル名展開の結果が空になってもエラーとせず、 展開前のパターンをそのまま残します。 .\" #### modified by kuma 96.12.23 #### ただし、`echo [' のような、 展開前のパターンが文法的に正しくない場合はエラーになります。 .It Ic notify セットされると、シェルがジョブの終了を随時報告するようになります。 通常はプロンプトの表示直前にのみ報告が行われます。 .It Ic path .\" #### modified by kuma 96.12.23 #### path 変数の各単語は、コマンドファイルを検索すべきディレクトリ名を表します。 空の単語はカレント・ディレクトリを示します。 .Ar path 変数が設定されて いない場合、フルパス指定によるコマンド実行のみが可能になります。 通常の検索パスは - `.'、`/bin'、`/usr/bin' です。しかし、これらの値はシステムによって異なります。 -スーパーユーザのデフォルトの検索パスは `/etc'、`/bin'、`/usr/bin' です。 + `.', `/bin', `/usr/bin' です。しかし、これらの値はシステムによって異なります。 +スーパーユーザのデフォルトの検索パスは `/etc', `/bin', `/usr/bin' です。 .Fl c オプションも .Fl t オプションも指定されなかった場合、 シェルは .Ar path 変数で指定されたディレクトリの内容をハッシュ・テーブルに保存します。 ハッシュ・テーブルは、起動時に .Ar \&.cshrc を読み込んだ後と .Ar path 変数を再設定した時に再構築されます。 シェルの実行中に、 新しいコマンドがハッシュされているディレクトリに追加された場合は、 .Ic rehash コマンドによりハッシュを再構築しなければなりません。 .\" #### modified by kuma 96.12.23 #### さもなければ、コマンドが見付からない可能性があります。 .It Ic prompt 端末上で対話的に実行されているシェルにおいて、 .\" #### modified by kuma 96.12.23 #### コマンド読み込み時に表示される文字列を指定します。 `!' が含まれる場合、現在のイベント番号に置換されます。 `\e' を指定することにより、この解釈を抑制することができます。 デフォルトの値は `% 'です。スーパーユーザの場合は `# ' となります。 .It Ic savehist ログアウト時にファイル ~/.history に保存されるコマンド履歴の数を指定 します。 .\" #### modified by kuma 96.12.23 #### この値で指定される数のイベントが保存されます。 起動時に、シェルは ~/.history の内容を読み込みます。あまりに 大きな値を指定すると、シェルの起動が遅くなる場合があります。 .Ar savehist がセットされているだけの場合は .Ar history に指定された値を使用します。 .It Ic shell シェルのフルパス名を示します。実行属性が立っているが、 .\" #### modified by kuma 96.12.23 #### システムが起動できないファイルを 実行する際に起動するシェルとして用いられます(後述の .Sx 非組み込みコマンドの実行 の項を参照)。システム依存の値で初期化されます。 .It Ic status 最後に実行したコマンドの終了ステータス値を保持します。 異常終了した場合は、値に 0200 が加算されます。 組み込みコマンドが失敗した場合は `1' に、成功した場合は `0' になります。 .It Ic time .\" #### modified by kuma 96.12.23 #### コマンドの自動計時を制御します。値が設定されている場合、 コマンドがその値よりも長く CPU 秒数を消費した場合には、 コマンド終了時にユーザ時間、システム時間、実時間と、 利用率すなわちユーザ+システム時間と実時間のパーセンテージが出力されます。 .It Ic verbose .Fl v コマンドラインオプションが指定されていた場合にセットされます。 ヒストリ置換が行われたあと、コマンドの内容が出力されます。 .El .Ss 非組み込みコマンドの実行 実行すべきコマンドが組み込みコマンドでなかった場合、シェルはコマンドを .Xr execve 2 システムコールによって起動しようとします。シェル変数 .Ar path .\" #### modified by kuma 96.12.23 #### の各単語は、シェルがコマンドを実行しようとするディレクトリ名を表します。 .Fl c オプションも .Fl t オプションも指定されなかった場合、 .\" #### modified by kuma 96.12.23 #### シェルはそれらのディレクトリ内にあるファイル名のハッシュ値を計算し、 シェル内部のテーブルに格納します。これは、 コマンドが存在する可能性のあるディレクトリだけで .Ic exec を試みるようにするためです。 この近道によって、サーチ・パスにたくさんのディレクトリが指定されている時、 コマンドの位置決定が著しく高速化されます。 この機能が( .Ic unhash .\" #### modified by kuma 96.12.23 #### コマンドによって)停止されている場合、または .Fl c または .Fl t オプションが起動時に指定された場合、または .Ar path .\" #### modified by kuma 96.12.23 #### 中の単語で `/' から始まらないものについては、ハッシュが用いられることはありません。 この場合は、 .Ar path の要素にコマンドラインで指定されたコマンドを連結した名前を持つ ファイルを実行しようと試みます。 .Pp 括弧で囲まれたコマンドは、つねにサブシェルによって実行されます。ですから、 .Pp .Dl (cd ; pwd) ; pwd .Pp はホーム・ディレクトリの値を表示しますが、カレント・ディレクトリ(ホーム・ .\" #### modified by kuma 96.12.23 #### ディレクトリの後に表示されます)は移動しません。 一方、 .Pp .Dl cd ; pwd .Pp を実行すると、カレント・ディレクトリがホーム・ディレクトリに移動します。 括弧で囲まれたコマンドは、現在のシェルのカレント・ディレクトリに 影響を与えずにコマンドを実行する場合にしばしば用いられます。 .Pp 実行属性が立っているにもかかわらず、 システムによって実行可能ではないファイルは シェルコマンドファイルであるとみなし、 サブシェルを起動してそのファイルを読み込ませます。 .Pp .Ic shell という名前のエイリアスが存在する場合、 エイリアスの値はシェルコマンドファイルを実行する場合の 引数リストの前に挿入されます。エイリアスの値の最初の単語は シェルのフルパス名でなければいけません(たとえば `$shell')。 .\" #### modified by kuma 96.12.23 #### これはエイリアス展開としては特別のもので、かなり後の時点に行われ、 引数リストを修正せずに、その前に単語を挿入するための手段を提供します。 .Ss シグナル処理 シェルは、通常 .Ar quit シグナルを無視します。バックグラウンドのジョブ( .Ic \&& または .Ic bg または .Ic %... & .\" #### modified by kuma 96.12.23 #### によるコマンド)はキーボードから入力されたシグナルに影響されません (hangup も含みます)。他のシグナルに対する挙動は親の環境を引き継ぎます。 シェル・スクリプトでの interrupt と terminate シグナルに対する処理は .Ic onintr によって制御することができます。ログイン・シェルは .Ar terminate シグナルを捕捉します。それ以外のシェルでは、 .Ar terminate シグナルはシェルの親の状態に従ってチャイルドプロセスに渡されます。 ログイン・シェルが .Pa \&.logout ファイルを読み込んでいる間は interrupt は無視されます。 .Sh 作者 William Joy。 ジョブ制御とディレクトリ・スタックは J.E. Kulp of IIASA, Laxenburg, Austria によって、 .\" #### modified by kuma 96.12.23 #### 現在とは異なる文法のものが実装されました。 ファイル名補完は Ken Greer, HP Labs が、 .\" #### modified by kuma 96.12.23 #### 8 bit クリーンな実装は Christos S. Zoulas, Cornell University によって行われました。 .Sh 関連ファイル .Bl -tag -width /etc/passwd -compact .It Pa ~/.cshrc シェルが起動されるときに読み込まれる。 .It Pa ~/.login ログイン・シェルの場合、ログイン時に `.cshrc' の後に読み込まれる。 .It Pa ~/.logout ログイン・シェルにおいてログアウト時に読み込まれる。 .It Pa /bin/sh 標準シェル。`#' で始まらないシェル・スクリプトの実行に用いる。 .It Pa /tmp/sh* `<<' の処理に用いられる一時ファイル。 .It Pa /etc/passwd `~name' 展開時に用いられるホーム・ディレクトリに関する情報を得る。 .El .Sh 制限事項 .\" #### modified by kuma 96.12.23 #### 単語の長さは 1024 文字に制限されます。引数リストは、システムによって 10240 文字に制限されています。ファイル名展開を含む引数の数は、 引数リストの文字数の 6 分の 1 に制限されています。 コマンド置換の結果は、引数リストと同数の制限があります。 ループ検出のため、1 行に対するエイリアス展開は 20 回までに制限されています。 .Sh 関連項目 .Xr sh 1 , .Xr su 1 , .Xr access 2 , .Xr execve 2 , .Xr fork 2 , .Xr killpg 2 , .Xr pipe 2 , .Xr setrlimit 2 , .Xr sigvec 2 , .Xr umask 2 , .Xr wait 2 , .Xr tty 4 , .Xr a.out 5 , .Xr environ 7 .br .Em An introduction to the C shell .Sh 歴史 .Nm csh は .Bx 3 で追加されました。 .\" #### modified by kuma 96.12.23 #### コマンドインタプリタとしては、履歴(参照: .Sx ヒストリ置換 )、ジョブ制御 (参照: .Sx ジョブ .\" #### modified by kuma 96.12.23 #### 参照)、対話的なファイル名補完とユーザ名補完(参照: .Sx ファイル名補完 .\" #### modified by kuma 96.12.23 #### )、C言語ライクな文法を採用して実装した最初のものです。 これらの機構にいくつかの追加機能(といくらかのバグの可能性)を 持つシェルは、現在ではたくさんあります。 これらは usenet から入手することができます。 .Sh バグ コマンドが停止状態から復帰したとき、もしそのコマンドが起動したときの ディレクトリとカレント・ディレクトリが異なるなら、 シェルはコマンドを起動したときのカレント・ディレクトリの値を表示します。 .\" #### modified by kuma 96.12.23 #### これは、そのジョブが内部的にディレクトリを変更した場合は誤解(間違った情報) を与える可能性があります。 .Pp シェルの組み込みコマンドは中断(suspend)も再開もできません。 `a ; b ; c' のようなコマンド列も適切には中断することができません。 たとえば、 `b' の実行を中断した場合には、 すぐに `c' の実行が開始されてしまいます。これは .Ar alias としてコマンド列を指定している場合に特に目立ちます。 このようなコマンド列は `()' で囲んでサブシェルで実行されるようにすることによって、 適切に停止させることが可能になります(`( a ; b ; c )'のように)。 .Pp プロセスを起動したあとの端末出力の制御が貧弱です。おそらく、 このために、 .\" #### modified by kuma 96.12.23 #### もっと良い仮想端末インタフェースを開発したいと考える人がいても何ら不思議はないです。 仮想端末インタフェース上なら、 もっと おもしろい端末出力の制御が可能になるでしょう。 .Pp .\" #### modified by kuma 96.12.23 #### シェル関数をシミュレートするために、エイリアスを不格好に用いてしまうことが よくあります。シェル関数がサポートされるべきです。 .Pp ループ中のコマンド入力において、 `?' プロンプトに続けて入力された内容はヒストリに残りません。 制御構造は組み込みコマンドとして解釈されるのではなく、 文法的に解釈するようにするべきです。これにより制御コマンドをどこにでも 置けるようになり、`\&|', `&', `;' との組み合わせが 自由にできるようになります。 .Pp コマンド置換の出力にも `:' 修飾子が適用できるべきです。 .Pp .\" #### modified by kuma 96.12.23 #### ファイル名補完機構の実装は不細工かつ非効率的です。 diff --git a/ja_JP.eucJP/man/man1/ctm_rmail.1 b/ja_JP.eucJP/man/man1/ctm_rmail.1 index cdd904c478..89b53482af 100644 --- a/ja_JP.eucJP/man/man1/ctm_rmail.1 +++ b/ja_JP.eucJP/man/man1/ctm_rmail.1 @@ -1,502 +1,502 @@ .\" NOTICE: This is free documentation. I hope you get some use from these .\" words. In return you should think about all the nice people who sweat .\" blood to document their free software. Maybe you should write some .\" documentation and give it away. Maybe with a free program attached! .\" .\" Author: Stephen McKay .\" .Dd January 24, 1995 .\" jpman %Id: ctm_rmail.1,v 1.3 1997/09/27 16:25:48 ryo2 Stab % .Dt CTM_MAIL 1 .Os .Sh 名称 .Nm ctm_smail, ctm_rmail .Nd メールを介しての .Nm ctm デルタの送受信 .Sh 書式 .Nm ctm_smail .Op Fl l Ar log .Op Fl m Ar maxmsgsize .Op Fl c Ar maxctmsize .Op Fl q Ar queue-dir .Ar ctm-delta .Ar mail-alias .Nm ctm_dequeue .Op Fl l Ar log .Op Fl n Ar numchunks .Ar queue-dir .Nm ctm_rmail .Op Fl Dfuv .Op Fl l Ar log .Op Fl p Ar piecedir .Op Fl d Ar deltadir .Op Fl b Ar basedir .Op Ar .Sh 解説 .Nm ctm_smail , .Nm ctm_dequeue , .Nm ctm_rmail は .Xr ctm 1 コマンドと組み合わせて、 ソースツリーへの変更を電子メールで配布するために使われます。 .Nm ctm_smail には圧縮した .Xr ctm のデルタとそれを送るメーリングリストを与えます。 するとデルタを送信できる大きさに切り分けて、メールメッセージとして エンコードしたものをメーリングリストに送ります (メールの負荷を分散させるためにキューに入れるように選択できます)。 各受信者は .Nm ctm_rmail を使い (手動または自動で) デルタのデコードと再組み立てを行い、 それをソースツリーに適用するために .Xr ctm を呼び出すようにも指定できます。 現在、 いくつかのソースツリーが、いくつかのサイトによって配布されています。 その中には .Li freefall.FreeBSD.org が配布している FreeBSD-current のソースと CVS のツリーもあります。 .Pp .Nm ctm_smail のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl m Ar maxmsgsize .Nm ctm_smail が送信できるメールメッセージの最大サイズを制限します。 メールヘッダとその他の細かい物をこの制限に入れていないため およその値となります。 指定されないとデフォルトは、メールの限界と噂される 64k に対して ヘッダのための 1535 バイトを残した 64000 バイトです。 .It Fl c Ar maxctmsize 送信されるデルタの最大サイズを制限します。この制限より大きいデルタは 謝罪メールをメーリングリストに送り出します。 これは大幅な変更でユーザのメールボックスを圧迫してしまうのを 避けるためです。これはエンコードする前のサイズなので注意して下さい。 エンコードされるとメールヘッダを付ける前でサイズは 4/3 倍になります。 指定されないと無制限になります。 .It Fl q Ar queue-dir デルタのかけらをメールする代わりに、後で .Nm ctm_dequeue を使ってメールされるように指定されたディレクトリに格納します。 この機能によって、巨大なデルタを数時間または数日にも渡って分散させ、 ネットワークのバンド幅が狭かったりメールのスプール領域が小さい 受信者へのインパクトを押えることが可能です。 .El .Pp .Ar ctm-delta は送信されるデルタで、 .Ar mail-alias はデルタを送信するメーリングリストです。 メールメッセージは .Xr sendmail 8 を使って送信されます。 .Pp .Nm ctm_dequeue のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl n Ar numchunks 1 回の .Nm ctm_dequeue の実行で送信するメールメッセージの数を制限します。 デフォルトでは、 .Nm ctm_dequeue は 1 回の実行で 1 つのメールメッセージを送信します。 .El .Pp .Ar queuedir は .Nm ctm_smail が格納したメールメッセージのあるディレクトリです。 .Ar numchunks 個までのメールメッセージが実行ごとに送信されます。 受信者のメーリングリストは、溜められたファイルに すでにエンコードされています。 .Pp .Nm ctm_smail がキューにエントリを追加している最中や、複数の .Nm ctm_smail を並行に実行している最中でも .Nm ctm_dequeue を安全に実行できますが、配布される各ツリーごとに独立した キューのディレクトリを使うべきです。 これはエントリがアルファベット順に処理されるので、デルタの 作成時刻ではなく、デルタ名に従って 1 つのツリーが他の物より 前に処理されて不公平になるからです。 .Pp .Nm ctm_rmail のコマンドラインの引数には以下があります: .Bl -tag -width indent .It Fl l Ar log .Em stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル .Em log に書き込まれます。 .It Fl p Ar piecedir デルタのかけらをこのディレクトリに集めます。 それぞれのかけらは 1 つのメールメッセージに対応します。 かけらは完全なデルタが出来上がると削除されます。 もし このフラグが指定されないと、入力ファイルは読まれませんが、 .Fl b フラグが指定されていれば完成しているデルタは .Xr ctm を使って適用されるかもしれません。 .It Fl d Ar deltadir このディレクトリ内の完成したデルタを集めます。デルタは、すべてのかけらが 揃っている時に 1 つ以上のかけらから組み立てられます。 .It Fl b Ar basedir 完成しているデルタを このソースツリーに適用します。このフラグが 指定されていない場合、デルタは格納されますが適用はされません。 ユーザは手動、または .Nm ctm_rmail を .Fl p フラグ無しで使ってデルタを適用できます。 もしデルタが .Ar basedir の .Li .ctm_status ファイルとマッチしない場合 (もしくは .Li .ctm_status が存在しない場合) には、デルタは適用されません。 .It Fl D .Xr ctm による適用が成功した後でデルタを削除します。 .Xr ctm はデルタのフルセットからファイルの小グループを回復する機能を 持つので、このフラグを避けて (そしてすべてのデルタを取って) おくのが 良いでしょう。 .It Fl f fork して .Xr ctm でのデルタの適用をバックグラウンドで実行します。 これは .Xr sendmail から .Nm ctm_rmail を自動的に呼び出す場合に有効です。なぜなら .Xr ctm は終了までに、とても長い時間を要し、それによって他の人のメールを 遅らせる原因になり、理論的にはリモート側の .Xr sendmail のタイムアウトによるメールの不要な再送信や、 .Xr "MH" の .Xr slocal のようなメールフィルタによる .Nm ctm_rmail の強制終了を引き起こす可能性があるからです。 膨大な数のバックグラウンドの .Xr ctm プロセスでマシンに負荷がかかる心配はありません。同時に 2 つ以上の .Xr ctm が起動されないようにロックが行われているからです。 .It Fl u 完成したデルタを適用する時に .Fl u フラグを .Xr ctm コマンドに渡します。これによって作成、変更されたファイルの 変更時刻が CTM デルタの作成時刻にセットされます。 .It Fl v 完成したデルタを適用する時に .Fl v フラグを .Xr ctm コマンドに渡します。これによってより多くの情報出力が得られます。 すべての .Xr ctm からの出力は .Nm ctm_rmail のログファイルに記録されます。 .El .Pp 引数のファイル (もし無ければ .Em 標準入力 ) がデルタのかけらとしてスキャンされます。 1 つのファイルから複数のデルタのかけらを読む事ができるので、 メールドロップ全体を 1 回のコマンドでスキャンして処理できます。 .Pp .Nm ctm_rmail を並行に (異なる入力ファイルで) 複数回起動しても安全です。 .Xr sendmail .nh がメールを非同期に配送した時にこのようなことが起こり得ます。 これは処理を順序通りに保つためにロックが行われているからです。 .Sh ファイルフォーマット 以下は実際の (とても小さい) デルタのかけらの重要部分です: .Bd -literal From: owner-src-cur To: src-cur Subject: ctm-mail src-cur.0003.gz 1/4 CTM_MAIL BEGIN src-cur.0003.gz 1 4 H4sIAAAAAAACA3VU72/bNhD9bP0VByQoEiyRSZEUSQP9kKTeYCR2gDTdsGFAwB/HRogtG5K8NCj6 v4+UZSdtUQh6Rz0eee/xaF/dzx8up3/MFlDkBNrGnbttAwyo1pxoRgoiBNX/QJ5d3c9/X8DcPGGo lggkPiXngE4W1gUjKPJCYyk5MZRbIqmNW/ASglIFcdwIzTUxaAqhnCPcBqloKEkJVNDMF0Azk+Bo dDzzk0Ods/+A5gXv9YyJHjMCtJwQNeESNma7hOmXDRxn CTM_MAIL END 61065 .Ed .Pp メッセージのサブジェクトは常に .Dq ctm-mail で始まりデルタの名前、いくつ目のかけらか、そして全部でいくつの かけらがあるのかが続きます。データは .Dq CTM_MAIL BEGIN と .Dq CTM_MAIL END という行で囲まれており、サブジェクト行の情報の複製、加えて単純な チェックサムが付きます。 .Pp デルタが .Ar maxctmsize を超えると、代わりに以下のようなメッセージが送られます: .Bd -literal From: owner-src-cur To: src-cur Subject: ctm-notice src-cur.0999.gz src-cur.0999.gz is 792843 bytes. The limit is 300000 bytes. このデルタは ftpmail か、または大学の仲良しから得られます。 .Ed .Pp これでもうあなたのものです! .Sh 使用例 .Em src-cur の 32 番目のデルタを .Em src-guys として .Xr sendmail に登録されている素晴らしいコードハッカーのグループに、 メールのサイズをおよそ 60000 バイトに制限して送るためには 以下のように出来ます: .Bd -literal -offset indent ctm_smail -m 60000 /wherever/it/is/src-cur.0032.gz src-guys .Ed .Pp メールボックスの各 .Nm ctm-mail メッセージをデコードして、それらを完全なデルタに組み立て、そして 出来上がったデルタやそこらに転がっているデルタはどれも、 以下のように適用出来ます: .Bd -literal -offset indent ctm_rmail -p ~/pieces -d ~/deltas -b /usr/ctm-src-cur $MAIL .Ed .Pp ( .Nm ctm_rmail はメッセージを削除しないので注意して下さい。 削除には どんなメールリーダでも使用できます。) .Pp .Em receiver-dude という名前の自動的にデコードとデルタの組み立てを行うけれども、 それらの適用は行わないようなメールエイリアスは、以下の行を .Pa /etc/aliases ファイルに入れる事で作成可能です ( .Pa /ctm/tmp と .Pa /ctm/deltas ディレクトリ そして .Pa /ctm/log ファイルが .Em daemon ユーザか .Em wheel グループで書き込み可能な事を仮定しています) : .Bd -literal -offset indent receiver-dude: "|ctm_rmail -p /ctm/tmp -d /ctm/deltas -l /ctm/log" owner-receiver-dude: real_dude@wherever.you.like .Ed .Pp 2 行目は、失敗した場合にそれを通常のメールボックスか、または どこか好きな所へ転送するためにあります。 .Pp 集められた全デルタを適用して、適用したものを削除するには以下のように します: .Bd -literal -offset indent ctm_rmail -D -d /ctm/deltas -b /ctm/src-cur -l /ctm/apply.log .Ed .Pp 柔軟性を最大限生かすためには、この .Xr procmail スクリプトからの引用の利用を考えてみて下さい: .Bd -literal -offset indent PATH=$HOME/bin:$PATH :0 w * ^Subject: ctm-mail cvs-cur | ctm_incoming .Ed .Pp 以下のシェルスクリプト .Pa ~/bin/ctm_incoming と一緒に使います: .Bd -literal -offset indent #! /bin/sh PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" export PATH cd $HOME/ctm && ctm_rmail -f -p pieces -d deltas -l log -b /ctm .Ed .Pp これは全部の .Xr ctm デルタを .Pa ~/ctm/deltas に置き、それらを .Pa /ctm 内のツリーに適用し、失敗したものは、すべてあなたの通常の メールボックスに落します。 .Pa ctm_incoming での .Ev PATH の操作は、このサンプルを取って来た (FreeBSD でない) マシンで .Nm ctm_rmail から .Xr ctm の実行を可能にするためのものです。 .Sh セキュリティ 自動的にメールを取ってファイルツリーへのパッチプログラムに 渡している場合、あなたのシステムへの鍵をハッカーに手渡していると 考えるかも知れません。幸い、損害を起こす窓はとても小さいのです。 .Nm ctm_rmail は、 (デルタ名中の いかなる .Dq / 文字も信用しないことによって) 与えられたディレクトリのみにしか書き込まないように注意しています。 そして最新の .Xr ctm では操作するファイルに絶対パス名と .Dq \&\.\. を許可していないので、最悪でも失われる可能性のあるのは (デルタから復元できる) 二、三のソースツリーのファイルだけなのです。 .Xr ctm はファイルにさわる前に .Xr md5 によるチェックサムが合致する事を要求するので、ソースの受信者だけが 偽造したデルタを生成できる可能性を持ち、そして そういう人達が そんなことを考えるはずもありません! :-) .Pp この可能性さえも暗号化された署名で取り除く事が可能です。 将来の強化の可能性は、 .Nm PGP -を使った安全なラッパーの提供があります。 +を使った安全なラッパの提供があります。 .\" This next request is for sections 1, 6, 7 & 8 only .Sh 環境変数 デルタを適用するのならば .Xr ctm 1 と .Xr gunzip 1 が .Ev PATH に含まれていなければなりません。 .Sh 関連ファイル .Bl -tag -width indent .It Pa QUEUEDIR/* メールメッセージとしてエンコードされて、メーリングリストに 送信されるのを待っているデルタのかけら。 .It Pa PIECEDIR/* 残りのかけらの到着を待っているデルタのかけら。 .It Pa DELTADIR/* 完成したデルタ。 .It Pa BASEDIR/.ctm_status このソースツリーに次に適用されるべきデルタの名前と番号を含むファイル。 .\" This next request is for sections 1, 6, 7 & 8 only .\" (command return values (to shell) and fprintf/stderr type diagnostics) .Sh 診断 .Nm ctm_smail , .Nm ctm_dequeue , .Nm ctm_rmail は正常に終了するとステータスとして 0 を、何らかの障害が あった場合は 1 を返します。 .Nm ctm_rmail は、メールの配送プログラムから呼ばれる事を想定しています。そして そのため入力されたメールメッセージが (送信者にではなく、 なるべく あなたの通常のメールドロップに) 返送されるべき状態に なった時にのみ障害を通知するようになっています。 いいかえれば、完成したデルタを .Xr ctm で適用する際に発生した障害はメールを返送する程に重要なエラーでは ないと判断されて、 .Nm ctm_rmail は終了ステータスとして 0 を返すということです。 .Pp 通常の操作では、 .Nm ctm_smail は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_smail: src-cur.0250.gz 1/2 sent to src-guys .Ed .Pp または、キューに入れたなら、 .Bd -literal -offset indent ctm_smail: src-cur.0250.gz 1/2 queued for src-guys .Ed .Pp .Nm ctm_dequeue は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_dequeue: src-cur.0250.gz 1/2 sent .Ed .Pp .Nm ctm_rmail は以下のようなメッセージで報告します: .Bd -literal -offset indent ctm_rmail: src-cur.0250.gz 1/2 stored ctm_rmail: src-cur.0250.gz 2/2 stored ctm_rmail: src-cur.0250.gz complete .Ed .Pp もし入力ファイルのいずれもが正しいデルタのかけらを含んでいないと、 .Nm ctm_rmail は以下のように報告します: .Bd -literal -offset indent ctm_rmail: message contains no delta .Ed .sp \n(Ppu そして終了ステータスとして 1 を返します。もしメールフィルタが 当てにならないのなら、これを使って気まぐれなメッセージを リダイレクトして本当のメールボックスに入れる事ができます。 .Pp これらのメッセージは .Em stderr かログファイルに出力されます。 .Xr ctm からのメッセージも同様にここに現れます。 エラーメッセージは それ自身が説明的であるべきです。 .\" The next request is for sections 2 and 3 error and signal handling only. .\" .Sh ERRORS .Sh 関連項目 .Xr ctm 1 , .Xr ctm 5 .\" .Sh STANDARDS .\" .Sh HISTORY .Sh 作者 Stephen McKay .\" .Sh BUGS .\" Gosh! No bugs here! .\" This message brought to you by the Coalition for More Humour in Man Pages. .\" .\" %Id: ctm_rmail.1,v 1.7.2.1 1996/12/17 14:07:51 mckay Exp % .Sh 日本語訳 野首 寛高(h-nokubi@nmit.mt.nec.co.jp): FreeBSD 用に翻訳 diff --git a/ja_JP.eucJP/man/man1/cvs.1 b/ja_JP.eucJP/man/man1/cvs.1 index b631f7f53c..6da2e4f547 100644 --- a/ja_JP.eucJP/man/man1/cvs.1 +++ b/ja_JP.eucJP/man/man1/cvs.1 @@ -1,2118 +1,2118 @@ .de Id .\" jpman %Id: cvs.1,v 1.4 1997/09/23 13:05:40 jsakai Stab % .ds Rv \\$3 .ds Dt \\$4 .. .TH CVS 1 "\*(Dt" .\" Full space in nroff; half space in troff .de SP .if n .sp .if t .sp .5 .. .\" quoted command .de ` .RB ` "\|\\$1\|" '\\$2 .. .SH "名称" cvs \- コンカレント・バージョン・システム .SH "注記" このマニュアルページは .B cvs の機能のまとめですが、より詳細な文書に関しては (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SH "書式" .TP \fBcvs\fP [ \fIcvs_options\fP ] .I cvs_command [ .I command_options ] [ .I command_args ] .SH "解説" .IX "revision control system" "\fLcvs\fR" .IX cvs "" "\fLcvs\fP \- concurrent versions system" .IX "concurrent versions system \- \fLcvs\fP" .IX "release control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system" .IX "source control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system" .IX revisions "cvs command" "" "\fLcvs\fP \- source control" .B cvs は .BR rcs ( 1 ) リビジョン管理システムのフロントエンドで、 リビジョン管理の概念を複数ファイルを集めた単一ディレクトリから リビジョン管理される複数ファイルを含む複数の階層構造を持つ ディレクトリへと拡張します。 それらのディレクトリとファイルをひとまとまりにしてソフトウェアリリースを 形成することが可能になります。 .B cvs は、それらのソフトウェアリリースの管理と複数のソフトウェア開発者が 並行してソースファイルを編集する場合の制御に必要な機能を提供するものです。 .SP .B cvs はマスターソースの単一のコピーを保持します。 このコピーはソースの``リポジトリ''と呼ばれます。 これは、以前の ソフトウェアリリースをいつでもシンボリックなリビジョンタグか、 または過去の日付のいずれかに基づいて取り出せるようにするための 全ての情報を含みます。 .SH "不可欠なコマンド" .B cvs はバラエティに富んだコマンドを提供します (書式説明における \fIcvs_command\fP)。 また分散環境での多様なソース管理要求を満たすために、 これらのコマンドの多くにはいくつものオプションが用意されています。 しかしながら、 .BR cvs で便利に仕事をするためにそれぞれの細部に渡ってマスタする 必要はありません。 実際、ソースリポジトリを使う (そしてそれに貢献する) には 5 つの コマンドで充分です。 .TP \fBcvs checkout\fP \fImodules\fP\|.\|.\|. 大部分の \fBcvs\fP での作業のために必要な準備: \fImodules\fP (名前をつけたソースの集合。 ここにはソースリポジトリへの相対パスを 使うこともできます) のソースの私的なコピーを作成します。 他人の作業に邪魔されることなく このコピーで作業することができます。 少なくとも 1 レベルのサブディレクトリが必ず作成されます。 .TP .B cvs update 他の開発者がリポジトリのソースに行った変更を あなたのコピーに 取り込みたいと思ったときに、あなたの私的なソースのディレクトリの \fI中で\fP このコマンドを実行して下さい。 .TP \fBcvs add\fP \fIfile\fP\|.\|.\|. あなたの作業ディレクトリの \fBcvs\fP のレコードに新しいファイルを 載せるには、このコマンドを使います。そのファイルは次にあなたが .` "cvs commit" を実行した時にリポジトリに追加されます。 注意: 新しいソースをソースリポジトリに登録するには .` "cvs import" コマンドを使って下さい。 .` "cvs add" はすでにチェックアウトされているモジュールに新しいファイルを 追加するときにのみ使います。 .TP \fBcvs remove\fP \fIfile\fP\|.\|.\|. (指定するファイルを消した後に) リポジトリからファイルを 消したいことを宣言する場合に、このコマンドを使います。 .` "cvs commit" を実行するまで削除は他へは影響しません。 .TP \fBcvs commit\fP \fIfile\fP\|.\|.\|. あなたの変更をソースリポジトリに取り込むことで、他の開発者へ 変更結果を ``公開'' したいときに、このコマンドを使います。 .SH "オプション" .B cvs のコマンドラインには .IR cvs_options を含めることができ、 これは .B cvs プログラム全体に適用されます。 ひとつの .IR cvs_command がソースリポジトリへの特定の動作を 指定します。 そして .I cvs_command の動作を完全に指定するために .I command_options と .I command_arguments とを含めることができます。 .SP .I 警告: .IR cvs_command とオプションの相対的な位置関係に正確さを 期さなければなりません。 なぜなら同じオプションが .I cvs_options の位置 ( .B cvs コマンドの左側) と .I command_options の位置 ( .B cvs コマンドの右側) のいずれに置かれるかで異なる意味を持つ可能性が あるためです。 .SP .IR cvs_command を省略できる状況が 2 つだけあります: .` "cvs \-H" または .` "cvs --help" は利用可能なコマンドの一覧を引き出します、そして .` "cvs \-v" または .` "cvs --version" は \fBcvs\fP それ自身のバージョン情報を表示します。 .SP .SH "CVS OPTIONS" リリース 1.6 現在、 .B cvs は、短いオプションと共に .SM GNU スタイルの長いオプションもサポートします。 現在はまだ 2、3の長いオプションしかサポートされておらず、 それらは同じ意味を持つ短いオプションの後ろにかぎ括弧で囲んで 示されています。 .SP 以下のオプションは .B cvs プログラムの全体的な制御に使います: .TP .B \-H [ --help ] 指定された .I cvs_command の用法を表示します (が、コマンドの実行は行いません)。コマンド名を 指定しないと .` "cvs \-H" は利用可能な全コマンドの要約を表示します。 .TP .B \-Q はコマンドを .I 真に 寡黙にします。 コマンドは深刻な問題についてのみ出力を行います。 .TP .B \-q はコマンドをいくぶん静かにします。 サブディレクトリを再帰的に 移動する際の報告のような通知的なメッセージが抑制されます。 .TP \fB\-b\fP \fIbindir\fP .SM RCS プログラムが置かれているディレクトリとして .I bindir を使います。 環境変数 .SM RCSBIN の設定より優先されます。 これは絶対パス名で指定しなければなりません。 .TP \fB\-d\fP \fICVS_root_directory\fP マスタとなる .SM RCS ソースリポジトリのルートディレクトリへのパス名として .I CVS_root_directory を使います。 環境変数 .SM CVSROOT の設定より優先されます。 これは絶対パスで指定しなければなりません。 .TP \fB\-e\fP \fIeditor\fP ログ情報の入力においてエディタとして .I editor を使います。 環境変数 .SM CVSEDITOR と .SM EDITOR の設定より優先されます。 .TP .B \-f .B cvs スタートアップファイル (\fI~/.cvsrc\fP) を読み込みません。 .TP .B \-l コマンドヒストリに .I cvs_command のログを取りません (しかし実行はします)。コマンドヒストリに関する 情報については .B history コマンドの説明を参照して下さい。 .TP .B \-n いかなるファイルも変更しません。 .IR cvs_command を実行しようとしますが、 経過報告のみを行います。 ファイルへの削除、更新やマージのいずれも 行いませんし、新しいファイルも作成しません。 .TP .B \-t プログラムの実行をトレースします。 .B cvs の動作のステップを示すメッセージを表示します。 不慣れなコマンドの影響の可能性を調べるのに .B \-n との組合せで特に有用です。 .TP .B \-r 新しい作業ファイルを読み出し専用にします。 環境変数 .SM CVSREAD がセットされている場合と同じ効果を持ちます。 .TP .B \-v [ --version ] .BR cvs のバージョンと著作権情報を表示します。 .TP .B \-w 新しい作業ファイルを読み書き可能にします (デフォルトです)。 環境変数 .SM CVSREAD がセットされていても無視します。 .TP .B \-x クライアントとサーバの間の通信を全て暗号化します。 現在では、Kerberos コネクション使用時のみ使用可能です。 .TP \fB\-z\fP \fIcompression\-level\fP ファイルをネットワーク経由でやりとりする際、 圧縮レベル \fIcompression\-level\fP で .B gzip を使い、やりとりするデータの圧縮と伸長を行います。リンクの両端で .SM GNU .B gzip プログラムがその時点でのサーチパス中に存在する必要があります。 .SH "使用法" .` "cvs \-H" で全般のヘルプを要求する場合を除き、 行いたい特定のリリース制御機能を選択するために、 .B cvs に対して一つの .I cvs_command を指定しなければなりません。 各 .B cvs コマンドはそれ自身のオプションと引数の集まりを受け付けます。 しかしながら、多くのオプションが複数のコマンドに渡って利用可能です。 .B \-H オプションをコマンドと共に指定することで、 各コマンドの使用法のまとめを表示することができます。 .SH "CVS のスタートアップファイル" 通常、CVS は起動時にユーザのホームディレクトリから .I .cvsrc というファイルを読み込みます。この起動時の手続きは .B \-f フラグで止めることができます。 .SP .I .cvsrc ファイルには CVS コマンドに引数リストを付けて、1 行に 1 つの コマンドを並べます。例えば \fI.cvsrc\fP に以下のように書くと: .SP diff \-c .SP .` "cvs diff" コマンドには常にコマンドラインで指定されたオプションに加えて \-c オプションが渡されるという意味になります (この場合 .` "cvs diff" を実行すると 全てにおいて context diff 形式が生成されるという 効果を持ちます)。 .SH "CVS COMMAND のまとめ" 以下は全 .B cvs コマンドの解説を要約したものです: .TP .B add 新しいファイルまたはディレクトリをリポジトリに追加します。 ファイルについては追加を同ファイルに対する .` "cvs commit" が行われるまで待ちます。 以前に .` "cvs checkout" を行うことで作成されたソースの中からのみ実行可能です。 新しいソース階層の全体を .B cvs の制御下に置くには .` "cvs import" を使って下さい。 (リポジトリを直接に変更するものではありません。 作業ディレクトリを変更します。) .TP .B admin ソースリポジトリに対して .SM RCS の制御コマンドを実行します。(リポジトリを直接に変更します。 作業ディレクトリを使用しますが変更は行いません。) .TP .B checkout 編集作業のためのソースファイルの作業ディレクトリを作成します。 (作業ディレクトリを生成または変更します。) .TP .B commit 作業ディレクトリでの変更、追加、削除部分をソースリポジトリに 反映します。(リポジトリを変更します。) .TP .B diff 作業ディレクトリのファイルとソースリポジトリ、または ソースリポジトリ中の 2 つのリビジョン間の差分を表示します。 (リポジトリ、作業ディレクトリのいずれも変更しません。) .TP .B export サイトからの出荷のための一揃いのソースファイルのコピーを用意します。 .` "cvs checkout" と違い .B cvs 管理のためのディレクトリが作られず (そしてそのため .` "cvs export" で作成されたディクトリから .` "cvs commit" を行うことはできません)、 シンボリックタグが指定されなければなりません (リポジトリを変更しません。 作業ディレクトリに似たディレクトリを 作成します)。 .TP .B history ソースリポジトリの特定のファイルまたはディレクトリにあなたや 他の人が実行した .B cvs コマンドを表示します。(リポジトリも作業ディレクトリも変更しません。) ヒストリログは .` "$CVSROOT/CVSROOT/history" ファイルが作成されることで有効になった場合にのみ記録されます。 .BR cvs ( 5 ) を参照して下さい。 .TP .B import 外部で行われた更新内容を ``ベンダ・ブランチ'' としてソースリポジトリに 取り込みます。(リポジトリを変更します。) .TP .B log .SM RCS のログ情報を表示します。 (リポジトリも作業ディレクトリも変更しません。) .TP .B rdiff リポジトリの中の 2つのリリースの間の差分の集合をパッチファイルとして 用意します。(リポジトリも作業ディレクトリも変更しません。) .TP .B release .` "cvs checkout" をキャンセルし、 全ての変更を捨て去ります。 (作業ディレクトリを削除できます。 リポジトリは変更しません。) .TP .B remove ソースリポジトリからファイルを削除します、そのファイルに .` "cvs commit" が実行されるまで保留されます。(直接リポジトリには影響しません。 作業ディレクトリを変更します.) .TP .B rtag ソースリポジトリの特定のリビジョンのファイルに明示的に シンボリックタグを指定します。 .` "cvs tag" も参照して下さい。 (リポジトリを直接変更します。 作業ディレクトリは必要なく また 変更もしません.) .TP .B status 現在のファイルの状態を表示します: 最新バージョン、作業ディレクトリの ファイルのバージョン、作業バージョンが編集されたかどうか、オプションで .SM RCS ファイル中のシンボリックタグ。(リポジトリ、作業ディレクトリとも 変更しません。) .TP .B tag リポジトリ中のファイルにシンボリックタグを指定します。 デフォルトでは、作業ディレクトリと最後に同期を取ったリビジョンに タグをつけます。 (直接リポジトリを変更します。 作業ディレクトリを使いますが 変更はしません。) .TP .B update リポジトリから変更を取り出して作業ディレクトリを最新状態にします。 可能であればマージが自動で行われます。 変更点が衝突しているために手動で解決しなければならない場合は、 警告が表示されます。(作業ディレクトリを変更します。 リポジトリは変更しません。) .SH "共通の COMMAND OPTIONS" この節では 複数の .B cvs コマンドで使用できる .I command_options について説明します。必ずしも全てのコマンドがこれら全てのオプションを サポートしているわけではありません。 コマンドの各オプションは、それが 意味を為すコマンドでのみサポートされます。しかしながら、 コマンドがそれらのオプションのひとつを持つとき、 他のコマンドでもそのオプションが同じ意味を持つと考えて差し支えありません。 (個々のコマンドと共に列挙してある別のオプションは ある .B cvs コマンドと別のコマンドで異なる意味を持つかもしれません。) .I "注意:" .B history コマンドは例外です。 このコマンドは、これら標準のオプションとも衝突するたくさんの オプションをサポートしています。 .TP \fB\-D\fP \fIdate_spec\fP \fIdate_spec\fP 以前のものの中で最も最近のリビジョンを使います (単独の 引数で、日時の表記は過去の日時を指定します)。 下請けの .SM RCS の機能により .BR co ( 1 ) に説明されているのと同様の多種多様な日時のフォーマットが サポートされますが、まったく同じというわけではありません。 特定のタイムゾーンが指定されていなければ、\fIdate_spec\fP は ローカルタイムゾーンで解釈されます。 ソースファイルの個人的なコピーを作るときに使うと、指定は ``sticky'' と なります。 つまり、\fB\-D\fP を使って作業ファイルを取り出すと、 \fBcvs\fP は指定された日時を記録します。 これは同じディレクトリでのその後の update で同じ日時を使うように するためです (これを明示的に無効にするよう指定していない場合に限ります。 \fBupdate\fP コマンドの説明を参照して下さい)。 .B \-D は .BR checkout ", " diff ", " history ", " export ", " .BR rdiff ", " rtag ", " .B update コマンドで有効です。 有効な日時指定には以下のようなものがあります: .in +1i .ft B .nf 1 month ago 2 hours ago 400000 seconds ago last year last Monday yesterday a fortnight ago 3/31/92 10:00:07 PST January 23, 1987 10:05pm 22:00 GMT .fi .ft P .in -1i .TP .B \-f \fBcvs\fP コマンドに特定の日時かタグを指定した場合、 通常は指定したタグを含まない (または指定した日時に存在しなかった) ファイルを無視します。一致するタグまたは日時が存在しなくても ファイルを取り出したいときは \fB\-f\fP オプションを使います。 (その場合、最も新しいバージョンが使われます。) .B \-f は以下のコマンドで使用できます: .BR checkout ", " export ", " .BR rdiff ", " rtag ", " update .TP .B \-H ヘルプ; そのコマンドで使用可能なオプションの説明を表示します。 これは .I 全ての .B cvs コマンドでサポートされる唯一のオプションです。 .TP \fB\-k\fP \fIkflag\fP デフォルトの .SM RCS のキーワード処理を変更します。 .BR co ( 1 ) に説明されている全ての .B \-k オプションが使用できます。\fB\-k\fP オプションは .BR add ", " checkout ", " diff ", " export ", " .BR rdiff ", " update コマンドで使用できます。 ソースファイルの個人的なコピーを作成するときに使うと \fIkflag\fP の指定は ``sticky'' になります。 つまり、このオプションを \fBcheckout\fP か \fBupdate\fP コマンドで指定すると、 \fBcvs\fP は指定した \fIkflag\fP をファイルに関連付け、 他のものを指定するまで、以降の \fBupdate\fP コマンドでそれを使い続けます。 .SP より有用な \fIkflag\fP としては \-ko と \-kb (バイナリファイル用、 .SM RCS バージョン 5.7 以降でのみ利用可)、と \-kv があります。\-kv は .B export の際、どこか別のサイトで後に .B import されてもキーワード情報が残るようにしたい場合に有用です。 .TP .B \-l ローカル; サブディレクトリを再帰的に処理するのではなく、 現ディレクトリでのみ実行します。 以下のコマンドで使用できます: .BR checkout ", " commit ", " diff ", " .BR export ", " remove ", " rdiff ", " rtag ", " .BR status ", " tag ", " update .I 注意: これは .B cvs コマンドの .I 左 に指定することのできる、全体に作用する .` "cvs \-l" オプションとは違います! .TP .B \-n .BR checkout / commit / tag / update のいずれのプログラムも .I 実行しません。 (プログラムはそれぞれの動作中にモジュールデータベースで 実行することを指定される可能性があり、このオプションはこれを バイパスします。) .BR checkout ", " commit ", " export ", " .B rtag コマンドで利用できます。 .I 警告: これは .B cvs コマンドの .I 左側 に指定できる、全体に作用する .` "cvs \-n" オプションと同じではありません。 .TP .B \-P .BR checkout " か " update によって更新されたことで空になった余分なディレクトリを 取り除きます (すなわち削除します)。 通常は、空のディレクトリ (リビジョン管理されたファイルを 含まないもの) は残されます。 .B \-P を指定すると、チェックアウトしたソースからそういったディレクトリを 黙って削除します。 これはリポジトリからはディレクトリを削除しません。あなたが チェックアウトしたコピーから削除するだけです。 このオプションは .B \-r か .B \-D オプションが .BR checkout " と " export で指定された場合に暗黙のうちに 指定されることに注意して下さい。 .TP .B \-p リポジトリから取り出されたファイルを、カレントディレクトリに 書き込むのではなく、標準出力へパイプします。 .BR checkout " と " update コマンドで使用できます。 .TP \fB\-r\fP \fItag\fP デフォルトの ``head'' リビジョンの代わりに引数 .I tag で指定されたリビジョンを使います。 \fBtag\fP と \fBrtag\fP コマンドで 付けられた任意のタグと共に、常に 2つの特別なタグが使用できます: .` "HEAD" はリポジトリ中で最も新しい有効なバージョンを指し、 そして .` "BASE" はカレントの作業ディレクトリに最後にチェックアウトした リビジョンを指します。 .SP このオプションを .` "cvs checkout" か .` "cvs update" でファイルのコピーを作成するときに使うと、 \fItag\fP の指定は ``sticky'' です: \fBcvs\fP は \fItag\fP を記憶して以降の \fBupdate\fP コマンドでも、他のものを 指定するまで、それを使い続けます。 .I tag としては .SM RCS スタイルのシンボリックまたは番号によるものが使用できます。 .SM RCS ファイルが指定されたタグを含んでいないときに警告メッセージを抑止するため 全体に作用する .B \-q オプションをコマンドオプション .B \-r と一緒に指定すると便利な場合が多くあります。 .B \-r は .BR checkout ", " commit ", " diff ", " .BR history ", " export ", " .BR rdiff ", " rtag ", " update コマンドで使用できます。 .I 警告: これは .B cvs コマンドの .I 左側 に指定し、全体に作用する .` "cvs \-r" オプションと同じではありません。 .SH "CVS COMMANDS" 以下が (最終的な) 全 .B cvs コマンドの詳細とそれぞれが受け付けるオプションです。 各コマンドの最初のサマリ行の説明は 3 種類の事柄をまとめています: .TP 1i \ \ \ \ コマンドのオプションと引数 特別なオプションが以下で説明されます。 共通のコマンドオプションは サマリ行にしか現れないかもしれません。 .TP 1i \ \ \ \ 作業ディレクトリかリポジトリか? いくつかの \fBcvs\fP コマンドは実行に作業ディレクトリが必要です。 いくつかはリポジトリが必要です。同様に、いくつかのコマンドは リポジトリを \fI変更し\fP 、いくつかは作業ディレクトリを変更し、 いくつかは何の変更も行いません。 .TP 1i \ \ \ \ 同義語 多くのコマンドには同義語があります。 同義語は正式な名前よりも覚えやすい (あるいはタイプしやすい) と 感じることでしょう。 .PP .TP \fBadd\fP [\fB\-k\fP \fIkflag\fP] [\fB\-m '\fP\fImessage\fP\fB'\fP] \fIfiles.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .B new .br .B add コマンドを使って .SM RCS ソースリポジトリに新しいファイルまたはディレクトリを作成します。 .B add で指定されるファイルまたはディレクトリは、すでに カレントディレクトリ ( .B checkout コマンドで作成されたディレクトリでなければなりません) に 存在しなければなりません。 新しいディレクトリ階層の全体をソースリポジトリに追加する (例えば、サードパーティのベンダから受け取ったファイル群のような) には、 代わりに .` "cvs import" コマンドを使います。 .SP .` "cvs add" の引数が直下のサブディレクトリを指しているなら、そのディレクトリが .SM RCS ソースリポジトリの現位置に作成され、必要な .B cvs 管理ファイルが作業ディレクトリに作成されます。 ディレクトリがすでにソースリポジトリに存在した場合でも、 .` "cvs add" はあなたのバージョンのディレクトリに管理ファイルを作成します。 これによって、あなたがソースを .B checkout した後に誰か他の人がディレクトリを作っていても .` "cvs add" でそのディレクトリをあなたの私的なソースに作成することが 可能になります。以下のようにすることができます: .SP .in +1i .ft B .nf example% mkdir new_directory example% cvs add new_directory example% cvs update new_directory .fi .ft P .in -1i .SP .` "cvs update" を使った別のアプローチもあります: .SP .in +1i .ft B .nf example% cvs update -d new_directory .fi .ft P .in -1i .SP (新しく \fIできた\fP ディレクトリをあなたの作業ディレクトリに 追加するには、おそらく .` "cvs checkout" か .` "cvs update -d" を使用する方が簡単でしょう。) .SP .` "cvs commit" で変更が恒久的なものとされるまで、追加されたファイルは .SM RCS ソースリポジトリには置かれません。 .` "cvs remove" コマンドで削除されたファイルに対して .` "cvs add" を行うと、間で .` "cvs commit" コマンドが実行されていなければファイルが復活します。 .SP 新しいファイルを .` "cvs commit" で恒久的なものにするときに、いつものように、ログメッセージを指定する 機会があります。もしファイルの .I 作成 と対応するもう一つのログメッセージを指定したいならば (例えば、ファイルの目的を説明するなど)、 .B add コマンドの .` "\-m \fImessage\fP" オプションで指定することができます。 .SP .` "-k kflag" オプションで このファイルがチェックアウトされるときの デフォルトを指定できます。 引数 .` "kflag" は .SM RCS ファイルに記録されて .` "cvs admin" で変更することができます。 展開された .SM RCS ID 文字列を持たないであろうバイナリをチェックインする場合には .` "-ko" を指定すると便利です。 .TP \fBadmin\fP [\fIrcs-options\fP] \fIfiles.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B rcs .br これは .BR rcs ( 1 ) で文書化されている .SM RCS の管理機構と対応する .B cvs のインタフェースです。 .` "cvs admin" は その全てのオプションと引数を単純に .B rcs コマンドに渡します。 なんのフィルタや変換も行いません。 しかしながら、このコマンドは再帰的に働きます。よって使用には 特別な注意を払わなければいけません。 .TP \fBcheckout\fP [\fBoptions\fP] \fImodules\fP.\|.\|. .I 以下が必要: リポジトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .BR co ", " get .br .IR modules で指定されたソースファイルのコピーを持つ 作業ディレクトリを作成します。他の大部分の .B cvs コマンドは作業ディレクトリに作用するものなので、これらを使う前に .` "cvs checkout" を実行しなくてはなりません。 .SP \fImodules\fP はいくつかのソースディレクトリとファイルを 集めたものに対するシンボル名 (それ自体は .` "modules" というモジュールとしてソースリポジトリに定義されています。 .BR cvs ( 5 ) 参照) か、あるいはリポジトリ中でのディレクトリまたはファイルへのパス名です。 .SP 指定した .I modules に応じて、 .B checkout は再帰的にディレクトリを作成して適切なソースファイルで満たします。 その後はいつでも、(他のソフトウェア開発者達がソースの彼らの分のコピーを 編集しているかどうかを気にすることなく) これらのソースファイルを編集したり、 他の人によってソースリポジトリに行われた新しい変更を取り込むために これらを更新 (update) したり、 .SM RCS あなたの作業を恒久的な変更としてリポジトリに 登録 (commit) することができます。 .SP .B checkout はディレクトリの作成に使われることに注意して下さい。 作成されるディレクトリのトップレベルは常に .B checkout が起動されたディレクトリに追加され、そして通常、指定された .IR module と同じ名前を持ちます。 .I module がエイリアスの場合は、作成されたサブディレクトリは違う名前を持つかも しれませんが、それがサブディレクトリであること、そして .B checkout はファイルが私的な作業領域に取り出される際に各ファイルへの 相対パスを表示すること (全体に作用する .B \-Q オプションを指定していなければ) は当てにできます。 .SP すでに以前の .B checkout で作成されているディレクトリで .` "cvs checkout" を実行することも許されています。これは 以下で説明する .B update コマンドに .B \-d オプションを指定するのと同じ効果を持ちます。 .SP .` "cvs checkout" で使える .I options は以下の標準のコマンドオプションです。 .BR \-P ", " \-f ", " .BI \-k " kflag" \&, .BR \-l ", " \-n ", " \-p ", " .BR \-r .IR tag ", " .BI \-D " date"\c .SP これらに加えて、以下の特別のコマンドオプションを .BR checkout で使うことができます: .SP .B \-A オプションで sticky なタグ、日付または .B \-k オプションをリセットできます。(作業ファイルを \fB\-r\fP, \fB\-D\fP, \fB\-k\fP オプションのいずれかを使って取り出すと、 \fBcvs\fP は対応するタグ、日付、\fIkflag\fP を記録して以降の 更新 (update) でそれを使い続けます。 \fB\-A\fP オプションを使って \fBcvs\fP に それらの指定を忘れさせ、ファイルの ``head'' バージョンを取り出します)。 .SP .BI \-j " branch" オプションはベースとなったリビジョンと、そこから変更された結果の リビジョンとの差分をマージします (例えば、もしタグがブランチを 指しているときは、 .B cvs は、そのブランチで行われた全ての変更を作業ファイルにマージします)。 .SP 2 つの \fB-j\fP オプションを指定すると、 .B cvs は 2 つの各々のリビジョン間での変更をマージします。 これは特定の差分を作業ファイルから ``削除'' するために使うことが できます。 .SP 加えて、各 \fB-j\fP オプションをブランチで使う場合に必要であれば 日時指定を加えることができ、選択するリビジョンを指定した日時以内に 制限できます。 日時を加える場合はタグにコロン (:) を付けて指定します。 例としては .` "cvs import" でローカルな変更と衝突する部分のあるソースを import するときに 実行するように指示されるコマンドがあります: .SP .in +1i .ft B .nf example% cvs checkout -jTAG:yesterday -jTAG module .fi .ft P .in -1i .SP .B \-N オプションと .` "\-d \fIdir\fP" を指定することで作業ディレクトリでモジュールのパスが短縮されるのを 防げます。(通常、明示的に対象ディレクトリを指定すると \fBcvs\fP は なるべくパスが短くなるようにします。) .SP .B \-c オプションで、作業ディレクトリのファイルやディレクトリに作成や変更を 行う代わりに、モジュールファイルをソートしたものを標準出力にコピー します。 .SP .BI \-d " dir" オプションで、モジュール名ではなく、 .I dir で指定した名前のディレクトリを作業ファイルのために作成します。 \fB\-N\fP を一緒に指定しない場合は、\fIdir\fP の下に作成されるパスは 可能な限り短くなります。 .SP .B \-s オプションを使って .B \-s オプションでモジュールファイルに格納されたモジュール単位の ステータス情報を表示します。 .TP \fBcommit\fP [\fB\-lnR\fP] [\fB\-m\fP '\fIlog_message\fP' | \fB\-f\fP \fIfile\fP] [\fB\-r\fP \fIrevision\fP] [\fIfiles.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B ci .br 作業ディレクトリでの変更を共有のソースリポジトリに組み込むにときには .` "cvs commit" を使います。 .SP コミットする対象となる \fIfiles\fP を指定しない場合、現在の 作業ディレクトリ中の全ファイルが調べられます。 .B commit はあなたが本当に変更したファイルだけを慎重にリポジトリで変更します。 デフォルトでは (または明示的に .B \-R オプションを指定した場合)、サブディレクトリのファイルも 調べられ、もし変更されていればコミットされます。 .B \-l オプションで現ディレクトリのみ .B コミット するように制限できます。 変更されていなくても強制的にファイルをコミットしたい場合があるかも しれません。 これは .B \-f フラグで可能で、これは同時に再帰も抑止します (もちろん .B \-R で再帰するようにできます)。 .SP .B commit は選択されたファイルがソースリポジトリの現リビジョンに対して 最新であることを確認します。 もし選択されたファイルのいずれかが まず .` "cvs update" で最新にされなければならないなら、そこで通知してコミットせずに終ります。 .B commit は .B update コマンドを呼び出しません。update すべきときであるかどうかの判断は ユーザにゆだねられます。 .SP 全てがうまくいくと、ログメッセージを入力するためにエディタが 呼び出されます。ログメッセージは一つかそれ以上のログを取る プログラムに書き込まれて .SM RCS ソースリポジトリのファイルに置かれます。 代わりにコマンドラインで .B \-m オプションと共にログメッセージを指定し、 エディタの呼び出しを抑制することができます。また .B \-F オプションで引数の \fIfile\fP にログメッセージが含まれていることを 指示することもできます。 .SP .B \-r オプションで特定のシンボリックまたは番号で指定される .SM RCS ファイル中のリビジョンとしてコミットできます。 例えば、全ファイルを .SM RCS リビジョンの ``3.0'' に上げる (変更されていないものも含めて) には、以下のようにします: .SP .in +1i .ft B .nf example% cvs commit -r3.0 .fi .ft P .in -1i .SP .B cvs はメインの幹上のリビジョン (ドットが 1 つのリビジョン) へのコミットのみ 許します。 しかしながら、 .B \-r オプションでブランチ上のリビジョン (偶数個のドットをもつリビジョン) へ コミットすることもできます。 ブランチとなるリビジョンを作成するには、通常 .BR rtag " または " tag コマンドの .B \-b オプションを使います。 その後、 .BR checkout " または " update のいずれかでソースのベースを新しく作成したブランチにすることができます。 それ以降、それらの作業ファイルで行われた全ての .B commit される変更点は自動的にブランチのリビジョンに追加され、 それによって主たる開発ラインが混乱させられることはありません。 例をあげると、製品のバージョン 1.2 へのパッチを作成しなければ ならなくなったとすると、バージョン 2.0 がすでに開発中だったとしても、 以下のようにできます: .SP .in +1i .ft B .nf example% cvs rtag -b -rFCS1_2 FCS1_2_Patch product_module example% cvs checkout -rFCS1_2_Patch product_module example% cd product_module [[ hack away ]] example% cvs commit .fi .ft P .in -1i .SP 極めて実験的なソフトウェアを開発しているとして、 前の週にチェックアウトしたなんらかのリビジョンをベースにしていると します。 あなたのグループの別の人がこのソフトウェアであなたと一緒に作業したいが、 主たる開発ラインの邪魔はしたくないと考えたなら、あなたはあなたの 変更点を新しいブランチにコミットすると良いでしょう。 すると別の人はあなたの実験的な変更をチェックアウトして .B cvs の衝突解決機能を最大限に利用することができます。 シナリオは以下のようになります: .SP .in +1i .ft B .nf example% cvs tag -b EXPR1 example% cvs update -rEXPR1 [[ hack away ]] example% cvs commit .fi .ft P .in -1i .SP 別の人は単純に .` "cvs checkout -rEXPR1 whatever_module" とすれば実験的な変更を採り入れてあなたと作業できるようになります。 .TP \fBdiff\fP [\fB\-kl\fP] [\fIrcsdiff_options\fP] [[\fB\-r\fP \fIrev1\fP | \fB\-D\fP \fIdate1\fP] [\fB\-r\fP \fIrev2\fP | \fB\-D\fP \fIdate2\fP]] [\fIfiles.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: なにも変更しません。 .br 作業ディレクトリのファイルとソースリポジトリのリビジョンを .` "cvs diff" コマンドで比較できます。もし特定のリビジョンを指定しなければ、 ベースにしたリビジョンと比較されます。 標準の .B cvs コマンドのオプション .B \-r で比較の対象となるリビジョンを指定することもできます。 最後に、 .B \-r を 2 回 使うと、リポジトリの 2 つのリビジョン間の差分を取ることができます。 過去のリビジョンとの差分を取るために .B \-D オプションを指定することもできます。 .B \-r と .B \-D オプションは常に指定された中で 2 つまでを組み合わせられます。 .SP 他の使用可能なオプションについては .BR rcsdiff ( 1 ) を参照して下さい。 .SP ファイルを何も指定しないと、 .B diff は現ディレクトリ (そして、標準オプション .BR \-l を指定していなければ そのサブディレクトリ) の全てのファイルについて、 ソースリポジトリの対応するリビジョンと異なっているもの (つまり .I あなたが 変更したファイル) または指定されたリビジョンと 異なっているものについて、その差分を表示します .TP \fBexport\fP [\-\fBf\|lNnQq\fP] \fB\-r\fP \fIrev\fP\||\|\fB\-D\fP \fIdate\fP [\fB\-d\fP \fIdir\fP] [\fB\-k\fP \fIkflag\fP] \fImodule\fP.\|.\|. .I 以下が必要: リポジトリ。 .br .I 以下を変更: 現ディレクトリ。 .br このコマンドは .` "cvs checkout" の一種です。 \fBcvs\fP の管理ディレクトリを持たない \fImodule\fP のソースのコピーが必要なときに使います。 例えば、サイト外にソースを出す準備をするために .` "cvs export" を使うことができます。 このコマンドでは日付またはタグを指定することが \fI必要\fP です。 (\fB\-D\fP または \fB\-r\fP によって)。それによって出荷したソースを 確実に再構成できるようになります。 .SP 標準でないオプションは .` "\-d \fIdir\fP" (ソースをディレクトリ \fIdir\fP に書き込みます) と .` "\-N" (モジュールパスを短縮しません) のみです。 これらは .` "cvs checkout" の同名のオプションと同じ意味を持ちます。 .SP .B export が使われるときは .B \-kv オプションが有用です。 これによって .SM RCS キーワードが、どこか別のサイトで .B import が行われたときにリビジョン情報が失われないような形に展開されるように なります。 他の \fIkflag\fP を .` "cvs export" で使用することもできます。その説明は .BR co ( 1 ) にあります。 .TP \fBhistory\fP [\fB\-\fP\fIreport\fP] [\fB\-\fP\fIflags\fP] [\fB\-\fP\fIoptions args\fP] [\fIfiles\fP.\|.\|.] .I 以下が必要: .` "$CVSROOT/CVSROOT/history" ファイル。 .br .I 以下を変更: 何も変更しません。 .br \fBcvs\fP はヒストリファイルを管理しており、各 \fBcheckout\fP, \fBcommit\fP, \fBrtag\fP, \fBupdate\fP, \fBrelease\fP コマンドの使用を記録します。 .` "cvs history" を使って、この情報を色々なフォーマットで表示することができます。 .SP .I 警告: .` "cvs history" は .` "\-f", .` "\-l", .` "\-n", .` "\-p" を .SM 共通の COMMAND OPTIONS\c \&での説明とは異なる意味に使用します。 .SP いくつかのオプション (上で \fB\-\fP\fIreport\fP となっている部分) は どんな種類のレポートを生成するかを制御します: .TP 1i .B \ \ \ \ \ \ \-c 今までの各 \fBcommit\fP (つまりリポジトリの変更) についてレポートします。 .TP 1i \fB\ \ \ \ \ \ \-m\fP \fImodule\fP 特定の \fImodule\fP についてレポートします。(コマンドラインで複数の \fB\-m\fP を指定できます。) .TP 1i .B \ \ \ \ \ \ \-o チェックアウトされたモジュールについてレポートします。 .TP 1i .B \ \ \ \ \ \ \-T 全てのタグについてレポートします。 .TP 1i \fB\ \ \ \ \ \ \-x\fP \fItype\fP 特定のレコードタイプ \fIX\fP のセットを \fBcvs\fP ヒストリから 取り出します。タイプは 1文字で表され、組み合わせて指定できます。 以下のコマンドは単一のレコードタイプを持ちます: \fBcheckout\fP (タイプ `O')、 \fBrelease\fP (タイプ `F')、\fBrtag\fP (タイプ `T')。 \fBupdate\fP は 4つのレコードタイプのうちの 1つになります: `W' は 作業用のファイルのコピーが update で (それがリポジトリから無くなって いたために) 削除された場合です; `U' は作業ファイルがリポジトリから コピーされた場合です; `G' は必要なマージが無事に終った場合です; 'C' は マージが必要だが衝突が検出された場合 (手動でのマージが必要な場合) です。 また、\fBcommit\fP では 3つのレコードタイプのうちの 1つになります: `M' はファイルが変更された場合; `A' はファイルが最初に追加された場合; `R' はファイルが削除された場合です。 .TP 1i .B \ \ \ \ \ \ \-e 全て (全レコードタイプ); 以下を指定するのと等価です。 .` "\-xMACFROGWUT" .TP 1i \fB\ \ \ \ \ \ \-z\fP \fIzone\fP ヒストリレコードを出力する際に .I zone で指定されたタイムゾーンを使います。 .B LT というゾーン名はローカルタイムの意味になります。 数値によるオフセットは時分での UTC との時差を意味します。 例えば、 .B +0530 は 5 時間と 30 分だけ UTC より前 (つまり東側) の意味になります。 .PP .RS .5i \fB\-\fP\fIflags\fP と書かれた部分のオプションは、レポートする範囲を絞ります。 引数の指定はありません。 .RE .TP 1i .B \ \ \ \ \ \ \-a 全てのユーザのデータを表示します (デフォルトでは .` "cvs history" を実行しているユーザのみのデータを表示します)。 .TP 1i .B \ \ \ \ \ \ \-l 最後の変更のみ表示します。 .TP 1i .B \ \ \ \ \ \ \-w .` "cvs history" が実行されているのと同じ作業ディレクトリから行われた変更に関する レコードのみを表示します。 .PP .RS .5i \fB\-\fP\fIoptions args\fP と書かれた部分のオプションは引数に 基づいてレポート範囲を絞ります: .RE .TP 1i \fB\ \ \ \ \ \ \-b\fP \fIstr\fP 文字列 \fIstr\fP をモジュール名、ファイル名、リポジトリパスの いずれかに含むレコードに戻って表示します。 .TP 1i \fB\ \ \ \ \ \ \-D\fP \fIdate\fP \fIdate\fP 以降のデータを表示します。 .TP 1i \fB\ \ \ \ \ \ \-p\fP \fIrepository\fP 特定のソースリポジトリのデータを表示します (複数の \fB\-p\fP オプションを同じコマンド行で指定できます)。 .TP 1i \fB\ \ \ \ \ \ \-r\fP \fIrev\fP 個々の RCS ファイルに現れるリビジョンが \fIrev\fP で指定されたリビジョンまたはタグ以降であるレコードを表示します。 各 .SM RCS ファイルについてリビジョンまたはタグが検索されます。 .TP 1i \fB\ \ \ \ \ \ \-t\fP \fItag\fP \fItag\fP で指定されるタグがヒストリファイルに最後に 追加されてからのレコードを表示します。 このオプションは、 .SM RCS ファイルではなくヒストリファイルのみ参照する点で 上記の \fB-r\fP フラグと異なり、 より高速です。 .TP 1i \fB\ \ \ \ \ \ \-u\fP \fIname\fP \fIname\fP で指定されるユーザのレコードを表示します。 .PP .TP \fBimport\fP [\fB\-\fP\fIoptions\fP] \fIrepository vendortag releasetag\fP.\|.\|. .I 以下が必要: リポジトリ、ソース配布物のディレクトリ。 .br .I 以下を変更: リポジトリ。 .br .` "cvs import" を使うことで外部の供給元 (例えばソース・ベンダ) からのソース配布物 全体をあなたのソースリポジトリのディレクトリへ取り込めます。 最初のリポジトリの作成と、外部の供給元からのモジュールへの 大規模な更新の両方にこのコマンドを使うことができます。 .SP 引数 \fIrepository\fP で CVS ルートディレクトリ下のリポジトリ用 ディレクトリ名 (またはディレクトリへのパス) を与えます。 もしディレクトリが存在しないなら、\fBimport\fP が作成します。 .SP あなたのソースリポジトリで (前回の \fBimport\fP から) 変更された ソースへの更新に \fBimport\fP を使った場合、開発の 2 本のブランチで 衝突しているファイルについて警告します。 \fBimport\fP が指示するように、 .` "cvs checkout -j" を使って差分を調整できます。 .SP デフォルトでは、ある種のファイル名が .` "cvs import" で無視されます: .SM CVS 管理、または他の一般的なソース管理システムに関連する名前; パッチファイル、オブジェクトファイル、アーカイブファイル、 エディタのバックアップファイルのための一般的な名前; そして雑多なユーティリティの加工品であることを示すその他の名前。 無視されるファイルのリストの最新については、 (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SP 外部からのソースは第一レベルの .SM RCS ブランチ、デフォルトでは .` "1.1.1" に保存されます。 以降の更新は このブランチのリーフになります。 例えば、最初に import したソース集合からのファイルはリビジョン .` "1.1.1.1" になり、 次の import による更新でファイルはリビジョン .` "1.1.1.2" になり、以下同様に続きます。 .SP 最低で 3 つの引数が必要です。ソースの集合を識別するために \fIrepository\fP が必要です。\fIvendortag\fP はブランチ全体を示す タグになります (例えば .` "1.1.1" と対応します)。 .` "cvs import" を実行する度にリーフとしてできるファイルを 識別するために少なくとも一つの \fIreleasetag\fP も指定しなければ なりません。 .SP .B cvs の標準のコマンドオプションのうちの 1 つ \fB\-m\fP が利用可能です: ログメッセージを \fB\-m\fP で指定しないと、(\fBcommit\fP でのように) メッセージを 入力できるようにエディタが起動されます。 .SP さらに 3 つの特別なオプションがあります。 .SP .` "\-d" を使って、各ファイルの最終更新日時がチェックインの日付と時刻として 使われるよう指示できます。 .SP .` "\-b \fIbranch\fP" を使って第一レベルのブランチを .` "1.1.1" 以外に指定できます。 .SP .` "\-I \fIname\fP" を使って \fBimport\fP 中に無視されるべきファイル名を指定できます。 このオプションは繰り返して指定できます。 いかなるファイルも無視されない (デフォルトで無視されるものでも) ようにするには、 .` "\-I !" と指定します。 .TP \fBlog\fP [\fB\-l\fP] \fIrlog-options [files\fP\|.\|.\|.] .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 何も変更しません。 .br .I 同義語: .B rlog .br \fIfiles\fP のログ情報を表示します。 .` "cvs log" は .SM RCS ユーティリティの \fBrlog\fP を呼び出します。 .BR rlog ( 1 ) で説明されている全てのオプションが使用できます。 \fBrlog\fP のオプションの中でも有用なものとしては、以下のものがあります: ヘッダ (タグの定義を含むが、ログの大部分は省略される) のみ表示する \fB\-h\fP ; 特定のリビジョンまたはリビジョンの範囲でログを選択する \fB\-r\fP; そして特定の日時または時刻の範囲を選択する \fB\-d\fP が あります。完全な説明は .BR rlog ( 1 ) を参照して下さい。 このコマンドは .B \-l オプションが指定されていなければ、デフォルトで再帰的に働きます。 .TP \fBrdiff\fP [\fB\-\fP\fIflags\fP] [\fB\-V\fP \fIvn\fP] [\fB\-r\fP \fIt\fP|\fB\-D\fP \fId\fP [\fB\-r\fP \fIt2\fP|\fB\-D\fP \fId2\fP]] \fImodules\|.\|.\|.\fP .I 以下が必要: リポジトリ。 .br .I 以下を変更: 何も変更しません。 .br .I 同義語: .B patch .br 2 つのリリース間の .BR patch ( 1 ) ファイルを Larry Wall 氏のフォーマットで作成します。それは直接 .B patch プログラムに入力できるもので、古いリリースを新しいリリースに更新する ために使えます。 (これは直接リポジトリを参照するため、これに先立って .BR checkout する必要のない、数少ない \fBcvs\fP コマンドのうちの 1 つです。) 差分出力は標準出力デバイスに送られます。 (標準の \fB\-r\fP と \fB\-D\fP オプションを 使って) 1 つまたは 2 つのリビジョンまたは日時の任意の組合せを指定できます。 もしリビジョンまたは日時が 1 つしか指定されないと、 そのリビジョンまたは日時とその時点での .SM RCS ファイルの ``head'' リビジョンの差分がパッチファイルに反映されます。 .SP もしソフトウェアリリースへの影響が複数ディレクトリにわたるなら、 古いソースにパッチを当てる際、 .B patch が他のディレクトリに置かれたファイルを見つけられるように、 .B \-p オプションを .B patch コマンドに指定する必要があるかもしれません。 .SP \fB\-V\fP \fIvn\fP オプションを使うと、 .SM RCS のキーワードが \fIvn\fP で指定された .SM RCS のバージョンに合わせて展開されます (展開フォーマットは .SM RCS のバージョン 5 で変更されました)。 .SP 標準オプションの \fIflags\fP \fB\-f\fP、\fB\-l\fP が このコマンドで利用可能です。他にもいくつかの 特別なオプションフラグがあります: .SP .B \-s オプションを指定すると、パッチ出力が作られません。 代わりに、2 つのリリース間で変更または追加されたファイルの要約が 標準出力デバイスに送られます。 これは、例えば、2 つの日付またはリビジョンの間で、どのファイルが 変更されたかを調べるのに便利です。 .SP .B \-t オプションを指定すると、新しい方から 2 つのリビジョンの差分が 標準出力デバイスに送られます。これはファイルへの最後の変更が 何であったかを知るのに最適です。 .SP .B \-u オプションを指定すると、パッチ出力として新しい ``unidiff'' フォーマットを使って文脈差分とします。 .SP 希望するなら、 .B \-c を使って明示的に .` "diff \-c" 形式の文脈差分を指定できます (こちらがデフォルトです)。 .TP \fBrelease\fP [\fB\-dQq\fP] \fImodules\fP\|.\|.\|. .I 以下が必要: 作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ、ヒストリログ。 .br このコマンドは .` "cvs checkout' の効果を安全にキャンセルすることになっています。 .B cvs はファイルをロックしないので、厳密にはこのコマンドを使用する必要は ありません。 単に作業ディレクトリを削除しても構いません。 しかし忘れているかも知れない変更を失う危険があり、そして .B cvs ヒストリファイルには捨ててしまったチェックアウトの記録は残りません。 .SP .` "cvs release" を使うとこれらの問題を回避できます。 このコマンドは以下の点をチェックします: コミットされていない変更が存在しないこと、 \fBcvs\fP の作業ディレクトリの直上または内部から実行していること、 ファイルが記録されたリポジトリがモジュールデータベースに 定義されたリポジトリと同じであること。 .SP これらの条件が全て真なら .` "cvs release" は その実行記録 (意図的にチェックアウトを削除した証拠) を .B cvs のヒストリログに残します。 .SP \fB\-d\fP フラグを使ってソースの作業用コピーを \fBrelease\fP が 成功したら削除するように指示できます。 .TP \fBremove\fP [\fB\-lR\fP] [\fIfiles\|.\|.\|.\fP] .I 以下が必要: 作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br .I 同義語: .BR rm ", " delete .br このコマンドを使って、\fIfiles\fP をソースリポジトリから削除する つもりであることを宣言できます。大部分の .B cvs コマンドがそうであるように、 .` "cvs remove" は作業ディレクトリのファイルに作用し、リポジトリには直接には 作用しません。安全機構として、まず指定するファイルを作業ディレクトリ から削除することも必要になっています。 .SP リポジトリに .BR commit で変更を反映するまで、ファイルは実際には削除されません。 commit した時点で、ソースリポジトリの対応する .SM RCS ファイルが .` "Attic" ディレクトリ (これもソースリポジトリの中です) に .I 移動 されます。 .SP このコマンドはデフォルトで再帰的になっており、 物理的に削除された全てのファイルが次の .BR commit での削除されるようにスケジュールします。 .B \-l オプションを使うか、または実際に削除したいファイルのみを 指定することで、この再帰を抑制できます。 .TP \fBrtag\fP [\fB\-f\|alnRQq\fP] [\fB\-b\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP | \fB\-D\fP \fIdate\fP] \fIsymbolic_tag\fP \fImodules\|.\|.\|.\fP .I 以下が必要: リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B rfreeze .br このコマンドを使って、リポジトリ中の特定の、明示的に 指定されたソースバージョンにシンボリックタグを割り当てられます。 .` "cvs rtag" はリポジトリの内容に直接に作用します (これに先立って .BR checkout する必要はありません)。 作業ディレクトリの内容に基づいて タグを付けるバージョンを選択するには、代わりに .` "cvs tag" を使います。 .SP 一般に、タグ (しばしばソフトウェア配布物のシンボリックな 名前でもある) は削除されるべきではありません。 しかし完全に廃れてしまったシンボリックな名前を削除する場合 (例えば、 アルファリリースの場合など) の手段として、 .B \-d オプションが用意されています。 .SP .` "cvs rtag" はすでに存在するタグを移動しません。 しかしながら、\fB\-F\fP オプションが指定されると .` "cvs rtag" はそのファイルに既に存在する \fIsymbolic_tag\fP のインスタンスを 新しいリポジトリのバージョンへ移動します。 \fB\-F\fP オプションが無い場合、 .` "cvs rtag" を使ってすでにそのファイルに存在するタグを付けようとすると、 エラーメッセージが出力されます。 .SP \fB-b\fP オプションはタグを ``ブランチ'' タグにし、並行の、 独立した開発を可能にします。 これは以前にリリースしたソフトウェア配布物へのパッチを作成するのに 最も有用です。 .SP 標準の \fB\-r\fP と \fB\-D\fP オプションを使って、すでに特定の タグを含んでいるファイルのみにタグを付けることができます。 この方法はタグの名前を変えるのに使えるでしょう: 古いタグで指定されるファイルにのみタグを付け、 それから古いタグを削除すれば、確実に同じファイルで古いタグを 新しいタグで置き換えることができます。 .SP .B rtag はデフォルトで再帰的に実行し、引数で指定した \fImodules\fP の全てのサブディレクトリにタグをつけます。 この動作を トップレベルのディレクトリに制限するには標準の \fB\-l\fP オプションを 指定します。 また明示的に再帰を指定するには \fB\-R\fP を指定します。 .SP モジュールデータベースではタグが指定されたときに必ず実行される プログラムを指定できます。 よくある使い方は、興味を持っている グループに電子メールを送るというものです。もしそのプログラムを バイパスしたい場合は、標準の \fB\-n\fP オプションを使います。 .SP .B \-a オプションを使うと .` "Attic" の中の指定されたタグを含む削除されたファイルを .B rtag の対象にできます。 タグはそれらのファイルから削除され、開発の進展につれての シンボリックタグの再利用に便利になります (そしてファイルは以降の 配布物から削除されます)。 .TP \fBstatus\fP [\fB\-lRqQ\fP] [\fB\-v\fP] [\fIfiles\fP\|.\|.\|.] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: 何も変更しません。 .br \fIfiles\fP の現在の状態について、``sticky'' なタグ、 日付、\fB\-k\fP オプションを含む、ソースリポジトリに関する 簡潔なレポートを表示します。(``sticky'' オプションはリセットするまで .` "cvs update" がどう働くかを規定します。 .` "cvs update \-A\|.\|.\|." の説明を参照して下さい。) .SP このコマンドを用いて、作業用ソースディレクトリでの .` "cvs update" による潜在的な影響を予測することもできます。 もし \fIfiles\fP を明示的に指定しないと、\fBcvs\fP が 作業ディレクトリに置いた全てのファイルについてレポートが 表示されます。 この検索の範囲を (そのサブディレクトリではなく) カレントディレクトリ だけに制限するには、標準の \fB\-l\fP オプションフラグを使います。 \fB\-R\fP オプションによって、明示的に再帰的なステータスレポートを 指定することもできます。 .SP .B \-v オプションを指定すると .SM RCS ファイルのシンボリックタグも表示されるようになります。 .TP \fBtag\fP [\fB\-lQqR\fP] [\fB\-F\fP] [\fB\-b\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP | \fB\-D\fP \fIdate\fP] [\fB\-f\fP] \fIsymbolic_tag\fP [\fIfiles\fP\|.\|.\|.\|] .I 以下が必要: 作業ディレクトリ、リポジトリ。 .br .I 以下を変更: リポジトリ。 .br .I 同義語: .B freeze .br このコマンドは、作業ディレクトリに最も近いリポジトリのバージョンに シンボリックタグをつけるために使います。\fBrtag\fP を 使ったときのように、タグはリポジトリに直接つけられます。 .SP タグの使い方の一つは、プロジェクトのソフトウェア凍結日が やってきたときに開発中のソースの ``snapshot'' を記録するというものです。 凍結した日の後でバグが修正されたら、それらの変更されたリリースの 一部となるソースのみに再度タグをつける必要があります。 .SP シンボリックタグはどのファイルのどのリビジョンがソフトウェア配布物を 作成する際に使われたかを恒久的に記録する意味があります。 .BR checkout , .B export , .B update コマンドは、タグをつけたリリースと全く同じものを、リリースのタグが つけられて以降にファイルが変更、追加、削除されたかどうかを気にする ことなく、将来のいつでも取り出すことを可能にします。 .SP 標準の \fB\-r\fP と \fB\-D\fP オプションを使って、すでに特定の タグを含んでいるファイルのみにタグを付けることができます。 この方法はタグの名前を変えるのに使えます。 すなわち、 古いタグで指定されるファイルにのみタグを付け、 それから古いタグを削除すれば、確実に同じファイルで古いタグを 新しいタグで置き換えることができます。 .SP \fB\-r\fP または \fB\-D\fP フラグに加えて \fB\-f\fP フラグを 指定すると、コマンドラインで指定したファイルで古いタグを 持っていないか指定された日時に存在しなかったものにもタグを 付けます。 .SP デフォルト (\fB\-r\fP または \fB\-D\fP フラグが無い場合) では、 バージョンは明示的に指定されるのではなく、暗黙のうちに作業ファイルの ヒストリの \fBcvs\fP レコードから取られます。 .SP .` "cvs tag \-d \fIsymbolic_tag\fP\|.\|.\|." とすると、指定したシンボリックタグが追加されるのではなく .I 削除 されます。\fI警告\fP: タグを削除する前にその根拠をしっかり確認して下さい。 これは効率的に一部の履歴情報を捨てますが、後になってその情報が重要だったと 判明するかも知れないからです。 .SP .` "cvs tag" はすでに存在するタグを移動しません。 しかしながら、\fB\-F\fP オプションが指定されると .` "cvs tag" はそのファイルに既に存在する \fIsymbolic_tag\fP のインスタンスを 新しいリポジトリのバージョンへ移動します。 \fB\-F\fP オプションが無い場合、 .` "cvs tag" を使って すでにそのファイルに存在するタグを付けようとすると エラーメッセージが出力されます。 .SP \fB-b\fP オプションはタグを ``ブランチ'' タグにし、並行して、 独立した開発を可能にします。 これは以前にリリースしたソフトウェア配布物へのパッチを作成するために 最も有効です。 .SP 通常、 .B tag はサブディレクトリに渡って再帰的に実行します。これは 標準の \fB\-l\fP オプションを使って抑制できます。 明示的に再帰を指定するには \fB\-R\fP を使います。 .TP \fBupdate\fP [\fB\-Adf\|lPpQqR\fP] [\fB\-d\fP] [\fB\-r\fP \fItag\fP|\fB\-D\fP \fIdate\fP] \fIfiles\|.\|.\|.\fP .I 以下が必要: リポジトリ、作業ディレクトリ。 .br .I 以下を変更: 作業ディレクトリ。 .br あなたが共有のリポジトリから私的なソースのコピーを作成するために .B checkout を実行した後も、別の開発者は共有のソースへの変更を続けるでしょう。 時々、開発過程で都合のいいときに、作業ディレクトリ内から .B update コマンドを使うことで、 最後に .B checkout または .BR update してからソースリポジトリに登録された変更を、あなたの変更と 融合させることができます。 .SP .B update は進行状況をファイルごとに 1 行表示することで知らせ続けます。 各行の先頭には以下の .` "U A R M C ?" のいずれか 1 文字があり、ファイルの状態を示しています: .TP 1i \fBU\fP \fIfile\fP file はリポジトリに関して \fI最新に\fP なりました。 これはリポジトリには存在するがあなたのソースには無いもの、 およびあなたは変更していないけれどもリポジトリの 最新リビジョンでは無いものに関して行われます。 .TP 1i \fBA\fP \fIfile\fP file はソースのあなたの私的なコピーに \fI追加\fP されたもので、 file に対して .` "cvs commit" を実行したときに .SM RCS ソースリポジトリに追加されます。 これは当該ファイルを commit する必要があるという助言です。 .TP 1i \fBR\fP \fIfile\fP これはソースのあなたの私的なコピーから file が \fI削除\fP されており、 file に対して .` "cvs commit" を実行すると .SM RCS ソースリポジトリから削除されることを示します。 これは当該ファイルを commit する必要があるという助言です。 .TP 1i \fBM\fP \fIfile\fP あなたの作業ディレクトリの file は \fI変更\fP されています。 .` "M" は作業中のファイルについて 2 つの状態のうちの 1 つを示します: リポジトリ中の対応するファイルは変更されておらず、あなたのファイルは 最後に見たときのままになっている。 または、あなたのコピー同様 リポジトリのものも変更されているが、それらの変更は 衝突することなく無事にあなたの作業ディレクトリに \fI融合 (merge)\fP されました。 .TP 1i \fBC\fP \fIfile\fP \fIfile\fP へのあなたの変更とソースリポジトリからの変更との 融合を試みる間に \fI衝突 (conflict)\fP が検出されました。 現在 \fIfile\fP (あなたの作業ディレクトリのコピー) は .BR rcsmerge ( 1 ) コマンドを 2 つのバージョンに適用した出力になっています。 変更されていない あなたのファイルのコピーも作業ディレクトリに、 `\fB.#\fP\fIfile\fP\fB.\fP\fIversion\fP' という名前で置かれます。 ここで .I version は あなたの変更したファイルの出発点となった .SM RCS リビジョンです。 (ある種のシステムでは、 \& .` ".#" で始まるファイルは何日かアクセスされないと自動的に削除されるので 注意して下さい。もし元のファイルのコピーを取っておくつもりなら、 名前を変えておくのが良いでしょう。) .TP 1i \fB?\fP \fIfile\fP \fIfile\fP が あなたの作業ディレクトリにありますが、 ソースリポジトリのどれとも対応しておらず、 \fBcvs\fP が無視するファイルのリストにもありません (\fB\-I\fP オプションの説明を参照して下さい)。 .PP .RS .5i .SP .B \-A オプションを用いて sticky なタグ、日付、 .B \-k オプションをリセットできます。(\fB\-r\fP, \fB\-D\fP, \fB\-k\fP オプションの いずれかを使って作業ファイルのコピーを得ると、 \fBcvs\fP は対応するタグ、日付、\fIkflag\fP を記憶し、 以降の update で それを使い続けます。 \fB\-A\fP オプションを使って \fBcvs\fP にそれらの指定を忘れさせることで、ファイルの ``head'' バージョンを取り出します)。 .SP \fB\-j\fP\fIbranch\fP オプションは、変更結果のリビジョンと ベースにしたリビジョンの間での変更をマージします (例えば、もしタグがブランチを指しているなら、 .B cvs は、そのブランチで行われた全ての変更をあなたの作業ファイルにマージします)。 .SP 2 つの \fB-j\fP オプションを指定すると、 .B cvs は 2 つの それぞれのリビジョン間での変更をマージします。 これは特定の変更を作業ファイルから ``削除'' するのに使えます。 例えば、ファイル foo.c がリビジョン 1.6 をベースにしていて、 1.3 と 1.5 の間で行われた変更を削除したいなら、次のようにします: .SP .in +1i .ft B .nf example% cvs update -j1.5 -j1.3 foo.c # 順番に注意... .fi .ft P .in -1i .SP 加えて、各 \fB-j\fP オプションにはオプションで、ブランチと使う場合に、 日付指定を含めることが可能で、選択するリビジョンを指定した 日付の範囲内に制限できます。 オプションの日付はコロン (:) をタグに付けることで指定します。 .SP .in +1i .ft B .nf -jSymbolic_Tag:Date_Specifier .fi .ft P .in -1i .SP .B \-d オプションを使うと、もし作業ディレクトリに無いディレクトリが リポジトリにあれば作成します。(通常、update は作業ディレクトリに すでに登録されているディレクトリとファイルのみに働きます。) これは最初の \fBcheckout\fP 以降に作成されたディレクトリを 更新するのに有用です。しかし不幸にも副作用があります。 もし作業ディレクトリを作る際に慎重にリポジトリ中の特定の ディレクトリを除いた (モジュール名を使ったか明示的に必要な ファイルとディレクトリをコマンドラインで指定したかのいずれかで) とすると、 .B \-d で更新するとそれらの不要かも知れないディレクトリができてしまいます。 .SP \fB\-I\fP \fIname\fP を使うと、update の際、名前が \fIname\fP に符合する (作業ディレクトリの) ファイルを無視します。 コマンドラインで \fB\-I\fP を 2 回以上指定することで、 複数の無視するファイルを指定できます。 デフォルトで、\fBupdate\fP はあるパターンに名前がマッチするファイルを 無視します; 無視されるファイル名の最新リストについては、 (このマニュアルページの関連項目の節に記述してあるように) Cederqvist 著のマニュアルを参照して下さい。 .SP いずれのファイルも無視しないようにするには .` "\-I !" を使います。 .SP 標準の \fBcvs\fP コマンドオプション \fB\-f\fP, \fB\-k\fP, \fB\-l\fP, \fB\-P\fP, \fB\-p\fP, \fB\-r\fP も \fBupdate\fP で使用可能です。 .RE .SH "関連ファイル" より詳細な .B cvs サポートファイルの情報については .BR cvs ( 5 ) を参照して下さい。 .LP .I ホームディレクトリのファイル: .TP \&.cvsrc .B cvs の初期化ファイル。このファイルの行は各 .B cvs コマンドのデフォルトのオプションの指定に使えます。例えば .` "diff \-c" と言う行は .` "cvs diff" に対して、コマンドラインで渡されたオプションに、常に .B \-c オプションが加えられて渡されることを指定します。 .TP \&.cvswrappers リポジトリのファイル CVSROOT/cvswrappers で指定されている -ものに加えて使用されるラッパーを指定します。 +ものに加えて使用されるラッパを指定します。 .LP .I 作業ディレクトリのファイル: .TP CVS \fBcvs\fP 管理ファイルのディレクトリ。 .I 削除してはいけません。 .TP CVS/Entries 作業ディレクトリのファイルのリストと状態。 .TP CVS/Entries.Backup .` "CVS/Entries" のバックアップ。 .TP CVS/Entries.Static フラグ: .` "cvs update" でそれ以上エントリを追加しません。 .TP CVS/Root チェックアウトしたときのリポジトリ ( .SM CVSROOT ) 位置へのパス名。 .SM CVSROOT 環境変数が設定されていない場合、このファイルが代わりに使用されます。 このファイルの内容と .SM CVSROOT 環境変数が異なっていると警告メッセージが出されます。 .SM CVS_IGNORE_REMOTE_ROOT 環境変数が設定されていると、このファイルは上書きされることがあります。 .TP CVS/Repository ソースリポジトリ中の対応するディレクトリへのパス名。 .TP CVS/Tag ディレクトリ毎の ``sticky'' なタグまたは日付情報を保持しています。 このファイルは .B \-r か .B \-D を .B checkout または .B update コマンドに指定して、ファイルが指定されなかったときに作成/更新されます。 .TP CVS/Checkin.prog .` "cvs commit" 時に実行するプログラム名。 .TP CVS/Update.prog .` "cvs update" 時に実行するプログラム名。 .LP .I ソースリポジトリ中のファイル: .TP $CVSROOT/CVSROOT リポジトリ全体の管理ファイルのディレクトリ。 .TP CVSROOT/commitinfo,v .` "cvs commit" のリクエストを選別するプログラムを登録します。 .TP CVSROOT/cvswrappers,v ファイルをリポジトリにチェックインそしてリポジトリから チェックアウトするときに使用される .B cvs -ラッパーコマンドを登録します。 -ラッパーはファイルまたはディレクトリが CVS で入出力される際に +ラッパコマンドを登録します。 +ラッパはファイルまたはディレクトリが CVS で入出力される際に 処理を行うことを可能にします。使い道はいろいろありますが、 その一つとして、C のファイルをチェックインする前に再フォーマットして、 リポジトリ中のコードの見た目を揃えるというものがあります。 .TP CVSROOT/editinfo,v .` "cvs commit" のログエントリの編集/確認用プログラムを登録します。 .TP CVSROOT/history \fBcvs\fP 処理のログファイル。 .TP CVSROOT/loginfo,v .` "cvs commit" のログエントリをパイプで渡すプログラムを登録します。 .TP CVSROOT/modules,v このリポジトリ中のモジュールを定義します。 .TP CVSROOT/rcsinfo,v .` "cvs commit" 操作中に使用するテンプレートへのパス名を登録します。 .TP CVSROOT/taginfo,v .` "cvs tag" と .` "cvs rtag" での確認/ログ採集のためのプログラムを登録します。 .TP MODULE/Attic 削除されたソースファイルのためのディレクトリ。 .TP #cvs.lock .SM RCS ソースリポジトリに微妙な変更を行っているときに .B cvs が作成するロックディレクトリ。 .TP #cvs.tfl.\fIpid\fP リポジトリの一時的なロックファイル。 .TP #cvs.rfl.\fIpid\fP 読みだしロック。 .TP #cvs.wfl.\fIpid\fP 書き込みロック。 .SH "環境変数" .TP .SM CVSROOT .B cvs ソースリポジトリのルートへのフルパス名 ( .SM RCS ファイルが保存されている場所) を指定します。 この情報は大部分のコマンドの実行で \fBcvs\fP から参照できなければなりません。 もし .SM CVSROOT が設定されていないか、それを上書き指定したい場合は、 コマンドライン上で与えることができます: .` "cvs \-d \fIcvsroot cvs_command\fP\|.\|.\|." もし \fBcvs\fP バイナリのコンパイル時に正しいパスが指定されているなら .SM CVSROOT を設定しなくて構いません。 .` "cvs \-v" でコンパイル時に指定されて組み込まれている全てのパス名が表示されます。 .TP .SM CVSREAD これがセットされていると、 .B checkout と .B update は作業ディレクトリのファイルを読みだし専用にするべく努力します。 これがセットされていないときは、デフォルトでは作業ファイルの 変更が許可されます。 .TP .SM RCSBIN .BR co ( 1 ) や .BR ci ( 1 ) といった .SM RCS のプログラムが置かれている場所へのフルパス名を指定します。 セットされないと、コンパイル時に設定された値が使用されます。 .` "cvs \-v" で表示される内容を参照して下さい。 .TP .SM CVSEDITOR .BR commit 中にログメッセージの記録に使われるプログラムを指定します。 設定されていないと、 .SM EDITOR 環境変数が代わりに使われます。 もし .SM EDITOR も設定されていないなら、デフォルトは .BR /usr/ucb/vi です。 .TP .SM CVS_IGNORE_REMOTE_ROOT この変数がセットされていると .B cvs は CVS/Root ファイル中のリモートのリポジトリへの参照を全て 無視します。 .TP .SM CVS_RSH .B cvs サーバを開始するときに使用するリモートシェルコマンドの 名前を決定します。 この変数が設定されていない場合は .` "rsh" が使用されます。 .TP .SM CVS_SERVER .B cvs サーバコマンドの名前を指定します。 この変数が設定されていない場合は .` "cvs" が使用されます。 .TP .SM CVSWRAPPERS .` "cvswrappers" スクリプトは、 リポジトリの .SM CVSROOT/cvswrappers とユーザのホームディレクトリの ~/.cvswrappers に -含まれるデフォルトのラッパーに加え、 +含まれるデフォルトのラッパに加え、 変数 .SM CVSWRAPPERS -を参照して、ラッパーファイルの名前を決定します。 +を参照して、ラッパファイルの名前を決定します。 .SH "作者" .TP Dick Grune .B comp.sources.unix にポストされ、1986年 12月のリリース volume6 に収められたオリジナルの .B cvs シェルスクリプト版の作者。 .B cvs の衝突を解決するアルゴリズムの大部分を作成しました。 .TP Brian Berliner .B cvs プログラム自身のコーディングとデザインを 1989年 4月に、Dick によるオリジナルをベースにして行いました。 .TP Jeff Polk Brian を助けて .B cvs のモジュールとベンダ・ブランチのサポートをデザインしました。 そして .BR checkin ( 1 ) シェルスクリプト ( .` "cvs import" の祖先) の作者でもあります。 .SH "関連項目" CVS の最も包括的なマニュアルは Per Cederqvist らによる Version Management with CVS です。 システムによっては、 .B info cvs コマンドで閲覧できたり、 cvs.ps (postscript)、cvs.texinfo (texinfo のソース)、cvs.html が 利用可能かもしれません。 .SP CVS の更新、ドキュメントに関するさらなる情報、 CVS 関連のソフトウェア、CVS の開発等については、下記をご覧ください: .in +1i .B http://www.cyclic.com .B http://www.loria.fr/~molli/cvs-index.html .in -1i .SP .BR ci ( 1 ), .BR co ( 1 ), .BR cvs ( 5 ), .BR cvsbug ( 8 ), .BR diff ( 1 ), .BR grep ( 1 ), .BR patch ( 1 ), .BR rcs ( 1 ), .BR rcsdiff ( 1 ), .BR rcsmerge ( 1 ), .BR rlog ( 1 ). .SH 日本語訳 野首 寛高(h-nokubi@nmit.mt.nec.co.jp): FreeBSD 用に翻訳 .br 酒井 淳嗣(sakai@jp.freebsd.org): FreeBSD 版の校正 diff --git a/ja_JP.eucJP/man/man1/perl.1 b/ja_JP.eucJP/man/man1/perl.1 index 845f6985ec..f16e794d1f 100644 --- a/ja_JP.eucJP/man/man1/perl.1 +++ b/ja_JP.eucJP/man/man1/perl.1 @@ -1,5933 +1,5933 @@ .rn '' }` .\" jpman %Id: perl.1,v 1.5 1997/10/11 07:57:22 horikawa Stab % ''' %RCSfile: perl.1,v %%Revision: 1.3.2.1 %%Date: 1997/10/12 08:11:42 % ''' ''' %Log: perl.1,v % ''' Revision 1.3.2.1 1997/10/12 08:11:42 jmg ''' MFC: spelling fixes ''' ''' Revision 1.4 1997/08/30 12:22:46 jmg ''' fix a few spelling changes ''' ''' Submitted by: Josh Gilliam ''' ''' Closes PR's: 4429, 4431-4438 ''' ''' PS: He has agreed to submit all contrib fixes back to the original author. ''' ''' Revision 1.3 1996/10/05 22:26:23 wosch ''' delete doubled words, e.g.: "the the" -> "the" ''' ''' Revision 1.2 1994/10/27 23:16:52 wollman ''' Convince Perl to that is is part of the system, as /usr/bin/perl (binary) ''' and /usr/share/perl (library). The latter was chosen as analogous to other ''' directories already present in /usr/share, like /usr/share/groff_font and ''' (particularly) /usr/share/mk. ''' .\" Revision 1.1.1.1 1994/09/10 06:27:36 gclarkii .\" Initial import of Perl 4.046 bmaked .\" .\" Revision 1.1.1.1 1993/08/23 21:29:37 nate .\" PERL! .\" ''' Revision 4.0.1.6 92/06/08 15:07:29 lwall ''' patch20: documented that numbers may contain underline ''' patch20: clarified that DATA may only be read from main script ''' patch20: relaxed requirement for semicolon at the end of a block ''' patch20: added ... as variant on .. ''' patch20: documented need for 1; at the end of a required file ''' patch20: extended bracket-style quotes to two-arg operators: s()() and tr()() ''' patch20: paragraph mode now skips extra newlines automatically ''' patch20: documented PERLLIB and PERLDB ''' patch20: documented limit on size of regexp ''' ''' Revision 4.0.1.5 91/11/11 16:42:00 lwall ''' patch19: added little-endian pack/unpack options ''' ''' Revision 4.0.1.4 91/11/05 18:11:05 lwall ''' patch11: added sort {} LIST ''' patch11: added eval {} ''' patch11: documented meaning of scalar(%foo) ''' patch11: sprintf() now supports any length of s field ''' ''' Revision 4.0.1.3 91/06/10 01:26:02 lwall ''' patch10: documented some newer features in addenda ''' ''' Revision 4.0.1.2 91/06/07 11:41:23 lwall ''' patch4: added global modifier for pattern matches ''' patch4: default top-of-form format is now FILEHANDLE_TOP ''' patch4: added $^P variable to control calling of perldb routines ''' patch4: added $^F variable to specify maximum system fd, default 2 ''' patch4: changed old $^P to $^X ''' ''' Revision 4.0.1.1 91/04/11 17:50:44 lwall ''' patch1: fixed some typos ''' ''' Revision 4.0 91/03/20 01:38:08 lwall ''' 4.0 baseline. ''' ''' .de Sh .br .ne 5 .PP \fB\\$1\fR .PP .. .de Sp .if t .sp .5v .if n .sp .. .de Ip .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. ''' ''' Set up \*(-- to give an unbreakable dash; ''' string Tr holds user defined translation string. ''' Bell System Logo is used as a dummy character. ''' .tr \(*W-|\(bv\*(Tr .ie n \{\ .ds -- \(*W- .if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch .if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch .ds L" "" .ds R" "" .ds L' ' .ds R' ' 'br\} .el\{\ .ds -- \(em\| .tr \*(Tr .ds L" `` .ds R" '' .ds L' ` .ds R' ' 'br\} .TH PERL 1 "\*(RP" .UC .SH 名称 perl \- 実用的抽出とレポートのための言語 .SH 書式 .B perl [options] filename args .SH 解説 .I perl は、任意のテキストファイルを走査し、そこから情報を取り出し、情報に基づ いたレポートを出力するために最適化されたインタプリタ言語です。 また、多くのシステム管理作業に適した言語でもあります。 .I perl は美しい (小さい、エレガント、最小) というよりは、むしろ実用的 (使いやすい、効率的、完全) であることをめざしています。 .I perl は、C, \fIsed\fR, \fIawk\fR, and \fIsh\fR, の最も良いところを 組み合わせてある (作者の意向としては、でありますが) ので、これらの言語に なじみのある人には、容易に使えるでしょう。 (言語歴史学者なら、\fIcsh\fR, Pascal, そして BASIC-PLUS の痕跡にさえも 気がつくでしょう。) 式の書式は、C のものに極めて似ています。 他の多くの UNIX ユーティリティと異なり、 .I perl は、データのサイズを勝手に制限するようなことはなく (メモリのある限りです)、 ファイル全体を一つの文字列として読み込んでしまえます。 再帰の深さには制限がありません。連想配列で使われるハッシュテーブルは、 パフォーマンスの低下を防ぐため、必要に応じて大きくなります。 .I perl は、大量のデータを非常に迅速に走査する洗練されたパターンマッチ テクニックを使います。 テキスト走査に最適化されてはいますが、 .I perl はバイナリデータも扱うこともできて、(dbm が使えるなら) 連想配列に似た dbm ファイルを作れます。 setuid .I perl スクリプトは、多くの馬鹿らしいセキュリティホールを防ぐデータフロー追跡 機構により、C のプログラムより安全です。 普通なら \fIsed\fR, \fIawk\fR, \fIsh\fR を使うような問題で、その能力を 越えていたり、もう少し速く走らせなければならなかったり、 くだらないことを C で書きたくないような場合に .I perl がぴったりです。 既存の .I sed や .I awk スクリプトを .I perl スクリプトにする変換プログラムもあります。 さあ、宣伝はこれで十分でしょう。 .PP まず始めに、 .I perl 次の場所からスクリプトを探します。 .Ip 1. 4 2 コマンドライン上の .B \-e スイッチで指定された行。 .Ip 2. 4 2 コマンドライン上で、最初に指定されたファイルの内容。 (#! の表記をサポートするシステムは、インタプリタをこうして起動します) .Ip 3. 4 2 標準入力から暗黙のうちに読み込まれます。これは、ファイル名の指定が一つ もない場合にだけ働きます。\*(-- .I 標準入力 スクリプトに引数を渡すには、スクリプト名として明示的に \- を 指定しなければなりません。 .PP スクリプトを見つけると、 .I perl は内部形式にコンパイルし、スクリプトが文法的に正しければ それを実行します。 .Sh "オプション" 注意: 最初にこのセクションを読んでも意味がわからないかもしれません。 簡単なリファレンスとして前半部分になっています。 .PP 一文字オプションは、次に続くオプションとくっつけてもかまいません。 #! 構造を使うスクリプトを起動する際には一つの引数しか許されないの で、特に便利です。 例: .nf .ne 2 #!/usr/bin/perl \-spi.bak # \-s \-p \-i.bak と同じ .\|.\|. .fi 以下のオプションがあります: .TP 5 .BI \-0 数字 レコードセパレータ ($/) を 8 進数で指定します。 数字がないと、ヌルキャラクタがセパレータになります。 他のコマンドラインスイッチは、前に置くか、もしくは数字の後に続けます。 例えば、ヌル文字を終端としたファイル名を表示可能なバージョンの .I find なら、このように書けます。 .nf find . \-name '*.bak' \-print0 | perl \-n0e unlink .fi 00 は特殊な値で、 .I perl はファイルをパラグラフモードで読み込みます。 0777 という値を使うと、この値の文字はないので、ファイル全体を 読み込みます。 .TP 5 .B \-a .B \-n や .BR \-p オプションと一緒に用いて、オートスプリットモードを ON にします。 .B \-n や .BR \-p オプションで自動的に生成される while ループの内側の 最初のところで、@F 配列に対して暗黙の split コマンドが行なわれます。 .nf perl \-ane \'print pop(@F), "\en";\' は、次の例と同等になります。 while (<>) { @F = split(\' \'); print pop(@F), "\en"; } .fi .TP 5 .B \-c .I perl スクリプトの文法をチェックし、実行せずに終了します。 .TP 5 .BI \-d perl デバッガのもとでスクリプトを実行します。 デバッグのセクションを参照して下さい。 .TP 5 .BI \-D 数字 デバッグフラッグをセットします。 スクリプトがどのように実行されるかを見るには、 .BR \-D14 を使います。 (これはデバッグ機能を .IR perl に組み込んでコンパイルした時にのみ動作します。) \-D1024 も有用な値で、コンパイルされた文法ツリーをリストします。 \-D512 を使うと、コンパイルされた正規表現を出力します。 .TP 5 .BI \-e " コマンドライン" 一行スクリプトを入力する場合に使えます。 複数行スクリプトを組み立てるには、複数の .B \-e コマンドを指定すればできます。 .B \-e が与えられると、 .I perl は引数のリストの中からスクリプトファイル名を探しません。 .TP 5 .BI \-i 拡張子 <> 構造で処理されるファイルをその場で修正することを指定します。 入力ファイルをリネームし、出力ファイルを元の名前でオープンし、出力ファイルを print 文のデフォルト出力にすることで処理されます。 拡張子が与えられれば、バックアップファイルの名前として元のファイル名に その拡張子を加えたものが使われます。 拡張子が与えられなければ、バックアップファイルは作成されません。 \*(L"perl \-p \-i.bak \-e "s/foo/bar/;" .\|.\|. \*(R" を実行することは、 次のスクリプトと同じです。 .nf .ne 2 #!/usr/bin/perl \-pi.bak s/foo/bar/; これは以下のものとも同等になります。 .ne 14 #!/usr/bin/perl while (<>) { if ($ARGV ne $oldargv) { rename($ARGV, $ARGV . \'.bak\'); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # 元の名前のファイルに出力する } select(STDOUT); .fi ただし、 .B \-i を用いた方法では、ファイル名が変更された時刻を知るために $ARGV と $oldargv を 比較する必要がないという点が異なります。 実際にはファイルハンドルとして ARGVOUT がセレクトされて使われます。 .I STDOUT がデフォルト出力のファイルハンドルとして保存され、 ループのあとで戻されることに注意して下さい。 .Sp 入力ファイルすべてに追加を行なう場合や、行番号をリセットしたりする場合、 各入力ファイルの終わりを知るために `eof' を使うことができます。 (eof の例を参照して下さい) .TP 5 .BI \-I ディレクトリ .B \-P と一緒に用いて C プリプロセッサにインクルードファイルの位置を 知らせます。デフォルトでは、/usr/include と /usr/lib/perl を検索します。 .TP 5 .BI \-l 8進数 行末処理を自動的に行ないます。これには二つの効果があります。 まず、 .B \-n や .B \-p と共に使われることで、行ターミネータを自動的に除きます。 二つ目は、$\e が、 .I 8進数 をセットし、print 文がすべて最後に行末文字をつけるということです。 .I 8進数 が省略された場合は、$\e に $/ の現在の値をセットします。 -例えば、行を 80 コラムに切り揃えるためには: +例えば、行を 80 桁に切り揃えるためには: .nf perl -lpe \'substr($_, 80) = ""\' .fi $\e = $/ という代入はコマンドラインスイッチが処理される時に 行なわれるので、 .B \-l スイッチに .B \-0 が続くときは、入力レコードセパレータと出力レコードセパレータが 異なることもあり得るということに注意して下さい。 .nf gnufind / -print0 | perl -ln0e 'print "found $_" if -p' .fi これは、$\e に改行をセットし、$/ にはヌル文字をセットします。 .TP 5 .B \-n スクリプトの前後に下に示すループがあるものとして .I perl を起動します。こうすると、引数のファイル全部について \*(L"sed \-n\*(R" または \fIawk\fR と同じような繰り返しが行なわれます: .nf .ne 3 while (<>) { .\|.\|. # ここにスクリプトが来ます } .fi デフォルトで入力行の出力はされないことに注意して下さい。 出力したければ .B \-p を参照して下さい。 以下は、1 週間より古いファイルすべてを削除する効率的な方法です。 .nf find . \-mtime +7 \-print | perl \-nle \'unlink;\' .fi この場合、ファイルが見つかるたびにプロセスを開始する必要がないので、 find の \-exec スイッチを使うより速くなります。 .TP 5 .B \-p スクリプトの前後に下に示すループがあるものとして .I perl を起動します。こうすると、引数のファイル全部について \fIsed\fR と同じような繰り返しが行なわれます: .nf .ne 5 while (<>) { .\|.\|. # ここにスクリプトが来ます } continue { print; } .fi 入力行は自動的に出力されることに注意して下さい。 出力を抑制したければ、 .B \-n スイッチを使って下さい。 .B \-p は、 .B \-n スイッチに優先します。 .TP 5 .B \-P .IR perl によるコンパイルの前に C プリプロセッサを通します。 (perl のコメントも cpp の命令も # の文字で始まるので、 コメントを C プリプロセッサが理解する単語、例えば \*(L"if\*(R" や \*(L"else\*(R" や \*(L"define\*(R" で始めてはなりません。) .TP 5 .B \-s コマンドライン上で、スクリプト名とファイル名の引数 (または \-\|\-) の間にある各スイッチについて基本的な解析を行ないます。 スイッチが見つかると、@ARGV から除かれ、対応する変数を .I perl スクリプト内でセットします。 以下のスクリプトでは、\-xyz スイッチをつけてスクリプトを起動したとき だけ、\*(L"true\*(R" を出力します。 .nf .ne 2 #!/usr/bin/perl \-s if ($xyz) { print "true\en"; } .fi .TP 5 .B \-S スクリプトを探すのに、環境変数 PATH を用います (スクリプト名が / で始まらないかぎり) 。 通常は、#! をサポートしないマシンにおいて #! を エミュレートするために用いられます。 次のような使い方です: .nf #!/usr/bin/perl eval "exec /usr/bin/perl \-S $0 $*" if $running_under_some_shell; .fi システムは 1 行目を無視し、スクリプトを /bin/sh に渡します。 /bin/sh は .I perl スクリプトをシェルスクリプトとして実行しようとします。シェルは 2 行目 を通常のシェルコマンドとして実行し、perl インタプリタを起動する ことになります。 システムによっては $0 は必ずしもフルパス名にならないので、 .B \-S を用いて .I perl に必要ならばスクリプトを探すように指示します。 .I perl がスクリプトを見つけたあと、解析を行ないますが、変数 $running_under_some_shell が真になることはないので、2 行目を無視します。 ファイル名などに含まれるスペースを正しく扱うには、$* よりも ${1+"$@"} の方がよいでしょうが、csh が解釈する場合には動作しません。 csh ではなく sh で起動するには、あるシステムでは #! 行を、perl で 無視されるコロンのみに書き換える必要があるかもしれません。その他の システムではこの方法は使えず、次のように、csh, sh, perl のどの下で も動作するような、とてもまわりくどい方法をとる必要があります: .nf .ne 3 eval '(exit $?0)' && eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -S $0 $argv:q' if 0; .fi .TP 5 .B \-u スクリプトのコンパイルの後、 .I perl はコアダンプします。 このコアダンプから、`undump' プログラム(提供していません)を用いて 実行可能ファイルに変換できます。 こうすると、ディスク消費が増えるかわりに (実行ファイルを strip すれば 最小にできます)、スタートアップが速くなります。 (しかし、私のマシンでは "hello world" の実行形式が約 200K の大きさ になります。) 実行形式を set-id プログラムとして走らせるのなら、通常の perl ではなく 多分 taintperl を用いてコンパイルすべきです。 ダンプする前に実行したいスクリプトがある場合は、代わりに dump 演算子を 使って下さい。 注意 : undump が使えるかどうかはプラットフォームに依存するので、perl の 移植によっては利用できないものもあるかもしれません。 .TP 5 .B \-U 安全でない操作を可能にします。 現在の所、\*(L"安全でない\*(R" 操作とは、スーパユーザ権限での 実行時にディレクトリを unlink すること、および汚れチェックで 警告が出るような setuid プログラムを走らせることだけです。 .TP 5 .B \-v .I perl のバージョンとパッチレベルを出力します。 .TP 5 .B \-w 一度だけ出てくる識別子、セットする前に使用されるスカラ変数に対して、 警告を出します。 サブルーチンが再定義されたとき、定義されていないファイルハンドルの参照 があるとき、リードオンリーでオープンしたファイルハンドルへ書き込もうと したときにも警告を出します。数値ではなさそうな値に == を使ったときや、 サブルーチンが 100 回以上再帰したときにも警告を出します。 .TP 5 .BI \-x ディレクトリ スクリプトがメッセージに埋め込まれていることを .I perl に知らせます。#! で始まり、"perl" という文字列を含む最初の行が現れる までは、ゴミとして無視されます。 その行に指定した意味のあるスイッチはすべて適用されます (ただし通常の #! 処理と同じく、スイッチのかたまり一つだけです)。 ディレクトリ名を指定すると、perl はスクリプトを実行する前にその ディレクトリに移ります。 .B \-x スイッチは、先頭のゴミを捨てるだけです。 スクリプトの後にゴミがある場合は、スクリプトは _\|_END_\|_ で終わらせなければなりません (望むなら、スクリプトで後ろのゴミの一部 または全部をファイルハンドル DATA 経由で処理することが可能です) 。 .Sh "データの型とオブジェクト" .PP .I perl には 3 種類のデータ型が有ります: スカラ、スカラ配列、 および連想配列です。 通常の配列は添え字が数字ですが、連想配列の場合は文字列です。 .PP perl における演算や値の解釈は、演算や値のコンテキスト(文脈)からの要求 にしばしば依存します。 主なコンテキストは三つ: すなわち文字列、数値、配列です。 演算の中には、配列を要求するコンテキストでは配列を、そうでなければ スカラ値を返すものもあります。 (そのような演算子についてはドキュメント内のその演算子のところに 記載されています。) スカラ値を返す演算子は、コンテキストが文字列あるいは 数値のどちらを要求しているかは考慮しませんが、スカラ変数および スカラ値は文字列あるいは数値のコンテキストの適切な方に解釈されます。 スカラはそれがヌル文字列あるいは 0 でなければ論理的に真であると 解釈されます。 演算子が返す論理値は、真の場合は 1、偽の場合は 0 または \'\' (ヌル文字列)です。 .PP 実際には、ヌル文字には二種類あります。define と undefined です。 undefined のヌル文字列は、エラー、ファイル終端、初期化されていない変数や 配列要素を参照しようとしたときなど、実際の値が存在しない場合に返ります。 undefined のヌル文字列は、最初にそれにアクセスしたときに defined となる ことがありますが、その前に defined() 演算子を用いて値が defined かどう かを知ることができます。 .PP スカラ変数への参照は、それが配列の一部であっても、常に \*(L'$\*(R' で始めます。 つまりこうです: .nf .ne 3 $days \h'|2i'# 単純なスカラ変数 $days[28] \h'|2i'# 配列 @days の 29 番目の要素 $days{\'Feb\'}\h'|2i'# 連想配列の値の一つ $#days \h'|2i'# 配列 @days の最後の添え字 しかし、配列全部や一部の取り出しは \*(L'@\*(R' で始めます: @days \h'|2i'# ($days[0], $days[1],\|.\|.\|. $days[n]) @days[3,4,5]\h'|2i'# @days[3.\|.5] と同じ @days{'a','c'}\h'|2i'# ($days{'a'},$days{'c'}) と同じ そして、連想配列全部を扱うには \*(L'%\*(R' で始めます: %days \h'|2i'# (key1, val1, key2, val2 .\|.\|.) .fi .PP これら 8 つはすべて左辺値として扱うことができます。すなわち、代入可能 ということです。 (さらに、あるコンテキストでは代入操作自体も左辺値となり得ます。 \*(-- s, tr, chop のところの例を参照して下さい。) スカラへの代入を行なうと、右辺をスカラのコンテキストで評価するのに 対し、配列や配列の一部への代入は右辺を配列のコンテキストで評価します。 .PP 配列 @days の長さを .IR csh のように \*(L"$#days\*(R" で評価してもかまいません。 (実際には、通常 0 番目の要素があるので、配列の長さではなく、最後の要素 の添え字になります。) $#days に代入すると、配列の長さが変わります。 この方法によって配列を小さくしても、実際には値は破壊されません。 すでに小さくした配列を大きくすると、もともとあった要素が元に戻ります。 大きくなりそうな配列をあらかじめ大きくしておくと、 効率をいくらか良くすることもできます。 (配列を大きくするには、配列の最後を超える要素に代 入を行なう方法もあります。この方法と、$#whatever へ代入する方法との 違いは、間の要素にヌルがセットされることです) 配列を縮めて空にするには、ヌルリスト () を代入すればできます。 次の二つは全く同等となります。 .nf @whatever = (); $#whatever = $[ \- 1; .fi .PP 配列をスカラのコンテキストで評価すると、配列の長さが返ります。 次の式は常に真となります: .nf scalar(@whatever) == $#whatever \- $[ + 1; .fi 連想配列をスカラのコンテキストで評価すると、配列が要素を含む場合 かつその場合に限り真の値を返します。 (要素がある場合に返る値は、使用している bucket の数およびアロケートさ れている bucket の数から成る文字列で、/ で区切られます。) .PP 多次元配列は直接はサポートされていませんが、連想配列を用いて複数の 添え字をエミュレートする方法については、$; 変数の項を参照して下さい。 多次元の添え字を 1 次元の添え字に変換するサブルーチンを書くことも できます。 .PP 各々のデータ型に応じて、それぞれの名前空間があります。衝突を心配する ことなく、同じ名前をスカラ変数、配列、連想配列、ファイルハンドル、 サブルーチン名、またはラベルにつけることができます。 変数や配列への参照は常に \*(L'$\*(R', \*(L'@\*(R', \*(L'%\*(R' で始まるので、\*(L"予約\*(R" 語は変数名については実際には 使用可能です。 (しかし、ラベルやファイルハンドルについては予約語は使用できません。 特殊な文字で始まらないからです。 .br ヒント: open(log,\'logfile\') より open(LOG,\'logfile\') を使った方が 良いです。大文字のファイルハンドル名を使うと、読み易さも向上し、 将来の予約語になるものとの衝突も避けることができるからです。) 大文字小文字の区別は重要です \*(--\*(L"FOO\*(R", \*(L"Foo\*(R", \*(L"foo\*(R" はすべて異なる 名前です。アルファベットで始まる名前は数字や下線を含んでもかまいません。 アルファベットで始まらない名前は 1 文字に限られます。 例えば、\*(L"$%\*(R" や \*(L"$$\*(R" です。 (ほとんどの一文字名は .IR perl の予約変数として意味があります。 詳細は後ほど述べます。) .PP 数値文字列は通常の浮動小数点や整数の形式で指定します。 .nf .ne 6 12345 12345.67 .23E-10 0xffff # 16 進 0377 # 8 進 4_294_967_296 .fi 文字列はシングルクォートまたはダブルクォートで区切られます。 動作はシェルにおけるクォートとよく似ています。 ダブルクォートで囲まれた文字列にはバックスラッシュや変数の置換が 行なわれます。シングルクォートで囲まれた文字列には行なわれません (\e\' と \e\e を除きます)。 通常のバックスラッシュ規則が改行やタブなどの文字を表すのに使え、 更に以下のちょっと変わった形式も使えます: .nf \et タブ \en 改行 \er リターン \ef フォームフィード \eb バックスペース \ea アラーム (ベル) \ee エスケープ \e033 8進文字 \ex1b 16進文字 \ec[ コントロール文字 \el 次の文字を小文字にします \eu 次の文字を大文字にします \eL \eE までを小文字にします \eU \eE までを大文字にします \eE 大小文字の修飾の終り .fi 改行を直接文字列に書き入れることもできます。すなわち、文字列は始まった 行と異なる行で終わることができることになります。これは便利ですが、 最後にクォートを忘れると、クォートを含むかなり離れた別の行を見つけるまで .I perl はエラーを報告しないでしょう。 文字列内の変数置換はスカラ変数、通常の配列、配列の一部に限られます。 (言い換えると、$ や @ で始まる識別子と、それに括弧で囲まれた添え字が ある場合だけです。) 次のコードは \*(L"The price is $100.\*(R" を出力します。 .nf .ne 2 $Price = \'$100\';\h'|3.5i'# 解釈されません print "The price is $Price.\e\|n";\h'|3.5i'# 解釈されます .fi 後に続くアルファベットや数字と区別するために、識別子を {} で囲う ことができることを覚えておいて下さい。 また、シングルクォートは識別子として有効な文字であるため、 シングルクォートで囲まれた文字列は、前の単語とは空白で区切られて いなければならないことも覚えておきましょう (パッケージの項を参照して下さい) 。 .PP プログラムのその時点での行番号とファイル名を表す _\|_LINE_\|_ と _\|_FILE_\|_ という二つの特殊な文字があります。 これらは独立したトークンとしてのみ使用でき、文字列中に 書き入れることはできません。 さらにトークン _\|_END_\|_ は、実際のファイルが終了する前で、スクリプト の論理的な終了を示すために使えます。残りのテキストはすべて無視されますが、 ファイルハンドル DATA から読むことができます。 (ファイルハンドル DATA は、メインスクリプトからのみデータを 読み込めますが、require されたファイルや評価された文字列からは 読み込めません。) ^D と ^Z の二つのコントロールキャラクタは _\|_END_\|_ と同義になります。 .PP 文法的に解釈不可能な単語は、それがシングルクォートで囲まれている かのように扱われます。このため、アルファベット、数字、下線のみからなり、 単語はアルファベットで始まらなければなりません。 ファイルハンドルやラベルと同じく、小文字のみからなる裸の単語は、 将来の予約語と衝突する危険があります。 .B \-w スイッチを使えば、perl はそのような単語について警告してくれます。 .PP 配列値をダブルクォートで囲まれた文字列に入れた場合は、配列の全要素を $" 変数で指定される区切り (デフォルトは空白) で連結して一つにした 文字列になります。 (3.0 以前のバージョンの perl では、@ はダブルクォートで囲まれた文字列 の中のメタキャラクタではなかったので、@array, $array[EXPR], @array[LIST], $array{EXPR}, @array{LIST} の文字列への挿入は、 配列がプログラムのどこかで参照されている場合、もしくは予約されている 場合にのみ起こります。) 次の二つは同等になります。 .nf .ne 4 $temp = join($",@ARGV); system "echo $temp"; system "echo @ARGV"; .fi 検索パターン (これにもダブルクォートと同じ置換が行なわれます) に おいては、あいまいな場合があります。 /$foo[bar]/ は /${foo}[bar]/ ([bar]は正規表現の文字クラス) でしょうか、 それとも /${foo[bar]}/ ([bar]は配列 @foo の添字) なのでしょうか 。 @foo が存在しないなら、それは明らかに文字クラスです。 @foo が存在するなら、perl は [bar]について考え、大抵の場合正しい類推を します。それが間違っていたり、あなたが単に偏執狂なら、 上記のように中括弧 {} を入れることで、正しい解釈をさせることができます。 .PP 行指向の引用法はシェルと同様の文法に基づいています。 << の後に引用文の終わりを示す文字列を指定すると、現在行からその文字列 が現れるまでの行すべてがその値になります。終わりを示す文字列は識別子 (単語) でも、クォートされたテキストでもかまいません。 クォートされているテキストの場合、通常クォートで囲む場合と同じく クォートの種類がテキストの扱い方を決めます。クォートされていない識別子 はダブルクォートされている場合と同じ動作となります。 (スペースを入れた場合、それは有効なヌル識別子として扱われ、 最初の空行にマッチします。 \*(--下の Merry Christmas の例を見て下さい。) 終わりを示す文字列はそれだけで (クォートされず、空白を前後につけずに) 書かれていなければなりません。 .nf print < に囲まれたファイルハンドルを評価すると、そのファイルから次の 行を読み込みます (改行が含まれるため EOF までは決して偽に成りません。 EOF では undefined 値が返ります) 。 通常はその値を変数に代入する必要がありますが、一つだけ 自動的に代入が起こる状況があります。入力シンボルだけが while ループの 条件文の中にある場合は(そしてこの場合にかぎり)、値は変数 \*(L"$_\*(R" に自動的に代入されます。 (奇妙に思うかもしれませんが、ほとんどの .I perl スクリプトにおいて、この構文を使うことになるでしょう。) とにかく、次の例はすべて同等となります。 .nf .ne 5 while ($_ = ) { print; } while () { print; } for (\|;\|;\|) { print; } print while $_ = ; print while ; .fi ファイルハンドル .IR STDIN , .IR STDOUT , .I STDERR は予約されています。 (ファイルハンドル .IR stdin , .IR stdout , .I stderr でも動作しますが、パッケージの中ではグローバルではなくローカルな識別子 として解釈されるので、働きません。) これ以外のファイルハンドルは、 .I open 関数で作成できます。 .PP 配列を探すコンテキストの中で が使われると、すべての入力行 の一行が一要素である配列が返ります。この方法で*巨大*なデータ空間が簡単 に作られるので、注意して使って下さい。 .PP ヌルファイルハンドル <> は特殊で、\fIsed\fR や \fIawk\fR の動作を エミュレートするために使えます。 <> からの入力には、標準入力やコマンドラインに並べられた全ファイルが 入ります。動作の仕方はこうなります。 <> の最初の評価では、ARGV 配列が チェックされ、それがヌルであると、$ARGV[0] は標準入力をオープンする \'-\' にセットされます。 次に ARGV 配列がファイル名のリストとして処理されます。 次のループは、 .nf .ne 3 while (<>) { .\|.\|. # 各行に対するコード } .ne 10 以下の疑似コードと同等になります。 unshift(@ARGV, \'\-\') \|if \|$#ARGV < $[; while ($ARGV = shift) { open(ARGV, $ARGV); while () { .\|.\|. # 各行に対するコード } } .fi 前者は、書くのが面倒でないというだけで、同じように動作します。 実際には、前者でも 配列 ARGV を shift し、現在のファイル名を変数 ARGV に代入します。 内部では、ファイルハンドル ARGV を使います \*(--<> は、魔術的な とまったく同義です。 (上の疑似コードでは、 を魔術的でないものとして扱うので、 動きません) .PP ファイル名のリストの配列が残っている限り、最初の <> の前に @ARGV を 変更することができます。 行番号 ($.) は入力が一つの大きなファイルであるかのように増えていきます。 (ファイル毎に行番号をリセットする方法については eof の例を参照して 下さい。) .PP .ne 5 @ARGV に自分でファイルのリストをセットしたい場合は、そうして下さい。 スクリプトにスイッチを渡したい場合、スクリプトの前の方に次のような ループを置くことでできます: .nf .ne 10 while ($_ = $ARGV[0], /\|^\-/\|) { shift; last if /\|^\-\|\-$\|/\|; /\|^\-D\|(.*\|)/ \|&& \|($debug = $1); /\|^\-v\|/ \|&& \|$verbose++; .\|.\|. # 他のスイッチ } while (<>) { .\|.\|. # 各行に対するコード } .fi <> シンボルは一回だけ*偽*を返します。 その後、もう一度呼ぶと、別の @ARGV リストを処理しているとみなして、 @ARGV がセットされていない場合は .IR STDIN から入力されることになります。 .PP カギ括弧の中の文字列がスカラ変数への参照であるとき (例えば <$foo>) 、 その変数の内容が読み込むべきファイルハンドル名となります。 .PP カギ括弧の中の文字列がファイルハンドルではないとき、検索 (glob) される ファイルパターンと解釈され、コンテキストによってファイル名の配列 またはリストの中の次のファイルが返されます。 最初に $ の解釈の一レベルが行なわれますが、<$foo> は前の段落で 説明されたような間接ファイルハンドルとなるため使えません。 強制的にファイル名検索と解釈させさければ <${foo}> のように 中括弧 {} を挿入できます。 例: .nf .ne 3 while (<*.c>) { chmod 0644, $_; } は以下と等価です。 .ne 5 open(foo, "echo *.c | tr \-s \' \et\er\ef\' \'\e\e012\e\e012\e\e012\e\e012\'|"); while () { chop; chmod 0644, $_; } .fi 実際、現在のところこのように実装されてます。 (これは、マシン上に /bin/csh がなければ、空白を含むファイル名では 動かないことを意味します。) もちろん、上の操作を行なう一番短い方法は、 .nf chmod 0644, <*.c>; .fi です。 .Sh "文法" .PP .I perl スクリプトは、一連の宣言とコマンドからなります。 .I perl の中で宣言されなければならないものは、レポートフォーマットと サブルーチンです。 これらの宣言の詳しい説明は下のセクションを参照して下さい。 初期化されていないユーザが作成したオブジェクトは、それが代入のように 明示的に定義されるまでは、ヌルまたは 0 の値であるとみなされます。 コマンド列が各入力行に対して実行される .I sed や .I awk スクリプトと違って、コマンド列は一度だけ実行されます。 入力ファイル (または複数のファイル) の各行について繰り返しを行うには 明示的にループを設けなければなりませんが、 着目するファイル、行をよりよくコントロールすることができます。 (実は、正しくありません \*(-- .B \-n や .B \-p スイッチで、暗黙のループを行なうことができます。) .PP 宣言は、コマンドを書くことができる場所ならどこにでも書くことができますが、 コマンド実行の基本的な流れには影響を与えません \*(-- 宣言は、 コンパイル時だけにしか影響を与えません。通常、すべての宣言は スクリプトの最初か最後のどちらかに置きます。 .PP .I perl は、ほとんどの部分において自由形式言語です。 (唯一の例外はフォーマット宣言で、理由は実に明白です。) コメントは、# 文字で指示され、行末までとなります。 /* */ という C のコメントを使おうとすると、コンテキストにより 除算またはパターンマッチと解釈されるので、そういうことはしないで下さい。 .Sh "複合文" .IR perl では、複数のコマンド列を中括弧 {} で囲むことで、一つのコマンドとして 扱うことになり、これをブロックと呼びます。 .PP 次のような複合コマンドは、フローコントロールに使われます: .nf .ne 4 if (EXPR) BLOCK if (EXPR) BLOCK else BLOCK if (EXPR) BLOCK elsif (EXPR) BLOCK .\|.\|. else BLOCK LABEL while (EXPR) BLOCK LABEL while (EXPR) BLOCK continue BLOCK LABEL for (EXPR; EXPR; EXPR) BLOCK LABEL foreach VAR (ARRAY) BLOCK LABEL BLOCK continue BLOCK .fi C や Pascal と違って、これらは文ではなく*ブロック*として定義されているこ とに注意して下さい。 これは、中括弧 {} が、\fI必要である\fR ことを意味します \*(-- 一つの 文を置くことは許されません。 中括弧 {} なしで書きたい場合は、別の方法があります。 以下はすべて同等のことを行ないます: .nf .ne 5 if (!open(foo)) { die "Can't open $foo: $!"; } die "Can't open $foo: $!" unless open(foo); open(foo) || die "Can't open $foo: $!"; # foo でなければ終わり open(foo) ? \'hi mom\' : die "Can't open $foo: $!"; # 最後のものは、ちょっとエキゾチック .fi .PP .I if 文は単純です。 *ブロック*は、常に中括弧 {} で囲まれるため、 .I else が、どの .I if にかかるかという曖昧さは生じません。 .I unless を .IR if の代わりに使うと、逆の意味となります。 .PP .I while 文は、式が真 (ヌル文字列または 0 でない) である限り、ブロックを 実行し続けます。 識別子とコロンからなるラベルをつけることもできます。 ラベルはループ制御文 .IR next , .IR last , .I redo (以下を参照) によって指し示すループの名前となります。 .I continue ブロックがあると、条件文が再評価される前に必ず実行され、C における .I for ループの三番目の部分と同様となります。 こうして、たとえ .I next 文で継続された場合でもループ変数はインクリメントできることになります (C の \*(L"continue\*(R" 文と同じ) 。 .PP .I while が .IR until に置き換えられると テストの意味は逆になりますが、条件判断は最初のループ の前に行なわれます。 .PP .I if や .I while 文では、\*(L"(EXPR)\*(R" をブロックに置き換えることができ、 ブロックの最後のコマンドの値が真なら、条件判断は真となります。 .PP .I for ループは、対応する .I while と全く同じように動作します: .nf .ne 12 for ($i = 1; $i < 10; $i++) { .\|.\|. } は、以下と同じになります。 $i = 1; while ($i < 10) { .\|.\|. } continue { $i++; } .fi .PP foreach ループは、通常の配列値について、配列の各要素を変数 VAR に順に セットしながら繰り返します。 その変数は、ループに対して暗黙のうちにローカルであり、それ以前の値はルー プを抜けると元の値に戻ります。 \*(L"foreach\*(R" キーワードは、実は \*(L"for\*(R" キーワードと同じで、 \*(L"foreach\*(R" を可読性のために、\*(L"for\*(R" を簡潔さのために 使うことができます。 VAR が省略されると、$_ が各値にセットされます。 ARRAY が実際の配列 (配列を返す式ではなく) の場合、ループ内の VAR を変 更することによって、配列の各要素を変更することができます。 例: .nf .ne 5 for (@ary) { s/foo/bar/; } foreach $elem (@elements) { $elem *= 2; } .ne 3 for ((10,9,8,7,6,5,4,3,2,1,\'BOOM\')) { print $_, "\en"; sleep(1); } for (1..15) { print "Merry Christmas\en"; } .ne 3 foreach $item (split(/:[\e\e\en:]*/, $ENV{\'TERMCAP\'})) { print "Item: $item\en"; } .fi .PP ブロックそれ自身 (ラベルが付いていても、付いていなくても) は、一度だけ 実行されるループと等価です。 だから、ブロックを抜けたり再実行するために、すべてのループ制御文を使う ことができます。 .I continue ブロックも付けられます。 この構成は、case 構造を作成するには特に有用です。 .nf .ne 6 foo: { if (/^abc/) { $abc = 1; last foo; } if (/^def/) { $def = 1; last foo; } if (/^xyz/) { $xyz = 1; last foo; } $nothing = 1; } .fi 同等のものを記述する方法が、既にいくつもあるので、perl には公式の switch 文がありません。 上記のものに加えて、 .nf .ne 6 foo: { $abc = 1, last foo if /^abc/; $def = 1, last foo if /^def/; $xyz = 1, last foo if /^xyz/; $nothing = 1; } または .ne 6 foo: { /^abc/ && do { $abc = 1; last foo; }; /^def/ && do { $def = 1; last foo; }; /^xyz/ && do { $xyz = 1; last foo; }; $nothing = 1; } または .ne 6 foo: { /^abc/ && ($abc = 1, last foo); /^def/ && ($def = 1, last foo); /^xyz/ && ($xyz = 1, last foo); $nothing = 1; } さらに .ne 8 if (/^abc/) { $abc = 1; } elsif (/^def/) { $def = 1; } elsif (/^xyz/) { $xyz = 1; } else {$nothing = 1;} .fi とも書けます。 これらはすべて内部で switch 構造に最適化されるため、perl は直接目的の 文にジャンプするので、同じ単純なスカラ変数を == や eq や上記のような パターンマッチで判定する限り、50 個の elsif を使っても perl がたくさん の不要な文を実行するのでは、という心配は不要となります。 (ある特定の case ステートメントが最適化されているかどうかに興味があるなら、 \-D1024 スイッチを付けて実行前に文法ツリーを表示することができます。) .Sh "単文" 単文のみがその副作用を評価される式となります。 どの単文もブロックの最後の文でない限り、セミコロンで終らなければ なりません。最後の文では、セミコロンはなくてもかまいません。 (それでも、ブロックが一行以上を含んでいるのなら、 セミコロンはあった方が望ましいです) .PP どの単文も、セミコロンで終る前に一つの修飾子を続けることができます。 可能な修飾子は以下の通りです: .nf .ne 4 if EXPR unless EXPR while EXPR until EXPR .fi .I if と .I unless 修飾子は見かけ通りの意味があります。 .I while と .I until 修飾子も見かけ通りの意味 (条件文が始めに評価されます) ですが、 do ブロックや do サブルーチンコマンドが付けられたときには異なり、 条件式が評価される前に一度だけ実行されます。 これは、以下のようなループが記述できるようにするためです: .nf .ne 4 do { $_ = ; .\|.\|. } until $_ \|eq \|".\|\e\|n"; .fi (後述の .I do 演算子を参照のこと。修飾子は、どれもループラベルを持てないため、 後に書かれたループ制御コマンドはこの構造では動かないことに 気をつけて下さい。あしからず。) .Sh "式" .I perl の式は、ほとんど C の式と同じに動作しますが、違いをここに述べます。 .PP 以下が .I perl にあって、C にないものです: .Ip ** 8 2 指数演算子。 .Ip **= 8 指数代入演算子。 .Ip (\|) 8 3 配列をヌルに初期化するために使う、ヌルリスト。 .Ip . 8 2 つの文字列の結合演算子。 .Ip .= 8 結合代入演算子。 .Ip eq 8 文字列の同値性 (== は数値の同値性) 。 覚えるためには、\*(L"eq\*(R" が文字列であると考えれば良いです。 (状況に応じて、== が文字列と数値の両方の同値性を表す .I awk に慣れている人は、ここでは明示しなければならないことに気をつけて下さい !) .Ip ne 8 文字列の非同値性 (!= は数値の非同値性) 。 .Ip lt 8 文字列の less than .Ip gt 8 文字列の greater than .Ip le 8 文字列の less than or equal .Ip ge 8 文字列の greater than or equal .Ip cmp 8 文字列の比較。 -1, 0, 1 を返します。 .Ip <=> 8 数値の比較。 -1, 0, 1 を返します。 .Ip =~ 8 2 演算には、検索、変更をデフォルトで文字列 \*(L"$_\*(R" に対して行うもの があります。 この演算子を用いると、別の文字列に対してその演算が行われます。 右の引数は、検索パターン、置換、変換です。 左の引数は、デフォルトの \*(L"$_\*(R" の代わりに検索、置換、変換が 行なわれる対象となるものです。 戻り値は、演算の成否を示します。 (右の引数が検索パターン、置換、変換以外の式なら、実行時に検索パターン として解釈されますが、パターンは式が評価される度にコンパイルされなけれ ばならないので、明示的な検索より効率的ではありません。) この演算子の優先度は単項マイナス演算子 (-) 、autoincrement/decrement (++, --) より低く、他のどの演算子よりも高くなります。 .Ip !~ 8 戻り値が否定されることを除いて =~ と同じです。 .Ip x 8 繰り返し演算子。 左オペランドを右オペランドで指定した回数だけ繰り返した文字列を返します。 配列のコンテキストでは、左オペランドが括弧に入ったリストの場合、 リストを繰り返します。 .nf print \'\-\' x 80; # ダッシュの列を出力します print \'\-\' x80; # 不正、x80 は識別子 print "\et" x ($tab/8), \' \' x ($tab%8); # タブに変換 @ones = (1) x 80; # 80 個 1 が並んだ配列 @ones = (5) x @ones; # 全要素を 5 にセット .fi .Ip x= 8 繰り返し代入演算子。 スカラに対してのみ動作します。 .Ip .\|. 8 範囲演算子。コンテキストによって、実際は二つの異なる演算子になります。 配列のコンテキストでは、左の値から右の値まで一つずつ数を増やした配列を 返します。 これは、\*(L"for (1..10)\*(R" というループや配列の切り出し (slice) を 行なうときに便利です。 .Sp スカラのコンテキストでは、.\|. は論理値を返します。 この演算子は、flip-flop のように二つの値を取り、 sed や awk やいろいろなエディタの行範囲 (comma) 演算子をエミュレート します。 各 .\|. 演算子はそれ自身の論理値を保持し、左のオペランドが偽である限り 偽となります。 左のオペランドが真になると、範囲演算子は、右のオペランドが真になるまで 真となります。その後、範囲演算子が再び偽となります。 (次に範囲指定演算子が評価されるまで、偽にはなりません。 真になったのと同じ評価を行った時 (awkと同様) に右のオペランドをテスト して、偽になることがあり得ますが、一度は真を返します。 次の評価まで右のオペランドをテストしたくなければ (sed のように) 、二つ にするかわりに三つのドット (.\|.\|.) を使って下さい。) 右のオペランドは、演算子が \*(L"偽\*(R" の状態である間は、 評価されず、左のオペランドは演算子が \*(L"真\*(R" である間は 評価されません。 || や && より優先度はやや低くなります。 戻り値は、偽ではヌル文字列に、真では (1で始まる) 連続した数に なります。 この数は、範囲指定毎にリセットされます。 連続した範囲の最後の数は、文字列 \'E0\' を持っていて、数値には影響しま せんが、終点を除きたい場合に検索のきっかけになります。 数字が 1 より大きくなるのを待つことで、始点を除くことができます。 スカラ .\|. の両方のオペランドが静的である場合、オペランドは暗黙の うちに現在の行番号を表す $. 変数と比べられます。 例: .nf .ne 6 スカラ演算子としては: if (101 .\|. 200) { print; } # 100行台を出力します next line if (1 .\|. /^$/); # ヘッダ行を読み飛ばします s/^/> / if (/^$/ .\|. eof()); # 本体をクォートします .ne 4 配列としては: for (101 .\|. 200) { print; } # $_ を 100回表示します @foo = @foo[$[ .\|. $#foo]; # 高価なノーオペレーション @foo = @foo[$#foo-4 .\|. $#foo]; # 最後の 5 要素を取り出します .fi .Ip \-x 8 ファイルテスト。 この単項演算子は一つの引数として、ファイル名またはファイルハンドルを取 り、そのファイルについて、何かが真であるかどうかを見るものです。 引数が省略されると、$_ を調べますが、例外として \-t は .IR STDIN を調べます。 真の場合は 1 を、偽の場合は \'\' を返し、ファイルが存在していない場合 は、undefined の値を返します。 優先度は、論理値や関係演算子より高くなりますが、算術演算子より低くなり ます。 演算子は以下の通りです: .nf \-r ファイルを実効 uid/gid で読み込める。 \-w ファイルに実効 uid/gid で書き込める。 \-x ファイルを実効 uid/gid で実行できる。 \-o ファイルの所有者が、実効 uid である。 \-R ファイルを実 uid/gid で読み込める。 \-W ファイルを実 uid/gid で書き込める。 \-X ファイルを実 uid/gid で実行できる。 \-O ファイルの所有者が、実 uid である。 \-e ファイルが存在する。 \-z ファイルサイズが 0 である。 \-s ファイルサイズが 0 でない (サイズを返す) 。 \-f ファイルはプレーンファイルである。 \-d ファイルはディレクトリである。 \-l ファイルはシンボリックリンクである。 \-p ファイルは名前付きパイプ (FIFO) である。 \-S ファイルはソケットである。 \-b ファイルはブロック特殊ファイルである。 \-c ファイルはキャラクタ特殊ファイルである。 \-u ファイルには setuid ビットが立っている。 \-g ファイルには setgid ビットが立っている。 \-k ファイルには sticky ビットが立っている。 \-t ファイルハンドルが tty にオープンされている。 \-T ファイルはテキストファイルである。 \-B ファイルはバイナリファイルである (\-T の逆) 。 \-M スクリプトを開始した時点でのファイルの古さ(単位は日) 。 \-A アクセス時刻と同じ。 \-C inode 変更時刻と同じ。 .fi ファイルパーミッション演算子 \-r, \-R, \-w, \-W, \-x, \-X の解釈は、 単にファイルのモードとユーザの uid, gid に基づきます。 他の理由で、実際にファイルを読み、書き、実行ができないことがあるかも しれません。 また、気をつけなけらばならないのは、スーパユーザにとって \-r, \-R, \-w, \-W は常に 1 を返し、そのモードでいずれかの実行ビットが 立っていれば、\-x, \-X も常に 1 を返すというところです。 従って、スーパユーザが実行するスクリプトは、ファイルの実際のモードを決 めるために stat() を実行したり、一時的に他の uid を立てる必要があるか もしれません。 .Sp 例: .nf .ne 7 while (<>) { chop; next unless \-f $_; # 特殊ファイルを無視 .\|.\|. } .fi \-s/a/b/ としても、否定した置換をするわけではないことに注意して 下さい。 \-exp($foo) とすると、期待通りに動きますが、\*(-- マイナスの後が一文字 の場合、ファイルテストと解釈されます。 .Sp \-T と \-B は以下のように動作します。 ファイルの先頭のブロックあたりに、変なコントロールコードや メタキャラクタのような、おかしな文字がないかどうかを調べます。 おかしな文字が (10%以上) 見つかると、それは \-B ファイル、 でなければ \-T ファイルとなります。 最初のブロックにヌルが含まれるファイルもバイナリファイルとみなされます。 \-T や \-B がファイルハンドルに使われると、最初のブロックではなく、 そのときの標準入力バッファが調べられます。 ヌルファイル(サイズ 0 のファイル)の場合やファイルハンドルをテストしていて 、それが EOF である場合、\-T と \-B は共に真を返します。 .PP すべてのファイルテスト (と stat 演算子)は、アンダライン一つ _ から 成る特殊ファイルハンドルを与えられると、システムコールを保存することに よって、その直前に行なわれたファイルテスト (または stat演算子) で使わ れた stat 構造体が使われます。 (この _ の働きは \-t では動作せず、lstat と -l が stat 構造体に 実ファイルではなく、シンボリックリンクの値を残すことを覚えて おかなければなりません。) 例: .nf print "Can do.\en" if -r $a || -w _ || -x _; .ne 9 stat($filename); print "Readable\en" if -r _; print "Writable\en" if -w _; print "Executable\en" if -x _; print "Setuid\en" if -u _; print "Setgid\en" if -g _; print "Sticky\en" if -k _; print "Text\en" if -T _; print "Binary\en" if -B _; .fi .PP C にあって、 .I perl にないもの: .Ip "単項 &" 12 アドレス演算子 .Ip "単項 *" 12 "アドレスを通しての"参照演算子 .Ip "(TYPE)" 12 型変換演算子。 .PP C のように、 .I perl は、演算子への引数が皆、静的で、副作用がない場合だけコンパイル時にある 程度の式の評価を行なってしまいます。 特に、変数置換を行なわないリテラル間での文字列の結合は、コンパイル時に 行なわれます。 バックスラッシュの解釈もコンパイル時に起こります。 .nf .ne 2 \'Now is the time for all\' . "\|\e\|n" . \'good men to come to.\' .fi これは全部、内部では一つの文字列にされてしまいます。 .PP ++ 演算子にはちょっと拡張した細工が施されています。 数値変数や数値コンテキストとして使われた変数をインクリメントすると、通 常のインクリメントになりますが、変数がヌルでない文字コンテキストとして だけ使われて来ていて、パターン /^[a\-zA\-Z]*[0\-9]*$/ にマッチする場合は、 各文字の範囲をキャリー付きで保存し、文字としてインクリメントされます: .nf print ++($foo = \'99\'); # prints \*(L'100\*(R' print ++($foo = \'a0\'); # prints \*(L'a1\*(R' print ++($foo = \'Az\'); # prints \*(L'Ba\*(R' print ++($foo = \'zz\'); # prints \*(L'aaa\*(R' .fi -- 演算子には、このような細工はありません。 .PP (配列のコンテキストにおける) 範囲演算子は、最大値と最小値が文字列の 場合に、細工した自動インクリメントアルゴリズムを使います。 すべてのアルファベット文字を得るには、 @alphabet = (\'A\' .. \'Z\'); 16 進数を得るには、 $hexdigit = (0 .. 9, \'a\' .. \'f\')[$num & 15]; 始めに 0 を付けた日付を得るには、 @z2 = (\'01\' .. \'31\'); print @z2[$mday]; と書けます。 (最後に指定された値が、細工したインクリメントの生成するシークエンスに 含まれていない場合、次の値が最後に指定された値より長くなるまでシークエ ンスを続けます。) .PP || と && は、0 や 1 を返す C のそれとは違って、最後に評価された値を 返します。 だから、ホームディレクトリをみつける移植性の高い方法は、こうなります。 .nf $home = $ENV{'HOME'} || $ENV{'LOGDIR'} || (getpwuid($<))[7] || die "You're homeless!\en"; .fi .PP 前述のリテラルや変数に合わせ、以降の節で説明する演算は 式中で項として使えます。 これらの演算の幾つかは、引数に*リスト*を取ります。 リストは、スカラや配列値からなります。 配列値がリストの中にあると、その場所に挿入されたように個々の値がリスト の中に含まれて、長い一次元配列値を作ることになります。 *リスト* の要素はコンマで区切られていなければなりません。 引数を括弧で囲んでも囲まなくても、演算をリスト出来ます。 これは関数呼び出しと同様単項演算子として、 演算を使うことができることを意味します。 関数呼び出しとして使うには、同じ行の次のトークンは左括弧でなければなり ません。 (空白が間にはさまってもかまいません。) そのような関数は、予想される通り最優先となります。 左括弧を持っていないトークンが続くとすれば、それは単項演算子で、リスト 演算子かどうかによって、優先度が決まります。 リスト演算子は最も優先度が低くなります。 すべての単項演算子は、関係演算子よりも優先されますが、算術演算子よりも 優先度は低くなります。 優先度のセクションを参照して下さい。 .PP スカラや配列のコンテキストで使われる演算子の場合、失敗すると一般に、 スカラコンテキストでは undefined 値を返し、配列のコンテキストでは ヌルリストを返します。 しかし、*リストをスカラに変換する一般的な規則はない* ということを 忘れないで下さい。 それぞれの演算子は、どの種のスカラを返すのが最も適当であるかを決めます。 ある演算子は、配列のコンテキストとして返されるようなリストの長さを返し ます。リストの最初の値を返す演算子、リストの最後の値を返す演算子、 操作に成功した回数を返す演算子などもあります。 一般に、一貫性を求めなければ、演算子は求めるものを返します。 .Ip "/PATTERN/" 8 4 m/PATTERN/ を参照して下さい。 .Ip "?PATTERN?" 8 4 これは、 .I reset 演算子呼び出しの間で一回しかマッチしないことを除けば、 /pattern/ 検索と全く同じです。 これは例えば、一群のファイルの中で、各ファイルに最初に何かが出現すること を見たいとき、便利な最適化です。 そのときのパッケージにローカルな ?? パターンだけは、リセットされます。 .Ip "accept(NEWSOCKET,GENERICSOCKET)" 8 2 accept システムコールと同じことをします。 成功すると真を、失敗すると偽を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "alarm(SECONDS)" 8 4 .Ip "alarm SECONDS" 8 指定した秒数 (実際には、1 を引いたもの) が経過したあと、自分の プロセスに SIGALRM を伝えます。 つまり、alarm(15) なら、14 秒以上経ったある時点で SIGALRM を生じます。 一度に一つのタイマしかカウントされません。呼び出される毎にそれ以前の タイマは無効となり、引数 0 で呼び出すと以前のタイマをキャンセルし て、新しいタイマは始動しません。 戻り値は、直前のタイマの残り時間です。 .Ip "atan2(Y,X)" 8 2 Y/X の アークタンジェント を .if t \-\(*p から \(*p. .if n \-π から π の範囲で返します。 .Ip "bind(SOCKET,NAME)" 8 2 bind システムコールと同じことをします。 成功すれば真を、失敗すれば偽を返します。 NAME は、ソケットに合った適切な型の pack されたアドレスでなければなりません。 プロセス間通信のセクションの例を参照して下さい。 .Ip "binmode(FILEHANDLE)" 8 4 .Ip "binmode FILEHANDLE" 8 4 バイナリファイルとテキストファイルを区別するオペレーティングシステム上 で、そのファイルを \*(L"バイナリ\*(R" として読み込まれるようにします。 バイナリモードで読み込まれないファイルは、CR LF が入力時に LF に変換 され、出力時には、LF が CR LF に変換されます。 binmode は、UNIX では無効です。 FILEHANDLE が式のときは、値がファイルハンドルの名前として扱われます。 .Ip "caller(EXPR)" .Ip "caller" 現在のサブルーチン呼び出しのコンテキストを返します: .nf ($package,$filename,$line) = caller; .fi EXPRがあると、デバッガがスタックトレースに出力して使う拡張情報も 返します。 EXPRの値は、現在のサブルーチンの前にいくつの call フレームがあるかを 示します。 .Ip "chdir(EXPR)" 8 2 .Ip "chdir EXPR" 8 2 動作しているディレクトリを、もしできるなら EXPR に変更します。 EXPRが省略されると、ホームディレクトリになります。 成功すれば 1 を、失敗すれば 0 を返します。 .IR die の例を参照して下さい。 .Ip "chmod(LIST)" 8 2 .Ip "chmod LIST" 8 2 ファイルのリストのパーミッションを変更します。 リストの最初の要素は、数値モードでなければなりません。 成功したファイルの数を返します。 .nf .ne 2 $cnt = chmod 0755, \'foo\', \'bar\'; chmod 0755, @executables; .fi .Ip "chop(LIST)" 8 7 .Ip "chop(VARIABLE)" 8 .Ip "chop VARIABLE" 8 .Ip "chop" 8 文字列の最後の文字を削り、削られた文字を返します。 基本的には、入力されたレコードの終りから改行文字を除くために使われます が、文字列のコピーをスキャンするわけではないので、s/\en// より 効率的です。 VARIABLE を省略すると、$_ を chop します。 例: .nf .ne 5 while (<>) { chop; # 最後のフィールドの \en を除く @array = split(/:/); .\|.\|. } .fi 実際には、代入を含む左辺値のいかなるものも chop できます。 .nf chop($cwd = \`pwd\`); chop($answer = ); .fi リストを chop するとすべての要素が chop され、 最後に chop された値が返されます。 .Ip "chown(LIST)" 8 2 .Ip "chown LIST" 8 2 ファイルのリストの所有者 (と所有グループ) を変えます。 リストの最初の二つの要素は数値で表した uid と gid がこの順で指定され なければなりません。 変更に成功したファイルの数を返します。 .nf .ne 2 $cnt = chown $uid, $gid, \'foo\', \'bar\'; chown $uid, $gid, @filenames; .fi .ne 23 以下は、passwd ファイルから数値でない uid を検索する例です: .nf print "User: "; $user = ; chop($user); print "Files: " $pattern = ; chop($pattern); .ie t \{\ open(pass, \'/etc/passwd\') || die "Can't open passwd: $!\en"; 'br\} .el \{\ open(pass, \'/etc/passwd\') || die "Can't open passwd: $!\en"; 'br\} while () { ($login,$pass,$uid,$gid) = split(/:/); $uid{$login} = $uid; $gid{$login} = $gid; } @ary = <${pattern}>; # ファイルを得ます if ($uid{$user} eq \'\') { die "$user not in passwd file"; } else { chown $uid{$user}, $gid{$user}, @ary; } .fi .Ip "chroot(FILENAME)" 8 5 .Ip "chroot FILENAME" 8 同名のシステムコールと同じことをします。 これが何をするのか知らないとしても、気にしないで下さい。 FILENAME を省略すると、$_ に chroot します。 .Ip "close(FILEHANDLE)" 8 5 .Ip "close FILEHANDLE" 8 ファイルハンドルに結びつけられたファイルやパイプをクローズします。 別のファイルをオープンしようとしている場合は、FILEHANDLE を閉じる 必要がありません。オープンした際に前のファイルをクローズしてくれる からです。 ( .IR open を参照して下さい) しかし、明示的に入力ファイルのクローズをすると行カウンタ ($.) が リセットされるのに対し、 .I open のときに行なわれる暗黙のクローズでは、リセットされません。 また、後でパイプの出力を見たい場合は、パイプをクローズするとパイプで 起動されたプロセスの完了を待ちます。 パイプを明示的にクローズすると、コマンド情報の戻り値が $? に 入れられます。 例: .nf .ne 4 open(OUTPUT, \'|sort >foo\'); # sort へパイプ .\|.\|. # print stuff to output close OUTPUT; # sort の終了を待ちます open(INPUT, \'foo\'); # sortの結果を得ます .fi FILEHANDLE は実際のファイルハンドル名を与える式でもかまいません。 .Ip "closedir(DIRHANDLE)" 8 5 .Ip "closedir DIRHANDLE" 8 opendir() でオープンされたディレクトリをクローズします。 .Ip "connect(SOCKET,NAME)" 8 2 connect システムコールと同じことをします。 成功すると真を、失敗すると偽を返します。 NAME はソケットに合った適当な型のパッケージアドレスでなければ なりません。 プロセス間通信のセクションの例を参照して下さい。 .Ip "cos(EXPR)" 8 6 .Ip "cos EXPR" 8 6 EXPR (ラジアンで表現) のコサインを返します。 EXPR を省略すると $_ のコサインを取ります。 .Ip "crypt(PLAINTEXT,SALT)" 8 6 C ライブラリの crypt() 関数と正確に同じように encrypt された文字列 を返します。 パスワードファイルを調べて、粗野なパスワードを見つけるのに便利です。 白い帽子をかぶっている奴だけがこれをしなければなりません。 .Ip "dbmclose(ASSOC_ARRAY)" 8 6 .Ip "dbmclose ASSOC_ARRAY" 8 dbm ファイルと連想配列の結び付きを解除します。 連想配列に残っている値は、dbm ファイルのキャッシュに何が入っているか を知りたいのでなければ、意味がないものとなります。 この関数は、ndbm を使う場合にのみ有用です。 .Ip "dbmopen(ASSOC,DBNAME,MODE)" 8 6 dbm や ndbm ファイルと連想配列を結び付けます。 ASSOC は連想配列の名前です。 (通常の open と違って、最初の引数はファイルハンドルのように見えても、 ファイルハンドルでは*ありません*) 。 DBNAME は、(.dir や .pag の拡張子を除いた) データベースの名前です。 データベースが存在しないと、(umaskで修飾された) MODE で指定された プロテクションで作成します。 古い dbm 関数しかサポートしないシステムでは、プログラムの中で一つの dbmopen しか許されないかもしれません。 dbm も ndbm もないシステムでは、dbmopen 呼び出しは致命的なエラーを生 じます。 .Sp それまでの dbmopen で関連付けられた連想配列の値は失われます。 dbm ファイルのうち、ある量の値はメモリにキャッシュされます。 デフォルトでその量は 64 ですが、dbmopen の前に連想配列の ガーベッジエントリの数をあらかじめ確保しておくことで、 増やすことができます。必要なら、reset コマンドでキャッシュを フラッシュすることができます。 .Sp dbm ファイルへの書き込み許可を持っていない場合、連想配列変数を 読み出すだけで、それをセットすることはできません。 書き込めるかどうかをテストしたければ、ファイルテストを使うか、エラーを トラップできる eval の中で、ダミーの配列エントリをセットしようと してみて下さい。 .Sp keys() や valuse() のような関数は、大きな dbm ファイルを使ったときに、 巨大な配列値を返すかもしれません。 大きな dbm ファイルで繰り返しをするときは、each() 関数を使った方が 良いかもしれません。 例: .nf .ne 6 # 履歴ファイルのオフセットを表示します dbmopen(HIST,'/usr/lib/news/history',0666); while (($key,$val) = each %HIST) { print $key, ' = ', unpack('L',$val), "\en"; } dbmclose(HIST); .fi .Ip "defined(EXPR)" 8 6 .Ip "defined EXPR" 8 左辺値 EXPR が、実際に値を持っているかどうかを表す論理値を返します。 多くの演算で、ファイル終端、初期化されていない変数、システムエラーなど の例外処理条件で undefined 値が返されます。 この関数は、本当のヌル文字列を返すかもしれない操作、特に配列要素を参照 する操作の際に、未定義のヌル文字列と定義されたヌル文字列の判別を可能に します。 配列やサブルーチンが存在するかどうかを調べることもできます。 予約済み変数を使うときは、直観的に期待するような結果になるとは保証されて いません。 例: .nf .ne 7 print if defined $switch{'D'}; print "$val\en" while defined($val = pop(@ary)); die "Can't readlink $sym: $!" unless defined($value = readlink $sym); eval '@foo = ()' if defined(@foo); die "No XYZ package defined" unless defined %_XYZ; sub foo { defined &$bar ? &$bar(@_) : die "No bar"; } .fi undef も参照して下さい。 .Ip "delete $ASSOC{KEY}" 8 6 指定した連想配列から、指定した値を削除します。 削除された値が返りますが、何も削除されなかった場合は undefined 値が 返ります。 $ENV{} から削除すると、環境変数を変更します。 dbm ファイルに結びつけられた配列を削除すると、dbm ファイルからその項 目を削除します。 .Sp 以下の例は、連想配列のすべての値を削除します: .nf .ne 3 foreach $key (keys %ARRAY) { delete $ARRAY{$key}; } .fi (しかし、 .I reset コマンドを使った方が速いでしょう。undef %ARRAY ならもっと速いでしょう) .Ip "die(LIST)" 8 .Ip "die LIST" 8 eval の外で、LIST の値を .I STDERR に表示して、そのときの $! (errno) の値で終了 (exit) します。 $! が 0 なら、($? >> 8) (\`command\` のステータス) の値で終了します。 ($? >> 8) が 0 なら、255 で終了します。 eval の中では、エラーメッセージは $@ に詰め込まれ、eval は undefined 値で終了します。 .Sp 同等の例: .nf .ne 3 .ie t \{\ die "Can't cd to spool: $!\en" unless chdir \'/usr/spool/news\'; 'br\} .el \{\ die "Can't cd to spool: $!\en" unless chdir \'/usr/spool/news\'; 'br\} chdir \'/usr/spool/news\' || die "Can't cd to spool: $!\en" .fi .Sp EXPR の値が改行で終らない場合、スクリプトの現在の行番号と (もしあれば) 入力行番号が出力され、改行が加えられます。 ヒント: \*(L", stopped\*(R" をメッセージに加えておくと、 \*(L"at foo line 123\*(R" が加えられたときにわかり易くなるので良い でしょう。 スクリプト \*(L"canasta\*(R" を走らせているとすると、 .nf .ne 7 die "/etc/games is no good"; die "/etc/games is no good, stopped"; は、多分 /etc/games is no good at canasta line 123. /etc/games is no good, stopped at canasta line 123. .fi と出力されます。 .IR exit を参照して下さい。 .Ip "do BLOCK" 8 4 BLOCK 内で指定されたうち、最後のコマンドの値を返します。 ループ修飾子に修飾されたときは、ループ条件をテストする前に BLOCK が 一度実行されます。 (他の文では、ループ修飾子は、条件を始めにテストします。) .Ip "do SUBROUTINE (LIST)" 8 3 .I sub で宣言されたサブルーチンを実行し、SUBROUTINE で最後に評価された式の値 を返します。 その名前のサブルーチンがない場合、致命的エラーを生じます。 (サブルーチンが存在しているかどうかを判定したいなら、\*(L"defined\*(R" 演算子を使うのが良いでしょう。) 配列をリストの一部として渡したいなら、各配列の前に配列の長さを付けて 渡すのが良いでしょう。 (後に出てくるサブルーチンのセクションを参照して下さい。) \*(L"do EXPR\*(R" の形との混乱を避けるため、括弧は必要となります。 .Sp SUBROUTINE は、一つのスカラ変数でもかまいません。その場合、 実行されるサブルーチン名は、変数から得られます。 .Sp 別の (好まれる) 形として、アンパサンド & を前に付ける &foo(@args) の ように、サブルーチンを呼んでもかまいません。 引数を渡さないなら、括弧を使う必要はありません。 括弧を省略すると、サブルーチンには @_ 配列は渡されません。 & 型は、defined や undef 演算子にサブルーチンを指示するのにも 使われます: .nf if (defined &$var) { &$var($parm); undef &$var; } .fi .Ip "do EXPR" 8 3 ファイル名として EXPR の値を使い、 .I perl スクリプトとして、ファイルの内容を実行します。 これは基本的に .I perl サブルーチンライブラリからサブルーチンをインクルードするという使い方を します。 .nf do \'stat.pl\'; は、 eval \`cat stat.pl\`; .fi とほとんど同じです。 違うのは、より効率的で、より簡潔で、エラーメッセージ中の現在ファイル名 は正しく、カレントディレクトリに stat.pl がなければ .B \-I で指定されたライブラリをすべて探すということです。 (予約変数のセクション中の @INC 配列を参照して下さい) 。 しかし、呼び出しのたびにファイルを解析し直すのは同じなので、ループの 内側でこのファイルを使うなら、起動時間は少し余計にかかるとしても、 \-P と #include を使った方が良いでしょう。 (この #include を使う問題点は、cpp が # コメントを認識してくれない ことです。\*(--逃げ道は、コメント単独として \*(L";#\*(R" を使うことです。) 次のものは等価ではないことに注意して下さい: .nf .ne 2 do $foo; # ファイルを eval します do $foo(); # サブルーチンを呼びます .fi ライブラリルーチンのインクルードとしては、 \*(L"require\*(R" 演算子の方がより良いことを覚えておいて下さい。 .Ip "dump LABEL" 8 6 ただちにコアダンプします。 もともと、これは、プログラムの始めにすべての変数を初期化した後に ダンプされたコアを undump プログラムを使って実行バイナリを作るために あります。 新しいバイナリが実行されるとき、"goto LABEL" を実行することから 始まります (goto が受けるすべての制限は適用されます) 。 コアダンプで止まったところから、goto で再び始まると考えれば良いです。 LABEL が省略されると、プログラムは先頭から再スタートします。 警告: ダンプされたときに open されていたどのファイルも、プログラムが 再生したときにはもう open されておらず、perlの側では混乱する可能性が あります。 \-u も参照して下さい。 .Sp 例: .nf .ne 16 #!/usr/bin/perl require 'getopt.pl'; require 'stat.pl'; %days = ( 'Sun',1, 'Mon',2, 'Tue',3, 'Wed',4, 'Thu',5, 'Fri',6, 'Sat',7); dump QUICKSTART if $ARGV[0] eq '-d'; QUICKSTART: do Getopt('f'); .fi .Ip "each(ASSOC_ARRAY)" 8 6 .Ip "each ASSOC_ARRAY" 8 連想配列の次のキーと値の 2 つの要素から成る配列を順次返し、 それを繰り返すことができます。 各エントリはランダムのように見える順序で返されます。 配列全部が読み込まれたとき、ヌル配列 (代入されると FALSE(0) 値となる) が返されます。 その後、次の each() の呼び出しで繰り返しを再び始めます。 繰り返し情報は、配列からすべての要素を読み込むことによってのみ リセットできます。 繰り返しの間は、配列を変更してはいけません。 各連想配列につき一つずつ繰り返し情報があり、プログラム中のすべての each(), keys(), values() 関数呼び出しで共有されます。 次の例は、順序は異なるものの printenv プログラムのように環境変数を 表示します: .nf .ne 3 while (($key,$value) = each %ENV) { print "$key=$value\en"; } .fi keys() 関数と values() 関数も参照して下さい。 .Ip "eof(FILEHANDLE)" 8 8 .Ip "eof()" 8 .Ip "eof" 8 次に FILEHANDLE を読んだときファイル終端であるか、 または FILEHANDLE がオープンされていないとき、1 を返します。 FILEHANDLE は実際のファイルハンドル名を値に持つ式でもかまいません。 (この関数は、実際には一文字読み込んでは、ungetc するので、対話的な コンテキストではそれほど有用ではありません。) 引数無しの eof は、最後に読んだファイルの eof 状態を返します。 空の括弧 () は、コマンドラインで指定されたファイル群からなる 擬似ファイルを指します。つまり、eof() は while (<>) の内側で最後の ファイルの終端を検出するときに意味があります。 while (<>) ループの中で各ファイルを調べたいときは、eof(ARGV) または 括弧のない eof を使って下さい。 例: .nf .ne 7 # 最後のファイルの最終行の直前にダッシュを挿入します while (<>) { if (eof()) { print "\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\|\-\en"; } print; } .ne 7 # 各入力ファイル毎に、行番号をリセットします while (<>) { print "$.\et$_"; if (eof) { # Not eof(). close(ARGV); } } .fi .Ip "eval(EXPR)" 8 6 .Ip "eval EXPR" 8 6 .Ip "eval BLOCK" 8 6 EXPR は解析され、一つの小さな .I perl プログラムであるかのように実行されます。 .I perl プログラムのコンテキストの中で実行されるので、どの変数設定、 サブルーチン、フォーマット定義もその後に残ります。 戻り値は、丁度サブルーチンと同様に、最後に評価された式が返ります。 文法エラーや実行時エラーがあるか、die 文があれば、eval により undefined が返り、$@ にエラーメッセージがセットされます。 もしエラーがなければ、$@ はヌル文字列であることが保証されます。 EXPRを省略すると、$_ を評価します。 最後のセミコロンはどれも式から除かれます。 .Sp eval はしかし、致命的エラーまでトラップするので、 (dbmopen や symlinkのような) ある機能が実装されているかどうかを 決めるには便利なことを覚えておいて下さい。 die 演算子が例外を起こすように使われるのは、perl の例外トラップ機構 でもあります。 .Sp 実行されるコードが変わらないなら、その度に再コンパイルされる時間を 費すよりは、実行時エラーをトラップする eval-BLOCK の形をとった方が良い かもしれません。 どんなエラーも起これば $@ にメッセージが返ります。 EXPR のような、シングルクォートされた文字列を評価すると、同じ効果が ありますが、eval-BLOCK の形ではコンパイル時に文法エラーを報告するのに 対し、eval-EXPR の形では $@ を通して実行時に文法エラーを報告する点が 異なります。 eval-EXPR の形は、最初に成功したときに eval-BLOCK に最適化されます。 (e 修飾子を使った場合、置換される側はシングルクォートされた文字列と みなされ、同じ最適化が起こります。) 例: .nf .ne 11 # 0 除算を致命的エラーにしません eval { $answer = $a / $b; }; warn $@ if $@; # 初回使用後、同じものに最適化されます。 eval '$answer = $a / $b'; warn $@ if $@; # コンパイル時エラー eval { $answer = }; # 実行時エラー eval '$answer ='; # sets $@ .fi .Ip "exec(LIST)" 8 8 .Ip "exec LIST" 8 6 LIST の中に一つ以上の引数があるか、LIST が一つ以上の値を持つ配列ならば、 リストの引数を付けて execvp() を呼びます。 一つのスカラ引数だけなら、引数にシェルのメタキャラクタがあるかどうか を調べます。あれば、解析のために引数を丸ごと \*(L"/bin/sh \-c\*(R" に 渡し、無ければ、引数は単語に split され、execvp() に直接渡されます。 その方が効率が良いからです。 注意: exec (と system) は出力バッファをフラッシュしないので、出力が 失われるのを避けるために $| をセットする必要があるかもしれません。 例: .nf exec \'/bin/echo\', \'Your arguments are: \', @ARGV; exec "sort $outfile | uniq"; .fi .Sp もし、最初の引数を本当に実行したいのでなく、実行しようとしている プログラムの名前を詐称したいだけなら、本当に走らせたいプログラムを変数に 割り当てて、LIST の前に変数の名前をカンマを付けずに置くように 指定できます。 (これは、たとえ単一スカラしかリストに無くても、常に多くの値を持つ リストとして LIST の解釈を強制します。) 例: .nf .ne 2 $shell = '/bin/csh'; exec $shell '-sh'; # ログインシェルのふりをします .fi .Ip "exit(EXPR)" 8 6 .Ip "exit EXPR" 8 EXPR を評価し、ただちにその値で終了します。 例: .nf .ne 2 $ans = ; exit 0 \|if \|$ans \|=~ \|/\|^[Xx]\|/\|; .fi .IR die を参照して下さい。 EXPR が省略されると、値 0 の状態で終了します。 .Ip "exp(EXPR)" 8 3 .Ip "exp EXPR" 8 .I e の EXPR 乗を返します。 EXPR を省略すると、exp($_) を返します。 .Ip "fcntl(FILEHANDLE,FUNCTION,SCALAR)" 8 4 fcntl(2) 関数の実装です。 正しい関数定義を得るには、多分 .nf require "fcntl.ph"; # 多分 /usr/local/lib/perl/fcntl.ph .fi を始めに書いておかなければならないでしょう。 もし、fcntl.ph が存在しないか、もしくは正しい定義がされていない場合、 のような C のヘッダファイルに基づいて、 自分で何とかしなければなりません。 (perl kit から来る h2ph と呼ばれる perl スクリプトがあり、 このことを助けてくれるでしょう) 引数の処理と戻り値を返すことは、 この後に書かれている ioctl のように動作します。 fcntl は、fcntl(2) が実装されていないマシンで使われると 致命的エラーを生じます。 .Ip "fileno(FILEHANDLE)" 8 4 .Ip "fileno FILEHANDLE" 8 4 ファイルハンドルに対するファイルディスクリプタを返します。 select() のビットマップを構成するのに便利です。 FILEHANDLE が式だと、その値がファイルハンドルの名前と解釈されます。 .Ip "flock(FILEHANDLE,OPERATION)" 8 4 ファイルハンドルに対し flock(2) を呼びます。 OPERATION の定義については、flock(2) のマニュアルを参照して下さい。 成功すれば真を、失敗すれば偽を返します。 flock(2) が実装されていないマシンで使うと、致命的エラーになります。 以下は、BSD システムのメールボックスにメールを追加します。 .nf .ne 20 $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; sub lock { flock(MBOX,$LOCK_EX); # 待っている間に、他の誰かが追加する # 場合のために... seek(MBOX, 0, 2); } sub unlock { flock(MBOX,$LOCK_UN); } open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}") || die "Can't open mailbox: $!"; do lock(); print MBOX $msg,"\en\en"; do unlock(); .fi .Ip "fork" 8 4 fork() システムコールを実行します。 親プロセスに子の pid を返し、子プロセスには 0 を返します。 注意: フラッシュされていないバッファは、両方のプロセスでフラッシュ されずに残ります。これは二重出力を避けるために、$| をセットする必要が あるかもしれないということを意味します。 .Ip "getc(FILEHANDLE)" 8 4 .Ip "getc FILEHANDLE" 8 .Ip "getc" 8 FILEHANDLE に結びつけられた入力ファイルから、次の文字を返します。 EOF ではヌルを返します。 FILEHANDLE を省略すると、STDIN から読み込み ます。 .Ip "getlogin" 8 3 現在のログイン状況が /etc/utmp から得られれば、それを返します。 得られなければ、getpwuid を使って下さい。 $login = getlogin || (getpwuid($<))[0] || "Somebody"; .Ip "getpeername(SOCKET)" 8 3 SOCKET 接続の向こう側の pack された sockaddr アドレスを返します。 .nf .ne 4 # 内部 sockaddr $sockaddr = 'S n a4 x8'; $hersockaddr = getpeername(S); .ie t \{\ ($family, $port, $heraddr) = unpack($sockaddr,$hersockaddr); 'br\} .el \{\ ($family, $port, $heraddr) = unpack($sockaddr,$hersockaddr); 'br\} .fi .Ip "getpgrp(PID)" 8 4 .Ip "getpgrp PID" 8 指定された PID に対する現在のプロセスグループを返します。 現在のプロセスでは 0 です。 getpgrp(2) が実装されていないマシンで使うと、致命的エラーになります。 EXPR が省略されると、現在のプロセスのプロセスグループが返ります。 .Ip "getppid" 8 4 親プロセスのプロセス ID を返します。 .Ip "getpriority(WHICH,WHO)" 8 4 プロセス、プロセスグループ、ユーザの現在のプライオリティを返します。 (getpriority(2)を参照して下さい。) getpriority(2) を実装していないマシンで使うと致命的エラーになります。 .Ip "getpwnam(NAME)" 8 .Ip "getgrnam(NAME)" 8 .Ip "gethostbyname(NAME)" 8 .Ip "getnetbyname(NAME)" 8 .Ip "getprotobyname(NAME)" 8 .Ip "getpwuid(UID)" 8 .Ip "getgrgid(GID)" 8 .Ip "getservbyname(NAME,PROTO)" 8 .Ip "gethostbyaddr(ADDR,ADDRTYPE)" 8 .Ip "getnetbyaddr(ADDR,ADDRTYPE)" 8 .Ip "getprotobynumber(NUMBER)" 8 .Ip "getservbyport(PORT,PROTO)" 8 .Ip "getpwent" 8 .Ip "getgrent" 8 .Ip "gethostent" 8 .Ip "getnetent" 8 .Ip "getprotoent" 8 .Ip "getservent" 8 .Ip "setpwent" 8 .Ip "setgrent" 8 .Ip "sethostent(STAYOPEN)" 8 .Ip "setnetent(STAYOPEN)" 8 .Ip "setprotoent(STAYOPEN)" 8 .Ip "setservent(STAYOPEN)" 8 .Ip "endpwent" 8 .Ip "endgrent" 8 .Ip "endhostent" 8 .Ip "endnetent" 8 .Ip "endprotoent" 8 .Ip "endservent" 8 これらのルーチンは、システムライブラリ中の同名の関数を実行します。 配列のコンテキストの中では、これらの各 get ルーチンの戻り値は、 以下のようになります: .nf ($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell) = getpw.\|.\|. ($name,$passwd,$gid,$members) = getgr.\|.\|. ($name,$aliases,$addrtype,$length,@addrs) = gethost.\|.\|. ($name,$aliases,$addrtype,$net) = getnet.\|.\|. ($name,$aliases,$proto) = getproto.\|.\|. ($name,$aliases,$port,$proto) = getserv.\|.\|. .fi (もしエントリが存在しなければ、ヌルリストになります。) .Sp スカラのコンテキストでは、 name による検索でない場合には name が得られ、 name による検索の場合には name 以外が得られます。 (エントリが存在しない場合は、undefined 値となります。) 例: .nf $uid = getpwnam $name = getpwuid $name = getpwent $gid = getgrnam $name = getgrgid $name = getgrent 他 .fi getgr.\|.\|. の返す $menbers 値は、空白で区切られたグループメンバの ログイン名のリストです。 .Sp gethost.\|.\|. 関数では、h_errno 変数が C でサポートされていれば、 関数のコールが失敗したとき $? を介して返されます。 成功した関数コールの返す @addrs 値は、相当するシステムライブラリ 呼び出しに返された raw address のリストです。 インターネットドメイン (INET) では、各アドレスは 4 バイト長で 以下のように書くと unpack できます。 .nf ($a,$b,$c,$d) = unpack('C4',$addr[0]); .fi .Ip "getsockname(SOCKET)" 8 3 pack された、SOCKET接続のこちら側の sockaddr アドレスを返します。 .nf .ne 4 # An internet sockaddr $sockaddr = 'S n a4 x8'; $mysockaddr = getsockname(S); .ie t \{\ ($family, $port, $myaddr) = unpack($sockaddr,$mysockaddr); 'br\} .el \{\ ($family, $port, $myaddr) = unpack($sockaddr,$mysockaddr); 'br\} .fi .Ip "getsockopt(SOCKET,LEVEL,OPTNAME)" 8 3 要求したソケットのオプションを返します。エラーの場合は undefined を 返します。 .Ip "gmtime(EXPR)" 8 4 .Ip "gmtime EXPR" 8 time 関数に返された時刻を、Greenwich timezone として 9 要素の配列に 変換します。 通常は次のように使います: .nf .ne 3 .ie t \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); 'br\} .el \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); 'br\} .fi すべての配列要素は数値で、構造体 tm から直接得られるものです。 これにより $mon は 0.\|.11 の範囲で $wday は 0.\|.6 の範囲であることに なります。 EXPR を省略すると、gmtime(time) を実行します。 .Ip "goto LABEL" 8 6 LABEL というラベルを付けられた文を探し、そこから実行を再開します。 現在のところ、プログラムの本体内で do {} 構造の内側が 入れ子になっていない文にしか行けません。 この文は効率的には実装されておらず、 .IR sed -to- perl 翻訳プログラムを簡単にできるようにするためだけあります。 翻訳された .I sed スクリプトの一貫性のサポートはしますが、このセマンティックスを私がいつ 変更するかわからないので、自らの責任で使って下さい。 全く使わない方が良いでしょう。 .Ip "grep(EXPR,LIST)" 8 4 LIST の各要素に対して (ローカルには各要素を $_ にセット) 、EXPR を 評価して、式が真であると評価された要素だけからなる配列を返します。 スカラのコンテキストでは、式が真になった回数を数値で返します。 .nf @foo = grep(!/^#/, @bar); # コメントを除きます .fi $_ は配列値への参照なので、配列の要素を変更する場合に使えることを 覚えておきましょう。 これは便利ですが、LIST が名前のついた配列でないと、おかしな結果を 引き起こすことになります。 .Ip "hex(EXPR)" 8 4 .Ip "hex EXPR" 8 10 進値 EXPR を 16 進文字列にして返します。 (0 または 0x で始まる文字列を解釈するなら、oct() を参照して下さい。) EXPR を省略すると $_ を使います。 .Ip "index(STR,SUBSTR,POSITION)" 8 4 .Ip "index(STR,SUBSTR)" 8 4 STR の中で、POSITION かそれ以降に最初に SUBSTR が現れる位置を返します。 POSITION を省略すると、文字列の先頭から検索します。 戻り値は、0 か $[ 変数に設定されたものがベースになります。 SUBSTR がみつからないと、ベースから 1 を引いた値を返し、通常 \-1 に なります。 .Ip "int(EXPR)" 8 4 .Ip "int EXPR" 8 EXPR の整数部を返します。 EXPR が省略されると、$_ を使います。 .Ip "ioctl(FILEHANDLE,FUNCTION,SCALAR)" 8 4 これは、ioctl(2) 関数を実装しています。 正しい関数定義を得るには、多分始めの方で .nf require "ioctl.ph"; # 多分 /usr/local/lib/perl/ioctl.ph .fi と書かなければならないでしょう。 ioctl.ph が存在しないか、または正しく定義されていない場合、 のような C のヘッダファイルから自分自身でなんとかしな ければなりません。 (perl キットにある h2ph というスクリプトがこの助けになるでしょう。) SCALAR は、FUNCTIONに依存して、参照または書き込みがされます。 FUNCTION \*(--SCALAR の文字列値へのポインタは、実際の ioctl 呼び出しの 第 3 引数に渡されます。 (SCALAR が文字列値でなく数値であった場合、文字列値へのポインタでなく 数値そのものが渡されます。これが真であることを保証するには、このスカラを 使う前に 0 を加えて下さい。) ioctl() に使われる構造体の値を扱うには、pack() 関数と unpack() 関数が 便利です。 次の例は、DEL に erase 文字をセットします。 .nf .ne 9 require 'ioctl.ph'; $sgttyb_t = "ccccs"; # chars 4 個と short 1 個 if (ioctl(STDIN,$TIOCGETP,$sgttyb)) { @ary = unpack($sgttyb_t,$sgttyb); $ary[2] = 127; $sgttyb = pack($sgttyb_t,@ary); ioctl(STDIN,$TIOCSETP,$sgttyb) || die "Can't ioctl: $!"; } .fi ioctl (と fcntl) の戻り値は以下の通りです: .nf .ne 4 OS の戻り値:\h'|3i'perlの戻り値: -1\h'|3i' undefined 値 0\h'|3i' 文字列 "0 but true" それ以外\h'|3i' その数 .fi このように、perl は成功時に真を、失敗時に偽を返しますが、 オペレーティングシステムから返される実際の値も簡単に判定することができます: .nf ($retval = ioctl(...)) || ($retval = -1); printf "System returned %d\en", $retval; .fi .Ip "join(EXPR,LIST)" 8 8 .Ip "join(EXPR,ARRAY)" 8 分割されている LIST や ARRAY の文字列を、フィールドセパレータとして 値 EXPR をはさんだ一つの文字列につなげて、その文字列を返します。 例: .nf .ie t \{\ $_ = join(\|\':\', $login,$passwd,$uid,$gid,$gcos,$home,$shell); 'br\} .el \{\ $_ = join(\|\':\', $login,$passwd,$uid,$gid,$gcos,$home,$shell); 'br\} .fi .IR split を参照して下さい。 .Ip "keys(ASSOC_ARRAY)" 8 6 .Ip "keys ASSOC_ARRAY" 8 名前のついた連想配列のすべてのキーからなる普通の配列を返します。 キーは、見かけ上ランダムな順で返されますが、values() 関数や each() 関数 (これによって連想配列は変更されません) が生成するものと同じ順になります。 以下は、環境変数を表示する別の方法です: .nf .ne 5 @keys = keys %ENV; @values = values %ENV; while ($#keys >= 0) { print pop(@keys), \'=\', pop(@values), "\en"; } キーでソートすると: .ne 3 foreach $key (sort(keys %ENV)) { print $key, \'=\', $ENV{$key}, "\en"; } .fi .Ip "kill(LIST)" 8 8 .Ip "kill LIST" 8 2 プロセスのリストにシグナルを送ります。 リストの最初の要素は、送られるシグナルでなければなりません。 シグナル送信に成功したプロセスの数を返します。 .nf $cnt = kill 1, $child1, $child2; kill 9, @goners; .fi シグナルが負の場合、プロセスの代わりにプロセスグループを kill します。 (System Vでは、負の \fIプロセス\fR 番号はプロセスグループも kill しますが、互換性はありません。) クォートでくくられたシグナル名も使えます。 .Ip "last LABEL" 8 8 .Ip "last" 8 .I last コマンドは、(ループ内で使われるような) C の .I break 文に似ていて、該当するループを直ちに終了します。 LABEL が省略されると、このコマンドは最も内側のループを抜けます。 .I continue ブロックがあったとしても、実行されません: .nf .ne 4 line: while () { last line if /\|^$/; # ヘッダが終ったら抜けます .\|.\|. } .fi .Ip "length(EXPR)" 8 4 .Ip "length EXPR" 8 EXPR の値の文字列長を返します。 EXPR を省略すると、$_ の長さを返します。 .Ip "link(OLDFILE,NEWFILE)" 8 2 OLDFILE にリンクされた NEWFILE を作成します。 成功すると 1 を、失敗すると 0 を返します。 .Ip "listen(SOCKET,QUEUESIZE)" 8 2 listen システムコールと同じことを行ないます。 成功すると真を、失敗すると偽を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "local(LIST)" 8 4 閉じたブロック、サブルーチン、eval 、\*(L"do\*(R" に局所的な 変数リストを宣言します。 リストされたすべての要素は左辺値として妥当なものでなければなりません。 この演算子は、LIST 内のその時点での変数を隠れたスタックに保存し、 ブロックやサブルーチンや eval を抜けるときに戻すように動作します。 これは、呼ばれたサブルーチンもグローバル変数でなく、ローカル変数を 参照することを意味します。 そうしたければ、LIST に代入してローカル変数を初期化してもかまいません。 (初期値が特定の値として与えられていなければ、undefined 値として 生成されます。) 普通、これはサブルーチンのパラメータに名前をつけるのに使われます。 例: .nf .ne 13 sub RANGEVAL { local($min, $max, $thunk) = @_; local($result) = \'\'; local($i); # 多分 $thunk は $i を参照しています for ($i = $min; $i < $max; $i++) { $result .= eval $thunk; } $result; } .ne 6 if ($sw eq \'-v\') { # グローバルな配列でローカルな配列を初期化します local(@ARGV) = @ARGV; unshift(@ARGV,\'echo\'); system @ARGV; } # @ARGV が元に戻されます .ne 6 # 一時的に digits という連想配列に追加をしています。 if ($base12) { # (注意: これが効率的と言いたいわけではありません) local(%digits) = (%digits,'t',10,'e',11); do parse_num(); } .fi local() は実行時のコマンドで、ループ終了時に全部を一度に開放するまでは、 ループを通るたびに実行され、毎回スタックを消費していきます。 .Ip "localtime(EXPR)" 8 4 .Ip "localtime EXPR" 8 time 関数に返された時刻を、ローカルタイムゾーンとして解析された 9 要素の 配列に変換します。 通常次のように使われます: .nf .ne 3 .ie t \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 'br\} .el \{\ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 'br\} .fi すべての配列要素は数字で、構造体 tm から直接得られたものです。 これにより $mon は 0.\|.11 の範囲で $wday は 0.\|.6 の範囲であることに なります。 EXPR を省略すると、localtime(time) を実行します。 .Ip "log(EXPR)" 8 4 .Ip "log EXPR" 8 EXPR の (底が .IR e の) 対数を返します。 EXPR を省略すると、$_ の log を返します。 .Ip "lstat(FILEHANDLE)" 8 6 .Ip "lstat FILEHANDLE" 8 .Ip "lstat(EXPR)" 8 .Ip "lstat SCALARVARIABLE" 8 stat() 関数と同じことを実行しますが、シンボリックリンクでは指している 先のファイルの代わりにシンボリックリンク自身の状態を返します。 シンボリックリンクが実装されていないシステムでは、通常の stat を 実行します。 .Ip "m/PATTERN/gio" 8 4 .Ip "/PATTERN/gio" 8 パターンマッチに合う文字列を検索し、真 (1) か偽 (\'\') を 返します。 =~ や !~ を介した文字列の指定がなければ、文字列 $_ が検索されます。 (=~ で指定された文字列は、左辺値である必要はありません。 式の評価結果でもかまいませんが、=~ はどちらかというと優先度が高いことを 覚えておいて下さい。) 正規表現のセクションを参照して下さい。 .Sp / が区切り文字である場合、始めの \*(L'm\*(R' は省略可能です。\*(L'm\*(R' が あると、英数字以外のどの文字でも区切りにできます。 これは、特に \*(L'/\*(R' を含む UNIX のパス名へのマッチに便利です。 最後の区切りの後にオプション文字 \*(L'i\*(R' が続くと、マッチングが 大文字小文字の区別なく行なわれます。 PATTERN は、スカラ変数への参照を含んでいてもよく、それはパターン検索 が評価される毎に挿入されます (パターンはリコンパイルされます) 。 ( $) と $| は文字列終端のテストに見えるため、挿入は行なわれません。) パターンを一度だけコンパイルさせたい場合は、後ろの区切り文字 の後に \*(L"o\*(R" を加えて下さい。 これにより、余分な実行時再コンパイルを避けられるので、挿入したい値が スクリプトの動いている間中、変わらないときには便利です。 PATTERN がヌル文字に評価されたときは、最後に成功した正規表現が代わりに 使われます。 .Sp 配列値が必要なコンテキストで使われると、パターンマッチはパターンの中で マッチした subexpression を括弧でくくったものすなわち、 ($1, $2, $3.\|.\|.) からなる配列を返します。 この場合、実際には $1, $2 等をセットは*せず*、 $+, $`, $&, $' もセットしません。 マッチが失敗すると、ヌル配列が返ります。 マッチが成功しても括弧がないと、配列値 (1) が返ります。 .Sp 例: .nf .ne 4 open(tty, \'/dev/tty\'); \|=~ \|/\|^y\|/i \|&& \|do foo(\|); # y なら foo を実行 if (/Version: \|*\|([0\-9.]*\|)\|/\|) { $version = $1; } next if m#^/usr/spool/uucp#; .ne 5 # 恵まれない人の grep $arg = shift; while (<>) { print if /$arg/o; # 一度だけコンパイル } if (($F1, $F2, $Etc) = ($foo =~ /^(\eS+)\es+(\eS+)\es*(.*)/)) .fi この最後の例は、$foo を最初の二語と残りに split し、三つのフィールド を $F1 、$F2 、$Etc に代入します。 どれかの変数が代入された場合、すなわちパターンがマッチした場合、 この条件は真となります。 .Sp \*(L"g\*(R" 修飾子は、グローバルパターンマッチの指定です\*(--つまり、 文字列の中でできるだけ多くのマッチを行ないます。 どのように振舞うかは、コンテキストに依存します。 配列のコンテキストでは、正規表現の中ですべての括弧にマッチした文字列の リストを返します。括弧がなければ、パターン全体を囲む括弧があるか のようにマッチした文字列すべてのリストを返します。 スカラのコンテキストでは、文字列を通してマッチする毎に*真*を返し、 マッチしなかったとき*偽*を返します。 (言いかえると、最後にテストした 場所を覚えていて、そこから再び検索を始めるということです。) 最後のマッチから文字列が変更されていないことを仮定しています。 マッチとマッチの間で文字列を変更することは、未定義な動作を引き起こす かもしれません。 (実際には substr()を使って、全文字列の長さを変えずにその場で変更する なら、できます。しかし、一般にはそういう変更は s///g を使うべきです。) 例: .nf # 配列のコンテキスト ($one,$five,$fifteen) = (\`uptime\` =~ /(\ed+\e.\ed+)/g); # スカラのコンテキスト $/ = ""; $* = 1; while ($paragraph = <>) { while ($paragraph =~ /[a-z][\'")]*[.!?]+[\'")]*\es/g) { $sentences++; } } print "$sentences\en"; .fi .Ip "mkdir(FILENAME,MODE)" 8 3 FILENAME で指定されたディレクトリを、(umask で修飾された) MODE で指定 されたパーミッションで作成します。 成功すると 1 を、失敗すると 0 を返し、$! (errno) をセットします。 .Ip "msgctl(ID,CMD,ARG)" 8 4 System V IPC 関数の msgctl を呼びます。 CMD が &IPC_STAT なら、ARG は 返された msqid_ds 構造を保持する変数でなければなりません。 ioctl のように、エラーのときは undefined 値を、0 のとき には "0 but true" を、でなければ実際の戻り値を返します。 .Ip "msgget(KEY,FLAGS)" 8 4 System V IPC 関数の msgget を呼びます。成功時はメッセージキュー ID を、 エラーが起これば undefined value を返します。 .Ip "msgsnd(ID,MSG,FLAGS)" 8 4 System V IPC 関数の msgsnd を呼び、メッセージ MSGS をメッセージキュー ID に送信します。 MSG は、pack("L", $type) で作られる long integer のメッセージ型で始めなければなりません。成功すれば真を、エラーが起こる と偽を返します。 .Ip "msgrcv(ID,VAR,SIZE,TYPE,FLAGS)" 8 4 System V IPC 関数 msgrcv を呼び、 メッセージキュー ID からメッセージを受け取り、 最大メッセージサイズ SIZE で変数 VAR に格納します。 メッセージを受け取ると、VAR に最初に格納されたものがメッセージ型 となり、VAR の最大長は、SIZE にメッセージ型のサイズを加えたものに なることに注意して下さい。 成功すると真を、エラーでは偽を返します。 .Ip "next LABEL" 8 8 .Ip "next" 8 .I next コマンドは、C の .I continue 文と同様に、ループの次の繰り返しを始めます。 .nf .ne 4 line: while () { next line if /\|^#/; # コメントを捨てます .\|.\|. } .fi 上の例で .I continue ブロックがあると、行が捨てられた場合でも実行されることを覚えておいて 下さい。 LABEL が省略されると、このコマンドは最も内側のループを続けます。 .Ip "oct(EXPR)" 8 4 .Ip "oct EXPR" 8 10 進数 EXPR を、8 進文字列にして返します。 (EXPRが 0x で始まる文字列なら、10 進の代わりに 16 進として変換します。) 以下は、10 進、8 進、16 進の標準的な記法を扱います。 .nf $val = oct($val) if $val =~ /^0/; .fi EXPR が省略されると、$_ を使います。 .Ip "open(FILEHANDLE,EXPR)" 8 8 .Ip "open(FILEHANDLE)" 8 .Ip "open FILEHANDLE" 8 EXPR で与えられたファイル名のファイルをオープンし、FILEHANDLE に結び つけます。 FILEHANDLE が式の場合、その値を実際にファイルハンドルが求める名前 として使います。 EXPR が省略されると、FILEHANDLE と同名のスカラ変数が保持する値が ファイル名となります。 ファイル名の前に \*(L"<\*(R" を付けるか、何も付けない場合、ファイルは 入力用にオープンされます。 ファイル名が \*(L">\*(R" で始まると、ファイルは出力用にオープンされます。 ファイル名が \*(L">>\*(R" で始まると、ファイルは追加書き込み用に オープンされます。 (\'>\' や \'<\' の前に \'+\' を付けると、ファイルを読み書き両用に できます。) ファイル名が \*(L"|\*(R" で始まると、ファイル名は出力がパイプされる コマンドと解釈され、ファイル名が \*(L"|\*(R" で終ると、入力が パイプされるコマンドと解釈されます。 (入出力共パイプするコマンドは必要がないでしょう。) \'\-\' をオープンすると .I STDIN を、\'>\-\' をオープンすると .IR STDOUT をオープンします。 open は成功したとき、0 でない値を、失敗したとき undefined 値を 返します。 open がパイプを含む場合、戻り値はサブプロセスの pid となります。 例: .nf .ne 3 $article = 100; open article || die "Can't find article $article: $!\en"; while (
) {\|.\|.\|. .ie t \{\ open(LOG, \'>>/usr/spool/news/twitlog\'\|); # (ログ保存) 'br\} .el \{\ open(LOG, \'>>/usr/spool/news/twitlog\'\|); # (ログ保存) 'br\} .ie t \{\ open(article, "caesar <$article |"\|); # 記事を decrypt 'br\} .el \{\ open(article, "caesar <$article |"\|); # 記事を decrypt 'br\} .ie t \{\ open(extract, "|sort >/tmp/Tmp$$"\|); # $$ は現在のプロセス 'br\} .el \{\ open(extract, "|sort >/tmp/Tmp$$"\|); # $$ は現在のプロセス 'br\} .ne 7 # 引数リストのファイルを、それがインクルードするものも # 含めて処理します foreach $file (@ARGV) { do process($file, \'fh00\'); # no pun intended } sub process { local($filename, $input) = @_; $input++; # 文字列インクリメント unless (open($input, $filename)) { print STDERR "Can't open $filename: $!\en"; return; } .ie t \{\ while (<$input>) { # 間接指定に注意 'br\} .el \{\ while (<$input>) { # 間接指定に注意 'br\} if (/^#include "(.*)"/) { do process($1, $input); next; } .\|.\|. # 続く } } .fi Bourne shell の慣習により、EXPR は \*(L">&\*(R" で始めるような指定も できます。その場合、文字列の残りはファイルハンドル (数字なら ファイルディスクリプタ) の名前と解釈され、dup して open します。 >>, <, +>, +>>, +< の後に & を使ってもかまいません。 指定するモードは、元のファイルハンドルのモードと一致していなくては なりません。 以下は、 .I STDOUT と .IR STDERR を保存し、リダイレクトを行なって、その後で書き戻します: .nf .ne 21 #!/usr/bin/perl open(SAVEOUT, ">&STDOUT"); open(SAVEERR, ">&STDERR"); open(STDOUT, ">foo.out") || die "Can't redirect stdout"; open(STDERR, ">&STDOUT") || die "Can't dup stdout"; select(STDERR); $| = 1; # バッファリングしません select(STDOUT); $| = 1; # バッファリングしません print STDOUT "stdout 1\en"; # これもサブプロセスで print STDERR "stderr 1\en"; # 動作します close(STDOUT); close(STDERR); open(STDOUT, ">&SAVEOUT"); open(STDERR, ">&SAVEERR"); print STDOUT "stdout 2\en"; print STDERR "stderr 2\en"; .fi コマンド \*(L"\-\*(R" でパイプをオープンする、すなわち \*(L"|\-\*(R" や \*(L"\-|\*(R" をオープンすると、暗黙のうちに fork され、open の 戻り値として親プロセスには、子プロセスの pid が返され、子プロセスには 0 が返されます。 (open が成功したかどうかは、defined($pid) を使って判断して下さい。) ファイルハンドルは、親にとって普通の挙動をしますが、子には .IR STDOUT / STDIN にパイプされたファイルハンドルの i/o となります。 子プロセスでファイルハンドルがオープンされず、\*(--新しく ファイルハンドルは、新しい .I STDIN から .IR STDOUT へのパイプとなります。 よく使われるのは、普通のパイプのオープンと同様、パイプコマンドの 実行状態をコントロールしたいとき、setuid されたプログラムを走らせるとき、 シェルコマンドでメタキャラクタのチェックをする必要がないときです。 次の二つは、それぞれある程度同等です: .nf .ne 5 open(FOO, "|tr \'[a\-z]\' \'[A\-Z]\'"); open(FOO, "|\-") || exec \'tr\', \'[a\-z]\', \'[A\-Z]\'; open(FOO, "cat \-n '$file'|"); open(FOO, "\-|") || exec \'cat\', \'\-n\', $file; .fi パイプされたファイルハンドルを明示的に close すると、親プロセスは 子プロセスが終了するのを待つことになり、$? に状態を返します。 fork を行う操作では、両方のプロセスでフラッシュされないバッファが そのまま残ることに注意して下さい。これは、二重出力を避けるために $| を セットした方が良いことを意味します。 .Sp open に渡されたファイル名は、前後の空白が除かれます。 意図的に変な文字を含むファイル名を持つファイルをオープンしたいときは、 前後の空白もこのように守ってやる必要があります: .nf .ne 2 $file =~ s#^(\es)#./$1#; open(FOO, "< $file\e0"); .fi .Ip "opendir(DIRHANDLE,EXPR)" 8 3 EXPR という名前のディレクトリを readdir(), telldir(), seekdir(), rewinddir(), closedir() で処理できるようにオープンします。 成功すると真を返します。 DIRHANDLE は、FILEHANDLE とは別個のそれ自身の名前空間を持ちます。 .Ip "ord(EXPR)" 8 4 .Ip "ord EXPR" 8 EXPR の最初の文字のアスキー値を数値で返します。 EXPR が省略されると、$_ を使います。 ''' Comments on f & d by gnb@melba.bby.oz.au 22/11/89 .Ip "pack(TEMPLATE,LIST)" 8 4 配列または値のリストを引数に取り、バイナリ構造体にパックし、 構造体を含む文字列を返します。 TEMPLATE は値の順序と型を与える文字のシークエンスで、以下のように なります: .nf A アスキー文字列(スペースが padding される) a アスキー文字列(ヌルが padding される) c signed char C unsigned char s signed short S unsigned short i signed integer I unsigned integer l signed long L unsigned long n short (\*(L"network\*(R" order) N long (\*(L"network\*(R" order) f 単精度浮動小数点 (native format) d 倍精度浮動小数点 (native format) p 文字列へのポインタ v short (\*(L"VAX\*(R" (little-endian) order) V long (\*(L"VAX\*(R" (little-endian) order) x null byte X Back up a byte @ 絶対位置にまでヌルで埋める u uuencode された文字列 b ビット文字列 (vec()のような昇順). B ビット文字列 (降順). h 16 進文字列 (低 nybble が先). H 16 進文字列 (高 nybble が先). .fi どの文字も繰り返し回数を表す数を続けることができます。 "a", "A", "b", "B", "h", "H" 以外の型では、pack 関数は LIST から回数を指定された数だけ値を取ります。 繰り返し数として * を使うと、残りすべての分だけ繰り返します。 "a" と "A" の型は値一つしか取りませんが、繰り返し指定を文字列長 として pack するので、ヌルや空白での padding が必要になります。 (unpack するときは、"A" は、後に続く空白を削りますが、"a" はしません。) 同様に、"b" と "B" フィールドは、指定したビット長を pack します。 "h" と "H" フィールドは、指定した長さの nybbles をパックします。 実数 (float と double) は、そのマシンの機械語フォーマットのみです。 浮動小数点フォーマット関係の多様性と標準の \*(L"network\*(R" 表現が 無いことから、交換することはできません。これは、 あるマシンで pack された浮動小数点データは、他のマシンでは、 たとえ両方が IEEE 浮動小数点数演算を行っていても (メモリ表現の endian は IEEE の仕様には無いから)、 読めないかもしれないということを意味します。 perl は、すべての数値計算を内部的には double を用い、 double -> float -> double という変換は精度を失うだろうということに 注意して下さい (すなわち、unpack("f",pack("f", $foo)) は一般に $foo にはなりません) 。 .br 例: .nf $foo = pack("cccc",65,66,67,68); # foo は "ABCD" $foo = pack("c4",65,66,67,68); # 上と同じ $foo = pack("ccxxcc",65,66,67,68); # foo は "AB\e0\e0CD" $foo = pack("s2",1,2); # little-endian の "\e1\e0\e2\e0" # big-endian の "\e0\e1\e0\e2" $foo = pack("a4","abcd","x","y","z"); # "abcd" $foo = pack("aaaa","abcd","x","y","z"); # "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\e0\e0\e0\e0\e0\e0\e0" $foo = pack("i9pl", gmtime); # 実際の tm 構造体 (少なくとも私のシステムでは) sub bintodec { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } .fi 一般に unpack 関数でも同じテンプレートが使われます。 .Ip "pipe(READHANDLE,WRITEHANDLE)" 8 3 相当するシステムコールのように一対の接続されたパイプをオープンします。 パイプでつながったプロセスのループを設定するときは、注意深くしないと デッドロックを起こすことがあることに気をつけて下さい。 それに加えて、perl のパイプは標準入力のバッファリングを使うので、 アプリケーションに依っては、$| をセットして コマンド毎に WRITEHANDLE をフラッシュする必要があるかもしれません。 [perl バージョン 3.0 パッチレベル 9 以上が必要] .Ip "pop(ARRAY)" 8 .Ip "pop ARRAY" 8 6 配列の最後の値を取り出し、配列の長さを 1 だけ短くします。 .nf $tmp = $ARRAY[$#ARRAY\-\|\-]; .fi 同じ結果となります。 配列に要素がない場合は、undefined 値を返します。 .Ip "print(FILEHANDLE LIST)" 8 10 .Ip "print(LIST)" 8 .Ip "print FILEHANDLE LIST" 8 .Ip "print LIST" 8 .Ip "print" 8 文字列または、カンマ区切りの文字列のリストを表示します。 成功すると、0 以外を返します。 FILEHANDLE は、ファイルハンドルの名前を保持したスカラ変数名でも かまいません。これにより 1 レベルの間接指定ができます。 (注意: FILEHANDLE が変数で次のトークンが項の場合、+ を挿入するか 引数に括弧を付けないと、演算子として解釈の間違いをするかもしれません。) FILEHANDLE が省略されると、デフォルトで標準出力 (または最後に select された出力チャンネル\*(-- select()を参照して下さい) に出力します。 LIST が省略されると、$_ を .IR STDOUT に出力します。 デフォルト出力チャンネルを .I STDOUT 以外に設定するには、select 演算子を使って下さい。 print は LIST を取るので、LIST の中のものは何でも配列のコンテキストで 評価され、サブルーチン呼び出しなら配列のコンテキストで評価された式を 持つことになるのを覚えておきましょう。 また、print キーワードの後に左括弧を置くときは、対応する右括弧が print の引数の終りを示す \*(--すなわち + を挿入するか、括弧をすべての引数に付ける のでなければ、左括弧を置いてはいけません。 .Ip "printf(FILEHANDLE LIST)" 8 10 .Ip "printf(LIST)" 8 .Ip "printf FILEHANDLE LIST" 8 .Ip "printf LIST" 8 \*(L"print FILEHANDLE sprintf(LIST)\*(R" と同等です。 .Ip "push(ARRAY,LIST)" 8 7 ARRAY (@ は省略可能) をスタックとして扱い、LIST の値を ARRAY の終りに 追加します。 ARRAY の長さは、LIST の長さだけ増えます。 これは、以下と同じことになります。 .nf for $value (LIST) { $ARRAY[++$#ARRAY] = $value; } .fi が、より効率的です。 .Ip "q/STRING/" 8 5 .Ip "qq/STRING/" 8 .Ip "qx/STRING/" 8 これは、実際には関数ではありませんが、クォートされた文字列に バックスラッシュをたくさん置き過ぎるのを避けるための、単なる 簡略記法です。 q 演算子はシングルクォートを生成し、qq 演算子はダブルクォートを 生成します。 qx 演算子は、バッククォートを生成します。 英数字でない文字なら、改行を含めて何でも、/ の代わりに区切り文字 にできます。 区切りが ( か { なら、終了の区切りは、対応する ) か } になります。 (埋め込み文字としての } には通常通り \ が必要になります。) 例: .nf .ne 5 $foo = q!I said, "You said, \'She said it.\'"!; $bar = q(\'This is it.\'); $today = qx{ date }; $_ .= qq *** The previous line contains the naughty word "$&".\en if /(ibm|apple|awk)/; # :-) .fi .Ip "rand(EXPR)" 8 8 .Ip "rand EXPR" 8 .Ip "rand" 8 ランダムな 0 から EXPR までの小数点数を返します。 (EXPR は正でなければなりません。) EXPR が省略されると、0 から 1 の範囲の値が返されます。 srand() を参照して下さい。 .Ip "read(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "read(FILEHANDLE,SCALAR,LENGTH)" 8 5 指定された FILEHANDLE から、LENGTH バイトのデータを読み込み、変数 SCALAR に格納します。 実際に読み込めたバイト数を返し、エラーの場合は undef を返します。 SCALAR は実際に読み込まれた長さに合わせて、伸縮します。 読んだデータを文字列の始めでなく、他の場所に格納するために、OFFSET を 指定することもできます。 これは、実際には stdio の fread コールで実装されています。 本当の read システムコールを使うには、sysread を参照して下さい。 .Ip "readdir(DIRHANDLE)" 8 3 .Ip "readdir DIRHANDLE" 8 opendir() にオープンされたディレクトリ内の、次のディレクトリエントリを 返します。 配列のコンテキストの中で使うと、残りすべてのディレクトリエントリを 返します。 エントリが残っていない場合、スカラのコンテキストでは undefined が、 配列のコンテキストではヌルリストを返します。 .Ip "readlink(EXPR)" 8 6 .Ip "readlink EXPR" 8 シンボリックリンクが実装されていれば、シンボリックリンクの値を返します。 実装されていなければ、致命的エラーを返します。 システムエラーが起こったときは、undefined 値を返し、$! (errno) を セットします。 EXPR を省略すると、$_ を使います。 .Ip "recv(SOCKET,SCALAR,LEN,FLAGS)" 8 4 ソケットからメッセージを受け取ります。指定した SOCKET ファイルハンドル から、LENGTH バイトのデータを受け取り、変数 SCALAR に格納します。 sender のアドレスを返し、エラーの場合は undefined 値を返します。 SCALAR は、実際に読み込まれた長さに合わせて、伸縮します。 同名のシステムコールと同じフラグを用います。 .Ip "redo LABEL" 8 8 .Ip "redo" 8 .I redo コマンドは、条件を再評価することなしに、ループブロックのコマンドを 再開します。 .I continue ブロックがあっても実行されません。 LABEL が省略されると、最も内側のループを参照します。 通常このコマンドは、入力された内容について、自分自身をだますような プログラムで使われます: .nf .ne 16 # 単純化した Pascal のコメント除去 # (警告: 文字列中には { や } はないものと仮定しています) line: while () { while (s|\|({.*}.*\|){.*}|$1 \||) {} s|{.*}| \||; if (s|{.*| \||) { $front = $_; while () { if (\|/\|}/\|) { # コメント終了? s|^|$front{|; redo line; } } } print; } .fi .Ip "rename(OLDNAME,NEWNAME)" 8 2 ファイル名を変更します。 成功すると 1 を、失敗すると 0 を返します。 ファイルシステムの境界を越えては働きません。 .Ip "require(EXPR)" 8 6 .Ip "require EXPR" 8 .Ip "require" 8 EXPR か EXPR が与えられなければ $_ で指定された、ライブラリファイルを インクルードします。 以下のようなサブルーチンと同じ意味になります: .nf sub require { local($filename) = @_; return 1 if $INC{$filename}; local($realfilename,$result); ITER: { foreach $prefix (@INC) { $realfilename = "$prefix/$filename"; if (-f $realfilename) { $result = do $realfilename; last ITER; } } die "Can't find $filename in \e@INC"; } die $@ if $@; die "$filename did not return true value" unless $result; $INC{$filename} = $realfilename; $result; } .fi 同じ名前で指定されたファイルは、二度はインクルードされないことに 注意して下さい。 どの初期化コードの起動も成功したこと示すため、ファイルの最後の文で、 真を返さなければなりません。だから、慣習的にそういうファイルは、 必ず真を返すということが確かでなければ、\*(L"1;\*(R" で 終るようにします。 .Ip "reset(EXPR)" 8 6 .Ip "reset EXPR" 8 .Ip "reset" 8 一般にループの終りで変数をクリアするのに .I continue ブロックの中で使われ、再びそれが働くように ?? 検索をリセットします。 式は 1 文字ずつ分けてリストしたもの (ハイフンで範囲指定) として解釈されます。 それらの文字の一つで始まる変数や配列はみな初期状態にリセットされます。 式を省略すると、一度だけマッチする検索 (?pattern?) をリセットし、 再びマッチするようにします。 現パッケージ内の変数と検索のみをリセットします。 常に 1 を返します。 例: .nf .ne 3 reset \'X\'; \h'|2i'# すべての X 変数をリセットします reset \'a\-z\';\h'|2i'# 小文字の変数すべてをリセットします。 reset; \h'|2i'# ?? 検索をリセットします。 .fi 注意: ARGV や ENV を消してしまうため、\*(L"A\-Z\*(R" をリセットする のは勧められません。 .Sp dbm 連想配列に reset を使っても、dbm ファイルを変更しません。 (しかし、perl がキャッシュしたエントリは皆フラッシュするので、 dbm ファイルを共有している場合は、便利です。便利でないかもしれませんが。) .Ip "return LIST" 8 3 指定した値で、サブルーチンから返ります。 (サブルーチンは、自動的に最後に評価された式の値を返すことに 注意して下さい。 これは、好まれる方法です\*(--明示的な .I return の使用で、やや遅くなります。) .Ip "reverse(LIST)" 8 4 .Ip "reverse LIST" 8 配列のコンテキストでは、LIST の要素を逆順に並べた配列を返します。 スカラのコンテキストでは、LIST の最初の要素のバイト列を逆順にした 文字列を返します。 .Ip "rewinddir(DIRHANDLE)" 8 5 .Ip "rewinddir DIRHANDLE" 8 DIRHANDLE に関し、readdir() で読み始める現在位置を、 ディレクトリの先頭にセットします。 .Ip "rindex(STR,SUBSTR,POSITION)" 8 6 .Ip "rindex(STR,SUBSTR)" 8 4 STR 内で、SUBSTR が最後に現れる位置を返す他は、index と全く同じに 動作します。 POSITION が指定されると、その位置の前で最後に現れた位置を返します。 .Ip "rmdir(FILENAME)" 8 4 .Ip "rmdir FILENAME" 8 FILENAME で指定されたディレクトリが空なら消去します。 成功すると 1 を、失敗すると 0 を返し、$! (errno) をセットします。 FILENAME が省略されると、$_ を使います。 .Ip "s/PATTERN/REPLACEMENT/gieo" 8 3 パターンに合う文字列を検索し、見つかると置換テキストに置き換えて、 置換が行なわれた数を返します。 でなければ、偽 (0) を返します。 \*(L"g\*(R" はオプションです。もしあれば、マッチしたパターンはすべて 置換されることを意味します。 \*(L"i\*(R" もオプションです。もしあれば、マッチングは大文字小文字の 区別なく行なわれることを意味します。 \*(L"e\*(R" もオプションです。もしあれば、置換文字列は ダブルクォートで囲まれた文字列のようにというより、 式として評価されなければならないことを意味します。 英数字でない文字ならなんでも、/ に置き換えて区切り文字にできます。 シングルクォートが使われると、置換文字列の中で変数の挿入が 行なわれません (e 修飾子はこれに優先します)。 バッククォート ` が使われると、置換文字列はコマンドとして実行され、 その出力が実際の置換テキストとして使われることになります。 PATTERN が <>, () で区切られると、REPLACEMENT は、それ自身のクォートを 持ち、それは <>, () であっても、そうでなくても良いことになります。 例えば、s(foo)(bar) や s/bar/ のように。 =~ や !~ 演算子を介する文字列指定がされなかったときは、$_ 文字列が 検索、置換されます。 (=~ で指定された文字列は、スカラ変数、配列の要素、それらへの代入等で なくてはなりません。すなわち左辺値ということです。) パターンが、文字列の終りをテストする $ でなく、変数に見える $ を含む 場合は、その変数が実行時にパターンに挿入されます。 初回だけ変数が挿入されてコンパイルされるパターンを使いたいなら、 終りに \*(L"o\*(R" を付けて下さい。 PATTERN がヌル文字列に評価されたときは、代わりに最後に成功した正規表現 が使われます。 正規表現のセクションを参照して下さい。 例: .nf s/\|\e\|bgreen\e\|b/mauve/g; # wintergreen を変更しません $path \|=~ \|s|\|/usr/bin|\|/usr/local/bin|; s/Login: $foo/Login: $bar/; # 実行時パターン ($foo = $bar) =~ s/bar/foo/; $_ = \'abc123xyz\'; s/\ed+/$&*2/e; # \*(L'abc246xyz\*(R' になる s/\ed+/sprintf("%5d",$&)/e; # \*(L'abc 246xyz\*(R' になる s/\ew/$& x 2/eg; # \*(L'aabbcc 224466xxyyzz\*(R' になる s/\|([^ \|]*\|) *\|([^ \|]*\|)\|/\|$2 $1/; # 始めの2フィールドを交換 .fi (最後の例では \|\e\| の代わりに $ を使っていることに注意。 正規表現のセクションを参照して下さい。) .Ip "scalar(EXPR)" 8 3 EXPR を強制的にスカラのコンテキストで解釈させて、EXPR の値を返します。 .Ip "seek(FILEHANDLE,POSITION,WHENCE)" 8 3 FILEHANDLE のポインタを、丁度 stdio の fseek() のように任意の 位置にします。 FILEHANDLE は、ファイルハンドルの名前を与える式でもかまいません。 成功すると 1 を、失敗すると 0 を返します。 .Ip "seekdir(DIRHANDLE,POS)" 8 3 DIRHANDLE について readdir() の読む現在位置をセットします。 POS は、telldir() の返す値でなければなりません。 相当するシステムライブラリルーチン同様、directory compaction について は同じ注意が必要です。 .Ip "select(FILEHANDLE)" 8 3 .Ip "select" 8 3 現在 select されたファイルハンドルを返します。 FILEHANDLE を与えられると、出力用の現在のデフォルトファイルハンドルを セットします。 これには二つの効果があります。一つは、ファイルハンドルの無い .I write や .I print が、デフォルトでこの FILEHANDLE に行なわれるということです。 二つ目は、出力に関連する変数参照が、この出力チャンネルを参照する ということです。 例えば、form フォーマットの先頭を、一つ以上の出力チャンネルに セットしなければならないとき、次のようにすると良いでしょう: .nf .ne 4 select(REPORT1); $^ = \'report1_top\'; select(REPORT2); $^ = \'report2_top\'; .fi FILEHANDLE は、実際のファイルハンドルの名前を与える式でもかまいません。 このように: .nf $oldfh = select(STDERR); $| = 1; select($oldfh); .fi .Ip "select(RBITS,WBITS,EBITS,TIMEOUT)" 8 3 これは、ビットマスクを指定して select システムコールを呼び出しします。 ビットマスクは、以下のように fileno() や vec() を使って作成されます。 .nf $rin = $win = $ein = ''; vec($rin,fileno(STDIN),1) = 1; vec($win,fileno(STDOUT),1) = 1; $ein = $rin | $win; .fi たくさんのファイルハンドルを select したいときは、サブルーチンを書いた 方が良いかもしれません。 .nf sub fhbits { local(@fhlist) = split(' ',$_[0]); local($bits); for (@fhlist) { vec($bits,fileno($_),1) = 1; } $bits; } $rin = &fhbits('STDIN TTY SOCK'); .fi 通常の使い方は、 .nf ($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout); また、何かが ready となるまでブロックしておくには、こうなります。 .ie t \{\ $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef); 'br\} .el \{\ $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef); 'br\} .fi ビットマスクはどれも undef にもできます。 TIMEOUT は秒で指定され、小数点数でもかまいません。 注意: すべての実装で $timeleft を返せるわけではありません。 できない場合、常に与えられた $timeout に等しい値の $timeleft を 返します。 .Ip "semctl(ID,SEMNUM,CMD,ARG)" 8 4 System V IPC 関数の semctl を呼び出します。 CMD が &IPC_STAT か &GETALL なら、ARG は返って来た semid_ds 構造体か、セマフォ値配列を 保持する変数でなければなりません。 ioctl 同様、エラーの場合 undefined 値が、0 の場合 "0 but true" が、 それ以外の場合実際の戻り値が返されます。 .Ip "semget(KEY,NSEMS,SIZE,FLAGS)" 8 4 System V IPC 関数 semget を呼び出します。セマフォ id を返し、エラーの 場合は undefined 値を返します。 .Ip "semop(KEY,OPSTRING)" 8 4 シグナルや wait のようなセマフォ操作を実行する System V IPC 関数 semop を呼び出します。 OPSTRING は、semop 構造体に pack された配列でなければなりません。 各 semop 構造体は \&'pack("sss", $semnum, $semop, $semflag)' で 生成できます。セマフォ操作の数は、OPSTRING の長さによります。 成功すると真を、エラーでは偽を返します。例として、以下のコードでは セマフォ id $semid のセマフォ $semnum を待ちます。 .nf $semop = pack("sss", $semnum, -1, 0); die "Semaphore trouble: $!\en" unless semop($semid, $semop); .fi セマフォにシグナルを送るには、"-1" を "1" にします。 .Ip "send(SOCKET,MSG,FLAGS,TO)" 8 4 .Ip "send(SOCKET,MSG,FLAGS)" 8 ソケットにメッセージを送ります。 同名のシステムコールと同じフラグを用います。 接続されていないソケットでは、送り先を TO として指定しなければ なりません。送った文字数を返します。エラーの場合は undefined 値を 返します。 .Ip "setpgrp(PID,PGRP)" 8 4 指定した PID のカレントプロセスグループをセットします。 PID は、 カレントプロセスでは 0 です。 setpgrp(2) が実装されていないマシンでは、致命的エラーとなります。 .Ip "setpriority(WHICH,WHO,PRIORITY)" 8 4 プロセス、プロセスグループ、ユーザのカレントプライオリティを セットします。 (setpriority(2) を参照して下さい。) setpriority(2) が実装されていないマシンでは、致命的エラーになります。 .Ip "setsockopt(SOCKET,LEVEL,OPTNAME,OPTVAL)" 8 3 リクエストされたソケットオプションをセットします。 エラーでは undefined を返します。 引数を渡したいので無ければ、OPTVAL は undef 値を指定しても かまいません。 .Ip "shift(ARRAY)" 8 6 .Ip "shift ARRAY" 8 .Ip "shift" 8 配列の最初の要素を配列から除き、その要素を返します。 配列は 1 だけ短くなり、他のすべての要素はずれます。 配列に要素がないときは、undefined 値を返します。 ARRAY を省略すると、メインプログラムでは @ARGV 配列を shift し、 サブルーチンでは @_ 配列を shift します。 (これは、辞書的に決められています) unshift(), push(), pop() を参照して下さい。 shift() と unshift() は、push() と pop() が配列の右端に行なうのと 同じことを、配列の左端で行ないます。 .Ip "shmctl(ID,CMD,ARG)" 8 4 System V IPC 関数 shmctl を呼び出します。 CMD が &IPC_STAT のとき、 ARG は、返された shmid_ds 構造体を保持する変数でなくてはなりません。 ioctl 同様の戻り値を返します。エラーでは undefined 値を、0 では "0 but true" を、それ以外では実際の値を返します。 .Ip "shmget(KEY,SIZE,FLAGS)" 8 4 System V IPC 関数 shmget を呼び出します。 共有メモリのセグメント id を返します。エラーでは、undefined 値を 返します。 .Ip "shmread(ID,VAR,POS,SIZE)" 8 4 .Ip "shmwrite(ID,STRING,POS,SIZE)" 8 Syste V の共有メモリセグメント ID を、位置 POS から始まる サイズ SIZE にて attach し、copy in/out し、detach することで、読み込み と書き込みを行ないます。 読み込み時、VAR は読まれたデータを保持する変数でなければ なりません。書き込み時に、STRING が長過ぎると、SIZE バイトだけが 使われます。STRING が短過ぎると、SIZE バイトを埋めるのにヌルが 書き込まれます。成功すると真を、エラーでは偽を返します。 .Ip "shutdown(SOCKET,HOW)" 8 3 ソケット接続を HOW で指示された流儀に従ってシャットダウンします。 同名のシステムコールと同様に HOW を解釈します。 .Ip "sin(EXPR)" 8 4 .Ip "sin EXPR" 8 EXPR (ラジアンで表現) のサインを返します。 EXPR を省略すると $_ のサインを取ります。 .Ip "sleep(EXPR)" 8 6 .Ip "sleep EXPR" 8 .Ip "sleep" 8 EXPR 秒間スクリプトを止めます。 EXPR がなければ永久に止めます。 プロセスに SIGALRM を送ることで、割り込まれます。 実際に sleep した秒数を返します。 sleep() は、しばしば alarm() を使って実装されているので、おそらく alarm() と sleep() は 混在させることはできないでしょう。 .Ip "socket(SOCKET,DOMAIN,TYPE,PROTOCOL)" 8 3 指定された種類のソケットをオープンして、ファイルハンドル SOCKET に 結びつけます。 DOMAIN, TYPE, PROTOCOL は、同名のシステムコールと同様に指定します。 perl ライブラリファイルから簡単に適当な値を得るには、h2ph を sys/soket.h に対して実行する必要があるかもしれません。 成功すると真を返します。 プロセス間通信のセクションの例を参照して下さい。 .Ip "socketpair(SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL)" 8 3 指定されたドメインの指定された型で、無名のソケットペアを生成します。 DOMAIN, TYPE, PROTOCOL は、同名のシステムコールと同じように指定します。 実装されていない場合は、致命的エラーとなります。 成功すると真を返します。 .Ip "sort(SUBROUTINE LIST)" 8 9 .Ip "sort(LIST)" 8 .Ip "sort SUBROUTINE LIST" 8 .Ip "sort BLOCK LIST" 8 .Ip "sort LIST" 8 LIST をソートし、ソート済みの配列値を返します。 存在しない配列値は、削られます。 SUBROUTINE や BLOCK が省略されると、標準的な文字の比較による順でソート します。 0 より小さい整数、0 、0 より大きい整数を返すような SUBROUTINE の名前 を指定すると、配列の要素の並べ方に従って順に並べ直します。 (<=> と cmp 演算子は、このようなルーチンでは非常に便利です) SUBROUTINE は、スカラ変数名でもかまいません。その値として使用する サブルーチンの名前が入っていれば良いのです。 SUBROUTINE 名の代わりに、BLOCK を指定して、 無名のインラインソートサブルーチンとして用いることもできます。 .Sp 効率を良くするため、通常のサブルーチン呼び出しコードをバイパスしています。 そのため、次のような影響があります。 サブルーチンは再帰的であってはならず、 比較される 2 要素は @_ を介してではなく、$a と $b を介して サブルーチンに渡されます。 (以下の例を参照して下さい。) これらは参照渡しなので、$a や $b を変更してはいけません。 .Sp 例: .nf .ne 2 # 辞書順のソート @articles = sort @files; .ne 2 # 同じものだが、明示的なソートルーチン @articles = sort {$a cmp $b} @files; .ne 2 # 同じものだが逆順 @articles = sort {$b cmp $a} @files; .ne 2 # 数値的に昇順でソート @articles = sort {$a <=> $b} @files; .ne 2 # 数値的に降順でソート @articles = sort {$b <=> $a} @files; .ne 5 # 明示的にサブルーチン名を使ったソート sub byage { $age{$a} <=> $age{$b}; # 整数と仮定 } @sortedclass = sort byage @class; .ne 9 sub reverse { $b cmp $a; } @harry = (\'dog\',\'cat\',\'x\',\'Cain\',\'Abel\'); @george = (\'gone\',\'chased\',\'yz\',\'Punished\',\'Axed\'); print sort @harry; # AbelCaincatdogx と出力 print sort reverse @harry; # xdogcatCainAbel と出力 print sort @george, \'to\', @harry; # AbelAxedCainPunishedcatchaseddoggonetoxyz と出力 .fi .Ip "splice(ARRAY,OFFSET,LENGTH,LIST)" 8 8 .Ip "splice(ARRAY,OFFSET,LENGTH)" 8 .Ip "splice(ARRAY,OFFSET)" 8 配列から OFFSET と LENGTH で指定された要素を除き、LIST の要素と 入れ替えます。 配列から除かれた要素を返します。 配列は必要に応じて伸縮されます。 LENGTH を省略すると、OFFSET から先はすべて除かれます。 以下は皆同等となります。 ($[ == 0 であると仮定した場合) .nf push(@a,$x,$y)\h'|3.5i'splice(@a,$#a+1,0,$x,$y) pop(@a)\h'|3.5i'splice(@a,-1) shift(@a)\h'|3.5i'splice(@a,0,1) unshift(@a,$x,$y)\h'|3.5i'splice(@a,0,0,$x,$y) $a[$x] = $y\h'|3.5i'splice(@a,$x,1,$y); 次の例では、配列長は配列の前に渡されると仮定しています: sub aeq { # compare two array values local(@a) = splice(@_,0,shift); local(@b) = splice(@_,0,shift); return 0 unless @a == @b; # 同じ長さ? while (@a) { return 0 if pop(@a) ne pop(@b); } return 1; } if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... } .fi .Ip "split(/PATTERN/,EXPR,LIMIT)" 8 8 .Ip "split(/PATTERN/,EXPR)" 8 8 .Ip "split(/PATTERN/)" 8 .Ip "split" 8 文字列を文字列の配列に分けて、その配列を返します。 (配列のコンテキストではない場合、見つかったフィールドの数を返し、 split したものは @_ 配列に入れます。 (配列のコンテキストでは、パターン区切りとして ?? を使うことで強制的に @_ に split させられますが、それでも配列値を返します。)) EXPR を省略すると、$_ 文字列を split します。 PATTERN も省略すると、空白文字 (/[\ \et\en]+/) で split します。 PATTERN にマッチするものは何でもフィールドを分ける区切りと解釈されます。 (区切りは 1 文字より長くてもよいことに注意して下さい。) LIMIT が指定されると、それを越えない数に split されます (少ない場合も あります) 。 LIMIT が指定されないと、後に続くヌルフィールドは除かれます (pop()を使う人は良く覚えておいた方がよいでしょう) 。 ヌル文字にマッチするパターン (ヌルパターン // と混同しないで下さい。 // はヌル文字にマッチするパターンの一つにすぎません。) は、 マッチするすべての点で EXPR を一文字ずつに split します。 例えば: .nf print join(\':\', split(/ */, \'hi there\')); .fi は、\*(L'h:i:t:h:e:r:e\*(R' を出力します。 .Sp LIMIT パラメータは、行を部分的に split することに使われます。 .nf ($login, $passwd, $remainder) = split(\|/\|:\|/\|, $_, 3); .fi (リストに代入するとき、LIMIT が省略されていると perl は不必要な動作を 避けるためにリストの変数の数より一つ大きい LIMIT を与えます。 上記のリストでは LIMIT はデフォルトで 4 だったはずです。 時間に制限のあるアプリケーションでは、本当に必要な数以上のフィールドに は split しないようにすべきです。) .Sp PATTERN が括弧を含むときは、区切りとしてマッチする文字列により、 更に配列要素が作成されます。 .Sp split(/([,-])/,"1-10,20"); .Sp は以下の配列値を作ります。 .Sp (1,'-',10,',',20) .Sp パターン /PATTERN/ は、実行時に変わるパターンを指定する式で 置き換え可能です。 (実行時コンパイルを一回にしたければ、/$variable/o を使って下さい。) 特別なケースとして空白 (\'\ \') を指定すると、引数無しで split する 場合と同様ですが、先頭に空白があってもヌルフィールドは作られません。 つまり split(\'\ \') は、 .IR awk のデフォルトの動作をエミュレートすることができるわけで、split(/\ /) は先頭に空白があると、最初にその数だけヌルフィールドを作ります。 .Sp 例: .nf .ne 5 open(passwd, \'/etc/passwd\'); while () { .ie t \{\ ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(\|/\|:\|/\|); 'br\} .el \{\ ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(\|/\|:\|/\|); 'br\} .\|.\|. } .fi (上の例の $shell は改行文字を含みます。 chop() を参照して下さい。) .IR join を参照して下さい。 .Ip "sprintf(FORMAT,LIST)" 8 4 通常の printf 変換でフォーマットされる文字列を返します。 * 文字はサポートされていません。 .Ip "sqrt(EXPR)" 8 4 .Ip "sqrt EXPR" 8 EXPR の平方根を返します。 EXPR を省略すると、$_ の平方根を返します。 .Ip "srand(EXPR)" 8 4 .Ip "srand EXPR" 8 .I rand 演算子のために、乱数用の seed をセットします。 EXPR を省略すると、srand(time) を実行します。 .Ip "stat(FILEHANDLE)" 8 8 .Ip "stat FILEHANDLE" 8 .Ip "stat(EXPR)" 8 .Ip "stat SCALARVARIABLE" 8 EXPR という名前のファイルや FILEHANDLE でオープンされたファイルの 情報を示す 13 要素の配列を返します。 stat が失敗するとヌルリストを返します。 普通次のように使います: .nf .ne 3 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); .fi stat に特殊ファイルハンドル _ を渡すと、stat は実行されず最後に 行なわれた stat やファイルテストで使われた stat 構造体の内容を 返します。 例: .nf .ne 3 if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\en"; } .fi (この例は、NFS 下でデバイス番号が負になるマシンでのみ動作します。) .Ip "study(SCALAR)" 8 6 .Ip "study SCALAR" 8 .Ip "study" SCALAR (指定しなければ $_) について、それが次に変更される前に多くの パターンマッチを予想してあらかじめ行います。 検索をするパターンの性質や数、検索される文字列中の文字の出現頻度分布 によっては、時間を節約できるかもしれませんし、できないかもしれません。 \*(--多分これを使った場合と使わない場合で、実行時どちらが速いかを 比べてみたいでしょう。たくさんの短い定数文字列(より複雑なパターンの 定数部を含む)をスキャンするループで最も恩恵にあずかれるでしょう。 一度に一つの study しか効果がありません。\*(--別のスカラを study すると、先に study したものは \*(L"unstudied\*(R" となってしまいます。 (study の動作の仕方は次の通りです: 検索される文字列のすべての文字の リンクリストを作ります。そうすると例えば、どこに \*(L'k\*(R' の文字が あるかがすべてわかるわけです。いくつかの C のプログラムと英文から 作成された統計頻度表に基づき、各検索文字について、最も頻度が少ない 文字を選びます。この \*(L"頻度が少ない\*(R" 文字を調べるのです。) .Sp 次の例は、あるパターンを含むすべての行の前にインデックスを含むエントリを 挿入します: .nf .ne 8 while (<>) { study; print ".IX foo\en" if /\ebfoo\eb/; print ".IX bar\en" if /\ebbar\eb/; print ".IX blurfl\en" if /\ebblurfl\eb/; .\|.\|. print; } .fi /\ebfoo\eb/ を検索するとき、\*(L'f\*(R' は \*(L'o\*(R' よりも頻度が 少ないため、$_ の中で \*(L'f\*(R' を含む位置が探されます。 一般に、病的な場合を除いて、これは非常にうまくいきます。 唯一、最初の時点でリンクリストを作成するためにかかる以上の 時間を節約できるかが問題になります。 .Sp 実行するまで解らない文字列を検索しなければならない場合、全ループを 一つの文字列として解析し eval することで、すべてのパターンを毎回 再コンパイルするのを避けることができることを覚えておきましょう。 それに加えて全ファイルが 1 レコードになるように $/ を undef すると、 大変速くなり、fgrep のように特殊化したプログラムより速くなることも 多いです。 以下の例は、ファイルのリスト (@files) と単語のリスト (@words) を 検索し、マッチするファイル名を出力します: .nf .ne 12 $search = \'while (<>) { study;\'; foreach $word (@words) { $search .= "++\e$seen{\e$ARGV} if /\e\eb$word\e\eb/;\en"; } $search .= "}"; @ARGV = @files; undef $/; eval $search; # これは(メモリ不足で)泣きそう $/ = "\en"; # 普通の入力区切りに戻そう foreach $file (sort keys(%seen)) { print $file, "\en"; } .fi .Ip "substr(EXPR,OFFSET,LEN)" 8 2 .Ip "substr(EXPR,OFFSET)" 8 2 EXPR から部分文字列を取り出し、それを返します。 $[ をセットしない限り、最初の文字はオフセット 0 です。 OFFSET が負だと、文字列の終りから OFFSET だけ離れた位置から始めます。 LEN を省略すると、終端までのすべての文字列を返します。 substr() 関数は左辺値としても使えます。その場合 EXPR は左辺値 でなくてはなりません。 LEN より短いものを代入すると、文字列は短くなり、長いものを代入すると それを含められるように長くなります。 文字列を同じ長さに保つためには、sprintf() を使ってパディングまたは 切り捨てをしなければならないかもしれません。 .Ip "symlink(OLDFILE,NEWFILE)" 8 2 OLDFILE へのシンボリックリンク NEWFILE を作成します。 成功すると 1 を、失敗すると 0 を返します。 シンボリックリンクをサポートしないシステムでは、実行時に致命的エラー となります。 これをチェックするには、eval を使います: .nf $symlink_exists = (eval \'symlink("","");\', $@ eq \'\'); .fi .Ip "syscall(LIST)" 8 6 .Ip "syscall LIST" 8 リストの最初の要素で指定されたものに、残りの要素を引数として付けて、 システムコールを呼び出します。 実装されていないと致命的エラーとなります。 引数は次のように解釈されます: 与えられた引数が数字なら、引数は 整数として渡されます。そうでなければ、文字列へのポインタが渡されます。 結果が受け取れるように、書き込まれるべき文字列を十分長くしておくのは、 あなたの責任です。 数字の引数がリテラルでなく、それまで数字のコンテキストで解釈されて いなかったものなら、強制的に数字に見せるように、 0 を足す必要があるかもしれません。 .nf # h2ph を実行しておく必要があるかもしれません require 'syscall.ph'; syscall(&SYS_write, fileno(STDOUT), "hi there\en", 9); .fi .Ip "sysread(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "sysread(FILEHANDLE,SCALAR,LENGTH)" 8 5 システムコール read(2) を使って、指定した FILEHANDLE から LENGTH バイトのデータを読み込み、変数 SCALAR に格納します。 これは標準入出力を経由しないので、read と混在して使うと、 混乱するかもしれません。 実際に読み込まれたバイト数を返します。エラーの場合は undef を返します。 SCALAR は実際に読み込まれた長さによって伸縮します。 文字列の始めでなく途中にデータを格納するように、OFFSET を指定できます。 .Ip "system(LIST)" 8 6 .Ip "system LIST" 8 \*(L"exec LIST\*(R" と全く同じことを行ないますが、違いは最初に fork が 実行されて、親プロセスは子プロセスが終了するのを待つことです。 引数の処理は、引数の数によって変わることに注意して下さい。 戻り値は、wait() で返るプログラムの終了時ステータスになります。 実際の終了時ステータスを得るには、256 で割って下さい。 .IR exec を参照。 .Ip "syswrite(FILEHANDLE,SCALAR,LENGTH,OFFSET)" 8 5 .Ip "syswrite(FILEHANDLE,SCALAR,LENGTH)" 8 5 システムコール write(2) を使って、指定した FILEHANDLE に 変数 SCALAR から LENGTH バイトのデータを書き込みます。 これは標準入出力を経由しないので、print と混在して使うと、 混乱するかもしれません。 実際に書き込まれたバイト数を返します。エラーの場合は undef を返します。 OFFSET で、文字列の始めでなく途中からデータを読むように指定できます。 .Ip "tell(FILEHANDLE)" 8 6 .Ip "tell FILEHANDLE" 8 6 .Ip "tell" 8 FILEHANDLE の現在のファイル位置を返します。 FILEHANDLE は、実際のファイルハンドルの名前を与える式でもかまいません。 FILEHANDLE を省略すると、最後に読んだファイルを使います。 .Ip "telldir(DIRHANDLE)" 8 5 .Ip "telldir DIRHANDLE" 8 DIRHANDLE について readdir() ルーチンの現在の位置を返します。 この値は、ディレクトリの特定の位置をアクセスするために、seekdir() の 引数に使います。 相当するシステムライブラリルーチン同様、directory compaction について は同じ注意が必要です。 .Ip "time" 8 4 1970 年 1 月 1 日 00:00:00 (UTC) からの通算の秒数(閏秒無し)を返します。 gmtime() や localtime() に使うことができます。 .Ip "times" 8 4 現在のプロセスと子プロセスのユーザ、システム時間(秒)からなる 4 要素の 配列を返します。 .Sp ($user,$system,$cuser,$csystem) = times; .Sp .Ip "tr/SEARCHLIST/REPLACEMENTLIST/cds" 8 5 .Ip "y/SEARCHLIST/REPLACEMENTLIST/cds" 8 SEARCHLIST にある文字が出現したら、すべて REPLACEMENTLIST の相当する 文字に変換します。 変換または削除された文字の数を返します。 =~ や !~ 演算子を介した文字列の指定をしなかった場合、$_ 文字列が 変換されます。 (=~ で指定した文字列は、スカラ変数か配列の要素かそれらへの代入 でなければいけません。つまり、左辺値ということになります。) .I sed 信者のために、 .I tr の別名 .I y が用意されています。 SEARCHLIST が [], <>, () で区切られていると、REPLACEMENTLIST は、 それ自身のクォートを持ち、それは [], <>, () であっても、そうでなくても 良いことになります。例えば、 tr[A-Z][a-z] または tr(+-*/)/ABCD/ のようになります。 .Sp c 修飾子が指定されると、SEARCHLIST の文字セットは補間されます。 d 修飾子が指定されると、SEARCHLIST で指定された文字で REPLACEMENTLIST に対応するものがないものは皆、削除されます。 (これは、SEARCHLIST で見つかったものを何でも削除してしまう ような .I tr プログラムの挙動よりも、やや柔軟です。) s 修飾子が指定されると、変換されて同じ文字が続いたとき、 それを 1 文字に縮めます。 .Sp d 修飾子が使われると、REPLACEMENTLIST は常に指定された通りに 解釈されます。それ以外の場合で、REPLACEMENTLIST が SEARCHLIST より 短いときは、同じ長さになるまで最後の文字が繰り返されます。 REPLACEMENTLIST がヌルだと、SEARCHLIST がコピーされます。 これは、あるクラスに含まれる文字をカウントしたり、あるクラスの文字の 重複を縮めるときに便利です。 .Sp 例: .nf $ARGV[1] \|=~ \|y/A\-Z/a\-z/; \h'|3i'# 小文字に統一します $cnt = tr/*/*/; \h'|3i'# $_ の中の * を数えます $cnt = tr/0\-9//; \h'|3i'# $_ の中の数字を数えます tr/a\-zA\-Z//s; \h'|3i'# bookkeeper \-> bokeper ($HOST = $host) =~ tr/a\-z/A\-Z/; y/a\-zA\-Z/ /cs; \h'|3i'# アルファベット以外を 1 文字の空白にします tr/\e200\-\e377/\e0\-\e177/;\h'|3i'# 8 ビット目を消します .fi .Ip "truncate(FILEHANDLE,LENGTH)" 8 4 .Ip "truncate(EXPR,LENGTH)" 8 FILEHANDLE や EXPR の名前のファイルを指定した長さに切り詰めます。 システムに truncate が実装されていないと、致命的エラーになります。 .Ip "umask(EXPR)" 8 4 .Ip "umask EXPR" 8 .Ip "umask" 8 プロセスに umask をセットし、変更前の値を返します。 EXPR が省略されると、単に現在の umask を返します。 .Ip "undef(EXPR)" 8 6 .Ip "undef EXPR" 8 .Ip "undef" 8 EXPR の値を undefined とします。これは左辺値でなければなりません。 スカラ値、配列全体、サブルーチン名 (& を使う) の場合でのみ使えます。 (undef は、多分ほとんどの予約変数、dbm 配列値では期待する動作となりません。) undef は、常に undefined 値を返します。 EXPR を省略することもできます。その場合は何も undef されませんが、 それでも undefined 値を得ることができます。 例えば、サブルーチンから return するときです。 例: .nf .ne 6 undef $foo; undef $bar{'blurfl'}; undef @ary; undef %assoc; undef &mysub; return (wantarray ? () : undef) if $they_blew_it; .fi .Ip "unlink(LIST)" 8 4 .Ip "unlink LIST" 8 リストに含まれるファイルを削除します。 削除に成功したファイルの数を返します。 .nf .ne 2 $cnt = unlink \'a\', \'b\', \'c\'; unlink @goners; unlink <*.bak>; .fi 注意: unlink は、自分がスーパユーザで .IR perl に .B \-U フラグを付けている場合を除くとディレクトリを消去はしません。 これらの条件がそろったとしても、ディレクトリの unlink は システムにダメージを与えることがあるので、気をつけて下さい。 代わりに rmdir を使って下さい。 .Ip "unpack(TEMPLATE,EXPR)" 8 4 unpack は pack の逆を行ないます: 構造体を示す文字列を引数に取り、 それを配列値に出力し、配列値を返します。 (スカラのコンテキストでは、生成された最初の値のみを返します。) TEMPLATE は、pack 関数と全く同じフォーマットになります。 以下は、substr を実行するサブルーチンです: .nf .ne 4 sub substr { local($what,$where,$howmuch) = @_; unpack("x$where a$howmuch", $what); } .ne 3 そして、 sub ord { unpack("c",$_[0]); } .fi というのもあります。 更に、フィールドの前に %<数字> の添字を付けることにより、 項目そのものの代わりに、項目の<数字>ビットのチェックサムが欲しいと いう指定になります。 デフォルトは、16 ビットのチェックサムです。 次の例で、System V の sum プログラムと同じ数が計算されます: .nf .ne 4 while (<>) { $checksum += unpack("%16C*", $_); } $checksum %= 65536; .fi .Ip "unshift(ARRAY,LIST)" 8 4 視点によって、 .IR shift の逆、または .IR push の逆を行ないます。 LIST を配列の前に付け加え、新しい配列の要素の数を返します。 .nf unshift(ARGV, \'\-e\') unless $ARGV[0] =~ /^\-/; .fi .Ip "utime(LIST)" 8 2 .Ip "utime LIST" 8 2 リストの各ファイルのアクセス時刻と最終変更時刻を変えます。 リストの最初の二つの要素には、*数値*で表されたアクセス時刻と変更時刻が この順で入っていなければなりません。 変更に成功したファイルの数が返ります。 各ファイルの inode 変更時刻には現在時間がセットされます。 以下は、\*(L"touch\*(R" コマンドの例です: .nf .ne 3 #!/usr/bin/perl $now = time; utime $now, $now, @ARGV; .fi .Ip "values(ASSOC_ARRAY)" 8 6 .Ip "values ASSOC_ARRAY" 8 名前付き連想配列のすべての値からなる普通の配列を返します。 値は、見かけ上ランダムな順で返るように見えますが、同じ連想配列に対して、 keys() 関数 や each() 関数が生成するものと同じ順になります。 keys() と each() を参照して下さい。 .Ip "vec(EXPR,OFFSET,BITS)" 8 2 文字列を unsigned integer のベクトルとして扱い、指定した ビットフィールドの値を返します。 代入もできます。 BITSは、2 の累乗で 1 から 32 まででなければなりません。 .Sp vec() に生成されたベクトルは、論理演算子 |, &, ^ で操作することができ、 両方のオペランドが文字列のとき、 ビットベクトル演算をするものとみなされます。 古いプログラムを守るために、プログラム中に少なくとも一つの vec() が ないと、この解釈はなされません。 .Sp ビットベクトルを 0 や 1 の文字列や配列に変換するには、 以下を使って下さい: .nf $bits = unpack("b*", $vector); @bits = split(//, unpack("b*", $vector)); .fi ビットの正確な長さがわかるならば、* の代わりに使うことができます。 .Ip "wait" 8 6 子プロセスが終了するのを待ち、死んだプロセスの pid を返します。 子プロセスがないときは、-1 を返します。 終了時ステータスは $? に返されます。 .Ip "waitpid(PID,FLAGS)" 8 6 特定の子プロセスが終了するのを待ち、死んだプロセスの pid を返します。 そのような子プロセスがなければ、-1 を返します。 終了時ステータスは $? に返されます。 次のように書くと、 .nf require "sys/wait.h"; .\|.\|. waitpid(-1,&WNOHANG); .fi どのプロセスに対しても、non-blocking wait を実行できます。 non-blocking wait は、 .I waitpid (2) か、または .I wait4 (2) システムコールをサポートしているマシンでのみ使えます。 しかし、FLAGS 0 での 特殊な pid の wait はどこでも実装されています。 (perl は、終了したものの perl スクリプトには採り入れられていない プロセスのステータス値を覚えていることでシステムコールをエミュレート します。) .Ip "wantarray" 8 4 現在実行しているサブルーチンのコンテキストが配列値なら真を返します。 スカラのコンテキストに見えれば、偽を返します。 .nf return wantarray ? () : undef; .fi .Ip "warn(LIST)" 8 4 .Ip "warn LIST" 8 \*(L"die\*(R" と同じようなメッセージを標準エラー出力に出しますが、 終了しません。 .Ip "write(FILEHANDLE)" 8 6 .Ip "write(EXPR)" 8 .Ip "write" 8 指定したファイルに、関連付けられたフォーマットを使って、 フォーマットレコード (複数行も可) を書き込みます。 デフォルトで、フォーマットはファイルハンドルと同じ名前を持つものに なりますが、$~ 変数にフォーマットの名前を明示的に割り当てることで、 現在の出力チャンネル ( .IR select を参照して下さい) に対するフォーマットをセットしてもかまいません。 .Sp 最上位の form 生成は自動的に行なわれます: フォーマットされたレコードに対して、現在のページに十分な空きがない 場合、改頁が書き込まれて、次のページに移ります。 新しいページのヘッダには、特別なページ先頭フォーマットが使われ、 その後レコードが書き込まれます。 デフォルトでページ先頭フォーマットは、 ファイルハンドルの名前に \*(L"_TOP\*(R" を付け加えたものになりますが、 ファイルハンドルが select されているときは、$^ 変数に名前を割り当てる ことで、好きなフォーマットを動的にセットしてもかまいません。 現在のページに残っている行数は、変数 $- に保持されていますが、0 を セットすることがで、強制的に新しいページに移ることができます。 .Sp FILEHANDLE が指定されないと、現在のデフォルト出力チャンネルに 出力されます。デフォルト出力は、起動時 .I STDOUT ですが、 .I select 演算子で変更できます。 FILEHANDLE が EXPR のとき、その式が実行時に評価され、結果の文字列が FILEHANDLE の名前として用いられます。 フォーマットについての詳細は、後述のフォーマットのセクションを 参照して下さい。 .Sp write は read の*逆ではない*ことに注意して下さい。 .Sh "優先度" .I perl の演算子は次のような結合規則と優先度を持っています: .nf なし\h'|1i'print printf exec system sort reverse \h'1.5i'chmod chown kill unlink utime die return 左から右\h'|1i', 右から左\h'|1i'= += \-= *= など 右から左\h'|1i'?: なし\h'|1i'.\|. 左から右\h'|1i'|| 左から右\h'|1i'&& 左から右\h'|1i'| ^ 左から右\h'|1i'& なし\h'|1i'== != <=> eq ne cmp なし\h'|1i'< > <= >= lt gt le ge なし\h'|1i'chdir exit eval reset sleep rand umask なし\h'|1i'\-r \-w \-x など 左から右\h'|1i'<< >> 左から右\h'|1i'+ \- 左から右\h'|1i'* / % x 左から右\h'|1i'=~ !~ 右から左\h'|1i'! ~ 単項の- 右から左\h'|1i'** なし\h'|1i'++ \-\|\- 左から右\h'|1i'\*(L'(\*(R' .fi 始めの方で述べたように、リストを引数にする演算子 (print 他) や、 任意の単項演算子 (chdir 他) のすぐ後に同じ行の次のトークンとして 左括弧がある場合、括弧の中の演算子と引数は、丁度通常の ファンクションコールと同様に再優先とみなされます。 例: .nf chdir $foo || die;\h'|3i'# (chdir $foo) || die chdir($foo) || die;\h'|3i'# (chdir $foo) || die chdir ($foo) || die;\h'|3i'# (chdir $foo) || die chdir +($foo) || die;\h'|3i'# (chdir $foo) || die しかし、* は || よりも優先度が高いので: chdir $foo * 20;\h'|3i'# chdir ($foo * 20) chdir($foo) * 20;\h'|3i'# (chdir $foo) * 20 chdir ($foo) * 20;\h'|3i'# (chdir $foo) * 20 chdir +($foo) * 20;\h'|3i'# chdir ($foo * 20) rand 10 * 20;\h'|3i'# rand (10 * 20) rand(10) * 20;\h'|3i'# (rand 10) * 20 rand (10) * 20;\h'|3i'# (rand 10) * 20 rand +(10) * 20;\h'|3i'# rand (10 * 20) .fi 括弧がないと、print, sort, chmod といったリストを引数に持つ演算子は、 演算子の左側を見ているか右側を見ているかによって、非常に高くも 非常に低くもなります。 例えば、次の例で .nf @ary = (1, 3, sort 4, 2); print @ary; # 1324 を出力 .fi sort の右側のコンマは、sort の前に評価されますが、左側のコンマは、 後で評価されます。 言い換えると、リストを引数に取る演算子は、それに続くすべての引数を 拾う傾向にあり、前の式にしたがって単一の命令語のように振舞います。 括弧に注意深くなければいけないことを覚えておいて下さい: .nf .ne 3 # これらを評価すると、print を実行する前に exit します。 print($foo, exit); # 明らかにやりたいこととは違います print $foo, exit; # これもそう .ne 4 # これらは、exit を評価する前に print を実行します。 (print $foo), exit; # これはやりたいことです print($foo), exit; # これもそう print ($foo), exit; # さらにこれも また、これは print ($foo & 255) + 1, "\en"; .fi 多分一目見て期待する動作とは違うことを実行するでしょう。 .Sh "サブルーチン" サブルーチンは次のように宣言されます: .nf sub NAME BLOCK .fi .PP ルーチンに渡されたすべての引数は、配列 @_ に入ります。 これは、($_[0], $_[1], .\|.\|.) です。 配列 @_ はローカル配列ですが、その値は実際のスカラパラメータへの参照 になります。 サブルーチンの戻り値は、最後の式が評価されたときの値で、配列値にも スカラ値にもなり得ます。 また、リターン文は戻り値を指定してサブルーチンを抜けることにも 使われます。 ローカル変数を作成するには、 .I local 演算子を参照して下さい。 .PP サブルーチンは、 .I do 演算子かまたは & 演算子を使って呼ばれます。 .nf .ne 12 例: sub MAX { local($max) = pop(@_); foreach $foo (@_) { $max = $foo \|if \|$max < $foo; } $max; } .\|.\|. $bestday = &MAX($mon,$tue,$wed,$thu,$fri); .ne 21 例: # 行を取得し、空白で始まる行は # 続きの行として結合されます。 sub get_line { $thisline = $lookahead; line: while ($lookahead = ) { if ($lookahead \|=~ \|/\|^[ \^\e\|t]\|/\|) { $thisline \|.= \|$lookahead; } else { last line; } } $thisline; } $lookahead = ; # 最初の行を取得します while ($_ = do get_line(\|)) { .\|.\|. } .fi .nf .ne 6 引数に名前を付けるには、ローカルリストへの配列の代入を使います: sub maybeset { local($key, $value) = @_; $foo{$key} = $value unless $foo{$key}; } .fi 代入は値をコピーするので、これは参照呼び出しを値呼び出しに換える効果も あります。 .Sp サブルーチンは再帰的に呼び出せます。 サブルーチンが & の型を使って呼び出されるとき、引数リストは省略 できます。 省略されると、サブルーチンには @_ 配列がセットされません; その代わり、呼び出し時に @_ 配列は、サブルーチンには可視となります。 .nf do foo(1,2,3); # 三つの引数を渡します &foo(1,2,3); # 上と同じです do foo(); # ヌルリストを渡します &foo(); # 上と同じです &foo; # 引数を渡しません\*(--より効率的 .fi .Sh "参照渡し" サブルーチンへ配列の値を渡すのではなく、その名前を渡して、サブルーチン がローカルなコピーに対してではなくグローバルな配列を変更できるように したいときがあるでしょう。 perl では名前を持つすべてのオブジェクトに対して、その名前の前に * を つけて参照できます: *foo のように。 これが評価されると、ファイルハンドル、フォーマット、サブルーチンを含む、 その名前を持つすべてのオブジェクトを表すスカラ値となります。 local() 演算子に代入されたとき、その名前がそれに代入された * 値を 参照するようになります。 例: .nf sub doubleary { local(*someary) = @_; foreach $elem (@someary) { $elem *= 2; } } do doubleary(*foo); do doubleary(*bar); .fi *name への代入は今のところ local() の中でしか勧められません。 実際には *name への代入はどこででもできますが、それ以前の *name への 参照が永遠に尾を引くかもしれません。 これにより困ったことになるかもしれませんし、ならないかもしれません。 .Sp スカラはすでに参照渡しですが、このメカニズムを用いなくても、 関心のある $_[nnn] への明示的な参照を行うことで、スカラの引数を 変更することができます。 すべての要素をスカラで渡すことで、すべての配列の要素を変更することが できますが、push や pop 、配列のサイズの変更には * メカニズムを 使わなければなりません。 どんな場合でも、* メカニズムは多分、より効率が良いはずです。 .Sp *name 値は表示不能なバイナリデータを含むので、print の引数または printf や sprintf の %s 引数として使われると、表示を綺麗にするため '*name' と いう値になります。 .Sp 通常 LIST メカニズムはすべての配列値をマージしてしまって、個々の配列を 取り出せなくなってしまうので、配列を変更したくないとしても、 このメカニズムは一つの LIST にたくさんの配列を渡すのに便利です。 .Sh "正規表現" パターンマッチで使われるパターンは、バージョン 8 regexp ルーチンで供給 されているものと同じ正規表現です。 (実際、このルーチンは Henry Spencer の自由に再配布可能な再実装 V8 ルーチン から抜き取って使われています。) それに加えて、\ew は英数字 (\*(L"_\*(R" を含む) にマッチし、 \eW は非英数字にマッチします。 単語境界は \eb に、非単語境界は \eB に。 空白文字は \es に、非空白文字は \eS に。 数字は \ed に、非数字は \eD にマッチします。 \ew, \es, \ed はキャラクタクラスでも使えます。 また、\en, \er, \ef, \et, \eNNN は通常と同じ意味となります。 キャラクタクラスの中では、\eb は単語境界ではなく、 バックスペースを表します。 選択候補は、| で区切ります。 括弧構造 \|(\ .\|.\|.\ \|) を使うと、\e<数字> はその数字番目の 部分文字列にマッチします。 (パターンの外では、数字の前に \e の代わりに常に $ を用いなければ なりません。$<数字> (と $\`, $&, $\') の有効範囲は、閉じたブロックの 終りか、eval 文字列か、次のパターンマッチまでとなります。 \e<数字> 記述は、ときに現在のパターンの外に作用しますが、それに頼って はいけません。) 括弧は好きなだけたくさん使ってかまいません。9 個以上の部分文字列が あると、変数 $10, $11, ... が対応する部分文字列を参照します。 後方参照の前に少なくともその数の左括弧があると、パターンの中では、 \e10, \e11 等が部分文字列を後方参照します。 そうでなければ (以前との互換性のために) \e10 は \e010 のバックスペースと 同じ、\e11 は \e011 のタブと同じというようになります。 (\e1 から \e9 は常に後方参照です。) .PP $+ は、最後の括弧でマッチしたものを返します。 $& は、マッチした文字列全体を返します。 ($0 が同じものを返していましたが、今は違います。) $\` はマッチした文字列の前の全文字列を返します。 $\' はマッチした文字列の後の全文字列を返します。 例: .nf s/\|^\|([^ \|]*\|) \|*([^ \|]*\|)\|/\|$2 $1\|/; # 最初の二語を交換 .ne 5 if (/\|Time: \|(.\|.\|):\|(.\|.\|):\|(.\|.\|)\|/\|) { $hours = $1; $minutes = $2; $seconds = $3; } .fi デフォルトで、^ 文字は文字列の先頭に、$ 文字は文字列の最後 (または最後の改行文字の前) にマッチすることが保障されており、 .I perl は文字列が一行しか含んでいないという仮定のもとで、 ある最適化を行なっています。 改行が埋め込まれた場合の ^ や $ の振舞いは、矛盾を生じるでしょう。 しかし、^ が文字列内の任意の改行の後に、$ が改行の前にマッチするよう な、文字列を複数行バッファとして使いたい場合があるかもしれません。 少々のオーバヘッドを覚悟すれば、変数 $* に 1 をセットすることで、 それができます。 $* を 0 に設定し直せば、 .I perl は元の動作に戻ります。 .PP 複数行の置換を用意にするために、. 文字は改行文字にはマッチしません (たとえ $* が 0 であっても) 。 特に次の例では、改行文字が $_ 文字列に残ります: .nf $_ = ; s/.*(some_string).*/$1/; 改行文字が要らないなら、次のどれかを試して下さい。 s/.*(some_string).*\en/$1/; s/.*(some_string)[^\e000]*/$1/; s/.*(some_string)(.|\en)*/$1/; chop; s/.*(some_string).*/$1/; /(some_string)/ && ($_ = $1); .fi 正規表現のどの要素の後でも中括弧で囲んだ数字を {n,m} の形で 置くことができ、n で要素がマッチする最小の回数を、m で最大の回数を 指定します。 {n} の形は、{n,n} と同等で、正確に n 回にマッチします。 {n,} の形は、n 回以上にマッチします。 (中括弧が他のコンテキストの中に出て来た場合は、通常の文字として 扱われます。) * 修飾子は {0,} と、+ 修飾子は {1,} と、? 修飾子は {0,1} と 同等となります。 n と m のサイズには制限がありませんが、大きい数字はより多くのメモリを 消費するでしょう。 .Sp .I perl では、 \eb, \ew, \en のような バックスラッシュのつくメタキャラクタは、すべて英数字であること に気がつかれることでしょう。 他の正規表現言語とは違って、英数字でないバックスラッシュシンボルは ありません。 従って、\e\e, \e(, \e), \e<, \e>, \e{, \e} というようなものは皆、 メタキャラクタではなく、文字そのものとして解釈されます。 これにより、メタキャラクタに含まれるのではないかと心配になるような 文字列をパターンに使って、引用することが容易になります。 英数字でないすべての文字の引用は、このようにします: .nf $pattern =~ s/(\eW)/\e\e$1/g; .fi .Sh "フォーマット" .I write 演算子で使う出力レコードフォーマットは、次のように 宣言します: .nf .ne 3 format NAME = FORMLIST . .fi NAME を省略すると、\*(L"STDOUT\*(R" フォーマットが定義されます。 FORMLIST は複数行から成り、各行は次の三つの型のいずれかとなります: .Ip 1. 4 コメント .Ip 2. 4 一つの出力行のフォーマットを示す \*(L"picture\*(R" 行 .Ip 3. 4 picture 行に値を与える引数行 .PP picture 行は、その中で値が置換される特定のフィールドを除けば、 見た目そのままに出力されます。 各 picture フィールドは、@ か ^ で始まります。 @ フィールド (配列の先頭の @ と混乱しないように) は通常の場合 で、^ フィールドは基本的な複数行テキストブロックを埋めるのに 使われます。 フィールドの長さは、<, >, | の繰り返しで埋めることで指定し、それぞれ 左寄せ、右寄せ、センタリングを意味します。 右寄せの別な形として、# 文字を (それに . を付けても良い) 数字フィールドの指定として使うこともできます。 (@ のかわりに ^ を使うと、undefined なフィールドが空白になります。) これらのフィールドに与えられた値が改行を含むと、改行までのテキスト のみが出力されます。 特殊フィールド @* は複数行の値の出力に使われます。 その行に書かれているのは @* だけでなくてはいけません。 .PP 値は、次の行で指定され、picture フィールドと同じ順となります。 値はカンマで区切られていなければなりません。 .PP @ でなく ^ で始まる picture フィールドは、特別な扱いになります。 指定する値は、テキスト文字列が入っているスカラ変数名でなければ いけません。 .I perl は、フィールドに入れられるだけたくさんのテキストを入れ、変数が次に参照 されるときに続きが出力されるように、文字列の先頭からそのテキストを削ります。 通常、テキストのブロックを出力するには、垂直なスタックの中にフィールド の一続きを入れて使います。 全部を入れるにはテキストが長すぎるとき、そうしたければ 最後のフィールドを .\|.\|. で終らせることもできます。 変数 $: を好きな文字のリストにすることで、テキストを分割する文字を 変えることができます。 .PP ^ フィールドを使うと、可変長のレコードを生成するので、テキストの フォーマットを短くしたいとき、チルダ (~) 文字を行のどこかに入れて 空行を抑制することができます。 (可読性を高めるため、普通はできれば行頭に入れるべきです。) チルダは出力時には空白に変換されます。 一つ目に続けて二つ目のチルダを書くと、行中のすべてのフィールドが なくなるまで、その行を繰り返します。 (いろいろな @ のフィールドを使うとき、与える式はいつも同じ値ではない方が 良いでしょう。) .PP 例: .nf .lg 0 .cs R 25 .ft C .ne 10 # /etc/passwd ファイルの形式 format STDOUT_TOP = \& Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ \&. format STDOUT = @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<< $name, $login, $office,$uid,$gid, $home \&. .ne 29 # バグレポート形式 format STDOUT_TOP = \& Bug Reports @<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>> $system, $%, $date ------------------------------------------------------------------ \&. format STDOUT = Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $subject Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $index, $description Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $priority, $date, $description From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $from, $description Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $programmer, $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< \& $description \&~ ^<<<<<<<<<<<<<<<<<<<<<<<... \& $description \&. .ft R .cs R .lg .fi 同じ出力チャンネルに対して、write を使って出力を混ぜることはできます が、$\- (ページの残り行数) を自分でいじらなければなりません。 .PP ほとんどが空白のフィールドがたくさんあるとき、 レコード間で reset 演算子を使うことを考えるべきです。 効率的であるというだけでなく、別のフィールドを加えてしまい、0 に し忘れてしまうというバグを防ぐことができます。 .Sh "プロセス間通信" perl の プロセス間通信(IPC)の能力は Berkeley のソケット機構に 基づいています。 ソケットが無ければ、このセクションは無視できます。 この呼び出しは、同名のシステムコールに相当しますが、 二つの理由で大抵引数は異なります。 一つ目は、perl のファイルハンドルは C ファイルディスクリプタとは 異なる動作をするということです。 二つ目は、perl は文字列の長さを知っているので、その情報を渡さなくても 良いということです。 以下がクライアントのサンプル (未テスト) です: .nf ($them,$port) = @ARGV; $port = 2345 unless $port; $them = 'localhost' unless $them; $SIG{'INT'} = 'dokill'; sub dokill { kill 9,$child if $child; } require 'sys/socket.ph'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\ed+$/; .ie t \{\ ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname); 'br\} .el \{\ ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($hostname); 'br\} ($name, $aliases, $type, $len, $thataddr) = gethostbyname($them); $this = pack($sockaddr, &AF_INET, 0, $thisaddr); $that = pack($sockaddr, &AF_INET, $port, $thataddr); socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; bind(S, $this) || die "bind: $!"; connect(S, $that) || die "connect: $!"; select(S); $| = 1; select(stdout); if ($child = fork) { while (<>) { print S; } sleep 3; do dokill(); } else { while () { print; } } .fi これがサーバ側です: .nf ($port) = @ARGV; $port = 2345 unless $port; require 'sys/socket.ph'; $sockaddr = 'S n a4 x8'; ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\ed+$/; $this = pack($sockaddr, &AF_INET, $port, "\e0\e0\e0\e0"); select(NS); $| = 1; select(stdout); socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; bind(S, $this) || die "bind: $!"; listen(S, 5) || die "connect: $!"; select(S); $| = 1; select(stdout); for (;;) { print "Listening again\en"; ($addr = accept(NS,S)) || die $!; print "accept ok\en"; ($af,$port,$inetaddr) = unpack($sockaddr,$addr); @inetaddr = unpack('C4',$inetaddr); print "$af $port @inetaddr\en"; while () { print; print NS; } } .fi .Sh "予約変数" 次の変数名は、 .IR perl にとって特別な意味があります。 これらのうち幾つかはアルファベットのシンボルにもしても良かったのですが、 reset \*(L"a\-zA\-Z\*(R" で予約変数まで消されてしまうようなことに したくなかったのです。 そのため、これらのおかしなシンボル名に悩まされなければならないでしょう。 そのうち多くは筋が通ったニーモニック (記憶方法) で、シェルのものと 類似になっています。 .Ip $_ 8 入力およびパターン検索のデフォルト。 次の組はそれぞれ同等です: .nf .ne 2 while (<>) {\|.\|.\|. # while の中でのみ同等 while ($_ = <>) {\|.\|.\|. .ne 2 /\|^Subject:/ $_ \|=~ \|/\|^Subject:/ .ne 2 y/a\-z/A\-Z/ $_ =~ y/a\-z/A\-Z/ .ne 2 chop chop($_) .fi (覚え方: 下線は実行されるとわかる。) .Ip $. 8 最後に読み込まれたファイルハンドルの現在の行番号。 読み出し専用。 明示的なファイルハンドルの close でのみ行番号がリセットされることを 覚えておいて下さい。 <> は明示的な close を行なわないので、ARGV ファイル全部を通して行番号 が増えていきます (eof の例を参照して下さい) 。 (覚え方: 多くのプログラムは . を現在行番号の意味で使う。) .Ip $/ 8 入力レコードの区切り文字。デフォルトは改行。 ヌル文字列にセットされると空行を区切りとして扱うことも含めて、 .IR awk の RS 変数と同じ働きをします。 複数文字にセットすると複数文字区切りにマッチさせることができます。 ファイルに空行が連続してあるとき、 この変数を "\en\en" にセットすると、"" にセットする場合と 少々異なる意味を持つことに注意して下さい。 "" にセットすると、二つかそれ以上の連続した空行を一つの空行として 扱います。 "\en\en" にセットすると、空行の後にたとえ改行文字が 続いていても、次の段落に含まれているものと盲目的に解釈されます。 (覚え方: / は詩をクォートするとき行境界の区切りとして使える。) .Ip $, 8 print 演算子のための出力フィールド区切り文字。 通常は、print 演算子は単にカンマ区切りで指定したフィールドを 出力します。より .IR awk に似た挙動をさせるためには、フィールド間に出力する文字を 指定する .IR awk の OFS 変数と同じものを、この変数をセットして下さい。 (覚え方: print文に , があるとき出力すべきもの。) .Ip $"" 8 $, と似ていますが、この変数の異なる点は、"" で囲まれた 文字列 (または同様な挿入文字) に挿入される配列値に適用されることです。 デフォルトは空白文字です。 (覚え方: これは明白。) .Ip $\e 8 print 演算子の出力レコードセパレータ文字。 通常 print 演算子は、後に改行やレコードセパレータ文字を続いていないと 推定して、単にカンマ区切りの指定フィールドを出力します。 より .IR awk に似た挙動をさせるためには、print の終りに出力する文字を指定する .IR awk の ORS 変数と同じものをこの変数にセットして下さい。 (覚え方: print の終りに \en を加える代わりに $\e をセット。) / にも似ていますが、 .IR perl から \*(L"得る\*(R" ものです。) .Ip $# 8 数字の出力のための出力フォーマット。 この変数は .IR awk の OFMT 変数を半分だけ受け継いでいます。 しかし .I awk と .I perl では、実際に何が数字であるかという概念の異なることがしばしばあります。 初期値も、%.6g でなく %.20g ですので、 .IR awk の値を得るには、明示的に $# をセットする必要があります。 (覚え方: # は数字の記号。) .Ip $% 8 現在 select されている出力チャンネルの現在のページ番号。 (覚え方: % は nroff におけるページ番号。) .Ip $= 8 現在 select されている出力チャンネルの現在のページ長 (出力可能行) 。 デフォルトは 60 。 (覚え方: = は平行線。) .Ip $\- 8 現在 select されている出力チャンネルのページの残り行数。 (覚え方: 1 ページの行数 \- 出力済み行数) .Ip $~ 8 現在 select されている出力チャンネルの現在のレポートフォーマット名。 デフォルトは、ファイルハンドル名。 (覚え方: $^ の仲間。) .Ip $^ 8 現在 select されている出力チャンネルの現在のページ先頭フォーマット名。 デフォルトは、ファイルハンドル名に \*(L"_TOP\*(R" を加えたもの。 (覚え方: 先頭ページを指す。) .Ip $| 8 0 でない値をセットすると、現在 select されている出力チャンネルに write や print が行なわれる毎にフラッシュします。 デフォルトは 0 。 通常 .I STDOUT は、端末に出力するときは行バッファが使われ、それ以外では ブロックバッファが使われることに注意して下さい。 この変数をセットするのは、 .I perl スクリプトを rsh の基で走らせている時等、 パイプに出力している時に、 出力が起こる度に確認したい場合に便利です。 (覚え方: パイプを常に動かしておきたい。) .Ip $$ 8 .I perl が走らせているスクリプトのプロセス番号。 (覚え方: シェルと同じ。) .Ip $? 8 最後に close したパイプや (\`\`) コマンドや .I system 演算子の戻り値。 これは、wait() システムコールが返すステータスなので、サブプロセスの 終了値は実際は ($? >> 8) です。 プロセスを終了させたシグナルがあった場合、$? & 255 は どのシグナルであるか、dump された core があるかどうかを返します。 (覚え方: sh や ksh と同じ。) .Ip $& 8 4 最後に成功したパターンマッチでマッチした文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: あるエディタの & と同じ。) .Ip $\` 8 4 最後にパターンマッチに成功したパターンの前にある文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: \` は大抵クォートされた文字列の前。) .Ip $\' 8 4 最後にパターンマッチに成功したパターンの後ろにある文字列。 (ブロック内や現在のブロックで閉じた eval でのマッチは含まれません。) (覚え方: \' は大抵クォートされた文字列の後。) 例: .nf .ne 3 $_ = \'abcdefghi\'; /def/; print "$\`:$&:$\'\en"; # abc:def:ghi を出力 .fi .Ip $+ 8 4 最後に検索したパターンの最後の括弧にマッチします。 これは、複数候補のパターンマッチでどちらにマッチするかわからない ときに便利です。 例: .nf /Version: \|(.*\|)|Revision: \|(.*\|)\|/ \|&& \|($rev = $+); .fi (覚え方: 正で、前方を見ること。) .Ip $* 8 2 文字列内で、複数行のマッチを行なうとき 1 をセットし、 パターンマッチの最適化の目的で、単一行を含む文字列であると .I perl に決め打ちにさせるときに 0 とします。 $* が 0 のときに複数の改行を含む文字列のパターンマッチをすると、 混乱した結果となります。 デフォルトは 0 。 (覚え方: * は複数のものにマッチする。) この変数は、^ や $ の解釈に影響するだけであるということに 注意して下さい。 改行のリテラルは、when $* == 0 としても検索できます。 .Ip $0 8 .I perl 起動したスクリプトのファイル名を保持しています。 $0 修飾子への代入は、ps(1) プログラムの引数の部分を参照して下さい。 (覚え方: sh や ksh と同じ) .Ip $<数字> 8 最後に行なったパターンマッチで対応する数字番目の括弧のサブパターン。 入れ子になったブロック内で既に終了したパターンマッチの数は含まれません。 (覚え方: \e数字と同じ。) .Ip $[ 8 2 配列中の最初の要素や部分文字列の最初の文字の添字。 デフォルトは 0 ですが、index() や substr() 関数の 添字のつけ方や評価に関して、 .I perl を .I awk (や Fortran) の動作にさせるには、この変数に 1 をセットすることでできます。 (覚え方: [ は添字の始まり。) .Ip $] 8 2 \*(L"perl -v\*(R" で出力される文字列。 これは、perl インタープリタが正しいバージョンの範囲でスクリプトを 実行しているかどうかを決めるために、スクリプトの始めの方で使われます。 数値のコンテキストで使われると、バージョン + パッチレベル / 1000 を 返します。 例: .nf .ne 8 # getcがつかえるかどうかを調べます ($version,$patchlevel) = $] =~ /(\ed+\e.\ed+).*\enPatch level: (\ed+)/; print STDERR "(No filename completion available.)\en" if $version * 1000 + $patchlevel < 2016; また、数値で使われると、 warn "No checksumming!\en" if $] < 3.019; .fi (覚え方: このバージョンの perl は right(正しい、右) 括弧に入ってるか? ) .Ip $; 8 2 多次元配列エミュレーションの際の添字の区切り。 連想配列の要素を次のように参照するとき、 .nf $foo{$a,$b,$c} 実際には $foo{join($;, $a, $b, $c)} を意味しますが、 @foo{$a,$b,$c} # スライス\*(--@ に注意 と書いてはいけません。 ($foo{$a},$foo{$b},$foo{$c}) .fi を意味することになってしまうからです。 デフォルトは "\e034" で、 .IR awk の SUBSEP と同じです。 キーとしてバイナリデータを使うと、$; として安全な値はないだろうという ことに気をつけて下さい。 (覚え方: カンマ (文法上添字の区切り) はセミコロンの半分。 これは、ちょっとひどいね。でも、$, は他のもっと重要なことに 取られているので。) .Ip $! 8 2 数値のコンテキストで使うと、通常の警告の文字列と共に errono の 現在の値を返します。 (これは、システムエラーのような特別なエラーを除くと、$! の値に 依存した動作をさせてはいけないということを意味します。) 文字列のコンテキストで使うと、相当するシステムエラー文字列を返します。 errno をセットするために $! に代入することができます。 例えば、エラー番号 n に対して $! が文字列を返したいときや、 die 演算子に終了値をセットしたいときなどです。 (覚え方: 一体何が爆発したの? ) .Ip $@ 8 2 最後に評価したコマンドからくる perl の文法エラーメッセージ。 ヌルなら、最後の評価が、正常に解析、実行されたことになります (起動された演算は普通の形で失敗したかもしれません) 。 (覚え方: 文法エラーはどこに \*(L"アット (at where)\*(R" ?) .Ip $< 8 2 現在のプロセスの実 uid 。 (覚え方: setuid で走らせているとき、*どこから* きた uid か。) .Ip $> 8 2 現在のプロセスの実効 uid 。 例: .nf .ne 2 $< = $>; # 実効 uid に実 uid をセットします ($<,$>) = ($>,$<); # 実 uid と実効 uid を取り換えます .fi (覚え方: setuid で走らせているとき、*行く先の* uid 。) 注意: $< と $> は setreuid() をサポートしているマシンでだけ 交換できます。 .Ip $( 8 2 現在のプロセスの実 gid 。 同時に複数グループのメンバとなることをサポートしたマシンで、 属しているグループの空白区切りのリストが得られます。 最初の数は getgid() の返すもので、残りが getgroups() の返すものです。 残りの中には最初の数値と同じものも含まれているかもしれません。 (覚え方: 括弧は GROUP に使われる。 setgid スクリプトを走らせているとき、 実 gid は LEFT(残っている、左) のグループ。) .Ip $) 8 2 現在のプロセスの実効 gid 。 同時に複数グループのメンバとなることをサポートしたマシンで、 属しているグループの空白区切りのリストが得られます。 最初の数は getegid() の返すもので、残りが getgroups() の返すものです。 残りの中には最初の数値と同じものも含まれているかもしれません。 (覚え方: 括弧は GROUP に使われる。 setgid スクリプトを走らせているとき、 実効 gid はあなたの RIGHT(正しい、右の)グループ。) .Sp 注意: $<, $>, $(, $) は、相当する set[re][ug]id() ルーチンを サポートしているマシンでだけセットできます。 $( と $) は setregid() をサポートしているマシンでだけ交換できます。 .Ip $: 8 2 format の (^ で始まる) 継続フィールドを埋めるように文字列を分ける 際の直前の文字列セット。 デフォルトは "\ \en-" で、空白やハイフンで分けられます。 (覚え方: 詩では \*(L"コロン\*(R" は行の一部) .Ip $^D 8 2 デバッグフラグの現在の値。 (覚え方: .B \-D スイッチの値。) .Ip $^F 8 2 最大システムファイルディスクリプタ数。通常は 2 。 システムファイルディスクリプタは、子プロセスに渡されますが、 それより数字が上のファイルディスクリプタは渡されません。 open する間は、たとえ open に失敗したとしても、 システムファイルディスクリプタは保存されます。 open が試みられる前に、通常のディスクリプタは close されます。 .Ip $^I 8 2 ファイルをその場で変更する場合の拡張子の値。 その場で変更できないようにするには、この変数を undef します。 (覚え方: .B \-i スイッチの値) .Ip $^L 8 2 改ページするために出力するフォーマット。デフォルトは \ef です。 .Ip $^P 8 2 デバッガが、自分自身をデバッグしないためにクリアする内部フラグ。 これをクリアしておくと、デバッグを不可能にさせられると考えられます。 .Ip $^T 8 2 スクリプトが走り始めた時刻を、epoch からの秒で保持します。 .B \-M , .B \-A , .B \-C ファイルテストで返された値は、この変数の値に基づいています。 .Ip $^W 8 2 警告スイッチの現在の値。 (覚え方: .B \-w スイッチに関係する。) .Ip $^X 8 2 argv[0] から来る、起動された perl 自身の名前。 .Ip $ARGV 8 3 <> から読み込んでいるとき、読み込み中のファイル名を保持します。 .Ip @ARGV 8 3 配列 ARGV は、スクリプトに渡されたコマンドライン引数を保持します。 $ARGV[0] はコマンド名ではなく、最初の引数なので、$#ARGV は一般に 引数の数 -1 です。 コマンド名については、$0 を参照して下さい。 .Ip @INC 8 3 配列 INC は、 .I perl スクリプトが \*(L"do EXPR\*(R" や \*(L"require\*(R" で評価されるときに 探されるべきディレクトリのリストを保持します。 初期値として、 .B \-I コマンドラインスイッチの引数、 これに続きデフォルトの .I perl ライブラリ (おそらく \*(L"/usr/share/perl\*(R")、 これに続きカレントディレクトリを示す \*(L".\*(R" です。 .Ip %INC 8 3 連想配列 INC は、\*(L"do\*(R" や \*(L"require\*(R" を介してインクルー ドされる各ファイル名のためのエントリを含んでいます。 キーは、指定したファイル名で、値は実際にファイルが見つかった 位置の値です。 この配列は、\*(L"require\*(R" コマンドが与えるファイルが既に インクルード済みかどうかを決めるのに使われます。 .Ip $ENV{expr} 8 2 連想配列 ENV は、現在の環境変数を保持しています。 ENV へ値を設定すると、子プロセスの環境が変わります。 .Ip $SIG{expr} 8 2 連想配列 SIG は、各シグナルハンドラをセットするのに使われます。 例: .nf .ne 12 sub handler { # 第一引数はシグナル名 local($sig) = @_; print "Caught a SIG$sig\-\|\-shutting down\en"; close(LOG); exit(0); } $SIG{\'INT\'} = \'handler\'; $SIG{\'QUIT\'} = \'handler\'; .\|.\|. $SIG{\'INT\'} = \'DEFAULT\'; # デフォルト動作に戻す $SIG{\'QUIT\'} = \'IGNORE\'; # SIGQUIT を無視する .fi SIG 配列は、perl スクリプトで実際にシグナル用にセットされた値を 保持しています。 .Sh "パッケージ" perl は、パッケージ間で異なる名前空間持つメカニズムを用意しており、 各々の変数がぶつからないように、パッケージを守っています。 デフォルトで、perl スクリプトはパッケージ \*(L"main\*(R" として コンパイルを始めます。 .I package 宣言を使うことによって、名前空間を切り替えることができます。 パッケージ宣言の有効範囲は、宣言それ自身から、閉じたブロックの終端まで です (local() 演算子と同じ有効範囲) 。 普通 \*(L"require\*(R" 演算子によりインクルードされたファイルの中の 最初の宣言として使われます。 複数箇所で同一パッケージに入ることが出来ます; ブロック中でコンパイラがどのシンボルテーブルを使うかに影響するだけです。 他のパッケージの変数やファイルハンドルは、識別子の前にパッケージ名と シングルクォートを付けることで、参照できます。 パッケージ名がヌルの場合、\*(L"main\*(R" と解釈されます。 .PP 文字で始まる識別子は、パッケージシンボルテーブルに保存されます。 それ以外のすべてのシンボルは、パッケージ \*(L"main\*(R" に保持されます。 更に、識別子 STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC, SIG は、 たとえ組み込みの変数、関数と異なる目的で使われたとしても、 強制的にパッケージ \*(L"main\*(R" に属するものとして扱われます。 仮に、\*(L"m\*(R", \*(L"s\*(R", \*(L"y\*(R" と呼ばれるパッケージを 持っていたとすると、パターンマッチ、代入、変換として解釈されるので、 識別子を適した形で使うことができないことに注意しましょう。 .PP eval された文字列は、eval がコンパイルされたパッケージ内で コンパイルされます。 (しかし、$SIG{} への代入は、main パッケージで指定された シグナルハンドラと解釈されます。パッケージ内でシグナルハンドラを 持ちたい場合、シグナルハンドラ名を適切に指定して下さい。) 例えば、perl ライブラリ内の perldb.pl を調べてみましょう。 これは始めに DB パッケージに切り替わり、デバッガがデバッグしようとして いるスクリプト内の変数を変更しないようになっています。 しかし、いろいろな時点で、main パッケージのコンテキストのいろいろな 式を評価するために、これは main パッケージに一時的に戻って来ています。 .PP パッケージのシンボルテーブルは、パッケージ名の前に下線のついた連想配列に 蓄えられることになります。 連想配列の各エントリの値は、*name 表記を使うときに参照しようと しているものになります。 実際、次の例は同じ効果 (もちろん main パッケージの場合) がありますが、 最初のものの方がコンパイル時にシンボルテーブルを見るので、 より効率が良くなります: .nf .ne 2 local(*foo) = *bar; local($_main{'foo'}) = $_main{'bar'}; .fi 例えば、以下によりパッケージ内のすべての変数を出力できます。 これは perl ライブラリの dumpvar.pl から取ってます: .nf .ne 11 package dumpvar; sub main'dumpvar { \& ($package) = @_; \& local(*stab) = eval("*_$package"); \& while (($key,$val) = each(%stab)) { \& { \& local(*entry) = $val; \& if (defined $entry) { \& print "\e$$key = '$entry'\en"; \& } .ne 7 \& if (defined @entry) { \& print "\e@$key = (\en"; \& foreach $num ($[ .. $#entry) { \& print " $num\et'",$entry[$num],"'\en"; \& } \& print ")\en"; \& } .ne 10 \& if ($key ne "_$package" && defined %entry) { \& print "\e%$key = (\en"; \& foreach $key (sort keys(%entry)) { \& print " $key\et'",$entry{$key},"'\en"; \& } \& print ")\en"; \& } \& } \& } } .fi たとえサブルーチンがパッケージ dumpvar でコンパイルされるとしても、 サブルーチン名がパッケージ \*(L"main\*(R" に挿入されるように、 サブルーチン名の前にパッケージ名をつけなければならないことに注意して 下さい。 .Sh "スタイル" 各々のプログラマは、フォーマットに関してもちろん自分自身の好みが あるでしょうが、自分のプログラムを読み易くするための一般的な ガイドラインがあります。 .Ip 1. 4 4 あることを特別な方法で*できる*からといって、そうしなければならない ということはありません。 .I perl は、一つのことをするときに、幾つかの方法があるように設計されている ので、最も読み易いものを選ぶように考えて下さい。 例えば open(FOO,$foo) || die "Can't open $foo: $!"; は、 die "Can't open $foo: $!" unless open(FOO,$foo); よりも良いです。なぜなら、後者の方法は文の主題を修飾子内に隠しているからです。 一方、 print "Starting analysis\en" if $verbose; は $verbose && print "Starting analysis\en"; より良いです。主となるのは、ユーザが -v を打ったかどうかでは ないからです。 .Sp 同様に、演算子がデフォルトの引数を仮定しているからといって、 それはデフォルトを用いなければならないということではありません。 デフォルトというものは、ちょっとしたプログラムを書く、怠け者の システムプログラマのためにあります。 読み易いプログラムをしたければ、引数を付けるようにして下さい。 .Sp 同じようなこととして、 あちこちで括弧を省略 .I できる ということは、以下のように書けということではありません: .nf return print reverse sort num values array; return print(reverse(sort num (values(%array)))); .fi 疑わしいときは、括弧をつけて下さい。 もしかすると、物好きな輩が、vi で % キーを叩くかもしれません。 .Sp たとえ疑わしくなかったとしても、自分の後でそのコードを管理する人間の 精神衛生上好ましいですし、その人が間違ったところに括弧をつける可能性も 大いにあります。 .Ip 2. 4 4 無理にこじつけて、ループの先頭や終わりで終了しようとしないで下さい。 .I perl には、真ん中からでも抜けられるように "last" 演算子が 用意されているのですから。 少々はみ出しても、より見易くなるようにして下さい: .nf .ne 7 line: for (;;) { statements; last line if $foo; next line if /^#/; statements; } .fi .Ip 3. 4 4 ループラベルを使うのを恐がらないで下さい\*(--多重ループの抜けだしがで きるようにするためだけでなく、可読性を高めるためにあるのですから。 最後の例を参照して下さい。 .Ip 4. 4 4 可搬性のため、すべてのマシンには実装されていない機能を使うときは、 失敗しないかどうか、eval の中で構成を確かめてみて下さい。 どのバージョンやパッチレベルで特定の仕様が実装されているかを 知っているなら、$] を調べて、実装されているかどうかを確認できます。 .Ip 5. 4 4 覚え易い識別子を選んで下さい。 .Ip 6. 4 4 一貫性を持たせましょう。 .Sh "デバッグ" .I perl に .B \-d スイッチを付けて起動すると、デバッグモニタの基でスクリプトが走ります。 最初の実行文の前で一時停止し、以下のようなコマンド入力を促します: .Ip "h" 12 4 ヘルプメッセージを出力する。 .Ip "T" 12 4 スタックトレース。 .Ip "s" 12 4 シングルステップ。 次の文の始めに達するまでを実行します。 .Ip "n" 12 4 次。 サブルーチンコール内では止まらずに、次の文に達するまで実行します。 .Ip "f" 12 4 終了。 現在のサブルーチンが終了するまで、文を実行し続けます。 .Ip "c" 12 4 継続。 次のブレークポイントに達するまで実行します。 .Ip "c line" 12 4 指定した行まで実行します。 指定した行に、一回きりのブレークポイントを挿入します。 .Ip "" 12 4 最後に実行した n または s を繰り返します。 .Ip "l min+incr" 12 4 min 行目から incr+1 行を表示します。 min を省略すると、最後に表示した残りから始めます。 incr を省略すると、前回の incr 値が使われます。 .Ip "l min-max" 12 4 指定範囲内の行を表示します。 .Ip "l line" 12 4 指定行を表示します。 .Ip "l" 12 4 次のウィンドウを表示します。 .Ip "-" 12 4 前のウィンドウを表示します。 .Ip "w line" 12 4 その行と前後のウィンドウを表示します。 .Ip "l subname" 12 4 サブルーチンを表示します。 長いサブルーチンの場合は、始めの方だけを表示します。 それ以上表示するには、\*(L"l\*(R" を使って下さい。 .Ip "/pattern/" 12 4 正規表現の前方検索。最後の / は省略可能です。 .Ip "?pattern?" 12 4 正規表現の後方検索。最後の ? は省略可能です。 .Ip "L" 12 4 ブレークポイントまたはアクションの設定された行を表示します。 .Ip "S" 12 4 すべてのサブルーチン名を表示します。 .Ip "t" 12 4 トレースモードを on/off するトグル。 .Ip "b line condition" 12 4 ブレークポイントをセットします。 line を省略すると、実行されようとしている行にセットされます。 condition が指定されると、 ブレークポイントの文に達する毎に condition が評価され、 condition が真のときだけブレークします。 ブレークポイントは実行文の先頭にだけセットできます。 .Ip "b subname condition" 12 4 ブレークポイントをサブルーチンの最初の実行文にセットします。 .Ip "d line" 12 4 ブレークポイントを削除します。 line を省略すると、実行しようとしている行のブレークポイントが 削除されます。 .Ip "D" 12 4 すべてのブレークポイントを削除します。 .Ip "a line command" 12 4 行にアクションをセットします。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "A" 12 4 すべての行のアクションを削除します。 .Ip "< command" 12 4 デバッガがプロンプトを出す前に実行するアクションをセットする。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "> command" 12 4 コマンドを入力してスクリプト実行に移る時に、 プロンプトの後に実行するアクションをセットします。 バックスラッシュの直後に改行すれば、複数行コマンドも入力できます。 .Ip "V package" 12 4 パッケージ内のすべての変数をリストします。 デフォルトは、メインパッケージです。 .Ip "! number" 12 4 デバッグコマンドの再実行を行ないます。 number が省略されると、直前のコマンドを再実行します。 .Ip "! -number" 12 4 幾つか前のコマンドを再実行します。 .Ip "H -number" 12 4 最後の n 個のコマンドを表示します。 1 文字より長いコマンドをリストします。 number を省略すると、すべてをリストします。 .Ip "q or ^D" 12 4 終了します。 .Ip "command" 12 4 コマンドを perl の文として実行します。 足りないセミコロンは補われます。 .Ip "p expr" 12 4 \*(L"print DB'OUT expr\*(R" と同じことです。 DB'OUT ファイルハンドルは、どこに STDOUT がリダイレクトされているか に関わらず、/dev/tty にオープンされます。 .PP デバッガを変更したいときは、perldb.pl ファイルを perl のライブラリ から、カレントディレクトリにコピーして、必要に応じて修正して下さい。 (コマンドラインに -I. を付けなければならないでしょう。) 初期化コードを含む .perldb ファイルを設定することで、カスタマイズが できます。例えば、以下のようなエイリアスを作ることができます: .nf $DB'alias{'len'} = 's/^len(.*)/p length($1)/'; $DB'alias{'stop'} = 's/^stop (at|in)/b/'; $DB'alias{'.'} = 's/^\e./p "\e$DB\e'sub(\e$DB\e'line):\et",\e$DB\e'line[\e$DB\e'line]/'; .fi .Sh "setuid スクリプト" .I perl は、安全な setuid スクリプトや setgid スクリプトを簡単に書けるように デザインされています。 スクリプトの各行が何回も置換されるシェルとは違って、 .I perl は、隠された \*(L"わけの判らないもの\*(R" を少なくして、より伝統的な 評価機構を使っています。 それに加え、この言語は組み込み機構をより多く備えていて、目的を達成する ために外部の (すなわち信頼できない可能性がある) プログラムに 頼らなければならないことは、ほとんどありません。 .PP パッチが当たっていない 4.2 または 4.3bsd カーネルでは、 setuid スクリプトは本質的に危険をはらんでいますが、このカーネルの 機能は無効にできます。 この場合、 perl スクリプトに (無意味な) setuid/gid ビットが付いていると、 .I perl は setuid と setgid 機構をエミュレートできます。 カーネルの機能が無効でない場合、 .I perl は setuid スクリプトが安全でないことをうるさく訴えるでしょう。 カーネルの setuid スクリプト機能を無効にするか、そうでなければ -スクリプトに C のラッパーをかぶせる必要があるでしょう。 +スクリプトに C のラッパをかぶせる必要があるでしょう。 .PP perl が setuid スクリプトを実行しているとき、明らかなトラップに はまらないように特別な注意を払います。 (いくつかの点で、perl スクリプトは同等の C プログラムより安全です。) コマンドライン引数と環境変数と入力は、\*(L"汚れ\*(R" とみなされ、 サブシェルを起動するコマンドや、ファイル、ディレクトリ、プロセスを 変更するようなコマンドの中では、直接にも間接的にも使われません。 それ以前に汚れた値を参照したような式の中でセットされた変数も、 また汚れていることなります。 (汚れた値が変数に影響することが、たとえ論理的に不可能だとしても) .br 例えば: .nf .ne 5 $foo = shift; # $foo は汚れています $bar = $foo,\'bar\'; # $bar も汚れています $xxx = <>; # 汚れています $path = $ENV{\'PATH\'}; # 汚れていますが、以下を見て下さい $abc = \'abc\'; # 汚れていません .ne 4 system "echo $foo"; # 危険です system "/bin/echo", $foo; # 安全です (shを使わないので) system "echo $bar"; # 危険です system "echo $abc"; # PATH がセットされるまで、 # 安全ではありません .ne 5 $ENV{\'PATH\'} = \'/bin:/usr/bin\'; $ENV{\'IFS\'} = \'\' if $ENV{\'IFS\'} ne \'\'; $path = $ENV{\'PATH\'}; # 汚れていません system "echo $abc"; # もはや汚れていません! .ne 5 open(FOO,"$foo"); # OK open(FOO,">$foo"); # 駄目です open(FOO,"echo $foo|"); # 駄目だけど.. open(FOO,"-|") || exec \'echo\', $foo; # OK $zzz = `echo $foo`; # 危険。 zzz は汚れてます。 unlink $abc,$foo; # 危険 umask $foo; # 危険 .ne 3 exec "echo $foo"; # 危険 exec "echo", $foo; # 安全 (sh を使いません) exec "sh", \'-c\', $foo; # 安全と見なされてしまう、嗚呼 .fi 汚れは、各スカラ値と関係するので、配列の要素は汚れているものも、 汚れていないものもあります。 .PP 何か安全でないことをしようとすると、 \*(L"Insecure dependency\*(R" とか \*(L"Insecure PATH\*(R" というような 致命的エラーになります。 それでも、危険なシステムコールや exec を書くことができますが、 上記の最後の例のようなことを明示的に行なった場合に限るということを 覚えておいて下さい。 サブパターンを参照することでも、汚れの機構を避けることが できます \*(--\c .I perl は、$1, $2 などを使った部分文字列の参照では、自分のしていることを 知っているはずだと解釈します。 次のようなパターンの場合です: .nf $ARGV[0] =~ /^\-P(\ew+)$/; $printer = $1; # 汚れていません .fi これは、\ew+ がシェルのメタキャラクタにマッチしないので、 まず安全です。 .+ を使うと危険でしょうが、 .I perl はそこまで調べないので、パターン指定には注意を払うべきです。 これは、ファイル操作をしたいときに ($> を $< と同じにしなければ) 、 ユーザが与えるファイル名を汚さないための唯一の機構です。 .PP 汚れた値を使うことを気にしないような他の操作でもトラブルを起こす場合が あります。 ユーザが与えたファイル名を扱うファイルテストは、慎重に使って下さい。 できれば、$> = $< というようにセットした後で open して下さい。 .I perl では、汚れたファイルをオープンして読みだすことが制限されないので、 出力する内容については注意して下さい。 汚れの機構は、ばかな間違いを防ぐように作られているのであって、 考える必要がなくなるようにするためではありません。 .SH 環境 .Ip HOME 12 4 chdir に引数がないときに使われます。 .Ip LOGDIR 12 4 chdir に引数が無く、HOME がセットされていないときに使われます。 .Ip PATH 12 4 サブプロセスを実行するとき、および \-S が使われたときは スクリプトを探す際に使われます。 .Ip PERLLIB 12 4 標準ライブラリやカレントディレクトリを見る前に、perl ライブラリ ファイルを探すディレクトリのコロン区切りのリストです。 .Ip PERLDB 12 4 デバッガコードを得るのに使われるコマンドのことです。セットされて いないと、 .br require 'perldb.pl' を使います。 .PP これらを別にすると、 .I perl は、スクリプト実行時と子プロセスに渡された環境変数しか使いません。 しかし、setuid で走っているスクリプトは、だまされないようにするために 何より先に以下の行を実行しておいた方が良いでしょう: .nf .ne 3 $ENV{\'PATH\'} = \'/bin:/usr/bin\'; # 必要なパスを入れましょう $ENV{\'SHELL\'} = \'/bin/sh\' if $ENV{\'SHELL\'} ne \'\'; $ENV{\'IFS\'} = \'\' if $ENV{\'IFS\'} ne \'\'; .fi .SH 作者 Larry Wall .br MS-DOS への移植 Diomidis Spinellis .SH 関連ファイル /tmp/perl\-eXXXXXX .B \-e コマンドのためのテンポラリファイル .SH 関連項目 a2p awk から perl への変換プログラム .br s2p sed から perl への変換プログラム .SH 診断 コンパイルエラーは、エラーの行番号と次にあるべきトークンか、または 調べられたトークンの型を教えてくれます。 ( .B \-e スイッチで .I perl に渡されたスクリプトの場合、各 .B \-e が一行に数えられます。) .PP setuid スクリプトには、更に \*(L"Insecure dependency\*(R" のような エラーメッセージを生じるという制約があります。 setuid スクリプトのセクションを参照して下さい。 .SH トラップ .IR awk に慣れたユーザは、以下のことに特に注意を払わなければなりません: .Ip * 4 2 .I perl では、(ブロックの終わりを除く) すべての単文の後にセミコロンが必要です。 改行は文の区切りではありません。 .Ip * 4 2 if や while には、中括弧 {} が必要です。 .Ip * 4 2 .IR perl では、変数は $ か @ で始まります。 .Ip * 4 2 配列の添字は、$[ をセットしなければ 0 で始まります。 substr() と index() の文字位置も同様です。 .Ip * 4 2 配列の添字が数字であるか文字列であるかを決めなければなりません。 .Ip * 4 2 連想配列は、参照するだけでは存在することになりません。 .Ip * 4 2 比較の際には、文字列比較か、数値比較かを決めなければなりません。 .Ip * 4 2 入力行を読み込んだだけでは、split は行なわれません。自分で split して、 配列に入れなければなりません。 そして、 .I split 演算子は、異なる引数を取ります。 .Ip * 4 2 現在の入力行は、通常 $0 ではなく $_ です。 一般に改行コードは除かれません。 ($0 は実行されたプログラム名です。) .Ip * 4 2 $<数字> は、フィールドの参照ではありません\*(--最後にマッチした パターンの部分文字列を参照します。 .Ip * 4 2 .I print 文は $, と $\e を設定しなければ、フィールド区切りやレコード区切りを 出力しません。 .Ip * 4 2 ファイルに出力する前には、オープンしなければなりません。 .Ip * 4 2 範囲演算子は \*(L".\|.\*(R" であって、コンマではありません。 (コンマ演算子は、C と同じ動作です。) .Ip * 4 2 マッチ演算子は、\*(L"~\*(R" でなく \*(L"=~\*(R" です。 (\*(L"~\*(R" は C と同じく補数の演算子です。) .Ip * 4 2 指数演算子は、\*(L"^\*(R" でなく \*(L"**\*(R" 演算子です。 (\*(L"^\*(R" は、C と同じく XOR 演算子です。) .Ip * 4 2 結合演算子は \*(L".\*(R" であり、ヌル文字列ではありません。 (ヌル文字列を使うと 3 番目の / が除算演算子と解釈されるため、 \*(L"/pat/ /pat/\*(R" が解析不能になります。\*(--トークン解析は、実際 のところ /, ?, < のような演算子ではコンテキストにやや敏感です。 そして、実は、. 自身は数字の始めになり得ます。) .Ip * 4 2 .IR next , .IR exit, .I continue の動作は異なります。 .Ip * 4 2 次の変数の動作は異なります。 .nf Awk \h'|2.5i'Perl ARGC \h'|2.5i'$#ARGV ARGV[0] \h'|2.5i'$0 FILENAME\h'|2.5i'$ARGV FNR \h'|2.5i'$. \- 何か FS \h'|2.5i'(何でもよい) NF \h'|2.5i'$#Fld かそのようなもの NR \h'|2.5i'$. OFMT \h'|2.5i'$# OFS \h'|2.5i'$, ORS \h'|2.5i'$\e RLENGTH \h'|2.5i'length($&) RS \h'|2.5i'$/ RSTART \h'|2.5i'length($\`) SUBSEP \h'|2.5i'$; .fi .Ip * 4 2 疑わしいときは、 .I awk のプログラムを a2p に通して、出て来たもの見て下さい。 .PP C に洗脳されたプログラマは、次のことを特に心に留めておかなければなりま せん: .Ip * 4 2 if や while には、中括弧 {} が必要です。 .Ip * 4 2 \*(L"else if\*(R" でなく、\*(L"elsif\*(R" を使わなければなりません。 .Ip * 4 2 .I break や .I continue は、それぞれ .I last や .IR next になります。 .Ip * 4 2 switch 文はありません。 .Ip * 4 2 .IR perl では、 変数は $ か @ で始まります。 .Ip * 4 2 printf には * は実装されていません。 .Ip * 4 2 コメントは、/* でなく # で始まります。 .Ip * 4 2 何者のアドレスを得ることもできません。 .Ip * 4 2 ARGV は大文字でなければなりません。 .Ip * 4 2 link, unlink, rename 等のシステムコールは、成功時に 0 でな く、非 0 を返します。 .Ip * 4 2 シグナルハンドラは、数字ではなくシグナル名を扱います。 .PP 経験豊かな .I sed プログラマは、次のことを心に留めておかなければなりません: .Ip * 4 2 置換の後方参照では、\e でなく $ を使います。 .Ip * 4 2 パターンマッチメタキャラクタ (, ), | の前にはバックスラッシュをつけません。 .Ip * 4 2 範囲演算子は、コンマでなく .\|. です。 .PP 鋭い shell プログラマは、次のことを心に留めておかなければなりません: .Ip * 4 2 `` 演算子のコマンド内では、'' にくくられていないと変数置換が行なわれます。 .Ip * 4 2 `` 演算子は csh と違って、戻り値の変換をしません。 .Ip * 4 2 シェル (特に csh) は、各コマンド行で複数レベルの置換を行ないます。 .I perl は、"", ``, <>, // のような決まった構造においてのみ、置換が行なわれます。 .Ip * 4 2 シェルは、スクリプトを一度に少しだけ解釈します。 .I perl は、すべてのプログラムを実行前にコンパイルします。 .Ip * 4 2 引数は、$1, $2,.. ではなく、@ARGV を介して利用できます。 .Ip * 4 2 環境は、変数として自動的に利用可能とはなりません。 .SH 訂正と追加 perl の本、 .I Programming\0Perl には以下のような省略と抜けがあります。 .PP 5 ページの例 .nf eval "/usr/bin/perl は、以下でなければいけません。 eval "exec /usr/bin/perl .fi .PP 195 ページの System V の sum 相当のプログラムは、極めて小さなファイル でしか動作しません。大きなファイルでは、以下を使って下さい。 .nf undef $/; $checksum = unpack("%32C*",<>) % 32767; .fi .PP alarm と sleep に関する記述は、シグナル SIGALARM と言っていますが、 SIGALRM でなければなりません。 .PP $/ の初期値をセットする .B \-0 スイッチは、この本が出版後に perl に追加されました。 .PP .B \-l スイッチでは、自動行末処理を行なうようになっています。 .PP qx// 構造は バックスラッシュ `` と同義です。 .PP $0 は、 .I ps (1) の引数表示を変更するために、代入可能となりました。 .PP 新しい @###.## フォーマットは、フォーマットの記述から 偶然省略されました。 .PP s///ee が置換式の多重評価を生じることが、出版時に 知られていませんでした。これは、仕様と解釈されるべきです。 .PP (LIST) x $count は、配列の繰り返しを実行します。 .PP 正規表現には、括弧の数に制限がなくなっています。 .PP ダブルクォート "" のコンテキストでは、更に以下のエスケープがサポート されています: \ee, \ea, \ex1b, \ec[, \el, \eL, \eu, \eU, \eE 最後の 5 つの制御コードは、大文字小文字の変換です。 .PP .B $/ 変数には、複数の区切り文字をセットできます。 .PP 通常のパターンマッチに g 修飾子が使えます。 これにより、文字列から複数のマッチを検索することで、 パターンマッチを繰り返します。 .PP $^T を除いて、すべての $^X 変数が増えてます。 .PP FILEHANDLE に対するデフォルトのページ先頭フォーマットは、top でなく FILEHANDLE_TOP になっています。 .PP eval {} と sort {} 構造は、version 4.018 で追加されました。 .PP pack と unpack の v と V (リトルエンディアン) テンプレートオプションは、 vertion 4.019 で追加されました。 .SH バグ .PP .I perl 型のキャスト、atof() 、sprintf() のようないろいろな操作は、 マシンの定義に左右されます。 .PP あるストリームで、stdio が各 read や write の間に seek や eof を 必要とする場合、 .IR perl はそのようにします。 (これは、sysread() と syswrite() には適用されません。) .PP どの組み込みデータタイプも勝手なサイズ制限は持っていません (メモリサイズは別です) が、それでもいくらかは限界はあります: 識別子は 255 文字以上にはできませんし、 \-S を使うとき、PATH の要素は 255 を超えてはいけません。 正規表現は、内部的に 32767 バイトを超えられません。 .PP .I perl は、実は 病理学的折衷主義のがらくたリスター (Pathologically Eclectic Rubbish Lister) なんですが、私がそう言ったとは誰にも話さないで下さい。 .rn }` '' diff --git a/ja_JP.eucJP/man/man1/ps.1 b/ja_JP.eucJP/man/man1/ps.1 index 3bf8c655ae..fafa2dee95 100644 --- a/ja_JP.eucJP/man/man1/ps.1 +++ b/ja_JP.eucJP/man/man1/ps.1 @@ -1,525 +1,525 @@ .\" Copyright (c) 1980, 1990, 1991, 1993, 1994 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)ps.1 8.3 (Berkeley) 4/18/94 .\" %Id: ps.1,v 1.11.2.2 1998/02/18 22:54:59 dima Exp % .\" jpman %Id: ps.1,v 1.2 1997/05/20 01:19:55 mutoh Stab % .\" .Dd April 18, 1994 .Dt PS 1 .Os BSD 4 .Sh 名称 .Nm \&ps .Nd プロセスの状態の表示 .Sh 書式 .Nm \&ps .Op Fl aCcefhjlmrSTuvwx .Op Fl M Ar core .Op Fl N Ar system .Op Fl O Ar fmt .Op Fl o Ar fmt .Op Fl p Ar pid .Op Fl t Ar tty .Op Fl W Ar swap .br .Nm \&ps .Op Fl L .Sh 解説 .Nm \&ps は、制御端末を持つ自分(あなた)のプロセスの情報を、 ヘッダ行に続いて表示します。 この情報はプロセス .Tn ID 順に整列されます。 .Pp 表示される情報は、一連のキーワードによって選ばれます .Pf ( Fl L , .Fl O , .Fl o オプションを参照)。 デフォルトの出力フォーマットは、各プロセス毎に、 プロセス .Tn ID , 制御端末・ cpu 時間(ユーザ時間とシステム時間の両方)・ プロセス状態・プロセスに関連するコマンドから成ります。 .Pp プロセスファイルシステム ( .Xr procfs 5 参照) は、 .Nm が実行されている時にマウントされているべきです。そうでない場合、 全ての情報が利用可能になるわけではありません。 .Pp オプションを以下に示します。 .Bl -tag -width indent .It Fl a 自分のプロセスに加え自分以外のプロセスの情報も同様に表示します。 .It Fl c -``コマンド'' コラム出力を全てのコマンドラインを表示するのではなく、 -実行名だけを表示するように変更します。 +``コマンド'' 桁の出力を、全てのコマンドラインを表示するのではなく、 +実行形式名だけを表示するように変更します。 .It Fl C cpu パーセンテージの計算を、``常駐'' 時間を無視する ``生'' cpu 時間を使う方法に変更します(通常これは影響ありません)。 .It Fl e 環境(変数)も同時に表示します。 .It Fl f より詳しいプロセス情報を得るように、働きます。 .It Fl h ページ毎に一つヘッダが入るようにします。 .It Fl j 次のキーワードに関する情報を表示します: user, pid, ppid, pgid, sess, jobc, state, tt, time, command。 .It Fl L 有効なキーワードの一覧を表示します。 .It Fl l 次のキーワードに関する情報を表示します: uid, pid, ppid, cpu, pri, nice, vsz, rss, wchan, state, tt, time, command。 .It Fl M 名前リストの値を取り出すとき、 デフォルトの .Dq Pa /dev/kmem の代わりに、指定した .Ar core から取り出します。 .It Fl m プロセス .Tn ID 順ではなく、メモリ使用量順に整列します。 .It Fl N デフォルトの .Dq Pa /kernel の代わりに、指定された .Ar system から名前リストを取り出します。 .It Fl O デフォルトで表示される情報に加え、 指定されたキーワードに関する情報を、 プロセス .Tn ID の後に挿入する形式で表示します。 .\"キーワードの列 .\".Ar fmt .\"は、空白あるいはカンマで区切って指定します。 .\"(訳中)2.2.1Rの記述には確認できないのでコメントアウトしました。 .\" 2.2.1R 対象(1997/05/16) Takeshi MUTOH 各キーワードの後ろには、等号 (``='') と文字列を追加しても構いません。 この場合、標準のヘッダの代わりに指定された文字列が表示されます。 .It Fl o 指定されたキーワードに関する情報を、表示します。 .\"キーワードの列 .\".Ar fmt .\"は、空白あるいはカンマで区切って指定します。 .\"(訳中)2.2.1Rの記述には確認できないのでコメントアウトしました。 .\" 2.2.1R 対象(1997/05/16) Takeshi MUTOH 各キーワードの後ろには、等号(``='')と文字列を追加しても構いません。 この場合、標準のヘッダの代わりに指定された文字列が表示されます。 .It Fl p 指定したプロセス .Tn ID に関する情報を表示します。 .It Fl r プロセス .Tn ID 順ではなく、現在の cpu 利用率順に整列します。 .It Fl S プロセス時間を計算するのに、 終了した子プロセスの時間を親プロセスに合計するように変更します。 .It Fl T 標準入力のデバイスに取り付けられたプロセスの情報を表示します。 .It Fl t 指定された端末デバイスに取り付けられたプロセスの情報を表示します。 .It Fl U 指定された .Tn username に属するプロセスを表示します。 .It Fl u 次のキーワードに関する情報を表示します: user, pid, %cpu, %mem, vsz, rss, tt, state, start, time, command。 .Fl u オプションを指定すると .Fl r オプションも暗に指定したことになります。 .It Fl v 次のキーワードに関する情報を表示します: pid, state, time, sl, re, pagein, vsz, rss, lim, tsiz, %cpu, %mem, command。 .Fl v オプションを指定すると .Fl m オプションも暗に指定したことになります。 .It Fl W デフォルトの .Dq Pa /dev/drum の代わりに指定したファイルからスワップ情報を取り出します。 .It Fl w デフォルトの現行ウィンドウ幅ではなく、132桁幅で表示します。 一度より多く .Fl w オプションを指定すると、 .Nm \&ps はウィンドウ幅にかかわらず、必要なだけの幅を使用します。 .It Fl x 制御端末のないプロセスの情報も表示します。 .El .Pp 有効なキーワードの全リストを以下に示します。 いくつかのキーワードに関してはさらに詳しく述べます。 .Bl -tag -width indent .It %cpu プロセスの cpu 利用率です。実時間で最近 1 分間の減衰平均です。 計算の基点となる時間は変化するので (プロセスはまだ生れたばかりかもしれないので)、 .Tn \&%CPU フィールド全部の合計は 100% を越える可能性もあります。 .It %mem プロセスで使われている実メモリのパーセンテージです。 .It flags インクルードファイル .Aq Pa sys/proc.h でプロセスに定義されたフラグです。 .Bl -column SNOCLDSTOP SNOCLDSTOP .It Dv "P_ADVLOCK" Ta No "0x00001 プロセスは POSIX 提案ロックを保持している" .It Dv "P_CONTROLT" Ta No "0x00002 制御端末を持っている" .It Dv "P_INMEM" Ta No "0x00004 メモリに読み込まれている" .It Dv "P_NOCLDSTOP" Ta No "0x00008 子プロセスが停止しても SIGCHLD を送らない" .It Dv "P_PPWAIT" Ta No "0x00010 親プロセスが、子プロセスが exec/exit するのを待っている" .It Dv "P_PROFIL" Ta No "0x00020 プロファイル付きで実行された" .It Dv "P_SELECT" Ta No "0x00040 選択されている;wakeup/waiting は危険である" .It Dv "P_SINTR" Ta No "0x00080 スリープは停止可能" .It Dv "P_SUGID" Ta No "0x00100 最後の実行以来 特権セット id されている" .It Dv "P_SYSTEM" Ta No "0x00200 システム proc: sigs や stat や swap が無い" .It Dv "P_TIMEOUT" Ta No "0x00400 スリープ中にタイムアウトした" .It Dv "P_TRACED" Ta No "0x00800 デバッグプロセスはトレースされている" .It Dv "P_WAITED" Ta No "0x01000 デバッグプロセスは子プロセスを待っている" .It Dv "P_WEXIT" Ta No "0x02000 終了動作中" .It Dv "P_EXEC" Ta No "0x04000 プロセスは exec で呼ばれた" .It Dv "P_NOSWAP" Ta No "0x08000 別のフラグがスワップアウトを妨げている" .It Dv "P_PHYSIO" Ta No "0x10000 物理 I/O をおこなっている" .It Dv "P_OWEUPC" Ta No "0x20000 次の ast プロセスが addupc() 呼び出しの借り" .It Dv "P_SWAPPING" Ta No "0x40000 プロセスはスワップされている" .El .It lim .Xr setrlimit 2 の呼び出しで指定される、メモリ使用量のソフトリミットです。 .It lstart コマンドの実行が始まった正確な時刻を、 .Xr strftime 3 に記述された ``%c'' フォーマットで表示します。 .It nice プロセススケジューリングにおける増加値です .Ns ( Xr setpriority 2 参照)。 .\" .Ns により ( と setpriority が離れるのを防ぐ .\" by horikawa@jp.freebsd.org (Feb 9 1997) .It rss プロセスの実メモリ(常駐分)の大きさ(1024バイト単位)です。 .It start コマンドが開始された時間です。 コマンドが開始されたのが 24 時間以内なら、 開始時刻は .Xr strftime 3 で記述された``%l:ps.1p''フォーマットで表示されます。 コマンドが開始されたのが7日以内なら、 開始時刻は``%a6.15p''フォーマットで表示されます。 さもなくば、開始時刻は``%e%b%y''フォーマットで表示されます。 .It state プロセスの状態を文字の列で表示します。例えば、 .Dq Tn RWNA の最初の文字は、プロセスが runnable 状態であることを示しています。 .Pp .Bl -tag -width indent -compact .It D プロセスはディスク(あるいは他の割り込み不可能な短期間の)待ち状態です。 .It I プロセスは idle 状態(20秒以上 sleep している)です。 .It R プロセスは runnable 状態です。 .It S プロセスは 20 秒未満の sleep 状態です。 .It T プロセスは stop している状態です。 .It Z プロセスは死んでいる状態(``ゾンビ'')です。 .El .Pp さらにこの後に文字があれば、さらなる状態情報を示します。 .Pp .Bl -tag -width indent -compact .It + プロセスはその制御端末のフォアグラウンドプロセスグループに属しています。 .It < プロセスは .Tn CPU のスケジュール優先度が上げられています。 .It > プロセスはメモリ要求に対するソフトリミットが指定されており、 現在そのリミットを越えています。 このようなプロセスは(必然的に)スワップされていません。 .It A プロセスはランダムなページ置換( .Xr vadvise 2 における .Dv VA_ANOM のことで、例えば、 .Xr lisp 1 でのガーベージコレクション)を要求しました。 .It E プロセスは終了しようとしています。 .It L プロセスは実メモリ中にロックされたページ (例えば、raw .Tn I/O 用)を持っています。 .It N プロセスは .Tn CPU スケジューリング優先度( .Xr setpriority 2 参照)が下げられています。 .It S プロセスは .Tn FIFO ページ置換( .Xr vadvise 2 における .Dv VA_SEQL のことで、 例えば、仮想記憶の多量のデータを順次アクセスする 大規模画像処理プログラム)を要求しました。 .It s プロセスはセッションリーダです。 .It V プロセスは .Xr vfork 2 の間、一時中断されています。 .It W プロセスはスワップアウトされています。 .It X プロセスはトレースされているか、デバッグされています。 .El .It tt もしあれば、制御端末のパス名の省略形です。 省略形は .Dq Pa /dev/tty に続く2文字か、コンソール場合の ``co'' です。 もはやプロセスがその制御端末に到達できない(即ち、revoke された)場合、 後に ``-'' が付きます。 .It wchan プロセスが待っているイベント(システム内のアドレス)。 数字で表示される時には、アドレスの最初の部分は削られて その結果が16進で表示されます。例えば 0x80324000 では 324000 と表示されます。 .El .Pp キーワード command には、 すでに終了しているのに親がまだ wait してくれていない プロセス(即ちゾンビ)は ``'' と表示されます。 終了しようとしてブロックされているプロセスは ``'' と表示されます。 .Nm \&ps は、メモリやスワップ領域を検査して、 プロセスが生成されたときのファイル名や引数を推測します。 この方法は、本質的に少々信頼できるものではなく、 プロセスはとにかくこの情報を破壊することができます。 だから、表示されるコマンド名や引数をあまり信用しすぎてはなりません。 一方、キーワード ucomm (アカウンティング名)は信用できます。 .Sh キーワード 以下は有効なキーワードとその意味の全リストです。 そのうちいくつかは別名があります。 .Pp .Bl -tag -width sigignore -compact .It %cpu cpu 使用率(別名 pcpu) .It %mem メモリ使用率(別名 pmem) .It acflag アカウンティングフラグ(別名 acflg) .It command コマンド名と引数 .It cpu 短期間 cpu 使用係数(スケジューリング用) .It flags 16 進数のプロセスフラグ(別名 f) .It inblk 総ブロック読み出し数(別名 inblock) .It jobc ジョブコントロール数 .It ktrace トレース中フラグ .It ktracep トレース中の vnode .It lim メモリ利用のリミット .It logname プロセスを開始したユーザのログイン名 .It lstart 開始時刻 .It majflt 総ページフォールト数 .It minflt 総ページ再生数 .It msgrcv 総メッセージ受信数(パイプ/ソケットからの読み込み) .It msgsnd 総メッセージ送信数(パイプ/ソケットへの書き込み) .It nice nice 値(別名 ni) .It nivcsw 総強制的コンテキストスィッチ数 .It nsigs 総シグナル受け入れ数(別名 nsignals) .It nswap 総スワップイン/スワップアウト数 .It nvcsw 総自発的コンテキストスィッチ数 .It nwchan wait チャネル(アドレスで表示) .It oublk 総ブロック書き込み数(別名oublock) .It p_ru リソース利用量(ゾンビに対してのみ有効) .It paddr スワップアドレス .It pagein ページイン数(majflt と同じ) .It pgid プロセスグループ番号 .It pid プロセス .Tn ID .It poip 進行中のページアウト数 .It ppid 親プロセス .Tn ID .It pri スケジューリング優先度 .It re 実メモリ常駐時間(秒単位; 127 = 無限) .It rgid 実グループ .Tn ID .It rlink run 行列における逆リンク(あるいは 0) .It rss 常駐セットサイズ .It rsz 常駐セットサイズ+(テキストのサイズ/テキストの利用総数) (別名rssize) .\" つまり、共通テキストを複数プロセスで分担しているわけだ .It rtprio 実時間優先度(101 = 実時間プロセスではない) .It ruid 実ユーザ .Tn ID .It ruser ユーザ名(ruid から得られたもの) .It sess セッションポインタ .It sig 遅延されたシグナル(別名 pending) .It sigcatch 捕獲されたシグナル(別名 caught) .It sigignore 無視されたシグナル(別名 ignored) .It sigmask ブロックされたシグナル(別名 blocked) .It sl sleep 時間(秒単位; 127 = 無限) .It start 開始時刻 .It state 記号でのプロセス状態(別名 stat) .It svgid setgid プログラムでの saved gid .It svuid setuid プログラムでの saved uid .It tdev 制御端末のデバイス番号 .It time ユーザ + システムの合計 cpu 時間(別名 cputime) .It tpgid 制御端末プロセスグループ .Tn ID .\".It trss .\"text resident set size (in Kbytes) .\"テキスト常駐セットサイズ(Kbyte単位) .It tsess 制御端末セッションポインタ .It tsiz テキストサイズ(Kbyte 単位) .It tt 制御端末名(2 文字の省略形) .It tty 制御端末の完全な名前 .It uprocp プロセスポインタ .It ucomm アカウンティングで使われるコマンド名 .It uid 実効ユーザ .Tn ID .It upr システムコールから帰る時のスケジューリング優先度(別名 usrpri) .It user ユーザ名(uid から得たもの) .It vsz kByte 単位の仮想記憶サイズ(別名vsize) .It wchan wait チャネル(シンボル名で表示) .It xstat 終了ステータスまたは stop ステータス (stop プロセスかゾンビプロセスの時のみに有効) .El .Sh 関連ファイル .Bl -tag -width /var/run/kvm_kernel.db -compact .It Pa /dev スペシャルファイルとデバイスの名前 .It Pa /dev/drum デフォルトのスワップデバイス .It Pa /dev/kmem デフォルトのカーネルメモリデバイス .It Pa /var/run/dev.db .Pa /dev 名前データベース .It Pa /var/run/kvm_kernel.db システム(カーネル)の名前リストデータベース .It Pa /kernel デフォルトのシステムの名前リスト .El .Sh 関連項目 .Xr kill 1 , .Xr w 1 , .Xr kvm 3 , .Xr strftime 3 , .Xr pstat 8 .Sh バグ .Nm \&ps はシステムより速く実行できず、 他のプロセスと同様にスケジュールされて実行されるので、 表示される情報は正確ではあり得ません。 diff --git a/ja_JP.eucJP/man/man8/named.8 b/ja_JP.eucJP/man/man8/named.8 index 807e53297f..95a320a02c 100644 --- a/ja_JP.eucJP/man/man8/named.8 +++ b/ja_JP.eucJP/man/man8/named.8 @@ -1,492 +1,493 @@ .\" ++Copyright++ 1985 .\" - .\" Copyright (c) 1985 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" - .\" Portions Copyright (c) 1993 by Digital Equipment Corporation. .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies, and that .\" the name of Digital Equipment Corporation not be used in advertising or .\" publicity pertaining to distribution of the document or software without .\" specific, written prior permission. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL .\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT .\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS .\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS .\" SOFTWARE. .\" - .\" --Copyright-- .\" .\" @(#)named.8 6.6 (Berkeley) 2/14/89 .\" jpman %Id: named.8,v 1.4 1997/11/11 13:59:51 horikawa Stab % .\" .TH NAMED 8 "June 20, 1995" .UC 4 .SH 名称 named \- インターネットドメインネームサーバ .SH 書式 .B named [ .B \-d .I debuglevel ] [ .B \-p .IR port# [\fB/\fP\fIlocalport#\fP] ] [{\-b} .I bootfile ] [ .B \-q ] [ .B \-r ] .SH 解説 .I Named はインターネットドメインネームサーバです。 インターネットドメインネームシステムの詳細な情報については RFC 1033, 1034, 1035 を参照してください。 パラメータがない場合は .I named はデフォルトのブートファイルである .IR /etc/named.boot の初期化データを読み込み、問い合わせに対し待機します。 .PP 指定できるオプションは以下の通りです。 .TP .B \-d デバッグ情報を出力します。 ``d''に続く数字には出力するメッセージのレベルを指定します。 .TP .B \-p 標準でないポート番号を指定します。 デフォルトは getservbyname(3) によって、 サービス ``domain'' に対して返される標準のポート番号となります。 このオプションでは2つのポートをスラッシュ(``\fB/\fP'')で続けて 指定することができます。 この場合は最初のポートがリモートサーバに接続する際に使用され、 後のポートはローカルで実行されている .IR named のサービスポートとなります。 これはおもにデバッグのために使用されます。 .TP .B \-b ブートファイルを指定します。 この指定はオプションであり、 ダッシュで始まるファイルを指定することが可能となります。 .TP .B \-q \fInamed\fP が \fIQRYLOG\fP を定義してコンパイルされている場合に、 全ての問い合わせのトレースを行ないます。 \fI注釈:\fP このオプションはブートファイル中の ``options query-log'' の指定と同等です。 .TP .B \-r 再帰的なネームサーバの問い合わせを抑止します。 問い合わせに対してはローカルゾーン(プライマリもしくはセカンダリ)からのみ 回答されます。 この指定はルートサーバにて使用することができます。 \fI注釈:\fP このオプションはブートファイル中の ``options no-recursion'' の指定と同等です。 .PP その他の引数はブートファイル名として扱われます。 複数のブートファイルが指定された場合は、最後の指定が有効となります。 .PP ブートファイルにはネームサーバが得るべき初期データの所在の情報が含まれます。 ブートファイル中の各行を次の行に引き続いて書くことはできません。 以下に簡単な例を示します。 .in +2m .nf ; ; boot file for name server ; directory /usr/local/adm/named .ta \w'check-names\ 'u +\w'6.32.128.IN-ADDR.ARPA\ 'u +\w'128.32.137.8 128.32.137.3\ 'u ; type domain source host/file backup file cache . root.cache primary Berkeley.EDU berkeley.edu.zone primary 32.128.IN-ADDR.ARPA ucbhosts.rev secondary CC.Berkeley.EDU 128.32.137.8 128.32.137.3 cc.zone.bak secondary 6.32.128.IN-ADDR.ARPA 128.32.137.8 128.32.137.3 cc.rev.bak primary 0.0.127.IN-ADDR.ARPA localhost.rev forwarders 10.0.0.78 10.2.0.78 limit transfers-in 10 limit datasize 64M limit files 256 options forward-only query-log fake-iquery check-names primary fail check-names secondary warn check-names response ignore .DT .fi .in ``directory'' 行はサーバのワーキングディレクトリを指定します。 この指定はプライマリゾーンファイル中にて \s-1$INCLUDE\s+1 が、 正しく機能する為に重要となります。 .LP ``cache'' 行は ``root.cache'' におけるデータがバックアップキャッシュに 置かれることを指定します。 これはおもにルートドメインサーバの位置のようなデータを指定するために 使われます。 このキャッシュは通常は使われませんが、現在のルートサーバをみつけるための -ヒント ``hint'' として使われます。 +「ヒント」として使われます。 ``root.cache'' ファイルは ``berkeley.edu.zone'' と同じフォーマットです。 複数の ``cache'' ファイルを指定することもできます。 ``root.cache'' ファイルは \s-1FTP.RS.INTERNIC.NET\s+1 から 定期的に取得するべきです。 なぜならば、それにはルートサーバのリストが含まれており、 リストは定期的に変更されているためです。 .LP 例における最初の ``primary'' 行ではファイル ``berkeley.edu.zone'' が ``Berkeley.EDU'' ゾーンにおける信頼すべきデータを含んでいることを 宣言しています。 ``berkeley.edu.zone'' ファイルは RFC 883 に記述されている -マスターファイルフォーマットのデータが含まれています。 -全てのドメイン名は起点 (ここの例では ``Berkeley.EDU'' ) に対し -相対的に指定されます。(詳細は後述。) +マスタファイルフォーマットのデータが含まれています。 +全てのドメイン名は起点 (ここの例では ``Berkeley.EDU'') に対し +相対的に指定されます (詳細は後述)。 2番目の ``primary'' 行ではファイル ``ucbhosts.rev'' が ドメイン ``32.128.IN-ADDR.ARPA'' の信頼すべきデータを含んでいることを 宣言しています。 これはネットワーク 128.32 におけるアドレスをホスト名に変換するために 使われます。 -それぞれのマスターファイルは +それぞれのマスタファイルは そのゾーンの SOA レコードで始めなければなりません。(下記参照) .LP 例における最初の ``secondary'' 行では ``CC.Berkeley.EDU'' 以下の全ての信頼すべきデータは 128.32.137.8 にあるネームサーバから転送されることを指定しています。 データの転送に失敗したら 128.32.137.3 と、 この行で指定された他のアドレス (10 個まで) を順に試みます。 セカンダリコピーもここで指定されているドメインについての 信頼すべきデータとなります。 -この行における最初の4つ組ドットアドレス表記でないものは +この行における最初の 4 つ組ドットアドレス表記でないものは、 転送されたゾーンのバックアップをとるファイル名として扱われます。 ネームサーバはこのバックアップファイルがブート時に存在すれば、 -ゾーン情報を読み込み、マスターサーバに接続できない場合でも +ゾーン情報を読み込み、マスタサーバに接続できない場合でも 完全なコピーとしてゾーン情報を供給します。 -ドメインの新しいコピーがマスターサーバのいずれかから自動ゾーン転送されれば、 +ドメインの新しいコピーがマスタサーバのいずれかから自動ゾーン転送されれば、 このファイルは更新されます。 ファイル名が指定されなければ、 一時ファイルが使用されゾーン転送が成功した後に削除されます。 これは不要なトラフィックを発生するため、おすすめできません。 -2番目の ``secondary'' 行ではサブネット 128.32.136 におけるアドレスから -ホスト名へのマッピングはその前のゾーンと同じマスターサーバから得ることを +2番目の ``secondary'' 行では、サブネット 128.32.136 におけるアドレスから +ホスト名へのマッピングは、その前のゾーンと同じマスタサーバから得ることを 宣言しています。 .LP -``forwarders'' 行では他のサーバからの再帰的な問い合わせを +``forwarders'' 行では、他のサーバからの再帰的な問い合わせを サイト単位で受け持つサーバのアドレスを指定しています。 ブートファイルに 1 つか複数のフォーワーダが指定してあると、 サーバはキャッシュに含まれていない全てのデータの問い合わせを 先ずフォーワーダに送ります。 -各々のフォーワーダには応答が返ってくるか、 -指定されている全てのフォーワーダに問い合わせが終るまで順に問い合わされます。 +応答が返ってくるか、 +指定されている全てのフォーワーダに問い合わせが終るまで、 +各々のフォーワーダに順に問い合わせます。 フォーワーダから応答が返って来ない場合、 -サーバは ``forward-only'' モードでなければ +サーバは、``forward-only'' モードでなければ、 forwarder 行が指定されていない場合と同様に処理を続けます。 この問い合わせの転送機能はマスタサーバにサイト単位の大きなキャッシュを 生成し、 外部のサーバとのリンクのためのトラフィックを軽減するのに役立ちます。 また、インターネットへの直接アクセスはできないが、 外部のアドレスを検索できるようなサーバを運用することが可能となります。 .LP ``slave'' 行は古いソフトウェアとの互換性のために設けられています。 これは ``options forward-only'' と同一です。 .LP -``sortlist'' 行は他のネットワークより優先するネットワークを指定するのに +``sortlist'' 行は、他のネットワークより優先するネットワークを指定するのに 使われます。 サーバと同じネットワーク上のホストからのアドレスの問い合わせには、 先ずローカルネットワークアドレスにリストされているもの、 次にソートされたリストから、そして最後にその他のアドレスから応答が返されます。 .LP ``xfrnets'' の指定 (例では使われていない) は単純なアクセス制御を行なうために 使われます。 この指定があれば、ネームサーバは ``xfrnets'' にて指定されたネットワーク上の ホストからのゾーン情報の転送の要求にのみ応答を返します。 これは古い中間的なサーバとの互換性を取るために ``tcplist'' として 指定することもできます。 .LP -``include'' の指定 (例では使われていない) は他のファイルの内容があたかも +``include'' の指定 (例では使われていない) は、他のファイルの内容があたかも ``include'' の指定がある場所におかれているように扱うために使われます。 この指定はゾーンが多数あるか、ゾーンを論理的にグループ化し多数の人によって メンテナンスしている場合に有用です。 ``include'' の指定は引数をひとつ取り、そこでインクルードするファイル名を 指定します。 ファイル名の前後に引用符は必要ありません。 .LP -``bogusns'' の指定 (例では使われていない) は指定されているネームサーバアドレス -(これはドメイン名ではなく 4つ組ドット表記にて指定される) +``bogusns'' の指定 (例では使われていない) は、 +指定されているネームサーバアドレス +(これはドメイン名ではなく 4 つ組ドット表記にて指定される) には問い合わせをしないことを \s-1BIND\s+1 に指示します。 -この指定はある特定のサーバのゾーンやキャッシュのデータが不正であることが +この指定は、ある特定のサーバのゾーンやキャッシュのデータが不正であることが あらかじめ分かっていて、 問題が修正されるまでデータの汚染を防止したい場合に有用です。 .LP ``limit'' の指定は \s-1BIND\s+1 の内部の制限を変更する場合に使用します。 制限にはシステムによるもの (例えば \fBdatasize\fP) と \s-1BIND\s+1 自身によるもの (例えば \fBtransfers-in\fP) があります。 limit の名称に続く数字はその後に続く ``k'', ``m'', ``g'' のいずれかによって 各々キロバイト、メガバイト、ギガバイトの単位となります。 \fBdatasize\fP の引数はカーネルによって設定されるプロセスのデータサイズです。 \fI注釈:\fP これを実現する関数が提供されていないシステムもあります。 そのようなシステムで ``limit'' に \fBdatasize\fP のパラメータを使用すると 警告メッセージが出力されます。 \fBtransfers-in\fP の引数は \s-1BIND\s+1 が一度に生成する \fInamed-xfer\fP サブプロセスの数を指定します。 \fBtransfers-per-ns\fP の引数はいくつかのリモートネームサーバに対し、 同時にゾーン転送を開始する最大の数となります。 \fBfiles\fP の引数はプロセスが使えるファイル記述子の数を設定します。 \fI注釈:\fP これを実現する関数が提供されていないシステムもあります。 そのようなシステムで ``limit'' に \fBfiles\fP のパラメータを使用すると 警告メッセージが出力されます。 .LP ``options'' の指定は \s-1BIND\s+1 の動作を変更するブール値の設定を行ないます。 ひとつの指定中に複数のオプションを指定することが可能です。 現在定義されているオプションには次のものがあります。 \fBno-recursion\fP これは \s-1BIND\s+1 に対し、 信頼できない名前に対する問い合わせを受け取った場合に実際のデータではなく、 照会先を返すよう指示します。 そのサーバが他のホストの \fIresolv.conf\fP ファイル中に記述されている場合は、 このオプションは指定しないでください。 -\fBno-fetch-glue\fP これは応答中の付属データ ``additional data'' セクションを +\fBno-fetch-glue\fP これは応答中の「付属データ(additional data)」セクションを 生成する時に、 -\s-1BIND\s+1 が missiong glue をフェッチしないようにします。 +\s-1BIND\s+1 が存在しない糊 (missing glue) をフェッチしないようにします。 これは、\fBno-recursion\fP と共に用いられ、 \s-1BIND\s+1 のキャッシュサイズが大きくなったり、壊れたりするのを防ぐのに 使われます。 \fBquery-log\fP 全ての問い合わせのログを syslog(8) 経由で採取します。 これを指定すると大量のデータを生成しますので、無闇には指定しないで下さい。 \fBforward-only\fP フォーワーダにのみ問い合わせます。 通常、この指定はサーバを運用したいが、 サーバが物理的もしくは管理上の理由によりインターネットに アクセスできない場合に使われます。 -\fBfake-iquery\fP 逆引き ``inverse queries'' に対してエラーではなく、 +\fBfake-iquery\fP 「逆引き (inverse queries)」に対してエラーではなく、 にせの応答を返すことを \s-1BIND\s+1 に指示します。 これはクライアントにマイクロコンピュータやSunOSのホストが沢山ある場合に 役に立ちます。 .LP ``check-names'' では、 その引数として ``primary'', ``secondary'', ``response'' を指定することにより、 \s-1BIND\s+1 に対してそれぞれ、 プライマリゾーンファイル、 セカンダリゾーンファイル、 再帰問い合わせに対する応答 (例えば、ファイアウォール中から問い合わせ転送に対する応答) の中の名称をチェックすることを指示します。 また、それぞれ名称の各タイプについて、 ゾーン情報が読み込まれていなかったり、 応答がキャッシュや転送されない場合の \s-1BIND\s+1 の振舞を、 引数に ``fail'', ``warn'', ``ignore''を指定することによってそれぞれ、 失敗する、 -システムのログにメッセージを残すような単に警告する、 +システムのログにメッセージを残す、 不正な名称を無視し従来の方法で処理する、というように指定することができます。 名称は、それがホスト名の場合は RFC 952 に準拠していれば正しいものと判断され、 ホスト名以外の場合は表示可能な \s-1ASCII\s+1 文字でのみ構成されていれば 正しいものと判断されます。 .LP ``max-fetch'' の指定 (例では使われていない) は 古いソフトウェアとの互換性を取るためのもので、 ``limit transfers-in'' と同一です。 .PP -マスターファイルは制御情報とゾーン中のオブジェクトの +マスタファイルは制御情報とゾーン中のオブジェクトの 資源レコードのリストからなり、次の形式を取ります。 .RS .nf $INCLUDE $ORIGIN .fi .RE ここで、 .I domain -にはルートの場合は "." を、現在の起点の場合は "@"、 +にはルートの場合は "." を、現在の起点の場合は "@" を、 それら以外では通常のドメイン名を指定します。 .I domain が ``.'' で終っていない通常のドメイン名である場合は、 現在の起点がドメインに追加されます。 ``.'' で終るドメイン名は変更されません。 .I opt_domain フィールドにはインクルードファイル中のデータの起点を定義します。 これはインクルードファイルの最初の行の前に $ORIGIN 宣言を置くことと等価です。 このフィールドはオプショナルです。 .I opt_domain や、インクルードファイル中の $ORIGIN 宣言は そのファイル自身の現在の起点を変更することはありません。 .I opt_ttl フィールドはオプションであり、 time-to-live フィールドを指定する整数値となります。 このデフォルト値はゼロであり、 そのゾーンの SOA レコードに指定された最小値を意味します。 .I opt_class フィールドはオブジェクトのアドレスの型を指定します。 現在はDARPAインターネットに接続するオブジェクトである .BR IN のみがサポートされています。 .I type フィールドには以下のトークンのうちひとつが含まれます。 括弧中におのおの .I resource_record_data フィールドに指定すべきデータを示しています。 .TP "\w'MINFO 'u" A ホストアドレス (4つ組ドット) .IP NS 信頼できるネームサーバ (ドメイン) .IP MX -メールエクスチェンジャー (ドメイン) +メールエクスチェンジャ (ドメイン) 優先順位 (0..32767) に引続き指定します。 優先順位は小さい値が優先順位の高いことを示します。 .IP CNAME 別名に対応した正式名 (ドメイン) .IP SOA オーソリティゾーンデータの開始を示します。 -(ホストの属するドメイン、メインテーナーのドメインアドレス、 +(ホストの属するドメイン、メンテナのドメインアドレス、 シリアル番号、その後にリフレッシュ、リトライ、有効期限、最小 TTL (RFC 883を参照) の各値を秒で指定したパラメータが続く)。 .IP NULL -ヌルリソースレコード (形式、データなし) +ヌルリソースレコード (形式やデータはありません) .IP RP いくつかのドメイン名の責任者 (メールアドレスか参照できるテキスト) .IP PTR ドメイン名のポインタ (ドメイン) .IP HINFO ホスト情報 (CPUタイプ、OSタイプ) .PP 通常は行末でリソースレコードは終了しますが、 左括弧と右括弧で囲まれた場合は複数行にまたがることが可能となります。 セミコロンから行末まではコメントとして扱われます。 .PP ここには示されていませんが、このほかのタイプのリソースレコードも存在します。 リソースレコードのすべてのタイプを知るには \s-1BIND\s+1 Operations Guide (``\s-1BOG\s+1'') を参照する必要があるでしょう。 新しい RFC にていくつかのリソースタイプが標準化されていますが、 このバージョンの \s-1BIND\s+1 ではまだ実装されていません。 .PP -各マスターゾーンファイルはそのゾーンの SOA レコードで始まらなければなりません。 +各マスタゾーンファイルはそのゾーンの SOA レコードで始まらなければなりません。 以下に SOA レコードの例を示します。 .LP .nf @ IN SOA ucbvax.Berkeley.EDU. rwh.ucbvax.Berkeley.EDU. ( .ta \w'x\ IN\ SOA\ 'u +\w'1989020501\ 'u 1989020501 ; serial 10800 ; refresh 3600 ; retry 3600000 ; expire 86400 ) ; minimum .fi .LP SOA ではシリアル番号を指定します。 -シリアル番号はマスターファイルを更新するたびに変更する必要があります。 +シリアル番号はマスタファイルを更新するたびに変更する必要があります。 シリアル番号 (serial) は少数点つきの数字を指定することもできますが、 整数への変換は乗算や加算ではなく文字列としてつなげて行っているため、 あまり賢い方法とはいえません。 年月日と 0〜99 のシリアル番号を使用することで、 このフィールドのサイズである符号なしの 32 ビット以内に収まります。 -このやり方はグレゴリー暦の 4294年には考え直す必要があることは確かですが、 +このやり方はグレゴリ暦の 4294 年には考え直す必要があることは確かですが、 それについては心配する必要はないでしょう。 セカンダリサーバは秒で指定されたリフレッシュ時間 (refresh) の間隔で シリアル番号をチェックします。 シリアル番号に変更があれば、新しいデータを読み込むために ゾーン情報が転送されます。 -リフレッシュ時間が過ぎてもマスターサーバに接続できない場合は、 +リフレッシュ時間が過ぎてもマスタサーバに接続できない場合は、 リトライ時間 (retry) の間隔でリフレッシュが試みられます。 -期限切れ時間 (expire) が過ぎてマスターサーバに接続できない場合は、 +期限切れ時間 (expire) が過ぎてマスタサーバに接続できない場合は、 セカンダリサーバはそのゾーンの全てのデータを破棄します。 最小値 (minimum) はファイル中の生存時間 (``\s-1TTL\s+1'') が 明示的に指定されていないレコードの生存時間となります。 .SH 注釈 ブートファイルでの ``domain'' と ``suffixes'' の指定は廃止され、 -もっと便利なリゾルバベースの部分的修飾ドメイン名 -(partially qualified domain names) の接尾辞の実装に取って代わりました。 -以前のメカニズムではかなりの状況下で、 -特にローカルネームサーバが完全な情報を持っていない場合に -うまく動作しないことがありました。 +もっと便利なリゾルバベースの実装、すなわち部分的な形のドメイン名 +(partially qualified domain names) の接尾辞に置き変えられました。 +以前のメカニズムでは多くの状況下で失敗することがあり、 +特にローカルネームサーバが完全な情報を持っていない場合に失敗しました。 .sp 以下に各シグナルを .IR kill (1) コマンドによってサーバに送った場合の効果を示します。 .IP SIGHUP サーバは named.boot を読み、データベースをロードし直します。 サーバがコンパイルオプションの FOCED_RELOAD を定義されて コンパイルされている場合は、 SIGHUPを送るとサーバは全てのセカンダリゾーンのシリアル番号もチェックします。 通常、シリアル番号は SOA 中に指定された間隔でのみチェックされます。 .IP SIGINT 現在のデータベースとキャッシュの内容を /var/tmp/named_dump.db にダンプします。 .IP SIGIOT サーバが -DSTATS 付きでコンパイルされていれば、 統計データを /var/tmp/named.stats にダンプします。 統計データはこのファイルの末尾に追加されます。 いくつかのシステムでは SIGIOT ではなく SIGABRT で統計データのダンプを行います。 .IP SIGSYS サーバがプロファイリング (サーバの fork, chdir と exit) を 有効にされてコンパイルされていれば、 プロファイリングデータを /var/tmp にダンプします。 .IP SIGTERM プライマリおよびセカンダリのデータベースファイルをダンプします。 サーバが動的更新を有効にしてコンパイルされていれば、 シャットダウン時に更新されたデータをセーブするために使用されます。 .IP SIGUSR1 デバッグ機能を有効にします。 SIGUSR1が送られるたびにデバッグレベルが上がります。 (SIGUSR1がない古いシステムではSIGEMTが使われます。) .IP SIGUSR2 デバッグ機能を完全に無効にします。 (SIGUSR2がない古いシステムではSIGFPEが使われます。) .IP SIGWINCH 全てのサーバに入力される問い合わせの syslog(8) による ログ採取の有無を切り替えます。 (ログ採取はサーバが QRYLOG オプションを指定されて コンパイルされている必要があります。) .SH 関連ファイル .nf .ta \w'/var/tmp/named_dump.db 'u -/etc/named.boot ネームサーバ コンフィギュレーション ブートファイル +/etc/named.boot ネームサーバの設定ブートファイル /etc/named.pid プロセス ID (旧システム) /var/run/named.pid プロセス ID (新システム) /var/tmp/named_dump.db ネームサーバデータベースのダンプ /var/tmp/named.run デバッグ出力 -/var/tmp/named.stats ネームサーバ 統計データ +/var/tmp/named.stats ネームサーバの統計データ .fi .SH 関連項目 kill(1), gethostbyname(3), signal(2), resolver(3), resolver(5), hostname(7), RFC 882, RFC 883, RFC 973, RFC 974, RFC 1033, RFC 1034, RFC 1035, RFC 1123, \fIName Server Operations Guide for \s-1BIND\s+1\fR diff --git a/ja_JP.eucJP/man/man8/named.restart.8 b/ja_JP.eucJP/man/man8/named.restart.8 index 67bcfd0265..867b865854 100644 --- a/ja_JP.eucJP/man/man8/named.restart.8 +++ b/ja_JP.eucJP/man/man8/named.restart.8 @@ -1,74 +1,74 @@ .\" ++Copyright++ 1987, 1993 .\" - .\" Copyright (c) 1987, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" - .\" Portions Copyright (c) 1993 by Digital Equipment Corporation. .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies, and that .\" the name of Digital Equipment Corporation not be used in advertising or .\" publicity pertaining to distribution of the document or software without .\" specific, written prior permission. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL .\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT .\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS .\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS .\" SOFTWARE. .\" - .\" --Copyright-- .\" .\" from hostname.7 6.4 (Berkeley) 1/16/90 .\" jpman %Id: named.restart.8,v 1.2 1997/05/17 16:56:47 horikawa Stab % .\" .TH NAMED.RESTART 8 "June 26, 1993" .UC 5 .SH 名称 named.restart \- ネームサーバを停止し、再起動する .SH 解説 このコマンドは実行中のネームサーバに \s-1SIGKILL\s+1 を送り、 -.IR /etc/sysconfig -にネームサーバが実行されるよう記述されていれば、新たに起動します。 +新たに起動します。 +.SH バグ ネームサーバが実際に動作しているか確認をしないため、古い PID キャッシュ ファイルが残っていると無関係なプロセスを停止させてしまうことがあり得ます。 .PP 古いサーバにシグナルを送った後、プロセスの完了を待たずに新しいサーバを起動 します。完了に時間がかかり、古いサーバが残ったまま新しいサーバが起動して 致命的エラーとなると、ネームサーバの動作していない状態に放置されることに なります。 .SH 関連項目 named(8), named.reload(8) .\" translated to japanese by Mochida Shuji 1995/03/31