diff --git a/ja_JP.eucJP/man/man1/ci.1 b/ja_JP.eucJP/man/man1/ci.1 index f975a3f3b6..6eae77e526 100644 --- a/ja_JP.eucJP/man/man1/ci.1 +++ b/ja_JP.eucJP/man/man1/ci.1 @@ -1,888 +1,888 @@ -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/ci.1,v 1.9 2001/05/14 01:07:21 horikawa Exp $ .ds Rv \\$3 .ds Dt \\$4 .. .Id %FreeBSD: src/gnu/usr.bin/rcs/ci/ci.1,v 1.6 1999/08/27 23:36:38 peter Exp % .ds i \&\s-1ISO\s0 .ds r \&\s-1RCS\s0 .ds u \&\s-1UTC\s0 .if n .ds - \%-- .if t .ds - \(em .TH CI 1 \*(Dt GNU .SH 名称 ci \- RCS ファイルにリビジョンをチェックインする .SH 書式 .B ci .RI [ options ] " file " .\|.\|. .SH 解説 .B ci は \*r ファイルに新たなリビジョンを格納します。 引数のうち、\*r ファイルの拡張子形式に一致する ファイル名を \*r ファイルとみなします。 それ以外のファイル名は、新たなリビジョンを含んだワークファイルとみなします。 .B ci はワークファイルの内容を対応した \*r ファイルに格納します。 もしワークファイルのみが指定されたなら、 .B ci はサブディレクトリ \*r、次にワークファイルがあるディレクトリの順に 対応する \*r ファイルを検索します。 詳細は後述の .SM "ファイル名規則" の項を参照してください。 .PP .B ci が動作するには、 .B ci を起動したユーザが \*r ファイルのアクセスリスト に登録されているか、アクセスリストが空であるか、 ユーザが \*r ファイルの持ち主であるか、 あるいはスーパユーザである必要があります。 すでに存在する枝 (branch) に新しいリビジョンを追加するには、 枝の先端 (tip) リビジョンが、 追加しようとするユーザによってロックされていなければなりません。 ロックされていない場合、新たな枝のみ作成可能です。 非厳格モード ( .BR rcs (1) 参照) の場合、 ファイルの所有者に対してはこの制限はありません。 他人が行っているロックは、 .B rcs コマンドによって解除できます。 .PP .B \-f オプションが指定されていなければ、 .B ci は追加しようとするリビジョンと直前のリビジョンとの比較を行います。 違いがなかった場合、新たなリビジョンを作成するかわりに、 ワークファイルを元のリビジョンのものに復元します。 復元するときには、ci はいったんワークファイルを削除し、 ロックを解除します。 .B "ci\ \-l" はロックし、 .B "ci\ \-u" はロックを解除します。 これらのオプションが指定されていれば、あたかも直前のリビジョンに対して .B "co\ \-l" または .B "co\ \-u" を実行したかのようにして直前のリビジョンの内容を取り出します。 復元が行われる場合、 .B \-n と .B \-s オプションは復元されるリビジョンに対して作用します。 .PP リビジョンを格納するときに、 .B ci はログメッセージの入力を促すプロンプトを表示します。 ログメッセージは、そのリビジョンの変更点の要約です。 ファイル終端 (EOF) あるいは、 ピリオド .B \&. のみからなる行によって入力を完了させます。 複数のファイルが登録される場合、 .B ci は前に入力したログメッセージを 再利用するかどうかを聞いてきます。 もし標準入力が端末でなければ、 .B ci は確認を行わず、 登録されるすべてのファイルに対して同じログメッセージを使用します。 .B \-m オプションの項も参照してください。 .PP もし \*r ファイルが存在しなければ、 .B ci は新規に \*r ファイルを作成し、 ワークファイルの内容を初期リビジョン (デフォルトでは .BR 1.1 ) として格納します。 その場合、アクセスリストは空に初期化されます。 初期リビジョンを格納するときは、 ログメッセージのかわりに ファイルの内容を記述したテキストを入力します (後述の .B \-t オプションの項を参照してください)。 .PP 登録するリビジョン番号 ( .I rev ) は、 .BR \-f , .BR \-i , .BR \-I , .BR \-j , .BR \-k , .BR \-l , .BR \-M , .BR \-q , .BR \-r , .B \-u のオプションのうちのいずれかで指定することができます。 .I rev はシンボル、数値、あるいは両者の組み合わせたものです。 .I rev で使用するシンボル名は定義済みでなければなりません; チェックイン時にシンボル名を割り当てる方法については .B \-n および .B \-N を参照して下さい。 もし .I rev が .B $ ならば、 .B ci はワークファイル中のキーワードからリビジョン番号を決定します。 .PP もし .I rev がピリオドから始まる場合、デフォルトの枝 (通常は幹 (trunk)) に格納されます。 もし .I rev が枝番号に続いてピリオドである場合、当該枝の最新のリビジョンが使用されます。 .PP .I rev がリビジョン番号の場合、 それは登録する枝のなかで最も大きな値である必要があります。 さもなければ、新しい枝を作成する必要があります。 .PP .I rev がリビジョン番号ではなく枝番号の場合、 その枝に対する新しいリビジョンが作成されます。 新しいリビジョン番号は、その枝の先端リビジョン番号に 1 を加えたものとなります。 もし .I rev が存在しない枝番号ならば、新たな枝が作成され、初期リビジョンとして .IB rev .1 が作成されます。 .br .ne 8 .PP .I rev が省略された場合、 .B ci はユーザが行った最後のロックからリビジョン番号を決定します。 ユーザがある枝の先端リビジョンをロックしている場合は、 新たなリビジョンがその枝に追加されます。 新しいリビジョン番号は 先端リビジョン番号に 1 を加えたものになります。 ユーザが先端ではないリビジョンをロックしている場合は、 新たな枝が作成されます。 新たな枝番号は、ロック対象のリビジョンの 最も大きな枝番号に 1 を加えたものになります。 デフォルトでは、新たな枝やリビジョンの番号は .B 1 となります。 .PP .I rev が省略され、ユーザがロックを行わず、そのファイルの所有者であり、 かつロックが .I 非厳格モード であるなら、 デフォルトの枝 (通常は幹 (trunk); .BR rcs (1) の .B \-b オプションの項を参照) に新たなリビジョンが作成されます。 .PP 例外: 幹 (trunk) においてリビジョンを追加することはできますが、 途中に挿入することはできません。 .SH オプション .TP .BI \-r rev リビジョン .I rev をチェックインします。 .TP .B \-r .B \-r オプションをリビジョン抜きで使用した場合、 .B ci にとって特別な意味が有ります。他の \*r コマンドでは .B \-r オプションを単体で使用するとデフォルト枝の最新のリビジョンを指定します。 しかし、 .B ci ではロック解除、ワークファイル削除を行い、 シェルのエイリアスやスクリプトによりデフォルトとされてしまった .B \-l や .B \-u オプションの効果を打ち消します。 .TP .BR \-l [\f2rev\fP] .B \-r と同様の動作を行ったあと、 .B "co\ \-l" と同様の動作も行います。 すなわち、登録されたリビジョンは即座にロックされ、チェックアウトされます。 これは、リビジョンをチェックインしてさらに編集を続けたい場合に便利です。 .TP .BR \-u [\f2rev\fP] .B \-l とほぼ同様の動作をしますが、登録されたリビジョンはロックされません。 これは、チェックインしたリビジョンの内容をすぐに参照したい場合に便利です。 .RS .PP .BR \-l 、リビジョン無し .BR \-r , .B \-u オプションは、最後に指定したもののみが効力を持ちます。 たとえば、 .B "ci\ \-u\ \-r" は .B "ci\ \-r" と等価です。 リビジョン無し .B \-r が .B \-u に優先するからです。 .RE .TP .BR \-f [\f2rev\fP] 強制的に登録します。 直前のリビジョンとの違いがない場合にも、 新しいリビジョンとして登録します。 .TP .BR \-k [\f2rev\fP] リビジョン番号などをローカルに算出せずに、 ワークファイルからキーワードを探し、 リビジョン番号、作成日時、状態、作者 ( .BR co (1) を参照) を検索し、登録されるリビジョンに割り当てます。 さらに、 .B ci を起動したユーザ名と実際にチェックインされた日付を含む デフォルトのログメッセージを作成します。 本オプションは、配布されたソフトウェアを登録するのに便利です。 複数のサイトに配布されたリビジョンは、 元のリビジョン番号、作成日付、状態、作者を保存するために、 .B \-k オプションを使って登録するべきです。 ワークファイルのキーワードから取り出した値とログメッセージは、 .BR \-d , .BR \-m , .BR \-s , .B \-w や、他のリビジョン番号を生成するようなオプションにより 変更することができます。 .TP .BR \-q [\f2rev\fP] 沈黙モードです。 診断メッセージを表示しません。 直前のリビジョンから変更がない場合、 .B \-f オプションを指定していなければ、登録を行いません。 .TP .BR \-i [\f2rev\fP] 最初のチェックイン; \*r ファイルが既に有る時にはエラー報告します。 特定のアプリケーションのレース状態を避けます。 .TP .BR \-j [\f2rev\fP] 初期化を行わず、チェックインします; \*r ファイルが無いとエラー報告します。 .TP .BR \-I [\f2rev\fP] 対話モードで動作します。 たとえ標準入力が端末でなくても、ユーザに対して問い合わせを行います。 .TP .BR \-d "[\f2date\fP]" チェックイン日付として指定された .I date を用います。 .I date は .BR co (1) で記述された自由形式で指定することができます。 これは、チェックイン日時をごまかしたい場合や、 日付キーワードがワークファイルにないにもかかわらず .B \-k オプションを使いたい場合に便利です。 .I date が指定されなかった場合、ワークファイルの最終更新日付が用いられます。 .TP .BR \-M [\f2rev\fP] 作成されるワークファイルの最終更新日付を、 取り出されたリビジョンの日付にします。 たとえば、 .BI "ci\ \-d\ \-M\ \-u" "\ f" は、 .I f の内容がキーワード置換により変更された場合も最終更新日時を変更しません。 本オプションを指定すると .BR make (1) に影響を与えるので、注意して使用する必要があります。 .TP .BI \-m "msg" チェックインするすべてのリビジョンのログメッセージとして .I msg を用います。 慣習的に .B # で始まるログメッセージはコメントであり、GNU Emacs の .B vc パッケージのようなプログラムはこれを無視します。 また、 .BI { clumpname } (の後に空白が続く) ログメッセージは可能であればまとめられることを意味します。 それはたとえ別々のファイルに関連づけられていてもです; .BI { clumpname } ラベルは、まとめる目的でのみ使用されます。 それ自身はログメッセージであるとは見なされません。 .TP .BI \-n "name" チェックインしたリビジョンにシンボリック名 .I name をつけます。 もし同じシンボリック名が別のリビジョンに割り当てられていた場合、 .B ci はエラーメッセージを出力します。 .TP .BI \-N "name" .B -n と同様の動作を行います。 ただし、同じシンボリック名が他のリビジョンに割り当てられていた場合は、 再割り当てを行います (こちらを優先します)。 .TP .BI \-s "state" チェックインされるリビジョンの状態を .I state とします。デフォルトは .B Exp (Experimental: 実験的) です。 .TP .BI \-t file \*r ファイル中の内容記述テキストをファイル .I file の内容で置き換えます。 すでに内容記述テキストがある場合はこれを削除します。ファイル名 .I file は .B \- で始まってはいけません。 .TP .BI \-t\- string \*r ファイル中の内容記述テキストを文字列 .I string で置き換えます。 すでに内容記述テキストがある場合は削除されます。 .RS .PP .B \-t オプションは、どちらの形式で使う場合も、 最初のチェックイン時にしか意味を持ちません。 それ以外の場合は単に無視されます。 .PP 最初のチェックイン時に .B \-t オプションが指定されなかった場合、 .B ci は標準 入力から内容記述テキストを読み込みます。 テキストは、ファイル終端 (EOF) あるいはピリオド ( -.Br \&. +.BR \&. ) のみの行で終了します。 ユーザへの問い合わせが可能な場合には、 テキストの入力を促すプロンプトが表示されます ( .B \-I オプション参照)。 .PP 旧バージョンとの互換性のため、引数のない .B \-t オプションは無視されます。 .RE .TP .B \-T 新しいリビジョンが存在し、 \*r ファイルの修正時刻が新しいリビジョンの時刻よりも古ければ、 \*r ファイルの修正時刻に対して新しいリビジョンの時刻を代入します; そうでない場合は \*r ファイルの修正時刻は保たれます。 リビジョンをロックした場合は、 .B ci は通常 \*r ファイルの修正時刻を現在の時刻に設定します。 なぜならロックが \*r ファイルに格納され、 ロックの削除は \*r ファイルの変更を要するからです。 \*r ファイルがワークファイルよりも新しくなる方法として 2 通り有ります: まず、 .B "ci\ \-M" は現在時刻以前の日付でワークファイルを作成します; 2 番目に、直前のバージョンを回復する時、 ワークファイルを変更しない場合にも \*r ファイルは変更され得ます。 \*r ファイルのワークファイルにおける .BR make (1) 依存により、上記 2 ケースは過剰の再コンパイルという結果になり得ます。 .B \-T オプションを使用することで、\*r ファイルの日付をごまかし、 再コンパイルを禁止します。 このオプションは注意して使って下さい; あるワークファイルのチェックインが、 同じ \*r ファイルに関連づけられている別のワークファイルに影響を及ぼすべき 時でも、再コンパイルを抑制し得ます。 例えば、\*r ファイルの時刻を 01:00、 (変更された) ワークファイルの時刻を 02:00、 別のワークファイルのコピーの時刻を 03:00、 現在の時刻を 04:00 とします。 ここで、 .B "ci\ \-d\ \-T" とすると、\*r ファイルの時刻は通常の 04:00 ではなく 02:00 になります; この結果、 .BR make (1) は別のコピーが \*r ファイルよりも新しいと (誤って) 認識します。 .TP .BI \-w "login" 指定された .I login をリビジョンの作者として登録します。 作者名をごまかしたい場合や、 作者キーワードがワークファイルにないにもかかわらず .B -k オプションを使いたい場合に便利です。 .BI \-V \*r のリビジョン番号を表示します。 .TP .BI \-V n \*r システムのバージョン .I n のエミュレーションを行います。詳細は .BR co (1) を参照してください。 .TP .BI \-x "suffixes" \*r ファイルの拡張子を指定します。 拡張子が空ではない場合、 拡張子まで含めたすべてのパス名を \*r ファイル名であるとみなします。 拡張子が空の場合は、 .BI RCS/ path または .IB path1 /RCS/ path2 形式のものを \*r ファイル名であるとみなします。 本オプションの場合、 .B / で区切ることにより、複数の拡張子を指定できます。たとえば、 .B \-x,v/ は、 .B ,v と空の拡張子の 2 つの拡張子を持つ \*r ファイルを指定します。 複数の拡張子が指定された場合、指定された順に \*r ファイルを検索します。 最初に見つかったサフィックスが \*r ファイルに対して用いられます。 \*r ファイルを生成できるが、 \*r ファイルが見つからないときは、 これらのサフィックスを新しいファイル名に対して用います。 デフォルトの拡張子は、インストールされる環境により異なります。 UNIX のようなコンマをファイル名中に含めることの出来る計算機では、通常 .B \-x,v/ が、それ以外の計算機では空の拡張子が用いられます。 .TP .BI \-z zone キーワード置換での日付の出力書式の指定を行い、また、 .BI \-d date オプションでの .I date のデフォルトのタイムゾーンの指定を行います。 .I zone は、省略する事も、UTC からの数値差で指定する事も、特別な文字列 .B LT を使ってローカル時間で指定する事もできます。 デフォルトでは .I zone は空であり、 この場合は伝統的な \*r フォーマット、 すなわちタイムゾーン無しの \*u であり日付をスラッシュで区切ります; そうでない場合は時刻はタイムゾーン付の \*i 8601 フォーマットです。 例えば、ローカルタイムが 1990 年 1 月 11 日 太平洋標準時間 (\*u の 8 時間西) 午後 8 時の場合、時間の出力は次のようになります: .RS .LP .RS .nf .ta \w'\f3\-z+05:30\fP 'u +\w'\f31990-01-11 09:30:00+05:30\fP 'u .ne 4 \f2オプション\fP\f2時刻の出力\fP \f3\-z\fP \f31990/01/12 04:00:00\fP \f2(デフォルト)\fP \f3\-zLT\fP \f31990-01-11 20:00:00\-08\fP \f3\-z+05:30\fP \f31990-01-12 09:30:00+05:30\fP .ta 4n +4n +4n +4n .fi .RE .LP .B \-z オプションは \*r ファイルに格納されている日付 (常に \*u です) には影響しません。 .SH "ファイル名規則" \*r ファイルとワークファイルの組み合わせは 3 通りの方法で指定することができます (使用例の項目も参照してください)。 .PP 1) \*r ファイルとワークファイルの両方を指定する。 \*r ファイルのパス名は .IB path1 / workfileX 形式、ワークファイルのパス名は .IB path2 / workfile 形式をとります。この場合の .IB path1 / と .IB path2 / はパス (異なるパスや、空でも可) を示し、 .I workfile はファイル名、 .I X は \*r ファイルの拡張子です。もし .I X が空なら、 .IB path1 / は .B RCS/ で始まるか、 .B /RCS/ を含まねばなりません。 .PP 2) \*r ファイルのみを指定する。 ワークファイルがカレントディレクトリに作成され、\*r ファイル名から .IB path1 / と拡張子 .I X を取り除いたファイル名になります。 .PP 3) ワークファイルのみを指定する。 .B ci はまず、各 \*r 拡張子 .I X に対して、 .IB path2 /RCS/ workfileX 形式の名前で検索を行います。 さらに、(もしこれが見つからず、 .I X が空でなければ、) .IB path2 / workfileX を検索します。 .PP 1) または 2) の方法で \*r ファイルが指定されていない場合、 .I ci はまずディレクトリ .B ./RCS を検索し、次にカレントディレクトリを検索します。 .PP 異常により \*r ファイルのオープンに失敗すると、 .I ci はエラー報告します。 他に \*r ファイルのパス名の候補があってもです。 たとえばディレクトリ .I d で \*r コマンドを利用できないようにするには、 .IB d /RCS なる名前の通常ファイルを作成しておきます。 すると、\*r コマンドは .IB d /RCS をディレクトリとしてオープンしようとしますが、 ディレクトリではないのでオープンすることができず失敗します。 .SH 使用例 \*r 拡張子が .B ,v 、カレントディレクトリには \*r ファイルを含む .B RCS というサブディレクトリがあり、 .B io.c,v があると仮定します。 ここで、以下に示したコマンドを実行すると、 どれもカレントディレクトリにある .B io.c を .B RCS/io.c,v にチェックインし、 .B io.c を削除します。 .LP .RS .nf .ft 3 ci io.c; ci RCS/io.c,v; ci io.c,v; ci io.c RCS/io.c,v; ci io.c io.c,v; ci RCS/io.c,v io.c; ci io.c,v io.c; .ft .fi .RE .PP \*r 拡張子が空、カレントディレクトリには \*r ファイルを含む .B RCS というサブディレクトリがあり、 .B io.c があると仮定します。ここで以下に示すコマンドは、どれも新しい リビジョンのチェックインを行います。 .LP .RS .nf .ft 3 ci io.c; ci RCS/io.c; ci io.c RCS/io.c; ci RCS/io.c io.c; .ft .fi .RE .SH "ファイルモード" .B ci が作成した \*r ファイルは、 ワークファイルの読み込みと実行の許可属性を受け継ぎます。 すでに \*r ファイルが存在すれば、 .B ci はその読み込みと実行の許可属性を保持します。 .B ci は、つねに \*r ファイルの書き込み許可属性を不許可にします。 .SH 関連ファイル いくつかの一時ファイルが、ワークファイルの存在するディレクトリまたは 一時ディレクトリ (環境変数の項の .B \s-1TMPDIR\s0 参照) に作成されます。 セマフォファイル等のファイルが \*r ファイルが存在するディレクトリに作成されます。 空ではない拡張子を用いている場合、 セマフォファイル名の先頭文字には、 拡張子の先頭文字と同じ文字が用いられます; よって、拡張子として、ワークファイルの拡張子の先頭文字と同じ文字を 指定しないように注意してください。 空の拡張子を指定している場合、 セマフォファイル名の最後の文字がアンダスコア ( .B _ ) となります。 .PP .B ci は、 \*r ファイルやワークファイルを変更しません。通常 .B ci はそれらのファイルをアンリンクし、新しいファイルを作成します; ただし、\*r ファイルへのシンボリックリンクの鎖を壊す代わりに、 目的のファイルをアンリンクします。 よって、 .B ci は変更されるワークファイルへの ハードリンク、シンボリックリンクを全て壊します; さらに、\*r ファイルへのハードリンクは無効となり、 シンボリックリンクは保存されます。 .PP 実効ユーザは、\*r ファイルを含むディレクトリの 検索および書き込み権を持っていなければなりません。 通常実ユーザは、 \*r ファイルとワークファイルの読み込み許可と、 それらを含むディレクトリの検索および書き込み権を持っていなければなりません。 しかし、古い計算機のなかには実ユーザと実効ユーザの間を 容易に行き来することができないものもあります。 これらの計算機では、実効ユーザのみが利用されます。 .B ci や .B co のコピーに setuid が設定されていなければ、 実ユーザと実効ユーザは同一です。 次節で説明するように、 もし実効ユーザが全 \*r ファイルとそれを含むディレクトリを所有し、 実効ユーザのみが \*r ディレクトリに書き込めるように設定できるなら、 \*r ファイルのセキュリティを強化することが可能です。 .PP ユーザは \*r ファイルを含むディレクトリの許可属性を変更することで、 \*r ファイルに対するアクセスを制限できます; そのディレクトリに書き込み権のあるユーザだけが、 \*r ファイルを変更する \*r コマンドを使用することができます。 たとえば、ユーザが複数のグループに属することが出来る計算機では、 \*r ディレクトリをあるグループのみが書き込み権を持つように設定します。 これは、略式のプロジェクトでは十分ですが、 グループに所属するユーザが自由に \*r ファイルを変更することができ、 \*r ファイルすべてを削除することもできます。 そのため、正式なプロジェクトでは、 \*r ファイルを自由に操作きる \*r 管理者と、 新たなリビジョンをチェックインすること以外の操作はできない他のユーザとを、 区別することがあります。 .SH SETUID の使用 \*r 管理者以外のユーザがリビジョンを削除できないようにするには、 以下のように setuid 特権を使用することができます。 .nr n \w'\(bu'+2n-1/1n .ds n \nn .if \n(.g .if r an-tag-sep .ds n \w'\(bu'u+\n[an-tag-sep]u .IP \(bu \*n その計算機で \*r にて setuid が使用できるか確認します。 疑問があるときは、信頼できる専門家に意見を聞いてください。 最も良いのは、 .B seteuid() システムコールが Posix 1003.1a Draft 5 に 記述されているように動作することです。 なぜなら、実ユーザが .BR root であっても、\*r は実ユーザと実効ユーザを簡単に切り替えることができるからです。 その次に良いのは、 .B setuid() システムコールが saved setuid (Posix 1003.1-1990の {\s-1_POSIX_SAVED_IDS\s0} の動作) を サポートしている場合です; この場合、実ユーザもしくは実効ユーザが .BR root である時のみ失敗します。 \*r は setuid に失敗すると、ただちに終了します。 .IP \(bu \nn ユーザグループの \*r 管理者として、ユーザ .I A を選びます。 .I A だけが、\*r ファイルに対して .B rcs コマンドを実行することができます。 .I A は .B root や、特権を持ったユーザであってはいけません。 相互に異なるユーザグループには、異なる管理者を使用するべきです。 .IP \(bu \nn ユーザが実行するファイルのディレクトリに、パス名 .I B を選びます。 .IP \(bu \nn 以下のように、通常のインストールディレクトリ .I D から、 .B ci と .B co を .I B にコピーし、 .I A へ setuid します: .LP .RS .nf .ne 3 \f3mkdir\fP \f2B\fP \f3cp\fP \f2D\fP\^\f3/c[io]\fP \f2B\fP \f3chmod go\-w,u+s\fP \f2B\fP\f3/c[io]\fP .fi .RE .IP \(bu \nn 以下のように、各ユーザのパスに .I B を加えます: .LP .RS .nf .ne 2 \f3PATH=\fP\f2B\fP\f3:$PATH; export PATH\fP # ordinary shell \f3set path=(\fP\f2B\fP \f3$path)\fP # C shell .fi .RE .IP \(bu \nn 以下のように、 .I A だけが書き込み許可を持つ \*r ディレクトリ .I R を作成します: .LP .RS .nf .ne 2 \f3mkdir\fP \f2R\fP \f3chmod go\-w\fP \f2R\fP .fi .RE .IP \(bu \nn 特定のユーザだけに \*r ファイルの読み込みを許可したい場合、 そのユーザをユーザグループ .IR G に入れて、さらに .I A が以下のように、\*r ディレクトリを保護します: .LP .RS .nf .ne 2 \f3chgrp\fP \f2G R\fP \f3chmod g\-w,o\-rwx\fP \f2R\fP .fi .RE .IP \(bu \nn (存在すれば) 古い \*r ファイルを .IR R にコピーし、 .I A が所有であることを保証します。 .IP \(bu \nn \*r ファイルのアクセスリストは、 リビジョンをチェックインおよびロックできるユーザを制限します。 デフォルトのアクセスリストは空で、 \*r ファイルを読むことのできる全てのユーザに、登録の権限を与えます。 チェックインを制限したい場合は、 .I A がそのファイルに対して .B "rcs\ \-a" を実行します; .BR rcs (1) を参照してください。 特に .BI "rcs\ \-e\ \-a" A は、 .IR A だけにアクセスを制限します。 .IP \(bu \nn 初めてチェックインを行う前に、 .I A は .B "rcs\ \-i" によって新しい \*r ファイルを初期化します。 チェックインを制限したい場合、 .B \-a オプションを付け加えます。 .IP \(bu \nn setuid 特権は、 .BR ci , .BR co , .BR rcsclean のみに与えます; .B rcs や他のコマンドに、setuid 特権を与えてはなりません。 .IP \(bu \nn \*r コマンドに対して、他の setuid コマンドを実行しないでください。 setuid はあなたが考えるより扱いにくいものです。 .SH 環境変数 .TP .B \s-1RCSINIT\s0 本変数に空白で区切ったオプションを設定することで、 コマンドライン引数に先立って処理されます。 空白はバックスラッシュによってエスケープすることができます。 .B \s-1RCSINIT\s0 はほとんどの \*r コマンドで参照されます。特に .BR \-q , .BR \-V , .BR \-x , .B \-z オプションを指定しておくと便利です。 .TP .B \s-1TMPDIR\s0 一時ディレクトリ名を指定します。 設定されていない場合は、環境変数 .B \s-1TMP\s0 と .B \s-1TEMP\s0 とを調べ、始めに見つかった値を用います; どれも設定されていない場合は、 計算機依存のデフォルトのディレクトリ (たいていは .B /tmp ) を使用します。 .SH 診断 各リビジョンに対して、 .I ci は \*r ファイル名、ワークファイル名、追加するリビジョン番号、直前の リビジョン番号を表示します。全ての処理が成功した場合のみ、 終了ステータスが 0 になります。 .SH 作者 Author: Walter F. Tichy. .br Manual Page Revision: \*(Rv; Release Date: \*(Dt. .br Copyright \(co 1982, 1988, 1989 Walter F. Tichy. .br Copyright \(co 1990, 1991, 1992, 1993, 1994, 1995 by Paul Eggert. .SH 関連項目 co(1), ident(1), make(1), rcs(1), rcsclean(1), rcsdiff(1), rcsintro(1), rcsmerge(1), rlog(1), setuid(2), rcsfile(5) .br Walter F. Tichy, \*r\*-A System for Version Control, .I "Software\*-Practice & Experience" .BR 15 , 7 (July 1985), 637-654. .br diff --git a/ja_JP.eucJP/man/man1/gzip.1 b/ja_JP.eucJP/man/man1/gzip.1 index 1d4791e107..21d05a22ad 100644 --- a/ja_JP.eucJP/man/man1/gzip.1 +++ b/ja_JP.eucJP/man/man1/gzip.1 @@ -1,488 +1,488 @@ .\" %FreeBSD: src/gnu/usr.bin/gzip/gzip.1,v 1.7 1999/09/20 09:15:15 phantom Exp % -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/gzip.1,v 1.4 2001/05/14 01:07:24 horikawa Exp $ .TH GZIP 1 .SH 名称 gzip, gunzip, zcat \- ファイルの圧縮、伸長を行なう .SH 書式 .ll +8 .B gzip .RB [ " \-acdfhlLnNrtvV19 " ] .RB [ \-S\ suffix ] [ .I "name \&..." ] .ll -8 .br .B gunzip .RB [ " \-acfhlLnNrtvV " ] .RB [ \-S\ suffix ] [ .I "name \&..." ] .br .B zcat .RB [ " \-fhLV " ] [ .I "name \&..." ] .SH 解説 .I gzip は、Lempel-Ziv アルゴリズム (LZ77) を利用してファイルのサイズを減らします。 もし可能な場合は、ファイル名に .B "\&.gz," の拡張子をつけ、 ファイルの所有者やアクセス時間と更新時間を保存します。 (デフォルトの拡張子は、 VMS では .B "\-gz" 、MSDOS, OS/2 FAT, Windows NT FAT, Atari では .B "z" となります。) もし、ファイル名が指定されなかったり、ファイル名として "-" が指定されれば、 標準入力を圧縮し、結果を標準出力へ出力します。 .I gzip は、一般ファイルのみを圧縮します。 特に、シンボリックリンクは無視されます。 .PP もし、圧縮されたファイル名がファイルシステムにとって長ければ、 .I gzip は、その名前を縮めます。 .I gzip は、ファイル名の 3 文字以上の部分にのみ名前の縮小を試みます。 (部分とは、ドットによって分けられた所です。) もし、ファイル名が短かい部分のみで 構成されていた時は、最も長い部分を縮小します。例えば、ファイル名が 14 文字 という制限がある時、 gzip.msdos.exe は gzi.msd.exe.gz となります。 ファイル名の文字数が制限を持たないシステムでは、 ファイル名の縮小は行われません。 .PP デフォルトで .I gzip は、オリジナルのファイル名とタイムスタンプを圧縮されたファイル中に保存します。 これらは、 .B \-N オプション付きで伸長された時に、使われます。これは、圧縮されたファイル名が 縮小されていたり、ファイル転送後にタイムスタンプが保存されなかった時に 便利です。 .PP 圧縮されたファイルは、 .I gzip -d か .I gunzip か .I zcat を用い、オリジナルに戻すことが出来ます。 もし、圧縮されたファイルに保存されたオリジナルのファイル名がファイルシステムに 合わなければ、オリジナルのファイル名から新しいファイル名が作られます。 .PP .I gunzip は、コマンドライン上のファイルのリストを 受け取り、.gz, -gz, .z, -z, _z, .Z で終っていて、正しいマジックナンバーで 始まっているファイルを、 元の拡張子を取り除いた圧縮されていないファイルにします。 .I gunzip は、 .B "\&.tar.gz" や .B "\&.tar.Z" を省略した .B "\&.tgz" や .B "\&.taz" も認識します。 圧縮する時、 .I gzip は、 .B "\&.tar" ファイルのファイル名を縮めるかわりに .B "\&.tgz" を使います。 .PP .I gunzip は、 .I gzip, zip, compress, compress -H, pack で作られたファイルを伸長できます。 入力されたファイルがどの方式で圧縮されいるかは自動的に判別されます。 最初の二つの方式を使うと、 .I gunzip は 32ビット CRC をチェックします。 .I pack の場合、 .I gunzip は伸長された大きさをチェックします。標準の .I compress は一貫性のチェックをするように設計されていませんでしたが、 .I gunzip は .Z ファイルが正しくないことを検出できることもあります。 もし .Z ファイルを伸長する時にエラーに会う場合には、 標準の .I uncompress がエラーを出さないという理由で .Z ファイルは正しい と思わないで下さい。 これは一般的に、標準の .I uncompress が入力をチェックせず、ゴミである出力をしてしまうという事を意味しています。 SCO compress -H 方式 (lzh 圧縮技法) は CRC を含みませんが、 ある程度の一貫性のチェックの余地があります。 .PP .I zip で作られたファイルは、 'deflation' 技法で圧縮された一つのメンバーを もつ時のみ gzip で伸長できます。この特徴は tar.zip ファイルを tar.gz ファイルに するのを助けることのみを意図しています。複数のメンバーを持った zip ファイルを 取り出す時には .I gunzip ではなく .I unzip を使って下さい。 .PP .I zcat は、 .I gunzip .B \-c と同一です。 (いくつかのシステムでは、 .I zcat は .I compress へのオリジナルのリンクを保存しておくために .I gzcat としてインストールされているかもしれません。) .I zcat は、コマンドラインで指定されたファイルか標準入力からの入力を伸長し、 標準出力へ伸長したデータを出力します。 .I zcat は、 .B "\&.gz" 拡張子であろうとなかろうと、マジックナンバーが正しければファイルを伸長 します。 .PP .I gzip は、 .I zip や PKZIP で使われている Lempel-Ziv アルゴリズムを使っています。 圧縮率は入力の大きさや共通の文字列の分布によります。 一般に、ソースコードや英語のようなテキストは 60\-70% 縮小されます。 また、 LZW ( .IR compress で使われている)、 Huffman coding ( .IR pack で使われている)、 適応性 Huffman coding .RI ( compact ) よりも圧縮率が良いです。 .PP 圧縮されたファイルがオリジナルのファイルよりわずかでも大きいとしても、 圧縮は常に行われます。最悪の伸長は gzip ファイルヘッダの数バイト、 32K ブロック毎に 5 バイトの増加、すなわち伸長率 0.015% です。 使用しているディスクブロックの実際の数はほとんどの場合決して増加しない事に 注意してください。 .I gzip は、圧縮や伸長を行う時ファイルのモード、所有者、タイムスタンプを保存します。 .SH オプション .TP .B \-a --ascii 行末の変換を行います。このオプションは非 Unix 環境でのみ サポートされています。例えばMSDOSでは、圧縮時に CR LF が LF に変換され、 伸長時に LF が CR LF に変換されます。 .TP .B \-c --stdout --to-stdout オリジナルファイルはそのままで、結果を標準出力へ書き出します。 もし、複数のファイルが入力されれば、結果は一続きの独立したものに なります。よりよく圧縮をするためには、圧縮をする前にすべての入力 ファイルを結合するとよいです。 .TP .B \-d --decompress --uncompress 伸長を行います。 .TP .B \-f --force ファイルが複数のリンクを持っていたり、すでにファイルは存在してとしても、 また圧縮されたデータを端末から読み書きしようとしたときでも圧縮や伸長を 強行します。もし入力されたデータが .I gzip で認識出来ない形式でありオプション --stdout が指定された場合、 変更されることなく入力されたデータは標準出力へコピーされます: .I zcat は .I cat として振舞います。もし .B \-f が指定されておらず バックグランドで実行されていない場合には、 .I gzip はファイルを上書きしてよいか確認を求めます。 .TP .B \-h --help ヘルプを表示し、終了します。 .TP .B \-l --list 圧縮されたファイルそれぞれに以下のフィールドを表示する。 compressed size: 圧縮されたファイルの大きさ uncompressed size: 伸長されたファイルの大きさ ratio: 圧縮率 (分からなければ 0.0%) uncompressed_name: 伸長されたファイルの名前 uncompressed size が -1 ならば、ファイルは gzip 形式ではなく .Z ファイル等です。 そのようなファイルの伸長されたファイルの大きさを 知るには、以下のようにして下さい。 zcat file.Z | wc -c --verbose オプションを共に指定すると、以下のフィールドが追加されます。 method: 圧縮技法 crc: 伸長されたファイルの 32-bit CRC date & time: 伸長されたファイルのタイムスタンプ 圧縮技法は今のところ deflate, compress, lzh (SCO compress -H), pack を サポートしています。crc が ffffffff ならば、gzip 形式ではありません。 --name オプションを共に指定すると、表示する伸長されたファイルの名前、日付、時間 は圧縮されたファイルに保存されたものになります。 --verbose オプションを共に指定すると、 全てのファイルのサイズのトータルや圧縮率が 表示されます (ファイルサイズが分からないものがある場合を除きます)。 --quiet オプションを共に指定すると、タイトルやトータルラインは表示されません。 .TP .B \-L --license .I gzip ライセンスを表示し、終了します。 .TP .B \-n --no-name 圧縮する時、デフォルトでオリジナルのファイル名やタイムスタンプを保存しません。 (もしファイル名が縮められるならば、オリジナルのファイル名は常に 保存されます。) 伸長する時、もしオリジナルのファイル名が存在しても 復元しません (圧縮されたファイルの名前から .I gzip サフィックスのみを取り除きます)、もしオリジナルのタイムスタンプが 存在しても復元しません (圧縮されたファイルからコピーします)。この オプションは伸長する時のデフォルトです。 .TP .B \-N --name 圧縮する時、常にオリジナルのファイル名とタイムスタンプを保存します。 これはデフォルトです。伸長する時、もしオリジナルのファイル名やタイム スタンプが存在すれば復元します。これはファイル名の長さに制限のある システムやタイムスタンプがファイル転送後に失われた時に役に立ちます。 .TP .B \-q --quiet すべての警告を抑制します。 .TP .B \-r --recursive ディレクトリ構造を再帰的に進みます。もし、コマンドラインで指定された ファイル名のディレクトリがあれば、 .I gzip はそのディレクトリへ進み、 そのディレクトリで発見した全てのファイルを圧縮します ( .I gunzip の場合はそれらを伸長します)。 .TP .B \-S .suf --suffix .suf -.gz の代わりに .suf というサフィックスを使います。どのようなサフィックス -を使う事が出来ますが、ファイルを他のシステムに転送する時の混乱を避ける +\&.gz の代わりに .suf というサフィックスを使います。どのようなサフィックス +でも使う事が出来ますが、ファイルを他のシステムに転送する時の混乱を避ける ために、.z や .gz 以外のサフィックスは避けるべきです。サフィックスに ヌルを指定すると、 以下のように gunzip はサフィックスにかかわらずすべてのファイルを 伸長しようとします。 gunzip -S "" * (MSDOS では *.*) gzip の以前のバージョンでは .z サフィックスを使っていました。 これは、 .IR pack "(1)" との衝突を避けるために変更されました。 .TP .B \-t --test テスト。圧縮されたファイルが完全なものかチェックします。 .TP .B \-v --verbose 冗長メッセージを表示します。圧縮/伸長される各ファイル名と圧縮率を 表示します。 .TP .B \-V --version バージョンナンバーやオプションを表示した後、終了します。 .TP .B \-# --fast --best 圧縮の速度を数値 .IR # で調節します。例えば、 .B \-1 や .B \-\-fast は圧縮速度を最も速くし (圧縮率は最低)、 .B \-9 や .B \-\-best は圧縮速度を最も遅くします (圧縮率は最高)。 デフォルトの圧縮レベルは .BR \-6 (つまり 速度より高い圧縮率を重視している)。 .SH 進んだ使用法 複数の圧縮されたファイルは結合する事ができます。この場合、 .I gunzip は同時にすべてのメンバーを取り出します。例えば、 gzip -c file1 > foo.gz gzip -c file2 >> foo.gz その後、 gunzip -c foo は cat file1 file2 と同じ事です。.gz ファイルの一つのメンバーが壊れた場合、他のメンバーは 復元できます (壊れたメンバーを取り除けば)。しかし、 同時にすべてのメンバーを圧縮する時、 gzip -c file1 file2 > foo.gz と実行するより、以下のように実行するとより圧縮率を上げる事が出来ます。 cat file1 file2 | gzip > foo.gz もし結合されたファイルをより圧縮率を上げるために再圧縮したければ、 以下のように実行して下さい。 gzip -cd old.gz | gzip > new.gz もし圧縮されたファイルがいくつかのメンバーを持つのなら、 --list オプションで報告される伸長後の大きさや CRC は最後のメンバーのみを 示しています。すべてのメンバーの伸長後の大きさが必要なら、以下のように 実行して下さい。 gzip -cd file.gz | wc -c 複数のメンバーを持ち、後からあるメンバーを抜き取る事ができるような 単一のアーカイブファイルを作りたければ、 tar や zip のようなアーカイバーを使って下さい。 GNU tar は gzip を呼び出す -z オプションをサポートしています。 gzip は tar の代替ではなく tar の捕捉として設計されています。 .SH 環境変数 環境変数 .B GZIP には、 .I gzip 起動時にコマンドラインに付加するオプションを指定できます。 これらのオプションがまず解釈され、コマンドラインのパラメーター によって上書きされます。例えば、 sh では: GZIP="-8v --name"; export GZIP csh では: setenv GZIP "-8v --name" MSDOS では: set GZIP=-8v --name Vax/VMS では、環境変数の名前は GZIP_OPT です。これはプログラムの 始動のためのシンボルセットとの衝突を避けるためです。 .SH 関連項目 znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), compress(1) .SH 診断 終了コードは通常 0 です; エラーが起こった場合は 1 を返します。 警告が出た時は 2 を返します。 .PP Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] .in +8 無効なオプションがコマンドラインに指定されています。 .in -8 .IR file : not in gzip format .in +8 .I gunzip に指定されたファイルは圧縮されていません。 .in -8 .IR file: Corrupt input. Use zcat to recover some data. .in +8 圧縮されたファイルが壊れています。壊れている部分までのデータを 以下のようにして復元できます。 .in +8 zcat file > recover .in -16 .IR file : compressed with .I xx bits, can only handle .I yy bits .in +8 .I file が、このマシンの伸長プログラムよりも多くの .I bit を処理できるプログラムにより (LZW を使い) 圧縮されています。 ファイルを gzip で再圧縮してください。 圧縮率が良くなりメモリ使用量も少なくなります。 .in -8 .IR file : already has .gz suffix -- no change .in +8 ファイルが既に圧縮されているかもしれません。ファイルをリネームして もう一度試してください。 .in -8 .I file already exists; do you wish to overwrite (y or n)? .in +8 もし出力ファイルを置き換えたければ、"y" と答えてください。そうでなければ "n" と答えてください。 .in -8 gunzip: corrupt input .in +8 SIGSEGV 違反が検出されました。これは通常、入力されたファイルが壊れている事を 意味しています。 .in -8 .I "xx.x%" .in +8 圧縮で保存された入力の割合 ( .BR \-v と .BR \-l にのみ関係あります)。 .in -8 -- not a regular file or directory: ignored .in +8 入力ファイルが通常ファイルやディレクトリでない時 (シンボリックリンク、ソケット、FIFO、デバイスファイル)、それらは 変更されません。 .in -8 -- has .I xx other links: unchanged .in +8 入力ファイルがリンクをもっています; 変更されないままです。より詳しい事は .IR ln "(1)" を参照して下さい。複数のリンクを持つファイルを圧縮するためには .B \-f フラグを使用して下さい。 .in -8 .SH 注意 圧縮されたデータをテープに書く時、一般にブロック境界まで 0 で埋める必要が あります。データを読み、全ブロックを .I gunzip で伸長する時、 .I gunzip は圧縮されたデータの後にゴミがあると検出し、デフォルトでは警告を出力します。 この警告を抑えるには --quiet オプションを使わなければなりません。 このオプションは、以下のように .B GZIP 環境変数にセット出来ます。 sh では: GZIP="-q" tar -xfz --block-compress /dev/rst0 csh では: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0 上記の例では、gzip は GNU tar の -z オプションによって 暗黙的に呼び出されています。 テープで圧縮されたデータを読み書きするのに同じブロックサイズ (tar の -b オプション) が使われて いるか確認して下さい。(この例では tar は GNU Version を使っていると 仮定しています。) .SH バグ サイズが 2GB を越える場合のオプション --list による出力は、正しくないものです。 圧縮ファイルがシークできない媒体上に存在する場合、 オプション --list による出力は、 サイズを -1 としヘッダ内の CRC を 0xffffffffとします。 まれに、オプション --best を付加して圧縮した場合よりも、デフォルトの圧縮 時 (-6) の方が圧縮率が良いことがあります。ファイルに高い冗長性があれば、 .I compress の方が .I gzip より圧縮率がよいです。 diff --git a/ja_JP.eucJP/man/man1/join.1 b/ja_JP.eucJP/man/man1/join.1 index 4dd7fcb02a..b43266f29b 100644 --- a/ja_JP.eucJP/man/man1/join.1 +++ b/ja_JP.eucJP/man/man1/join.1 @@ -1,231 +1,231 @@ .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the Institute of Electrical and Electronics Engineers, Inc. .\" .\" 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. .\" .\" @(#)join.1 8.3 (Berkeley) 4/28/95 .\" %FreeBSD: src/usr.bin/join/join.1,v 1.3.2.2 2000/12/08 15:13:43 ru Exp % -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/join.1,v 1.5 2001/05/14 01:07:25 horikawa Exp $ .\" .Dd April 28, 1995 .Dt JOIN 1 .Os .Sh 名称 .Nm join .Nd リレーショナルデータベースの操作 .Sh 書式 .Nm .Oo .Fl a Ar file_number | Fl v Ar file_number .Oc .Op Fl e Ar string .Op Fl j Ar file_number field .Op Fl o Ar list .Bk -words .Ek .Op Fl t Ar char .Op Fl \&1 Ar field .Op Fl \&2 Ar field .Ar file1 .Ar file2 .Sh 解説 .Nm ユーティリティは、指定されたファイルに対し .Dq equality join と呼ばれる、 各ファイルの同一の部分を結合する操作を施して結果を標準出力に出力します。 .Pp 比較は、それぞれのファイルの .Dq join field と呼ばれるフィールドで 行ないます。デフォルトでは、各行の最初のフィールドが使用されます。 .Ar file1 と .Ar file2 の中で、 .Dq join field が一致した行が組みとなり、1 行で出力されます。 join field と、 .Ar file1 のうちの残りのフィールド、その後、 .Ar file2 のうちの残りのフィールドが 1 行になって出力されます。 .Pp フィールドの区切は、デフォルトではタブか空白文字です。複数のタブや空白 が繋っていても、1 つの区切とみなされ、読み込み時にこれらは無視されます。 出力時の各フィールドの区切は、デフォルトでは空白 1 文字です。 .Pp ファイルとフィールドの番号に関し、多くのオプションがあります。これらの 番号は常に、1 から始まります。すなわち、コマンドラインの最初のファイル はファイル番号 1 番であり、各行の最初のフィールドは、フィールド番号 1 番となります。 .Bl -tag -width indent .It Fl a Ar file_number デフォルトの出力に加えて、 .Ar file_number で指定したファイルに関して、同一フィールドがなかった行を表示します。 ( -.FL a +.Fl a の引数の前には空白を入れてはなりません; .Sx 互換性 の節を御覧ください。) .It Fl e Ar string 出力時に、空のフィールドがあれば .Ar string で指定した文字列に置き換えます。 .It Fl o Ar list .Nm の処理して出力すべき行に関し、デフォルトの順序でなく、 .Ar list で指定した順序で各ファイルの各フィールドを出力 するようにします。 .Ar list の各要素は、 .Ql file_number.field で表わし、要素間は、コンマ .Pf ( Dq , Ns ) か空白で区切ります (空白で区切る場合は、シェルが要素を別々のパラメータに分解しないよう クォーティングするか、複数の .Fl o オプションを使用します)。 .It Fl t Ar char 入力および出力に使用するフィールドの区切として .Ar char で指定した文字を使用するようにします。 1行の中で出現したすべての .Ar char が有効です。 .It Fl v Ar file_number .Ar file_number で指定したファイル番号のファイルに関して、 join 処理で同一フィールドが見つからなかった行だけを表示する ようにします。 .Fl v Ar 1 と .Fl v Ar 2 を同時に指定してもかまいません。 .It Fl 1 Ar field ファイル 1 の .Dq join field を .Ar field で指定した番号のフィールドとします。 .It Fl 2 Ar field ファイル 2 の .Dq join field を .Ar field で指定した番号のフィールドとします。 .El .Pp デフォルトのフィールド区切り文字が使われた場合、 ファイルが結合される順序は .Xr sort 1 に .Fl b オプションを付けたものと同様になるはずです。 逆に、 .Nm .Fl t オプションによって、フィールド区切り文字が指定されている場合、 フィールドの照合順序は .Xr sort 1 で .Fl b オプションを指定しない場合と同じになるはずです。 .Pp .Ar file1 または .Ar file2 のうちの片方が .Dq - であった場合には、標準入力が使われます。 .Sh 診断 .Nm は、実行に成功した場合に 0 を返し、エラーが発生した場合には 0 より大きな 値を返します。 .Sh 互換性 さらに、古いバージョンの .Nm との互換のため、次のオプションも使用できます。 .Bl -tag -width indent .It Fl a デフォルトの出力に加え、file1 と file2 の各々で、同一フィールド がない行を表示します。 (これと .Fl a Ar file_number を区別するために、 .Nm は現在後者は空白を含まないことを必要としています。) .It Fl j1 Ar field ファイル1の ``join field'' を .Ar field で指定した番号のフィールドとします。 .It Fl j2 Ar field ファイル2の ``join field'' を .Ar field で指定した番号のフィールドとします。 .It Fl j Ar field file1 と file2 の ``join field'' を .Ar field で指定した番号のフィールドとします。 .It Fl o Ar list ... 歴史的な .Nm の実装では .Fl o オプションに複数の引数を許可していました。 これらの引数は、現在の .Fl o オプションで説明したものと同じ .Dq file_number.field_number という形式でした。 しかし、この方法では .Ql 1.2 と名付けられたファイルが存在すると、明らかに困難を生じます。 .El .Pp これらのオプションは、修正をしたくないような非常に古いシェルスクリプト のためだけに用意されています。 これらのオプションは、使うべきではありません。 .Sh 規格 .Nm コマンドは .St -p1003.2 互換です。 .Sh 関連項目 .Xr awk 1 , .Xr comm 1 , .Xr paste 1 , .Xr sort 1 , .Xr uniq 1 diff --git a/ja_JP.eucJP/man/man1/kbdcontrol.1 b/ja_JP.eucJP/man/man1/kbdcontrol.1 index 601b0d90f4..35ee1c35cf 100644 --- a/ja_JP.eucJP/man/man1/kbdcontrol.1 +++ b/ja_JP.eucJP/man/man1/kbdcontrol.1 @@ -1,242 +1,242 @@ .\" .\" kbdcontrol - a utility for manipulating the syscons keyboard driver section .\" .\" 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. .\" .\" @(#)kbdcontrol.1 .\" %FreeBSD: src/usr.sbin/kbdcontrol/kbdcontrol.1,v 1.18.2.6 2001/03/06 14:21:10 ru Exp % .\" -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/kbdcontrol.1,v 1.17 2001/05/14 01:07:25 horikawa Exp $ .\" .Dd June 30, 1999 .Dt KBDCONTROL 1 .Os FreeBSD .Sh 名称 .Nm kbdcontrol .Nd syscons コンソールドライバを操作するユーティリティ .Sh 書式 .Nm .Op Fl dFKix .Oo .Fl b .Ar duration . Ns Ar pitch | Ar belltype .Oc .Oo .Fl r .Ar delay . Ns Ar repeat | Ar speed .Oc .Op Fl l Ar keymap_file .Op Fl f Ar # Ar string .Op Fl h Ar size .Op Fl k Ar keyboard_device .Op Fl L Ar keymap_file .Sh 解説 .Nm コマンドは、 キーマップ、リピート速度/ディレイ時間、ベル といった様々なキーボード関連オプションを、 .Xr syscons 4 コンソールドライバとキーボードドライバに対して設定するのに用いられます。 .Pp キーボードオプションは、 .Pa /etc/rc.conf 中の変数を設定することにより、 システムブート時に自動設定可能です。 後述の .Sx ブート時の設定 を参照してください。 .Pp 以下のコマンドラインオプションを使用可能です: .Bl -tag -width indent .It Fl b Xo .Ar duration . Ns Ar pitch | Ar belltype .Xc ベルの持続時間 (duration) をミリ秒で、ピッチ (pitch) をヘルツで設定します。 代わりに .Ar belltype 引数が指定された場合、この引数は .Cm normal (サウンドパラメータを標準値に戻します) か .Cm off (完全にベルをオフにします) か .Cm visual (ベルをビジュアルモードにします、 すなわち音を鳴らす代わりに画面をフラッシュさせます) のいずれかであることが必要です。 .Ar belltype の前に語 .Cm quiet. .\" quiet. と、「.」が付くのが正しい が付いた場合、 ベルを鳴らすプロセスがバックグラウンドの vty にいるときにはベルを鳴らしません。 .It Fl r Xo .Ar delay . Ns Ar repeat | Ar speed .Xc キーボードの .Ar delay (250, 500, 750, 1000) と .Ar repeat (34, 38, 42, 46, 50, 55, 59, 63, 68, 76, 84, 92, 100, 110, 118, 126, 136, 152, 168, 184, 200, 220, 236, 252, 272, 304, 336, 368, 400, 440, 472, 504) レートを設定します。 代わりに .Ar speed 引数が指定された場合、この引数は .Cm slow (1000.504), .Cm fast (250.34), .Cm normal (500.126) であることが必要です。 .It Fl l Ar keymap_file キーボードマップをファイル .Ar keymap_file から読み取って設定します。 キーボードマップファイルのロードは、 メニューによるコマンド -.Xw kbdmap 1 +.Xr kbdmap 1 により実行可能です。 .It Fl d 現在のキーボードマップを標準出力にダンプします。 出力はファイルにリダイレクト可能であり、前述の .Fl l オプションを使用して後でカーネルにロードできます。 .It Fl f Ar # Ar string .Ar # 番のファンクションキーで文字列 .Ar string が送られるように設定します。 使用可能なファンクションキーとその番号については、 キーボードドライバのマニュアルページ .Pq 例えば Xr atkbd 4 を参照してください。 .It Fl F ファンクションキー設定を標準状態に戻します。 .It Fl x キーボードマップのダンプを 16 進数表示で行います。 .It Fl h Ar size ヒストリバッファの大きさを .Ar size 行に設定します。 .It Fl i キーボードに関する短かい情報を表示します。 .It Fl K コンソールからキーボードを切り離します。 キーボードとコンソールを再接続するためには、後述の .Fl k オプションを使用する必要があります。 .It Fl k Ar keyboard_device 指定したデバイスをコンソールキーボードとして使用します。 本オプション使用時にシステムコンソール上で作業していない場合には、 .Nm プロセスの標準入力を .Pa /dev/console からリダイレクトする必要があります ( .Sx EXAMPLES 節を参照してください)。 .It Fl L Ar keymap_file キーボードマップをファイル .Ar keymap_file から読み取り、これをコンパイルした結果の .Ft "struct keymap" を標準出力に書き出します。 このオプションは第一にプログラマ向けであり、 おそらく通常の状況下ではほとんど使用しないでしょう。 .El .Sh キーボードの設定 .Ss ブート時の設定 .Pa /etc/rc.conf または .Pa /etc/rc.conf.local の変数を設定することにより、ブート時にキーボードを設定可能です。 関連する変数を列挙します。 .Pp .Bl -tag -width foo_bar_var -compact .It Ar keymap .Fl l オプション用のキーボードマップファイルを指定します。 .It Ar keyrate .Fl r オプション用のキーボードリピートレートを指定します。 .It Ar keychange .Fl f オプション用のファンクションキー文字列を列挙します。 .El .Pp 詳細は .Xr rc.conf 5 を参照してください。 .Ss ドライバの設定 キーボードマップなどのデフォルト設定オプションの変更を、 キーボードドライバが許す場合があります。 その場合、ブート時のオプション設定の必要はなくなります。 詳細はキーボードドライバマニュアル .Pq 例えば Xr atkbd 4 , Xr ukbd 4 を参照してください。 .Sh 関連ファイル .Bl -tag -width /usr/share/syscons/keymaps/foo_bar -compact .It Pa /usr/share/syscons/keymaps/* キーボードマップファイル。 .El .Sh 使用例 次のコマンドでキーボードマップファイル .Pa /usr/share/syscons/keymaps/ru.koi8-r.kbd をロードします。 .Pp .Dl kbdcontrol -l /usr/share/syscons/keymaps/ru.koi8-r.kbd .Pp キーボードマップファイルが .Pa /usr/share/syscons/keymaps にある場合、ファイル名を .Pa ru.koi8-r のように短縮可能です。 .Pp .Dl kbdcontrol -l ru.koi8-r .Pp 次のコマンドはファンクションキー 10 が "telnet myhost" を出力するようにします。 .Pp .Dl kbdcontrol -f 10 \&"telnet myhost\&" .Pp ベルをビジュアルにするものの、 バックグラウンド画面でベルが鳴るときには画面がフラッシュするのを避けるには、 次のコマンドを実行します。 .Pp .Dl kbdcontrol -b quiet.visual .Pp .Pp デフォルトコンソールキーボードを別のキーボード、 例えば最初の USB キーボード ( .Xr ukbd 4 を参照してください) に切り替えるには、次のコマンドを使用します。 .Pp .Dl kbdcontrol -k /dev/kbd1 < /dev/console .Pp デフォルトキーボードに戻すには、次のコマンドを使用します。 .Pp .Dl kbdcontrol -k /dev/kbd0 .Sh バグ もし見つかったら報告してください。 .Sh 関連項目 .Xr kbdmap 1 , .Xr vidcontrol 1 , .Xr atkbd 4 , .Xr keyboard 4 , .Xr screen 4 , .Xr syscons 4 , .Xr ukbd 4 , .Xr kbdmap 5 , .Xr rc.conf 5 .Sh 作者 .An S\(/oren Schmidt Aq sos@FreeBSD.org .Sh 日本語訳 酒井 淳嗣 (sakai@csl.cl.nec.co.jp): FreeBSD 向けに翻訳 diff --git a/ja_JP.eucJP/man/man1/lex.1 b/ja_JP.eucJP/man/man1/lex.1 index 25b9a48755..aa94379261 100644 --- a/ja_JP.eucJP/man/man1/lex.1 +++ b/ja_JP.eucJP/man/man1/lex.1 @@ -1,4083 +1,4083 @@ .\" %FreeBSD: src/usr.bin/lex/lex.1,v 1.10 1999/10/27 20:21:03 obrien Exp % .\" -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/lex.1,v 1.7 2001/05/14 01:07:25 horikawa Exp $ .TH FLEX 1 "April 1995" "Version 2.5" .SH 名称 flex \- 高速な字句解析処理系の生成ツール .SH 書式 .B flex .B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton] .B [\-\-help \-\-version] .I [filename ...] .SH 概説 本マニュアルは、 テキストのパターンマッチングを行うプログラムを生成するツール .I flex を扱います。 本マニュアルはチュートリアルとリファレンス節とを含みます: .nf 解説 ツールの短い概説 簡単な例 入力ファイルのフォーマット パターン flex が使用する拡張した正規表現 入力のマッチ方法 何がマッチするかを決定する規則 アクション パターンがマッチした時に何を行うかを指定する方法 生成されたスキャナ flex が生成するスキャナに関する詳細; 入力元の制御方法 開始条件 スキャナへの文脈の導入と、 "ミニスキャナ" の制御方法 複数の入力バッファ 複数の入力元を扱う方法; ファイルではなく文字列からスキャンする方法 ファイルの終りのルール ファイルの終りにマッチする特別なルール 雑多なマクロ アクションで使用可能なマクロのまとめ ユーザが使用可能な値 アクションで使用可能な値のまとめ Yacc とのインタフェース lex スキャナと yacc パーサとの結合 オプション flex のコマンドラインオプションと、 "%option" ディレクティブ 性能関連 スキャナを可能な限り高速にする方法 C++ スキャナの生成 C++ スキャナクラス生成のための (実験的な) 機能 Lex および POSIX との非互換性 AT&T lex および POSIX lex 標準と flex との違い 診断 flex (もしくは生成したスキャナ) が出力する エラーメッセージで意味が明確でないもの 関連ファイル flex が使用するファイル 欠陥 / バグ flex の既知の問題 関連項目 ツールに関係する他のドキュメント 作者 連絡方法を含みます .fi .SH 解説 .I flex は .I スキャナ を生成するためのツールです。 ここで、スキャナとは、 テキスト内の字句パターンを解析するプログラムです。 .I flex は指定したファイル、もしくはファイル名が与えられなかった場合は 標準入力から、生成するスキャナの記述を読み込みます。 この記述は、 正規表現と C コードのペアの形をとっています。 これは .I ルール と呼ばれます。 .I flex は、出力として C ソースファイルの .B lex.yy.c を生成しますが、その中に .B yylex() ルーチンが定義されます。 このファイルはコンパイルされ、 .B \-ll ライブラリとともにリンクされて、 実行形式となります。 実行形式が走り始めると、 正規表現をマッチさせるために 入力が解析されます。 マッチするものを見つけると、対応する C コードが実行されます。 .SH 簡単な例 .PP まず簡単な例から、 .I flex の使い方を見て行きましょう。 次の .I flex の入力は、"username" という文字列に出会うとユーザのログイン名に置き換える スキャナを指定しています: .nf %% username printf( "%s", getlogin() ); .fi デフォルトでは、 .I flex スキャナにマッチしなかったテキストは出力にコピーされますので、 "username" を展開しながら入力を出力にコピーすることが このスキャナの最終的な結果となります。 この入力にはただ一つのルールだけがあります。 "username" は .I パターン であり、"printf" は .I アクション です。 "%%" はルールの始まりの印です。 .PP 別の例を見て見ましょう: .nf %{ int num_lines = 0, num_chars = 0; %} %% \\n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\\n", num_lines, num_chars ); } .fi このスキャナは入力の文字数および行数を数えます (数えた最終結果を報告するだけです)。 最初の行は 2 つの大域変数 "num_lines" と "num_chars" を宣言します。 これらの変数は、2 番目の "%%" の後に宣言されている .B yylex() と .B main() のルーチンからアクセス可能です。 ここには 2 つのルールがあります。 1 つ目は改行文字 ("\\n") にマッチし、行数と文字数のカウントを増加させます。 もう 1 つは、改行文字以外の全ての文字 ("." という正規表現で表されています)にマッチします。 .PP 次はもうちょっと複雑な例です: .nf /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\\n", yytext ); } {ID} printf( "An identifier: %s\\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); "{"[^}\\n]*"}" /* eat up one-line comments */ [ \\t\\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } .fi これは Pascal のような言語の単純なスキャナの原型です。 異なったタイプの .I トークン を定義し、これを見付けると報告します。 .PP この例の詳細は、以降の節で説明します。 .SH 入力ファイルのフォーマット .I flex の入力ファイルは 3 つの部分からなり、 .B %% だけからなる行により分けられます: .nf 定義 %% ルール %% ユーザコード .fi .I 定義 部分は、スキャナの宣言を単純化する単純な .I 名前 の定義の宣言と、後で説明する .I 開始条件 の宣言とからなります。 .PP 名前の定義は次の形式です: .nf 名前\ 定義 .fi "名前" は語であり、 レターかアンダースコア ('_') から始まって 0 個以上のレター・数字・'_'・'-' (ダッシュ)が続きます。 定義は、名前に続く最初の非空白文字から始まり、行末まで続くものとされます。 定義は後で "{名前}" で参照でき、"(定義)" を展開します。 例えば、 .nf DIGIT [0-9] ID [a-z][a-z0-9]* .fi は、 "DIGIT" が単一の数字にマッチする正規表現であると定義し、 "ID" がレターに 0 個以上のレターか数字が続く正規表現であると定義します。 後で出て来る参照 .nf {DIGIT}+"."{DIGIT}* .fi は .nf ([0-9])+"."([0-9])* .fi と同じであり、1 個以上の数字に '.' が続き、 0 個以上の数字が続くものにマッチします。 .PP .I flex の入力の .I ルール は次の形式の一連のルールからなります: .nf パターン\ \ \ アクション .fi ここで、パターンはインデントされていてはならず、 アクションは同じ行から始まる必要があります。 .PP パターンとアクションの詳細は後の解説を見て下さい。 .PP 最後に、ユーザコードの部分は単純にそのままの形で .B lex.yy.c にコピーされます。 スキャナを呼び出すまたは呼び出される付随ルーチンのために使用されます。 この部分はあっても無くても構いません; 無い場合には、入力ファイル中の 2 番目の .B %% も省略できます。 .PP 定義とルールの部分では、 .I インデントされた テキストと .B %{ と .B %} との間のテキストはそのままの形で出力にコピーされます (この際 %{} は削除されます)。 %{} はインデントされていない行に現れる必要があります。 .PP ルールの部分では、 最初のルールの前に現れるインデントされたもしくは %{} 部分のテキストは、 スキャンルーチンにローカルな変数と、 (宣言の後では)スキャンルーチンに入るたびに実行されるコードとを宣言します。 ルール部分の他のインデントされたもしくは %{} 部分のテキストは 出力にコピーされますが、 意味はちゃんと定義されておらずコンパイル時にエラーとなるかも知れません (この仕様は .I POSIX 互換のためにあります; 他のこのような仕様は以降を見て下さい)。 .PP 定義の部分(ルールの部分ではないです)では、 インデントされていないコメント("/*" から始まる行) は次の "*/" まで そのままの形でコピーされます。 .SH パターン 入力ファイルのパターンは拡張した正規表現を使って記述します。 以下に示します: .nf x 文字 'x' にマッチ。 . 改行を除く全ての文字(バイト)。 [xyz] "文字クラス"; この場合、'x', 'y', 'z' のいずれにも マッチします。 [abj-oZ] 範囲指定を含む "文字クラス"; この場合、'a', 'b' と 'j' から 'o' までの任意のレターと 'Z' にマッチします。 [^A-Z] "否定文字クラス"; クラスに含まれない任意の文字に マッチします。 この場合、'A' から 'Z' までの大文字 「以外の」文字にマッチします。 [^A-Z\\n] 大文字と改行を「除く」全ての文字。 r* 0 もしくはそれ以上の r。r は任意の正規表現。 r+ 1 もしくはそれ以上の r。 r? 0 もしくは 1つの r (「おまけ」の r) r{2,5} 2 つから 5つまでの r。 r{2,} 2 つ以上の r。 r{4} ちょうど 4つ の r。 {名前} "名前" の定義の展開。 (上を参照) "[xyz]\\"foo" 文字列 [xyz]"foo \\X X が 'a', 'b', 'f', 'n', 'r', 't', 'v' のいずれかの とき、ANSI-C での \\X の解釈となります。 それ以外の場合、文字 'X' ('*' のようなオペレータの 意味を打ち消し、その文字自体を指定する際に使います)。 \\123 8進数で 123 と表される文字。 \\x2a 16進数で 2a と表される文字。 (r) r にマッチ; ()は 優先順位を変えるために使用。 (以下を参照) rs 正規表現 r に正規表現 s が続く; 「連結(concatenation)」 と呼びます。 r|s r もしくは s。 r/s 後ろに s が続く時の r。 s にマッチするテキストはこのルールの "最長適合" を判定する 時には含まれますが、アクションが実行される前に 入力に戻されます。 アクションは r にマッチするテキストだけを見ます。 このパターンは "右文脈(trailing context)" と呼ばれます。 (flex が正確にマッチ不能な r/s の組合せは複数あります; "危険な右文脈" については、 以降の、欠陥 / バグ の節の記述を見て下さい。) ^r 行頭にある r。(スキャンの始まりもしくは スキャンされた改行の右です)。 r$ 行末にある r。"r/\\n" と等価(改行の前です)。 "r/\\n" と同じです。 flex の "改行" の表現は flex をコンパイルした C コンパイラが解釈する '\\n' と完全に一致することに 注意して下さい; 特定のシステム DOS では \\r を入力から取り除くか "r$" を表すために明示的に r/\\r\\n を使用する必要があります。 r 開始条件 s における r。(開始条件については以下を 参照)。 r 上に同じ。ただし開始条件は s1, s2, s3 のいずれでもよい。 <*>r 任意の開始条件の r。開始条件は排他的なものでもよい。 <> ファイルの終了。 <> 開始条件が s1 もしくは s2 であるときのファイルの終了。 .fi 文字クラス中では、全ての正規表現のオペレータは、 エスケープ ('\\') および 文字クラスオペレータである '-' と ']' とクラスの先頭の '^' を除き 特別な意味を失うことに注意して下さい。 .PP 上に挙げた正規表現は優先順位によってグループに分けられています。 一番上のグループが最も高い優先度で、 一番下のグループの優先順位が最も低くなっています。 グループ内では同じ優先順位です。例えば、 .nf foo|bar* .fi は .nf (foo)|(ba(r*)) .fi と同じです。なぜなら '*' オペレータは連結より優先度が高く、 連結は選言 ('|') より優先度が高いからです。このパターンは 文字列 "foo" .I もしくは 文字列 "ba" に 0 個以上の r がつづくものの .I どちらにも マッチします。 "foo" もしくは 0 個以上の "bar" にマッチさせるためには次の表現を使用して下さい: .nf foo|(bar)* .fi 0 個以上の "foo" または "bar" にマッチするためには次の表現を使用して下さい: .nf (foo|bar)* .fi .PP 文字もしくは文字範囲に加え、文字クラスも文字クラスの .I 表現 を含みます。 これらの表現は .B [: および .B :] のデリミタに囲まれます (文字クラスの '[' と ']' との間に現れる必要があります; 他の要素が文字クラス中に現れても構いません)。 有効な表現は以下の通りです: .nf [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] .fi これらの表現は対応する標準 C の .B isXXX 関数に適合する全ての文字集合を指示します。例えば、 .B [:alnum:] は .B isalnum() が真を返す文字を指示します - すなわちすべてのアルファベットと数字です。 .B isblank(), が無いシステムでは、flex は .B [:blank:] を空白とタブと定義します。 .PP 例えば以下の表現は全て同じです: .nf [[:alnum:]] [[:alpha:][:digit:]] [[:alpha:]0-9] [a-zA-Z0-9] .fi スキャナが大文字小文字を意識しない場合( .B \-i フラグ指定時) .B [:upper:] と .B [:lower:] は .B [:alpha:] と同じです。 .PP パターンに関する注意点です: .IP - 否定文字クラス、例えば上の "[^A-Z]" は "\\n" (もしくはこれを表すエスケープシーケンス) が明示的に 否定文字クラスに現れている場合 (例えば "[^A-Z\\n]") を除き .I 改行にマッチします。 これは他の正規表現ツールが否定文字クラスを扱う方法とは異なりますが、 不幸なことにこの矛盾は歴史的に確立しています。 改行にマッチするとは、 入力に別のクオートが存在しない場合に [^"]* のようなパターンが 入力全体にマッチすることを意味します。 .IP - ルールは右文脈('/' オペレータもしくは '$' オペレータ) を高々一つしか持てません。 開始条件 '^' と "<>" パターンは パターンの最初になければならず、 '/', '$' 同様に () 内にいれることは出来ません。 ルールの先頭ではない '^' もしくはルールの終りではない '$' は 特別な意味を失い、通常の文字として扱われます。 .IP 以下は無効です: .nf foo/bar$ foobar .fi 前者は "foo/bar\\n" と書けます。 .IP 以下では '$' と '^' とは通常の文字として扱われます: .nf foo|(bar$) foo|^bar .fi "foo" もしくは "改行が続く bar" を指定したい場合は、 次の表現を使用して下さい (特別な '|' の動作は後で説明します): .nf foo | bar$ /* action goes here */ .fi 同じ方法で、foo もしくは 行頭の bar を指定可能です。 .SH 入力のマッチ方法 生成したスキャナを実行すると、 スキャナは入力を見てパターンにマッチする文字列を探します。 1 より多くのマッチを見付けると、最長テキストのマッチを採用します (右文脈(trailing context rule)の後ろの部分も長さに含みますが、 後ろの部分は入力に戻されます)。 同じ長さのマッチを 2 つ以上見付けた場合、 .I flex 入力ファイルで最初に記述されたルールを採用します。 .PP マッチが決定すると、マッチに対応するテキスト( .I トークン と呼ばれます)がグローバル文字ポインタ .B yytext により使用可能となり、長さがグローバル整数 .B yyleng により使用可能となります。 その後、マッチしたパターンに対応する .I アクション が実行され(アクションの詳細な記述は後で行います)、 残りの入力が残りのマッチのためにスキャンされます。 .PP マッチが見付からないと、 .I デフォルトルール が実行されます: 入力の次の文字がマッチしたと見倣され、 標準出力にコピーされます。最も簡単で正当な .I flex の入力は以下の通りです: .nf %% .fi これは、入力を単純に出力にコピー(1 度に 1 文字ずつ)するスキャナを生成します。 .PP .B yytext は 2 つの異なった方法により定義されうることに注意して下さい: 文字 .I ポインタ もしくは文字 .I 配列 です。 .I flex がどちらの定義を使用するかは特別なディレクティブ .B %pointer もしくは .B %array を flex の入力の最初の(定義)部分に含めることにより制御できます。 デフォルトは .B %pointer であり、 .B -l lex 互換オプションを使用した場合には例外的に .B yytext は配列になります。 .B %pointer を使用する利点はスキャンが高速であること、 非常に大きなトークンにマッチする時にも (動的メモリを使用し尽くさない限り)バッファオーバフローとならないことです。 欠点は、アクションが .B yytext を修正することが制限されること(次節参照)、 .B unput() 呼び出しが .B yytext の現在の内容を破壊することです。 これは異なる .I lex バージョン間での移植性に関する頭痛の種です。 .PP .B %array の利点は .B yytext の内容を思った通りに変更できること、 .B unput() を呼び出しても .B yytext の内容が破壊されないことです(下記参照)。 その上、既存の .I lex プログラムは .B yytext を外部から次の形式の宣言を使用してアクセスしていることがあります: .nf extern char yytext[]; .fi この定義は .B %pointer 使用時には誤りですが、 .B %array 使用時には正しいです。 .PP .B %array は .B yytext を文字数 .B YYLMAX (デフォルトは十分大きな値)の配列であると定義します。 この大きさは、 .I flex の入力の最初の部分で単純に .B YYLMAX を異なった値に #define することにより変更できます。 上記の通り、 .B %pointer 使用時には yytext は大きなトークンを格納するために動的に大きくなります。 このことは .B %pointer を使用したスキャナは非常に大きなトークン (例えばコメントブロック全体)を格納可能であることを意味しますが、 スキャナが .B yytext の大きさを変えるたびにトークン全体を先頭から再スキャンすることが必要となるため このようなトークンに対するマッチングは遅くなりうることを覚えておいて下さい。 現在、 .B yytext は .B unput() が結果として返すテキストが大きい時には動的には大きくなり .I ません; 実行時エラーとなります。 .PP また、 .B %array は C++ スキャナクラスでは使用できないことに注意して下さい( .B c++ オプションに関しては下記参照)。 .SH アクション ルール中のパターンは対応するアクションを持ちます。 アクションは任意の C の文です。 パターンは最初のエスケープされていない空白文字で終ります; 行の残りがアクションです。 アクションが空である場合、 パターンがマッチした時に入力トークンは単純に捨てられます。 例えば入力から全ての "zap me" を削除するプログラムの仕様を示します: .nf %% "zap me" .fi (入力の他の全ての文字を出力にコピーします。 なぜならデフォルトルールにマッチするからです。) .PP 次は、複数の空白や文字を単一の空白に圧縮し行末の空白を捨てるプログラムです: .nf %% [ \\t]+ putchar( ' ' ); [ \\t]+$ /* ignore this token */ .fi .PP アクションが '{' を含む場合、アクションは対応する '}' まで続き、 複数行に渡る場合もあります。 .I flex は C の文字列およびコメントに関して知っており、 それらの中のブレースを誤解することはありませんが、 アクションが .B %{ で始まることを許し、次の .B %} までのテキストがアクションであるとします (アクション内部の任意個のブレースには関係ありません)。 .PP 垂直バー ('|') のみからなるアクションは "次のルールと同じ" を意味します。説明は以下を見て下さい。 .PP アクションは任意の C コードを含むことが出来ます。 これには、 .B yylex() を呼び出したルーチンに対して値を返す .B return 文も含まれます。 .B yylex() が呼ばれるたび、最後に残ったトークンから処理を再開し、 ファイルの終了もしくは return を実行するまで処理を行います。 .PP アクションは自由に .B yytext を変更できますが、例外は長さを増やすことです (文字を末尾に加えることになり、 これは入力ストリームの後続する文字を上書きします)。 これは .B %array 使用時には当てはまりません(上述); この場合 .B yytext を自由に変更できます。 .PP アクションは自由に .B yyleng を変更できますが、アクションが .B yymore() を使用する時には例外的に変更してはいけません(後述)。 .PP 多くの特別なディレクティブがあり、アクション中に含めることが出来ます: .IP - .B ECHO yytext をスキャナの出力にコピーします。 .IP - .B BEGIN 後ろに開始条件の名前を書くと、スキャナを対応する開始条件に設定します(後述)。 .IP - .B REJECT 入力(もしくは入力の頭)に "2 番目によく(second best)" マッチするルール に進むようにスキャナに指示します。 "入力のマッチ方法" で示したようにルールは選択され、 .B yytext と .B yyleng は適切に設定されます。 選択されるルールは、最初に選択されたルールと同じ長さであるが .I flex の入力ファイルにて後で出て来るもの、もしくは少ない文字数にマッチするものです。 例えば次の例では入力中の語を数え、 "frob" が見付かるたびにルーチン special() を呼びます: .nf int word_count = 0; %% frob special(); REJECT; [^ \\t\\n]+ ++word_count; .fi .B REJECT が無い場合、 入力中の "frob" は語として数えられず、 スキャナは通常通りトークン毎に 1 つのアクションだけを行います。 複数の .B REJECT を使用可能であり、それぞれ現在有効なルールの次に良い選択を見付けます。 例えば次のスキャナは、"abcd" というトークンをスキャンし、 出力に "abcdabcaba" を書きます: .nf %% a | ab | abc | abcd ECHO; REJECT; .|\\n /* eat up any unmatched character */ .fi (前の 3 つのルールは 4 番目のルールのアクションを共有します。 なぜなら特別な '|' アクションが使用されているからです。) .B REJECT はスキャナの性能という点で特にコストのかかる機能です; もしスキャナのアクションの .I いずれか にでも REJECT が使われたなら、スキャナの .I 全ての マッチング速度を低下させるということです。 さらに .B REJECT をオプション .I -Cf や .I -CF と共に用いることは出来ません。 .IP また、他の特別アクションと違い .B REJECT は .I 分岐(branch) であることに注意してください; すなわち REJECT 直後のアクションは 実行 .I されません。 .IP - .B yymore() 次にルールとマッチしたときには、対応するトークンは、 現在の .B yytext の内容と入れ換えるのではなく .B yytext に .I 追加 するようスキャナに指示します。 例えば、入力 "mega-kludge" が与えられると、以下は "mega-mega-kludge" を出力に書きます: .nf %% mega- ECHO; yymore(); kludge ECHO; .fi 最初の "mega-" はマッチし出力にエコーされます。 次に "kludge" がマッチしますが、直前の "mega-" がまだ .B yytext の先頭に残っており、"kludge" の -.ECHO +.B ECHO ルールは実際には "mage-kludge" を書きます。 .PP .B yymore() の使用に関し 2 つの注意点があります。 まず、 .B yymore() は現在のトークンの大きさを反映する .I yyleng の値の正確さに依存することであり、 .B yymore() 使用時には .I yyleng を変更してはなりません。 次に、 スキャナのアクションに .B yymore() があると、スキャナのマッチ速度に若干悪影響があります。 .IP - .B yyless(n) 現在のトークンから最初の .I n 文字を除いたものを入力ストリームに戻します。 戻した文字列はスキャナが次のマッチングをとるときに再度スキャンされます。 .B yytext と .B yyleng は適切に調整されます(例えば .B yyleng は .I n となります)。 例えば、入力 "foobar" が与えられると、以下は "foobarbar" を書きます: .nf %% foobar ECHO; yyless(3); [a-z]+ ECHO; .fi 引数 0 を .B yyless に与えると、現在の入力文字列全体が再度スキャンされます。 (例えば .B BEGIN を使用して)次にスキャナが入力する方法を変更していないと、無限ループとなります。 .PP .B yyless はマクロであり、flex 入力ファイルでのみ使用可能であり、 別のソースファイルからは使用不能であることに注意して下さい。 .IP - .B unput(c) 文字 .I c を入力ストリームへ戻します。戻した文字は次にスキャンされる文字になります。 次のアクションは現在のトークンを取り上げ、 括弧内に入れて再スキャンします。 .nf { int i; /* Copy yytext because unput() trashes yytext */ char *yycopy = strdup( yytext ); unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yycopy[i] ); unput( '(' ); free( yycopy ); } .fi .B unput() は文字を入力ストリームの .I 先頭 に戻すので、文字列を戻す場合には後ろから前に向かって戻す必要があります。 .PP .B unput() 使用時の重要な潜在的な問題は、 .B %pointer 使用時(デフォルト)に .B unput() を呼び出すと、 右端の文字から開始し 1 文字ずつ左に向かって消費され、 .I yytext の内容が .I 破壊 されることです。 (上記例のように) .B unput() 呼び出し後も .I yytext の内容を保存するためには、始めに別の場所にコピーするか、 スキャナを .B %array を使うように構築することです(入力のマッチ方法参照)。 .PP 最後に、 .B EOF を戻して入力ストリームにファイルの終りをマークするとは 出来ないことに注意して下さい。 .IP - .B input() 次の文字を入力ストリームから読みます。 次の例は C コメントを食べます: .nf %% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } } .fi (スキャナが .B C++ でコンパイルされたときは、このルーチンは .B yyinput() という名称になり、 .B C++ ストリームの .I input と名前が衝突することを避けます。) .IP - .B YY_FLUSH_BUFFER スキャナの内部バッファをフラッシュし、 次にスキャナがトークンをマッチしようとした時 バッファを .B YY_INPUT にてリフィルします(生成されたスキャナで後述)。 このアクションは、 複数の入力バッファにおいて後述する より一般的な .B yy_flush_buffer() 関数の特別なケースです。 .IP - .B yyterminate() アクションの return 文の代わりに使うことが出来ます。 .B yyterminate() はスキャナを終了し、"全て終了" を意味する 0 を呼び出し元関数に返します。 デフォルトでは .B yyterminate() はファイルの終わりに達したときにも呼ばれます。 .B yyterminate() はマクロであり、定義しなおすことができます。 .SH 生成されたスキャナ .I flex の出力は .B lex.yy.c というファイルであり、スキャンルーチン .B yylex() と、トークンのマッチングに使用する複数のテーブルと、 複数の付属ルーチンとマクロからなります。デフォルトでは、 .B yylex() は次のように宣言されます: .nf int yylex() { ... various definitions and the actions in here ... } .fi (環境が関数プロトタイプをサポートしている場合、 "int yylex( void )" となります。) この定義は "YY_DECL" マクロを定義することにより変更できます。 例えば次のように使用することが出来ます: .nf #define YY_DECL float lexscan( a, b ) float a, b; .fi これはスキャンルーチンの名前を .I lexscan とし、浮動小数点数を返すようにし、2 つの浮動小数点数を引数とします。 K&R の非プロトタイプの関数宣言を使用してスキャンルーチンに対して引数を 与える場合、定義をセミコロン(;)で終了する必要があります。 .PP .B yylex() は呼ばれるたび、グローバル入力ファイル .I yyin (デフォルトでは標準入力)からトークンをスキャンします。 ファイルの終りになる(この場合 0 を返します)か、 アクションが .I return 文を実行するまで、実行を続けます。 .PP スキャナがファイルの終りに到達すると、 .I yyin が新たなファイルを指さないか (新たなファイルを指す場合はこのファイルのスキャンを続けます)、 .B yyrestart() が呼ばれない限り、 後続する呼び出しは未定義です。 .B yyrestart() は .B FILE * ポインタ( .B YY_INPUT を設定して .I yyin 以外のソースをスキャンするようにした場合には nil も可です) である引数を 1 つとり、そのファイルからのスキャンのために .I yyin を初期化します。 本質的に、 .I yyin を新しい入力ファイルに割り当てることと .B yyrestar() を使用することとは同じです; 後者は前のバージョンの .I flex との互換性のために使用可能であり、 またスキャンの途中で入力ファイルを変えることが可能です。 引数を .I yyin として呼び出すことにより、現在の入力バッファを捨てることも出来ます; ただし、 .B YY_FLUSH_BUFFER (上述)を使用する方が良いです。 .B yyrestart() は .B INITIAL の開始条件を変更し .I ない ことに注意して下さい (後述の開始条件参照)。 .PP あるアクション中で .I return 文を実行することにより .B yylex() がスキャンを止めた場合、スキャナは再度呼び出し可能であり、 この場合スキャンの残りの部分から再開します。 .PP デフォルトで(効率のため)、スキャナは単純な .I getc() コールではなくブロックリードを行い、 .I yyin から文字を読みます。 入力取得方法は .B YY_INPUT マクロを定義することにより制御できます。 YY_INPUT 呼び出し手順は "YY_INPUT(buf,result,max_size)" です。 このアクションは、 .I buf 文字配列中に最大 .I max_size 文字を用意し、整数変数 .I result 中に読めた文字数もしくは定数 YY_NULL (Unix システムでは 0)を入れて返します。 デフォルトの YY_INPUT はグローバルファイルポインタ "yyin" から読みます。 .PP YY_INPUT のサンプル定義です(入力ファイルの定義部に格納): .nf %{ #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %} .fi この定義により、入力処理は 1 度に 1 文字ずつ行うように変更されます。 .PP スキャナが YY_INPUT からファイルの終りを通知された場合、 スキャナは .B yywrap() 関数をチェックします。 .B yywrap() 関数が偽(ゼロ)を返す場合、関数は続行中であるとされ、 .I yyin を別の入力ファイルを指すように設定し、スキャンを続行します。 関数が真(非ゼロ)を返す場合、スキャナは終了し、呼び出し元に 0 を返します。 どちらの場合も開始条件は変化しないことに注意して下さい; つまり .B INITIAL には戻り .I ません。 .PP 独自の .B yywrap() を設定しない場合、 .B %option noyywrap (この場合スキャナは .B yywrap() が 1 を返したかのように動作します)を使用するか、フラグ .B \-ll を指定してデフォルトのルーチン(常に 1 を返します)を使用しなければなりません。 .PP ファイルではなくメモリ中のバッファからスキャンするための 3 つのルーチンを 使用可能です: .B yy_scan_string(), yy_scan_bytes(), yy_scan_buffer() 。 これらに関する議論は複数の入力バッファの節を参照して下さい。 .PP スキャナは、自己の .B ECHO 出力を .I yyout グローバル(デフォルトでは標準出力であり、 別の .B FILE ポインタに割り当てることで再定義できます)に書きます。 .SH 開始条件 .I flex は、条件的に有効となるルールのための機構を提供します。 パターンのプレフィックスが "" となっているルールは、 スキャナが "sc" という名前の開始条件にいる場合のみ有効です。 例えば、 .nf [^"]* { /* eat up the string body ... */ ... } .fi はスキャナが "STRING" 開始条件にいる時のみ有効であり、 .nf \\. { /* handle an escape ... */ ... } .fi は現在の開始条件が、 "INITIAL", "STRING", "QUOTE" のいずれかの場合のみ有効です。 .PP 開始条件は、入力の定義(先頭)部において、インデントされない行で .B %s もしくは .B %x から始まり名前が続く行において宣言されます。 前者は .I 内包的 開始条件を、 後者は .I 排他的 開始条件を、それぞれ宣言します。 開始条件を有効にするのは .B BEGIN アクションです。 次の .B BEGIN アクションが実行されるまで、与えられた開始条件のルールは有効であり、 他の開始条件のルールは無効です。 開始条件が .I 内包的 な場合、開始条件を持たないルールもまた有効です。 開始条件が .I 排他的 な場合、 開始条件を満たすルール .I だけ が有効です。 同じ排他開始条件に依存するルールの組は、 .I flex 入力中の別のルールとは独立なスキャナを記述します。 そのため、排他開始条件を使用すれば、"ミニスキャナ" (別部分とは文法的に異なる部分(例えばコメント)に対するスキャナ) を簡単に指定できます。 .PP 内包的開始条件と排他的開始条件とがまだ少し曖昧であるなら、 両者の関係を表す例を示して説明します。以下のルールの組: .nf %s example %% foo do_something(); bar something_else(); .fi は .nf %x example %% foo do_something(); bar something_else(); .fi と等価です。 .B が無いと、2 番目の例における .I bar パターンは、開始条件が .B example の場合、有効となりません(すなわちマッチしません)。 .B だけを .I bar につけると、 .B example だけにおいて有効となり、 .B INITIAL では有効となりません。一方、最初の例ではどちらの場合でも有効です。 なぜなら最初の例では .B example 開始条件は .I 内包的 .B (%s) 開始条件だからです。 .PP 特殊な開始条件指定子 .B <*> は全ての開始条件にマッチすることに注意して下さい。 このため、上の例は次のようにも書けます; .nf %x example %% foo do_something(); <*>bar something_else(); .fi .PP デフォルトルール(マッチしなかった文字に対しては .B ECHO です)は開始条件中でも有効です。 これは次のものと等価です: .nf <*>.|\\n ECHO; .fi .PP .B BEGIN(0) は、開始条件の無いルールだけが有効である、最初の状態に戻ります。 この状態は開始条件 "INITIAL" として参照できるため、 .B BEGIN(INITIAL) は .B BEGIN(0) と等価です。 (開始条件名を括る括弧は不要ですが、良いスタイルであるとされています。) .PP .B BEGIN アクションは、ルール部の先頭のインデントされたコード中に現れても良いです。 例えば以下の例では、 .B yylex() が呼ばれグローバル変数 .I enter_special が真の場合には、スキャナは "SPECIAL" 開始条件に入ります: .nf int enter_special; %x SPECIAL %% if ( enter_special ) BEGIN(SPECIAL); blahblahblah ...more rules follow... .fi .PP 開始条件を説明するために、 "123.456" のような文字列を 2 通りの異なった解釈をするスキャナを示します。 デフォルトではこれは、 整数 "123" とドット ('.') と整数 "456" の 3 トークンに数えられます。 しかし、この文字列の前に "expect-floats" の文字列がある場合、 これは単一のトークンであるとされ、浮動小数点数 123.456 とされます: .nf %{ #include %} %s expect %% expect-floats BEGIN(expect); [0-9]+"."[0-9]+ { printf( "found a float, = %f\\n", atof( yytext ) ); } \\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); } [0-9]+ { printf( "found an integer, = %d\\n", atoi( yytext ) ); } "." printf( "found a dot\\n" ); .fi 次は、C のコメントを理解(して捨てる)一方で、 現在の入力行を数えるスキャナです。 .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi このスキャナは各ルールで可能な最大のテキストにマッチしようとする場合、 ちょっとした問題が起こります。 一般的には、高速なスキャナを記述する場合、 各ルールで最大のマッチを得ようとすることが最も成功します。 .PP 開始条件名は実際には整数値であり、格納することが出来ることに注意して下さい。 そのため、上記例は以下のように拡張できます: .nf %x comment foo %% int line_num = 1; int comment_caller; "/*" { comment_caller = INITIAL; BEGIN(comment); } ... "/*" { comment_caller = foo; BEGIN(comment); } [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(comment_caller); .fi さらに、現在の開始条件を整数値であるマクロ .B YY_START にてアクセスできます。 例えば、上記の .I comment_caller への代入は次のように記述できます。 .nf comment_caller = YY_START; .fi flex は .B YYSTATE を .B YY_START のエイリアスとして提供します (AT&T の .I lex が使用しています)。 .PP 開始条件は独自の名前空間を持たないことに注意して下さい; %s や %x の宣言における名前宣言の扱いは #define と同じです。 .PP 最後に、排他的開始条件を使用する、 展開されたエスケープシーケンスを含む(長すぎる文字列のチェックは含みません) C スタイルのクオート文字列へのマッチ方法を示します: .nf %x str %% char string_buf[MAX_STR_CONST]; char *string_buf_ptr; \\" string_buf_ptr = string_buf; BEGIN(str); \\" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\\0'; /* return string constant token type and * value to parser */ } \\n { /* error - unterminated string constant */ /* generate error message */ } \\\\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; } \\\\[0-9]+ { /* generate error - bad escape sequence; something * like '\\48' or '\\0777777' */ } \\\\n *string_buf_ptr++ = '\\n'; \\\\t *string_buf_ptr++ = '\\t'; \\\\r *string_buf_ptr++ = '\\r'; \\\\b *string_buf_ptr++ = '\\b'; \\\\f *string_buf_ptr++ = '\\f'; \\\\(.|\\n) *string_buf_ptr++ = yytext[1]; [^\\\\\\n\\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; } .fi .PP 上記例のように同一の開始条件を持つ全てのルールの前に 開始条件を書かねばならないことが多いです。 flex はこれを簡単かつ綺麗にするため開始条件 .I スコープ を導入しました。 開始条件スコープは次のように始まります: .nf { .fi ここで .I SCs は 1 つ以上の開始条件のリストです。 開始条件スコープ内では、 最初の .I '{' にマッチするまでの .I '}' において、全てのルールは自動的に .I のプレフィックスが付きます。 そのため、例えば .nf { "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; } .fi は次のものと等価です: .nf "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; .fi 開始条件スコープはネストすることが出来ます。 .PP 開始条件のスタックを制御するために 3 つのルーチンを使用可能です: .TP .B void yy_push_state(int new_state) 現在の開始条件を開始条件スタックの先頭にプッシュし、 .B BEGIN new_state を使用したかのように .I new_state に切り替えます (開始条件名は整数値でもあることを思い出して下さい)。 .TP .B void yy_pop_state() スタックの先頭をポップし、 .B BEGIN を使用してその開始条件に切り替えます。 .TP .B int yy_top_state() スタックの内容を変更せずに、スタックの先頭を返します。 .PP 開始条件スタックは動的に大きくなり、 また組み込み時のサイズ制限はありません。 メモリを使い切ると、プログラム実行は中止されます。 .PP 開始条件スタックを使用するためには、スキャナは .B %option stack ディレクティブをインクルードする必要があります (下記オプションを参照して下さい)。 .SH 複数の入力バッファ スキャナによっては(ファイルの "include" をサポートする等) 複数の入力ストリームを扱う必要があります。 .I flex スキャナでは大きなバッファリングを行うため、 スキャンコンテキストに影響される .B YY_INPUT を単純に書き換えるだけでは次の入力がどこから読まれるのかを制御できません。 .B YY_INPUT が呼ばれるのはスキャナがバッファの終りに到達する時だけですので、 例えば "include" のように入力元を切り替える必要のある文をスキャンした後でも 長時間を費す場合があります。 .PP この様な問題を解決するため、 .I flex は複数の入力バッファを生成して切り替える機構を提供します。 入力バッファは次のように生成されます: .nf YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) .fi これは .I FILE ポインタと size を取り、与えられる file に関連し .I size 文字を保持するに十分なバッファを生成します (疑わしい場合には size には .B YY_BUF_SIZE を使用して下さい)。 これは、別のルーチン(下記参照)に渡すための .B YY_BUFFER_STATE ハンドルを返します。 .B YY_BUFFER_STATE のタイプは .B struct yy_buffer_state 構造体へのポインタであるため、 安全のため YY_BUFFER_STATE 変数を .B ((YY_BUFFER_STATE) 0) と初期化することが出来、 スキャナではなくソースファイルにおいて 入力バッファを正しく宣言するためにこの構造体を参照することが出来ます。 .B yy_create_buffer 呼び出しにおける .I FILE ポインタは .B YY_INPUT から見える .I yyin の値と同じようにだけ使用されることに注意して下さい; .B YY_INPUT を再定義して .I yyin を使わないようにすることにより、 .B yy_create_buffer に対して安全にニル .I FILE ポインタを渡せます。 スキャンするバッファを選択するためには次のようにします: .nf void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) .fi これはスキャナの入力バッファを切り替え、 トークンが .I new_buffer から来るようになります。 新たなファイルをオープンして .I yyin を指すのではなく、スキャンを継続するために yywrap() から .B yy_switch_to_buffer() を使用することがあることに注意して下さい。 また、 .B yy_switch_to_buffer() または .B yywrap() による入力元の切り替えは開始条件を変更し .I ない ことにも注意して下さい。 .nf void yy_delete_buffer( YY_BUFFER_STATE buffer ) .fi はバッファに関連づけられたストレージの返還要求に使用します。( .B buffer はニルでも構いませんがこの場合このルーチンは何もしません。) 現在のバッファの内容をクリアするには次のようにします: .nf void yy_flush_buffer( YY_BUFFER_STATE buffer ) .fi この関数はバッファの内容を捨てるため、 次にスキャナがこのバッファとトークンのマッチを行う場合、 スキャナはまず .B YY_INPUT を使用してこのバッファをフィルします。 .PP .B yy_new_buffer() は .B yy_create_buffer() のエイリアスであり、動的オブジェクトの生成と破壊のために使用する C++ の .I new と .I delete との互換性のために提供しています。 .PP 最後に .B YY_CURRENT_BUFFER マクロは、現在のバッファに対する .B YY_BUFFER_STATE ハンドルを返します。 .PP この機能を使用してインクルードファイルを展開するスキャナの記述例です( .B <> 機能は後述します): .nf /* the "incl" state is used for picking up the name * of an include file */ %x incl %{ #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; %} %% include BEGIN(incl); [a-z]+ ECHO; [^a-z\\n]*\\n? ECHO; [ \\t]* /* eat the whitespace */ [^ \\t\\n]+ { /* got the include file name */ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "Includes nested too deeply" ); exit( 1 ); } include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ) error( ... ); yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) ); BEGIN(INITIAL); } <> { if ( --include_stack_ptr < 0 ) { yyterminate(); } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( include_stack[include_stack_ptr] ); } } .fi ファイルではなくメモリ上の文字列をスキャンするための 入力バッファを設定するための 3 つのルーチンを使用可能です。 いずれも文字列をスキャンする新しい入力バッファを生成し、対応する .B YY_BUFFER_STATE ハンドル(終了時には .B yy_delete_buffer() にて消去します)を返します。新しいバッファに切り替える時には .B yy_switch_to_buffer() を使用し、次の .B yylex() の呼び出し時にはこの文字列をスキャン開始します。 .TP .B yy_scan_string(const char *str) NUL ターミネートされた文字列をスキャンします。 .TP .B yy_scan_bytes(const char *bytes, int len) .I len バイト (NUL が含まれるかも知れません)を位置 .I bytes からスキャンします。 .PP どちらの関数も文字列もしくはバイト列の .I コピー を生成してからスキャンします。( .B yylex() はスキャンするバッファの内容を変更するため、これが望ましいのです。) コピーを避けるためには次のようにします: .TP .B yy_scan_buffer(char *base, yy_size_t size) バッファ内で .I base から .I size バイトの長さをスキャンします。最後の 2 バイトは .B YY_END_OF_BUFFER_CHAR (ASCII NUL) である .I 必要があります。 これらの最後の 2 バイトはスキャンされません; そのためスキャンの内容は .B base[0] から .B base[size-2] までで両端を含みます。 .IP この様になるように .I base を設定しなかった場合(つまり最後の 2 つの .B YY_END_OF_BUFFER_CHAR バイトを忘れた場合)、 .B yy_scan_buffer() は新しいバッファを生成するのではなくニルポインタを返します。 .IP 型 .B yy_size_t は整数型であり、 バッファの大きさを反映する整数式をこの型にキャストすることが出来ます。 .SH ファイルの終りのルール 特別ルール "<>" は、 ファイルの終了時もしくは yywrap() が非ゼロ(すなわち処理するファイルが無いことを表す)の時に 行われるべきアクションを表します。 アクションは以下の 4 つのうちのいずれかで終る必要があります。 .IP - .I yyin に新しいファイルを割り当てる(前のバージョンの flex では、 割り当て後に特別なアクション .B YY_NEW_FILE を呼び出す必要がありました; 今では不要です。); .IP - .I return 文を実行する; .IP - 特別な .B yyterminate() アクションを実行する; .IP - .B yy_switch_to_buffer() を使用して新たなバッファに切り替える (上記例で示した通り)。 .PP <> ルールを他のパターンと共に使用してはなりません; 他のパターンは開始条件のリストともにだけ満たされるからです。 満たされない <> ルールが与えられた場合、 <> アクションをまだ持っていない .I 全ての 開始条件に適用されます。 <> ルールを最初の開始条件だけに指定するためには次のようにして下さい。 .nf <> .fi .PP これらのルールは閉じていないコメントを捕まえる場合等に便利です。 例えば: .nf %x quote %% ...other rules for dealing with quotes... <> { error( "unterminated quote" ); yyterminate(); } <> { if ( *++filelist ) yyin = fopen( *filelist, "r" ); else yyterminate(); } .fi .SH 雑多なマクロ マクロ .B YY_USER_ACTION にはマッチルールアクションに先だって常に行うアクションを定義できます。 例えば、yytext を小文字に変換するルーチンを呼ぶように #define 出来ます。 .B YY_USER_ACTION 起動時には、変数 .I yy_act はマッチしたルールの番号を与えます(ルールは 1 番から数えます)。 各ルールがマッチする頻度を知りたい場合を想像して下さい。 以下に仕掛けを示します: .nf #define YY_USER_ACTION ++ctr[yy_act] .fi ここで .I ctr は配列であり、それぞれのルールがマッチした回数を計数します。 マクロ .B YY_NUM_RULES はルールの総数を表すため( .B \-s を使った時でさえデフォルトルールを含みます)、 正しい .I ctr の宣言は次のようになります: .nf int ctr[YY_NUM_RULES]; .fi .PP マクロ .B YY_USER_INIT には最初のスキャンの前に常に行うアクションを再定義できます (スキャナの内部初期化の前に行われます)。 例えばデータ表を読み込んだり、ログファイルをオープンするために使用できます。 .PP マクロ .B yy_set_interactive(is_interactive) は現在のバッファが .I 対話的 と見倣されているか否かを制御するために使用します。 対話的なバッファの処理は遅くなりますが、 スキャナの入力元が対話的でありバッファをフィルするのを待つことに起因する 問題を避けるためには指定しなければなりません(以下の .B \-I .B %option interactive フラグに関する議論を参照して下さい)。 マクロ起動時に非ゼロを指定するとバッファは対話的になり、 ゼロを指定すると非対話的になります。 このマクロの使用は .B %option interactive , .B %option always-interactive , .B %option never-interactive に優先します(下記オプションを参照して下さい)。 バッファをスキャンして対話的である(もしくはでない)と判断される前に、 .B yy_set_interactive() を起動して下さい。 .PP マクロ .B yy_set_bol(at_bol) は現在のバッファにおける次のトークンに対するマッチのためのスキャンが 行頭から始まるか否かを制御します。 非ゼロのマクロ引数は、'^' が付いたルールを有効にしますが、 ゼロのマクロ引数は '^' が付いたルールを無効にします。 .PP 現在のバッファからスキャンされた次のトークンが有効な '^' ルールを持つ時、 マクロ .B YY_AT_BOL() は真を返します。 そうでない場合は偽を返します。 .PP 生成されたスキャナでは、全てのアクションは大きな一つの switch 文に 集められ、 .B YY_BREAK で分けられています。 .B YY_BREAK は再定義可能です。デフォルトではそれぞれのルールのアクションを 分けるための単なる "break" です。 .B YY_BREAK を再定義することにより、例えば C++ ユーザが #define YY_BREAK を何もしないように定義し (ただし全てのルールが "break" か "return" で終るように 注意しなければなりません!)、 ルールのアクションが "return" で終ることにより .B YY_BREAK がアクセスできないことに起因する、 到達できない文があるという警告を避けることが出来ます。 .SH ユーザが使用可能な値 この節ではユーザがルールのアクション部分で使用可能な値をまとめます。 .IP - .B char *yytext 現トークンのテキストを保持しています。内容を変更しても構いませんが、 その長さを伸ばしてはいけません(終りに文字を追加してはいけない)。 .IP スキャナの記述の最初の部分に特別な指示である .B %array が書かれているとき、 .B yytext は .B char yytext[YYLMAX] と定義されます。 .B YYLMAX はマクロで、デフォルトの値 (多くの場合8KB) を変更したい場合には 最初の部分で再定義可能です。 .B %array を使うといくらか遅いスキャナになりますが、 .B yytext の値は .I input() と .I unput() の呼び出しでも破壊されなくなります。 .B yytext が文字ポインタである場合、 これらの関数呼び出しは .B yytext を破壊する可能性があります。 .B %array と対称な指定 .B %pointer がデフォルトです。 .IP C++ のスキャナクラスを生成する (オプション .B \-+ ) ときには .B %array は使えません。 .IP - .B int yyleng 現トークンの長さを保持しています。 .IP - .B FILE *yyin はデフォルトで .I flex が読むファイルです。再定義することは可能ですが、スキャンを 始める前か EOF に到達した後でのみ再定義は意味を持ちます。 スキャンの途中で変更すると予想外の結果をもたらします。 というのも .I flex は入力をバッファリングしているからです; そのような場合には、直接再定義せず .B yyrestart() を使って下さい。 ファイルの終わりでスキャンが終了した場合には .I yyin を新しい入力ファイルに割り当て、 再びスキャナを呼び出してスキャンを続けることが出来ます。 .IP - .B void yyrestart( FILE *new_file ) を呼ぶことで .I yyin が新しい入力ファイルを指すように出来ます。新しいファイルへの変更は すぐに行われます (それまでにバッファに読み込まれていた入力は失われます)。 .I yyin を引数として .B yyrestart() を呼ぶと、現在の入力バッファを捨てて同じ入力ファイルを スキャンし続けることに注意して下さい。 .IP - .B FILE *yyout は .B ECHO アクションが行われる対象のファイルです。 ユーザが再割当することが出来ます。 .IP - .B YY_CURRENT_BUFFER カレントバッファの .B YY_BUFFER_STATE ハンドルを返します。 .IP - .B YY_START 現在の開始条件に対応する整数値を返します。 続いてこの値を .B BEGIN と共に使うことで、スキャナをその開始条件へ戻すことが出来ます。 .SH YACC とのインタフェース .I flex の主な使用方法の一つは、 .I yacc パーサジェネレータと共に使用することです。 .I yacc パーサは .B yylex() と言う名前のルーチンを呼び、次の入力トークンを見付けるものとしています。 このルーチンは、次のトークンの型を返し、 関連する値をグローバルの .B yylval に格納するものとされています。 .I flex を .I yacc と共に使うには、 .I yacc に .B \-d オプションを指定して、 .I yacc の入力に現れる全ての .B %tokens の定義を含む .B y.tab.h ファイルを生成させます。 このファイルは .I flex スキャナにインクルードされます。 例えばトークンの一つが "TOK_NUMBER" である場合、 スキャナの一部分は次のようになっています: .nf %{ #include "y.tab.h" %} %% [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; .fi .SH オプション .I flex には以下のようなオプションがあります: .TP .B \-b バックアップ情報を .I lex.backup に出力します。 このファイルには、スキャナのバックアップ(backing-up)を必要とする状態と それに対応する入力文字の一覧がリストされます。 ルールを追加することでバックアップ状態を取り除くこと ができます。バックアップ状態が .I 全て 取り除かれ、 .B \-Cf または .B \-CF を指定すると、生成されたスキャナの実行速度が向上します( .B \-p フラグを見て下さい)。 スキャナをぎりぎりまで最適化しようとしてるユーザのみが このオプションに関係あります。 (後述の性能関連の節を見て下さい。) .TP .B \-c 何もしません。POSIX 互換のために用意されています。 .TP .B \-d 生成されたスキャナが .I デバッグ モードで実行されます。 .B yy_flex_debug が非ゼロの場合(デフォルト)、 パターンが認識されるたびに、スキャナは次のようなメッセージを .I 標準エラー出力 へ出力します。 .nf --accepting rule at line 53 ("the matched text") .fi 行番号はスキャナを定義しているファイル (flexに与えられたファイル) でのルールの位置です。 スキャナがバックアップしたとき、デフォルトルールを受け入れたとき、 入力バッファの最後に到達したとき (あるいは、NULに到達したとき; スキャナには、この二つの区別はつきません) 、ファイルの最後に到達した ときにもメッセージが出力されます。 .TP .B \-f .I 高速なスキャナ を指定します。 テーブル圧縮は行われず、標準入出力をバイパスします。 その結果生成されるスキャナは大きくなりますが、高速なものになります。 このオプションは .B \-Cfr と同等です (以下を参照)。 .TP .B \-h .I flex のオプションの要約からなる "ヘルプ" を .I 標準出力 に書き出し終了します。 .B \-? と .B \-\-help とは .B \-h と同じです。 .TP .B \-i .I 大文字小文字を区別しない スキャナを生成します。 .I flex の入力パターンに与えられる文字が大文字であるか小文字であるかは区別されず、 スキャナに入力される文字列は大文字小文字に関係なくマッチします。 マッチしたテキスト .I yytext では入力時の大文字小文字が保存されます (大文字を小文字に変換したりしません)。 .TP .B \-l AT&T の .I lex の実装に対して最大限の互換性を持たせます。これは .I 完全な 互換性を意味しません。 このオプションを使用すると性能に大きな影響があります。 このオプションは、 .B \-+, \-f, \-F, \-Cf, \-CF と同時に使用できません。詳しくは、 後述の "Lex および POSIX との非互換性" の節を御覧下さい。 またこのオプションを使用すると、 .B YY_FLEX_LEX_COMPAT が生成されたスキャナの名前に #define されます。 .TP .B \-n 何もしません。POSIX 互換のためにだけ用意されたオプションです。 .TP .B \-p 性能情報を標準エラー出力に出力します。 .I flex 入力ファイルの記述のうち、 生成されるスキャナの性能低下の深刻な原因となる部分について、 コメントされます。 オプションを2回指定すると、より細かな性能低下についても コメントが出力されます。 .IP .B REJECT ・ .B %option yylineno ・可変長右文脈(欠陥/バグの節で後述)は多大なる性能への悪影響があります; .I yymore() の使用・ .B ^ オペレータ・ .B \-I フラグは小さな性能の悪影響があります。 .TP .B \-s .I デフォルトルール (マッチしないスキャナの入力を .I 標準出力 に出力する) が抑制されます。ルールにマッチしない入力が表れたとき、スキャナは エラーで異常終了します。 スキャナのルールの組に抜けが無いかを確認する場合に有効です。 .TP .B \-t .B lex.yy.c ではなく、標準出力にスキャナを書き出します。 .TP .B \-v 生成するスキャナの特徴の要約を .I 標準エラー出力 に出力するように .I flex に指示します。 ほとんどの特徴は通常の .I flex ユーザには意味がありませんが、最初の行は .I flex のバージョンを表示し( .B \-V で表示されるもと同じです)、次の行はデフォルトを含むスキャナ生成時のフラグです。 .TP .B \-w 警告メッセージを抑制します。 .TP .B \-B .I 対話的 なスキャナ (以下の .B \-I の項を参照) ではなく .I バッチ的 なスキャナを生成するよう .I flex に指示します。 通常 .B \-B を使用するのは、スキャナを対話的に使用しないことが .I 分かっている 時であり、 .I 少しでも 性能を追求したい時です。 より大きい性能を追求する場合には、 .B \-Cf もしくは .B \-CF オプションを使用すべきです(後述)。 .B \-B を自動的に設定します。 .TP .B \-F .ul 高速な スキャナテーブルの表現を使う(標準入出力はバイパスする)ことを指定します。 この表現は、完全テーブル表現 .B (-f) とほぼ同じぐらい高速で、 ある種のパターンに対してはかなり小さく (ある種に対しては大きく) なります。 通常、次のように、パターンの組が "keywords" とその対応 および "identifier" ルールからなる場合: .nf "case" return TOK_CASE; "switch" return TOK_SWITCH; ... "default" return TOK_DEFAULT; [a-z]+ return TOK_ID; .fi この場合、完全テーブル表現を使用する方が良いです。 もし "identifier" ルールからのみ表現され、 キーワードを検知するためにハッシュ表等を使用する場合は、 .B -F を使用する方が良いです。 .IP このオプションは .B \-CFr と等価です (以下を参照)。 これは .B \-+ オプションとは同時に指定できません。 .TP .B \-I .I flex に .I 対話的 なスキャナを生成するように指示します。 対話的なスキャナは、 先読みすることによりマッチするトークンが完全に決まる場合のみ先読みします。 現在のトークンが既に明らかな場合でも常に先読みする方法は、 必要時のみ先読みする方法より少し速いです。 しかし、常に先読みする方法では対話性能に著しく悪影響があります; 例えばユーザが改行を入力した場合、 .I 別の トークンを入力するまでそれは改行として認識されません。 大概の場合、次の行全体を入力することになります。 .IP .I flex のスキャナのデフォルトは .I 対話的 であり、例外は .B \-Cf や .B \-CF といったテーブル圧縮オプション(後述)使用時です。 高性能追求時にはこれらのオプションを使用しているべきですので、 これらのオプションを使用していない場合には、 .I flex は実行時性能を少し犠牲にして直観的な対話的な振舞いを取っているものとします。 .B \-I オプションを .B \-Cf や .B \-CF と共に .I 使用できない ことにも注意して下さい。 実際はこのオプションは不要です; 許される場合、デフォルトで有効になっています。 .IP .B isatty() がスキャナの入力に対して偽を返す場合、 .B \-I が指定されていた場合でも、flex はバッチモードへ戻ります。 なにがあっても対話モードを強制するには、 .B %option always-interactive (後述のオプションを参照) を使用します。 .IP スキャナを対話的で .I 無い ように強制するには .B \-B (先述)を使用します。 .TP .B \-L .I flex に .B #line ディレクティブを .B lex.yy.c 中に生成しないように指示します。 デフォルトではこの #line ディレクティブを生成するので、 アクションにおけるエラーメッセージは、オリジナルの .I flex 入力ファイル( エラーが入力ファイルのコードに起因する場合)もしくは ファイル .B lex.yy.c ( .I flex の誤り -- 以下の電子メールアドレスに報告して下さい) における正しい位置を与えます。 .TP .B \-T .I flex を .I トレース モードで実行します。 入力の形式とその結果として出力される非決定性/決定性有限 オートマトンに関して .I 標準エラー出力 に多量のメッセージを出力します。 このオプションは主に .I flex をメンテナンスするために使われます。 .TP .B \-V バージョン番号を .I 標準出力 に出力して終了します。 .B \-\-version は .B \-V と同じです。 .TP .B \-7 7 ビットのスキャナを生成します。 すなわち、入力に 7 ビットの文字のみを使用することを意味します。 .B \-7 を指定する利点は、 .B \-8 オプション(後述)を指定して生成するテーブルの半分まで小さくなりうることです。 欠点は、入力に 8 ビット文字が含まれている時に、 スキャナがハングもしくはクラッシュすることです。 .IP しかしながら、 .B \-Cf や .B \-CF といったテーブル圧縮オプション使用時にはテーブル圧縮の効果は少なく、 移植性が著しく低下することに注意して下さい。 .I flex のデフォルトの動作では、 .B \-Cf や .B \-CF, を指定しない限り 8 ビットスキャナを生成します。 指定時には、 あなたのサイトが常に 8 ビットスキャナを生成するように (USA 以外のサイトでは良くあります)していない場合には、 7 ビットスキャナを生成します。 flex が 7 ビットもしくは 8 ビットのいずれのスキャナを生成するのかを 知りたい場合には、上述の .B \-v の出力のフラグの要約を調べて下さい。 .IP .B \-Cfe もしくは .B \-CFe (これらのテーブル圧縮オプションおよび等価クラスは後述) を使用しても、flex はデフォルトで 8 ビットスキャナを生成することに 注意して下さい。 なぜなら、完全な 8 ビットテーブルは 7 ビットテーブルと比べても たいして高価にはならないからです。 .TP .B \-8 8 ビットのスキャナを生成するように .I flex に指示します。すなわち 8 ビット文字を解釈します。 圧縮オプション .B \-Cf と .B \-CF 使用時にのみ必要です。 なぜなら flex はデフォルトでは 8 ビットスキャナを生成するからです。 .IP flex のデフォルト動作と 7 ビットおよび 8 ビットスキャナの トレードオフに関しては、上記 .B \-7 の議論を見て下さい。 .TP .B \-+ C++ のスキャナクラスを生成します。 詳しくは C++ スキャナの生成で後述します。 .TP .B \-C[aefFmr] テーブル圧縮の程度と、 より一般的には小さいスキャナと高速なスキャナとのトレードオフを指定します。 .IP .B \-Ca ("アライン") 生成されるスキャナのテーブルは、 メモリアクセスおよび計算のためにアラインされるため、より大きなものになります。 RISC アーキテクチャではロングワードのフェッチおよび操作は ショートワードといったより小さな大きさのものに対するものより効率的です。 場合によってはスキャナのテーブルサイズが通常の 2倍になることもあります。 .IP .B \-Ce .I 等価クラス (同一の字句属性を持つ文字セット)を構築します (例えば、 .I flex 入力中に数字が現れるのが文字クラス "[0-9]" のみの場合、 数字 '0', '1', ..., '9' は全て同じ等価クラスになります)。 多くの場合、等価クラスを用いることで最終的なテーブル/ オブジェクトファイルのサイズを劇的(平均して 1/2-1/5)に減らすことが出来ます。 また、その際の性能コストは非常に低く抑えられます ( 1文字スキャンするごとに 1回の配列検索を行うだけです)。 .IP .B \-Cf .I 完全(full) スキャナテーブルを生成することを指示します - .I flex は、別の状態に関する類似した遷移関数をうまく利用するという、 テーブル圧縮手法を用いません。 .IP .B \-CF 別の高速スキャナ表現( .B \-F フラグにて記述)を用いることを指定します。 このオプションは .B \-+ と同時に使用できません。 .IP .B \-Cm .I flex に .I メタ等価クラス を構築するよう指示します。 メタ等価クラスは一緒に使われることの多い等価クラス (等価クラスが使われていないときには文字群) の集合です。 圧縮テーブルを使っているとき、 メタ等価クラスは多くの場合にかなりの効果的をもたらしますが、 やや性能に影響します (1-2 回の条件テストと 1 回の配列検索がスキャンした文字ごとに行われます)。 .IP .B \-Cr 生成されたスキャナは入力に対しては標準入出力ライブラリ(標準入出力)を .I バイパス します。 スキャナは、 .B fread() や .B getc() ではなく、 .B read() システムコールを使用します。 性能改善結果はシステムに依存します。 オプション .B \-Cf もしくは .B \-CF を使用していない場合には、 一般にこのオプションは性能をあまり改善しません。 .B \-Cr を指定すると、例えばスキャナを設定する前に標準入出力を使用して .I yyin を読み取る等した場合奇妙な動作となり得ます (標準入出力の入力バッファに以前読み込んだものを、スキャナは読めません)。 .IP .B \-Cr は .B YY_INPUT を定義した場合意味がありません (前述の生成されたスキャナを参照)。 スキャナの呼出に先だって標準入力を使って .I yyin から読みだしているときには、予想外の振る舞いをすることがあります。 .IP .B \-C のみを指定したときには、スキャナはテーブル圧縮は行いますが、 等価クラスもメタ等価クラスも使いません。 .IP オプション .B \-Cf と .B \-CF はオプション .B \-Cm を同時に指定しても意味をなしません - なぜなら、テーブル圧縮が行われないときメタ等価クラス は現れないからです。 それ以外のオプションは自由に組み合わせることが出来ます。 .IP デフォルトの設定は .B \-Cem です。このとき .I flex は等価クラスとメタ等価クラスを生成します。 この設定は最も高いテーブル圧縮を行います。 テーブルサイズの大きさと実行の高速性はトレードオフの関係にあり、 一般に .nf 遅いが 小さい -Cem -Cm -Ce -C -C{f,F}e -C{f,F} -C{f,F}a 速いが 大きい .fi となります。 小さいテーブルのスキャナは通常生成もコンパイルも高速であるため、 通常の開発時は最大の圧縮を行うでしょう。 .IP 製品のスキャナでは、 .B \-Cfe が速度と大きさの良いバランスです。 .TP .B \-ooutput .B lex.yy.c ではなくファイル .B output にスキャナを書くように flex に指示します。 .B \-o と .B \-t オプションを組み合わせると、 スキャナは .I 標準出力 に書かれますが、 .B #line ディレクティブ( .B \\-L にて上述)はファイル .B output を参照します。 .TP .B \-Pprefix .I flex の使うデフォルトのプレフィックス .I "yy" の代わりに .I prefix を使います。これはグローバル変数とファイル名に影響します。 例えば .B \-Pfoo とすると、 .B yytext の名前は .B footext となります。 またデフォルトの出力ファイル名を .B lex.yy.c から .B lex.foo.c に変えます。 影響を受ける名前の一覧です: .nf yy_create_buffer yy_delete_buffer yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrap .fi (C++ スキャナ使用時には .B yywrap と .B yyFlexLexer だけが影響を受けます。) スキャナの中では、グローバル変数および関数を どちらの名前ででも参照できます; 外部的には修正した名前のみ持ちます。 .IP このオプションを使用することにより、複数の .I flex プログラムを同一の実行形式に容易にリンクすることが出来ます。 しかし、このオプションは .B yywrap() の名前をも変えますので、 独自の(適切に名前を付けた)ルーチンをスキャナのために用意するか、 .B %option noyywrap を使用して .B \-ll とリンクする .I 必要があります。 どれもデフォルトでは提供されません。 .TP .B \-Sskeleton_file .I flex がスキャナを構築するのに使うデフォルトの スケルトンファイルに優先します。 .I flex のメンテナンスや開発をする場合以外、このオプションは必要ありません。 .PP .I flex は、flex のコマンドラインではなく、 スキャナ仕様記述中からオプションを制御する機構を提供します。 これはスキャナの最初の部分に .B %option ディレクティブを含めることで実現できます。 単一の .B %option ディレクティブにおいて複数のオプションを指定でき、 また複数のディレクティブを flex 入力ファイルの最初の部分に置くことが出来ます。 .PP ほとんどのオプションが単純な名前であり、 オプションとして前に "no" という語(空白をはさみません)を付けて 意味を反転できます。 数値は flex のフラグやその反転と等価です。 .nf 7bit -7 オプション 8bit -8 オプション align -Ca オプション backup -b オプション batch -B オプション c++ -+ オプション caseful または case-sensitive -i オプションの逆(デフォルト) case-insensitive または caseless -i オプション debug -d オプション default -s オプションの逆 ecs -Ce オプション fast -F オプション full -f オプション interactive -I オプション lex-compat -l オプション meta-ecs -Cm オプション perf-report -p オプション read -Cr オプション stdout -t オプション verbose -v オプション warn -w オプションの逆 (-w オプションには "%option nowarn" を使用して下さい) array "%array" と等価 pointer "%pointer" と等価(デフォルト) .fi .B %option には、他では利用できない機能を提供するものもあります: .TP .B always-interactive 入力を常に "対話的" に扱うスキャナを生成するように flex に指示します。 通常、新たな入力ファイル毎にスキャナは .B isatty() を呼び出し、スキャナの入力元が対話的であり 1 度に 1 文字ずつ読むべきか どうか判定しようとします。 一方このオプションを使用するとこの様な呼び出しは行いません。 .TP .B main スキャナに対し、 .B yylex() を呼び出すだけのデフォルトの .B main() プログラムを提供するように指示します。 このオプションは .B noyywrap (後述)も暗黙的に指示します。 .TP .B never-interactive 入力を "対話的" とはしないスキャナを生成するように flex に指示します (これもまた .B isatty() を呼び出しません)。 これは .B always-interactive の逆です。 .TP .B stack 開始条件スタックの使用を有効にします(前述の開始条件を参照)。 .TP .B stdinit 設定されている場合 (すなわち .B %option stdinit) .I yyin および .I yyout を、 デフォルトの .I nil ではなく、 .I 標準入力 と .I 標準出力 に設定します。 既存の .I lex プログラムには、 ANSI C 互換ではないものの、この動作に依存しているものがあります。 ANSI C では .I 標準入力 と .I 標準出力 がコンパイル時の定数である必要はありません。 .TP .B yylineno 入力から読み取った現在の行番号をグローバル変数 .B yylineno に保持するスキャナを生成するように、 .I flex に指示します。 このオプションは .B %option lex-compat から暗黙的に指定されます。 .TP .B yywrap セットされていない場合 (すなわち .B %option noyywrap) 、スキャナはファイルの終りに際し .B yywrap() を呼ばず単にスキャンすべきファイルがもう無いものとするようになります( ユーザが .I yyin を新しいファイルを指すようにし、再度 .B yylex() を呼び出すまでです)。 .PP .I flex はルールアクションをスキャンし、 .B REJECT と .B yymore() の機能が使われているかどうかを調べます。 .B reject と .B yymore のオプションを使用すると、 オプションで指定した通りにこの判定に優先します。 オプションの指定は、セットして機能を使用していることを示す(例えば .B %option reject) 、もしくはアンセットして機能を使用していないことを示す(例えば .B %option noyymore) ものとします。 .PP 次のオプションは文字列の値を取り、'=' で区切ります: .nf %option outfile="ABC" .fi これは .B -oABC と同じであり、 .nf %option prefix="XYZ" .fi は .B -PXYZ と同じです。 最後に、 .nf %option yyclass="foo" .fi は C++ スキャナ生成時のみ有効( .B \-+ オプション)です。これは .I flex に対して、 .B foo が .B yyFlexLexer のサブクラスであることを知らせますので、 .I flex はアクションを .B yyFlexLexer::yylex() ではなく .B foo::yylex() のメンバ関数とします。 また、( .B yyFlexLexer::LexerError() を起動することにより)呼び出すと実行時エラーを除去する .B yyFlexLexer::yylex() メンバ関数を生成します。 詳細は後述の C++ スキャナの生成を見て下さい。 .PP 生成されたスキャナから不要なルーチンを除きたい lint 純正主義者のために 多くのオプションが用意されています。 以下をアンセットすると(例えば .B %option nounput )、対応するルーチンは生成されるスキャナから除かれます: .nf input, unput yy_push_state, yy_pop_state, yy_top_state yy_scan_buffer, yy_scan_bytes, yy_scan_string .fi ( .B yy_push_state() 等は .B %option stack を使用しない場合には現れません)。 .SH 性能関連 .I flex の主なデザインゴールは高性能なスキャナを生成することです。 多くのルールセットを良く扱うことで最適化されます。 既に概説した .B \-C オプション使用によるテーブル圧縮に起因する速度への影響の他に、 性能を悪化させる多くのオプション/アクションがあります。 それらを高価なものから安価なものへと並べます: .nf REJECT %option yylineno 自由長の右文脈(trailing context) バックアップが必要なパターンの組 %array %option interactive %option always-interactive '^' 行頭オペレータ yymore() .fi 最初の 3 つは非常に高価であり、最後の 2 つは非常に安価です。 .B unput() は潜在的に非常に大きな仕事をするルーチン呼び出しとして実装されているのに対し、 .B yyless() は非常に安価なマクロです; ですからスキャンした余分なテキストを戻すだけの場合には .B yyless() を使って下さい。 .PP 性能が重要な場合には、出来うる限りの努力でもって .B REJECT を避けて下さい。 これは特に高価なオプションです。 .PP バックアップを取り除くと、乱雑になり、 ひどく苦労して複雑なスキャナを作ることになります。 実際的には .B \-b フラグを指定して .I lex.backup ファイルを生成することから始めます。例えば、入力 .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; .fi に対しては、ファイルは次のようになります: .nf State #6 is non-accepting - associated rule line numbers: 2 3 out-transitions: [ o ] jam-transitions: EOF [ \\001-n p-\\177 ] State #8 is non-accepting - associated rule line numbers: 3 out-transitions: [ a ] jam-transitions: EOF [ \\001-` b-\\177 ] State #9 is non-accepting - associated rule line numbers: 3 out-transitions: [ r ] jam-transitions: EOF [ \\001-q s-\\177 ] Compressed tables always back up. .fi 最初の数行は、 \&'o' に遷移できるが他の文字には遷移できない状態があり、 その状態では現在スキャンされたテキストは他のルールにはマッチしないことを 表します。 この状態が発生したのは、 入力ファイルの行 2, 3 のルールにマッチしようとした時です。 スキャナがこの様な状態にあり 'o' 以外の文字を読んだ場合には、 マッチするルールを探すためのバックアップが必要となります。 少し考えれば、これは "fo" を見た時にある状態に違いないことが分かるでしょう。 この様な時、'o' 以外のものが現れると、 スキャナは、単に 'f' にマッチする(デフォルトルール)ところまで 戻り(バックアップし)ます。 .PP 状態 #8 に関係するコメントは、 "foob" がスキャンされた時に問題があることを表しています。 実際、'a' 以外の文字に出会うと、スキャナは "foo" を受理するところまで戻ります。 同様に状態 #9 に関係するコメントは、 "fooba" がスキャンされ 'r' が続かない場合に関係します。 .PP 最後のコメントが通知するのは、 .B \-Cf や .B \-CF を使っているのでなければ バックアップを取り除こうと努力することは無意味であることです。 なぜなら、圧縮されたスキャナに対してそのようなことをしても、 性能上の利益は無いからです。 .PP バックアップを取り除くためには "エラー" ルールを追加します: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; fooba | foob | fo { /* false alarm, not really a keyword */ return TOK_ID; } .fi .PP キーワードのリストからバックアップを取り除くには、"全てを捕まえる" ルールを使用することが出来ます: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; [a-z]+ return TOK_ID; .fi 通常、適切な時にはこれは一番良い解決策です。 .PP バックアップメッセージはカスケードすることが多いです。 複雑なルールの組では、数百ものメッセージを得るのは普通のことです。 しかし、これを解析すれば、バックアップを除去するためには 大抵の場合数ダースのルールにだけ関係あることが分かるでしょう (しかし、間違えることが多く、誤ったルールが偶然有効なトークンにマッチし得ます。 将来の .I flex の機能では、 自動的にバックアップを除去するルールを追加するようになるかも知れません)。 .PP バックアップを除去することにより利益があるのは、 .I 全ての バックアップを除去した時だけということを覚えておくことは重要です。 たった一つを残しても何も得ることが出来ません。 .PP .I 可変長の 右文脈 (左部分と右部分のいずれかもしくは両方が可変長)は .B REJECT とほぼ同じだけの(すなわち相当の)性能劣化となります。 そのため次のようなルール: .nf %% mouse|rat/(cat|dog) run(); .fi は次のように書くか: .nf %% mouse/cat|dog run(); rat/cat|dog run(); .fi 次のように書いた方が良いです: .nf %% mouse|rat/cat run(); mouse|rat/dog run(); .fi 特別な '|' アクションは助けにはなり .I ません し、かえって状況を悪くします (後述の欠陥/バグを参照)。 .LP スキャナの性能を向上させるための余地(実現は最も容易)は、 マッチするトークンが長ければスキャナが高速になることにあります。 長いトークンではほとんどの入力処理は(短い)内部ループで処理され、 アクションのためにスキャナ環境を設定する追加の仕事(例えば .B yytext) をほとんどしないからです。 C コメントのスキャナを思い出しましょう: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* "*"+[^*/\\n]* \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 次のように書くと高速になります: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* [^*\\n]*\\n ++line_num; "*"+[^*/\\n]* "*"+[^*/\\n]*\\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 今度は、改行毎に別のアクションの処理を行うのではなく、 改行認識はルール間で "分散" され、 可能な限り長いテキストにマッチするようになっています。 ルールの .I 追加 はスキャナを遅く .I しません! スキャナの速度は、ルール数とも、 オペレータ '*' や '|' といったものに基づくルールの複雑さ (この節の始めで扱いました)とも独立です。 .\" 括弧内自信無しです .\" Apr 29 1997, horikawa@jp.freebsd.org .PP 最後の高速化の例です: 1 行に 1 つずつであり別の文字は付かないような、 識別子とキーワードを全てファイルからスキャンすることを考えます。 最初は次のようになるでしょう: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ .|\\n /* it's not a keyword */ .fi 後戻りを避けるために全てを捕まえるルールを導入します: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ [a-z]+ | .|\\n /* it's not a keyword */ .fi 1 行に正確に 1 語だけあることが保証されている場合、 改行の認識を別のトークンと併せることで、 マッチの総数を半分に減らすことが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | .|\\n /* it's not a keyword */ .fi ここで、再度バックアップをスキャナに組み込んだことに 気を付けなければなりません。 実際 .I 我々は 入力ストリームはレターと改行だけであることを知っていますが、 .I flex はこれが分からないため、 トークン "auto" などをスキャンした次の文字が改行でもレターでもない場合には バックアップが必要であると考えます。 以前は "auto" ルールに適合しそれで終りでしたが、 今は "auto" ルールは無く、"auto\\n" ルールだけがあります。 バックアップの可能性を除去するためには、 最後の改行以外のルールを二重化するか、 そのような入力に出くわさないので分類は不要と分かっているため、 改行を導入しないもう一つの全てを捕まえるルールを導入することが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | [a-z]+ | .|\\n /* it's not a keyword */ .fi .B \-Cf を付けてコンパイルすると、実際問題上 .I flex で得られるほぼ最速になります。 .PP 最後の注意事項: .I flex は NUL にマッチする時には遅く、トークンが複数の NUL を含む時には特に遅いです。 テキストがしばしば NUL を含むものと予想される場合には、テキストの .I 短い 部分とマッチするようにルールを書くべきです。 .PP もう一つの性能に関する最終注意事項: 入力のマッチ方法の節で既に示したように、 大きなトークンを納めるために .B yytext のサイズを動的に変更すると処理が遅くなります。 なぜなら、(巨大な)トークンを再度先頭からスキャンしなおさねばならないからです。 性能が重要な場合、 テキストの "大きな" 部分にマッチさせるべきですが "巨大な" 部分にマッチさせる べきではありません。 両者の堺目は 8K 文字/トークンです。 .SH C++ スキャナの生成 .I flex は 2 通りの C++ スキャナ生成方法を提供します。 最初の方法は .I flex が生成したスキャナを単に C コンパイラではなく C++ コンパイラで コンパイルするというものです。 この場合コンパイルエラーには出会わないはずです (見付けた場合には作者の節で後述する電子メールアドレスに報告して下さい)。 この場合ルールにおいて C コードではなく C++ コードを書くことが出来ます。 スキャナのデフォルトの入力元は .I yyin のままであり、 デフォルトのエコー先は .I yyout のままであることに注意して下さい。 どちらも .I FILE * 変数のままであり、C++ .I streams ではないです。 .PP .I flex に C++ スキャナクラスを生成させることも出来ます。 .B \-+ オプションを指定する(もしくは等価的に .B %option c++ を使う)とこのように実行され、 flex の実行形式名が '+' で終っている場合には自動的に指定されます。 このオプションを指定すると flex が生成するスキャナのデフォルトはファイル .B lex.yy.cc となり .B lex.yy.c ではありません。 生成されたスキャナは 2 つの C++ クラスとのインタフェースを定義するヘッダファイル .I FlexLexer.h をインクルードします。 .PP 最初のクラス .B FlexLexer は一般的なスキャナクラスを定義する抽象基盤クラスを提供します。 以下のメンバ関数を提供します: .TP .B const char* YYText() 最後にマッチしたテキストを返します。 .B yytext と等価です。 .TP .B int YYLeng() 最後にマッチしたトークンの長さを返します。 .B yyleng と等価です。 .TP .B int lineno() const 現在の入力の行番号( .B %option yylineno 参照)もしくは .B %option yylineno を使用していない場合には .B 1 を返します。 .TP .B void set_debug( int flag ) スキャナのデバッグフラグをセットします。 .B yy_flex_debug に代入するのと同じです(オプションの節で前述)。 スキャナ構築時に .B %option debug を使用してデバッグ情報を組み込む必要があることに注意して下さい。 .TP .B int debug() const 現在のデバッグフラグの設定を返します。 .PP また次のものと等価なメンバ関数も提供されます .B yy_switch_to_buffer(), .B yy_create_buffer() (最初の引数は .B istream* オブジェクトポインタであり .B FILE* ではありません), .B yy_flush_buffer(), .B yy_delete_buffer(), .B yyrestart() (これもまた最初の引数は .B istream* オブジェクトポインタです)。 .PP 2 番目のクラスは .I FlexLexer.h で定義される .B yyFlexLexer であり、 .B FlexLexer から導出したものです。 以下の追加のメンバ関数を定義します: .TP .B yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ) 与えられた入出力ストリームを使う .B yyFlexLexer オブジェクトを構築します。 指定しない場合にはそれぞれストリームのデフォルト .B cin と .B cout になります。 .TP .B virtual int yylex() これは .B yylex() が通常の flex スキャナに対して行ったのと同様の役割を担います: ルールのアクションが値を返すまで、 入力ストリームをスキャンし、トークンを消費します。 .B yyFlexLexer からサブクラス .B S を導出し .B yylex() から .B S のメンバ関数および変数をアクセスしたい場合、 .B %option yyclass="S" を指定して .B yyFlexLexer ではなくサブクラスを使用することを .I flex に知らせる必要があります。 この場合 .B yyFlexLexer::yylex() を生成するのではなく、 .I flex は .B S::yylex() (および呼び出されたなら .B yyFlexLexer::LexerError() を呼び出すダミーの .B yyFlexLexer::yylex() も)を生成します。 .TP .B virtual void switch_streams(istream* new_in = 0, .B ostream* new_out = 0) .B yyin を .B new_in (非ニルの場合) に再割当し、 .B yyout を .B new_out (同様)に再割当します。 .B yyin が再割当された場合には以前の入力バッファは消去されます。 .TP .B int yylex( istream* new_in, ostream* new_out = 0 ) まず入力ストリームを .B switch_streams( new_in, new_out ) を使用して切り替え、 .B yylex() の値を返します。 .PP さらに、 .B yyFlexLexer は次のプロテクトされた仮想関数を定義します。 スキャナにあわせてこれらを導出クラスにおいて再定義出来ます: .TP .B virtual int LexerInput( char* buf, int max_size ) 最大 .B max_size 文字を .B buf に読み込み、読めた文字数を返します。 入力の終りを示すには 0 文字を返します。"対話的" スキャナ( .B \-B と .B \-I フラグを参照)はマクロ .B YY_INTERACTIVE を定義することに注意して下さい。 .B LexerInput() を再定義し、 対話的な入力元をスキャンする可能性があるかどうかに依存して 異なるアクションが必要となる場合、 この名前が存在するかどうかのテストは .B #ifdef にて可能です。 .TP .B virtual void LexerOutput( const char* buf, int size ) .B size 文字をバッファ .B buf から書き出します。 スキャナのルールが NUL を含むテキストにマッチ可能な場合、 NUL 終端されているこのバッファは "内部に" NUL を含んでいても構いません。 .TP .B virtual void LexerError( const char* msg ) 致命的なエラーメッセージを報告します。 デフォルトのこの関数はメッセージをストリーム .B cerr に書き、終了します。 .PP .B yyFlexLexer オブジェクトは .I 全ての スキャン時の状態を含むことに注意して下さい。 それゆえこの様なオブジェクトをリエントラントなスキャナとして使用できます。 同一の .B yyFlexLexer クラスの複数のインスタンスを具体化可能であり、 複数の C++ スキャナクラスを組み合わせ上記 .B \-P オプションを使用することで同一のプログラムで使用可能です。 .PP 最後に .B %array 機能は C++ スキャナクラスでは使用できないことに注意して下さい; .B %pointer を使用しなければなりません(デフォルト)。 .PP 単純な C++ スキャナの例を以下に示します: .nf // An example of using the flex C++ scanner class. %{ int mylineno = 0; %} string \\"[^\\n"]+\\" ws [ \\t]+ alpha [A-Za-z] dig [0-9] name ({alpha}|{dig}|\\$)({alpha}|{dig}|[_.\\-/$])* num1 [-+]?{dig}+\\.?([eE][-+]?{dig}+)? num2 [-+]?{dig}*\\.{dig}+([eE][-+]?{dig}+)? number {num1}|{num2} %% {ws} /* skip blanks and tabs */ "/*" { int c; while((c = yyinput()) != 0) { if(c == '\\n') ++mylineno; else if(c == '*') { if((c = yyinput()) == '/') break; else unput(c); } } } {number} cout << "number " << YYText() << '\\n'; \\n mylineno++; {name} cout << "name " << YYText() << '\\n'; {string} cout << "string " << YYText() << '\\n'; %% int main( int /* argc */, char** /* argv */ ) { FlexLexer* lexer = new yyFlexLexer; while(lexer->yylex() != 0) ; return 0; } .fi 複数の(異なった)字句解析クラスを生成したい場合、 .B \-P フラグ (もしくは .B prefix= オプション) を使用して各 .B yyFlexLexer を .B xxFlexLexer 等の別の名前にします。 次に字句解析クラスのソースごとに .B をインクルードします。 以下のように .B yyFlexLexer をリネームします: .nf #undef yyFlexLexer #define yyFlexLexer xxFlexLexer #include #undef yyFlexLexer #define yyFlexLexer zzFlexLexer #include .fi これはあるスキャナに対し .B %option prefix="xx" を使用しもう一方に対し .B %option prefix="zz" を使用した場合です。 .PP 重要: 現在のスキャンクラスの形式は .I 実験的 であり、メジャーリリースが変わると大きく変更される可能性があります。 .SH LEX および POSIX との非互換性 .I flex は AT&T Unix の .I lex ツールのリライトですが(2 つの実装はいかなるコードも共有しません)、 いくばくかの拡張と非互換性を持っており、 どちらの実装でも受理可能なスキャナを書きたい方は これを意識しなければなりません。 flex は POSIX .I lex 仕様に完全合致しますが、例外は .B %pointer (デフォルト)使用と .B unput() 呼び出しにより .B yytext の内容を破壊することであり、これは POSIX 仕様に反します。 .PP この節では、 flex と AT&T lex と POSIX 仕様との間の全ての既知の非互換性を扱います。 .PP .I flex の .B \-l オプションはオリジナルの AT&T .I lex 実装との最大の互換性を有効にしますが、 生成されたスキャナの性能は大きく低下します。 .B \-l オプションを使用しても発生しうる非互換性は後で述べます。 .PP .I flex は以下の例外を除き .I lex と完全互換です: .IP - ドキュメントに記載されていない .I lex スキャナ内部の変数 .B yylineno は .B \-l もしくは .B %option yylineno を使用しないとサポートされません。 .IP .B yylineno はスキャナ毎(単一のグローバル変数)ではなく、バッファ毎に管理されるべきです。 .IP .B yylineno は POSIX 仕様ではありません。 .IP - .B input() ルーチンは再定義できませんが、 ルールにマッチしたものに後続する文字を読むために呼ばれえます。 .B input() がファイルの終りに到達すると、通常の .B yywrap() 処理は終了します。``実際の'' ファイルの終りは .I EOF として返されます。 .IP 実際には入力は .B YY_INPUT マクロを定義することにより制御されます。 .IP .B input() を再定義できないという .I flex の制限は、最初に .I yyin を設定する以外のスキャナ入力制御方法を単に規定していないという、 POSIX 仕様と合致します。 .IP - .B unput() ルーチンは再定義できません。この制限は POSIX に合致しています。 .IP - .I flex スキャナは .I lex スキャナとは異なりリエントラントではありません。 実際、対話的なスキャナにおいて、 割り込みハンドラにてロングジャンプを用いてスキャナから脱出し、 その後スキャナを再度呼び出す場合、以下のメッセージを得るでしょう: .nf fatal flex scanner internal error--end of buffer missed .fi スキャナに再度入るためには、まず以下のようにして下さい .nf yyrestart( yyin ); .fi この呼び出しにより入力バッファは捨てられることに注意して下さい; 通常これは対話的スキャナでは問題ではありません。 .IP また、C++ スキャナクラスはリエントラント .I です ので、C++ を使用できるのなら、C++ を使用すべきです。 前述の "C++ スキャナの生成" を参照して下さい。 .IP - .B output() はサポートされていません。 .B ECHO マクロからの出力はファイルポインタ .I yyout (デフォルトでは .I 標準出力 )に対して行われます。 .IP .B output() は POSIX 仕様にはありません。 .IP - .I lex は排他的開始条件 (%x) をサポートしませんが、これは POSIX 仕様にあります。 .IP - 定義を展開する時、 .I flex では括弧で括ります。 lex では以下は: .nf NAME [A-Z][A-Z0-9]* %% foo{NAME}? printf( "Found it\\n" ); %% .fi 文字列 "foo" にはマッチしません。 なぜなら展開されたマクロはルール "foo[A-Z][A-Z0-9]*?" と等価になり、 優先度にて `?' は "[A-Z0-9]*" と結び付きます。 .I flex ではルールが展開されると "foo([A-Z][A-Z0-9]*)?" となり、 文字列 "foo" がマッチします。 .IP .B ^ で始まるか .B $ で終る定義は、展開時に括弧で括らず、 これらのオペレータが定義において特別な意味を失わないようにすることに 注意して下さい。 しかし .B , /, .B <> オペレータは .I flex の定義では使用できません。 .IP .B \-l を使用すると、 .I lex の振舞いと同じく定義を括弧で括りません。 .IP POSIX 仕様では、定義を括弧で括ります。 .IP - .I lex の実装によっては、 ルールのパターンの右側に空白がある場合、 ルールのアクションを別の行から始めることを許します: .nf %% foo|bar { foobar_action(); } .fi .I flex はこの機能をサポートしません。 .IP - .I lex の .B %r (Ratfor スキャナの生成)オプションはサポートされていません。 これは POSIX 仕様には含まれません。 .IP - スキャナを .B %array を使用して構築したのではない限り、 .B unput() 呼び出し後には、次のトークンにマッチするまで .I yytext は未定義です。 これは .I lex にも POSIX 仕様にも当てはまりません。 .B \-l オプションを指定するとこの非互換性を取り除きます。 .IP - .B {} (数値範囲)オペレータの優先度が異なります。 .I lex は "abc{1,3}" を "1 度か 2 度か 3 度の 'abc' にマッチ" と解釈しますが、 .I flex は "'ab' に 1 度か 2 度か 3 度の 'c' が続くものにマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .B ^ オペレータの優先度が異なります。 .I lex は "^foo|bar" を "行頭の 'foo' か任意位置の 'bar' にマッチ" と解釈しますが、 .I flex は "行頭の 'foo' か 'bar' にマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .I lex でサポートされている .B %a 等の特別なテーブルサイズの宣言は .I flex スキャナでは不要です; .I flex はこれらを無視します。 .IP - .I flex と .I lex のどちらでもスキャナを使用可能に書けるように、 .bd FLEX_SCANNER という名前を定義します。 スキャナを生成した .I flex のバージョンを表す .B YY_FLEX_MAJOR_VERSION と .B YY_FLEX_MINOR_VERSION を、スキャナは含みます (例えば 2.5 リリースではこれらはそれぞれ 2 と 5 になります)。 .PP 以下の .I flex の機能は .I lex および POSIX 仕様には含まれません: .nf C++ スキャナ %option 開始条件スコープ 開始条件スタック 対話的/非対話的スキャナ yy_scan_string() 等 yyterminate() yy_set_interactive() yy_set_bol() YY_AT_BOL() <> <*> YY_DECL YY_START YY_USER_ACTION YY_USER_INIT #line ディレクティブ アクションの周りの %{} 単一行における複数のアクション .fi さらにほぼ全ての flex フラグです。 リストの最後の機能の意味は、 .I flex では複数のアクションをセミコロンで区切って同一行に記述可能ですが、 .I lex では次の .nf foo handle_foo(); ++num_foos_seen; .fi は (驚くべきことに) 次のように切り詰められるということです。 .nf foo handle_foo(); .fi .I flex はアクションを切り詰めません。 ブレースで括られないアクションは単純に行末で終了します。 .SH 診断 .PP .I warning, rule cannot be matched 常に同じテキストにマッチするルールが前にあるので、 与えられたルールがマッチしません。 例えば以下の "foo" は "全てを捕まえる" ルールの後ろにありますので 決してマッチしません: .nf [a-z]+ got_identifier(); foo got_foo(); .fi スキャナ中で .B REJECT を使用するとこの警告を抑制します。 .PP .I warning, .B \-s .I option given but default rule can be matched (おそらくある特定の開始条件のもとでは) デフォルトルール (任意の一文字にマッチする) しか特定の入力に 対してはマッチしないことがあります。 .B \-s を指定しているので、おそらくそうなりません。 .PP .I reject_used_but_not_detected undefined あるいは .I yymore_used_but_not_detected undefined - これらのエラーは コンパイル時に起きます。スキャナが .B REJECT もしくは .B yymore() を使っていますが .I flex がそのことに気づかなかったということです。 つまり、 .I flex は最初の 2 つの部分を探しても これらのアクションの出現を見つけられなかったのですが、 実際には何らかの方法 (例えば #include ファイルを介して)でこれらが記述されていた、ということです。 .B %option reject か .B %option yymore を使用して、flex にこれらの機能を実際に使用していることを教えて下さい。 .PP .I flex scanner jammed - .B \-s でコンパイルされたスキャナが、どのルールにもマッチしない 入力文字列に遭遇しました。 内部的な問題に起因してこのエラーが起こることもあります。 .PP .I token too large, exceeds YYLMAX - スキャナが .B %array を使っている場合に、あるルールが定数 .B YYLMAX (デフォルトで 8K バイト) より大きな文字列とマッチしました。 .I flex の入力ファイルの定義部で .B YYLMAX を #define することで値を大きくできます。 .PP .I scanner requires \-8 flag to .I use the character 'x' - スキャナの記述に 8 ビットの文字 .I 'x' を識別する部分があり、 .B \-Cf もしくは .B \-CF のテーブル圧縮オプションのためにデフォルトの 7 ビットになっている にもかかわらず、 \-8 オプションをつけていないということです。 詳細は .B \-7 フラグのオプションの議論を参照して下さい。 .PP .I flex scanner push-back overflow - .B unput() でテキストを戻しすぎたため、スキャナのバッファは 戻したテキストと現トークンを .B yytext に保てません。 この場合、理想的にはスキャナが動的にバッファの大きさを変えるべきですが、 現在のところそうなってはいません。 .PP .I input buffer overflow, can't enlarge buffer because scanner uses REJECT - スキャナは非常に大きなトークンのマッチを調べていて、入力バッファを 拡張する必要が起きました。しかしながら、バッファの拡張は .B REJECT を使うスキャナでは働きません。 .PP .I fatal flex scanner internal error--end of buffer missed - スキャナが使用しているフレームから(を越えて)ロングジャンプした後、 再度スキャナに入った場合に起こります。 再度スキャナに入る前に: .nf yyrestart( yyin ); .fi を使うか、前述のように C++ スキャナクラスを使用するようにして下さい。 .PP .I too many start conditions in <> construct! - 存在するより多くの開始条件を <> 中に記載しました (少なくとも一つを二度記載しました)。 .SH 関連ファイル .TP .B \-ll スキャナがリンクしなければならないライブラリ。 .TP .I lex.yy.c 生成されたスキャナ(システムによっては .I lexyy.c という名前になります)。 .TP .I lex.yy.cc .B -+ を使った時に作成された C++ スキャナクラス。 .TP .I C++ スキャナベースクラス .B FlexLexer とその導出クラス .B yyFlexLexer を定義するヘッダファイル。 .TP .I flex.skl スケルトンスキャナ。 このファイルは flex の実行時ではなく、flex を構築する時のみ利用されます。 .TP .I lex.backup .B \-b フラグ用のバックアップ情報(システムによっては .I lex.bck という名前になります)。 .SH 欠陥 / バグ .PP 右文脈(trailing context)パターンの中には、正しくマッチせず 警告メッセージ ("dangerous trailing context") を出すものがあります。 これらのパターンは、 ルールの最初の部分が 2番目の頭の部分とマッチするようなものです。 例えば "zx*/xy*" の場合、'x*' は右文脈の頭の 'x' とマッチします。 (POSIX ドラフトではそのようなパターンにマッチするテキストは 未定義であると述べていることに注意して下さい。) .PP 右文脈の中には、実際には固定長であるのにそうとは解釈されないものがあり、 上に述べた性能の低下が起こります。 特に、 '|' や {n} (例えば "foo{3}") は常に可変長であると解釈されます。 .PP 右文脈と特別なアクション '|' を組み合わせると .I 固定の 右文脈がよりコストのかかる .I 可変の 右文脈となります。例えば、次のようなものです: .nf %% abc | xyz/def .fi .PP .B %array もしくは .B \-l オプションを指定しない場合、 .B unput() を使うと yytext と yyleng を破壊します。 .PP NUL のパターンマッチングは他の文字の比較よりかなり遅くなっています。 .PP 入力バッファの動的な大きさの再調整は時間がかかります。これは現トークン (一般に巨大)までのマッチした全テキストの再スキャンを伴うためです。 .PP 入力のバッファリングと先読みのため、 ルーチンと 混合して使うことが出来ません。例えば、 .B getchar() と .I flex のルールはうまく行きません。代わりに .B input() を使って下さい。 .PP .B \-v オプションで表示される全テーブルエントリには、 どのルールがマッチしたのかを決定するのに必要なテーブルエントリ数が 含まれていません。エントリの数はスキャナが .B REJECT を使っていないときには DFA 状態数に等しく、 使っているときには DFA 状態数よりいくらか大きくなります。 .PP .B REJECT がオプション .B \-f もしくは .B \-F とともに使えません。 .PP .I flex の内部アルゴリズムについてのドキュメントが必要です。 .SH 関連項目 .PP lex(1), yacc(1), sed(1), awk(1). .PP John Levine, Tony Mason, and Doug Brown, .I Lex & Yacc, O'Reilly and Associates. 第 2 版を入手すること。 .PP M. E. Lesk and E. Schmidt, .I LEX \- Lexical Analyzer Generator .PP Alfred Aho, Ravi Sethi and Jeffrey Ullman, .I Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). .I flex で使用しているパターンマッチング技法を解説している(決定性オートマトン)。 .SH 作者 Vern Paxson が多くのアイディアとインスピレーションを得る助けを Van Jacobson から受けました。 オリジナルバージョンは Jef Poskanzer が作成しました。 高速テーブル表現は Van Jacobson のデザインの部分実装です。 この実装は Kevin Gong と Vern Paxson が行いました。 .PP 多くの .I flex ベータテスタ、フィードバッカ、コントリビュータ、特に Francois Pinard, Casey Leedom, Robert Abramovitz, Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai, Neal Becker, Nelson H.F. Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard, Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher, Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David Daniels, Chris G. Demetriou, Theo Deraadt, Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz, Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, Jarkko Hietaniemi, Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, John Interrante, Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, David Loffredo, Mike Long, Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, Bengt Martensson, Chris Metcalf, Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, G.T. Nicol, Landon Noll, James Nordby, Marc Nozell, Richard Ohnemus, Karsten Pahnke, Sven Panne, Roland Pesch, Walter Pelissero, Gaumond Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, Frederic Raimbault, Pat Rankin, Rick Richardson, Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, Andreas Scherer, Darrell Schiebel, Raf Schietekat, Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi Tsai, Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken Yap, Ron Zellar, Nathan Zelle, David Zuhn, および私の最低のメールアーカイブ能力から滑り落ちた方々、 それらの方々の協力にも同様に感謝します。 .PP Keith Bostic, Jon Forrest, Noah Friedman, John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. Nicol, Francois Pinard, Rich Salz, Richard Stallman には多くの悩みの分散に関して感謝します。 .PP Esmond Pitt と Earle Horton には 8 ビット文字サポートに関して; Benson Margulies と Fred Burke には C++ サポートに関して; Kent Williams と Tom Epperly には C++ クラスサポートに関して; Ove Ewerlid には NUL のサポートに関して; Eric Hughes には複数バッファのサポートに関して、それぞれ感謝します。 .PP この作品は当初、私が CA Berkeley の Lawrence Berkeley Laboratory における Real Time Systems Group にいた時に作成されました。 私に協力してくれた方々に感謝します。 .PP コメントは vern@ee.lbl.gov に送って下さい。 diff --git a/ja_JP.eucJP/man/man1/paste.1 b/ja_JP.eucJP/man/man1/paste.1 index a03704254e..2d3506702f 100644 --- a/ja_JP.eucJP/man/man1/paste.1 +++ b/ja_JP.eucJP/man/man1/paste.1 @@ -1,112 +1,112 @@ .\" Copyright (c) 1989, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Adam S. Moskowitz and the Institute of Electrical and Electronics .\" Engineers, Inc. .\" .\" 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. .\" .\" @(#)paste.1 8.1 (Berkeley) 6/6/93 .\" %FreeBSD: src/usr.bin/paste/paste.1,v 1.4.2.2 2001/03/06 12:52:54 ru Exp % -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/paste.1,v 1.5 2001/05/14 01:07:26 horikawa Exp $ .\" .Dd June 6, 1993 .Dt PASTE 1 .Os .Sh 名称 .Nm paste .Nd ファイルの対応する行または引き続く行を併合する .Sh 書式 .Nm .Op Fl s .Op Fl d Ar list .Ar .Sh 解説 .Nm ユーティリティは、与えられた入力ファイルの対応する行の結合を、 最後のファイル以外の改行文字を一つのタブ文字に置き換えながら行い、 その結果の行を標準出力に書き出します。 入力ファイルの一つが EOF (ファイルの終り) に達した場合、 他のファイルの終了までそのファイルは空行が有るかのように 扱われます。 .Pp 以下のようなオプションがあります。 .Bl -tag -width Fl .It Fl d Ar list デフォルトのタブの代わりに改行文字を置換するための文字として使います。 .Ar list 中の文字は巡回するように使われます。つまり、 .Ar list の文字が終った時には最初の文字が再び使われます。 これは、(デフォルトの操作では) 最後の入力ファイルからの行まで、もしくは ( .Fl s オプション使用時には) 各ファイルの最後の行が表示されるまで続きます。 最後の行を表示したところで、 .Nm は、選択された文字の最初から操作を行います。 .Pp 以下の特殊文字を記述可能です。 .Pp .Bl -tag -width flag -compact .It Li \en 改行文字 .It Li \et タブ文字 .It Li \e\e バックスラッシュ文字 .It Li \e0 空文字列 (ヌル文字ではありません) .El .Pp 上記以外の文字は、バックスラッシュ付きの場合その文字自身を表現します。 .It Fl s 別個の入力ファイルの全行の結合を、コマンドラインに並んだ順に行います。 入力ファイル中の、最後の行以外の全ての行の改行文字は、 -.Dl d +.Fl d オプションが 指定されていない場合は、タブ文字で置き換えられます。 .El .Pp .Ql Fl が、1 つ以上の入力ファイルに指定された場合、標準入力が使われます。 標準入力は、一度に一行読み込まれ、巡回的に .Ql Fl の各実体として使われます。 .Sh 診断 .Nm は、成功した場合 0 で終了します。 また、エラーが起こった場合は 0 より大きな値で終了します。 .Sh 関連項目 .Xr cut 1 .Sh 規格 .Nm ユーティリティは、 .St -p1003.2 互換であることが期待されています。 diff --git a/ja_JP.eucJP/man/man1/rlogin.1 b/ja_JP.eucJP/man/man1/rlogin.1 index b7d60713c0..0366d74c06 100644 --- a/ja_JP.eucJP/man/man1/rlogin.1 +++ b/ja_JP.eucJP/man/man1/rlogin.1 @@ -1,223 +1,223 @@ .\" Copyright (c) 1983, 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. .\" .\" @(#)rlogin.1 8.1 (Berkeley) 6/6/93 .\" %FreeBSD: src/usr.bin/rlogin/rlogin.1,v 1.11.2.4 2001/03/06 12:52:55 ru Exp % -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/rlogin.1,v 1.9 2001/05/14 01:07:28 horikawa Exp $ .\" .Dd June 6, 1993 .Dt RLOGIN 1 .Os BSD 4.2 .Sh 名称 .Nm rlogin .Nd リモートログイン .Sh 書式 .Nm .Op Fl 468DEKLdx .Op Fl e Ar char .Op Fl i Ar localname .Op Fl k Ar realm .Op Fl l Ar username .Ar host .Sh 解説 .Nm は、リモートホスト .Ar host 上で端末セッションを開始します。 .Pp .Nm はまず最初に、以下に述べる Kerberos 認証メカニズムの使用を試みます。 もしリモートホストが Kerberos をサポートしていなければ、 標準的な Berkeley .Pa rhosts 認証メカニズムが用いられます。 オプションは以下の通りです: .Bl -tag -width flag .It Fl 4 IPv4 アドレスのみを使用します。 .It Fl 6 IPv6 アドレスのみを使用します。 .It Fl 8 常に 8 ビットの入力データパスを有効にします。 .Fl 8 オプションを指定しなければ、 リモート側のストップ/スタートキャラクタが ^S/^Q の場合を除き、 パリティビットが取り除かれます。 .It Fl D ソケットオプション TCP_NODELAY を有効にします。 ネットワーク負荷を高めますが、対話の応答性が向上します。 .It Fl E いかなるキャラクタもエスケープキャラクタとして認識されないようにします。 .Fl 8 オプションと組み合わせて用いると、 完全に透過的なコネクションとなります。 .It Fl K .Fl K 全ての Kerberos 認証を無効にします。 .It Fl L rlogin セッションを .Dq litout モードで動作させます ( .Xr tty 4 参照)。 .It Fl d リモートホストとの通信に用いる TCP ソケットの ソケットデバッグ機能 ( .Xr setsockopt 2 参照)を有効にします。 .It Fl e エスケープキャラクタを指定します。デフォルトは .Dq ~ です。 指定はリテラルキャラクタあるいは \ennn 形式の 8 進数で行います。 .It Fl i .Fl i オプションにより、認証に使用する別のローカル名を、呼び出し元が指定可能です。 本オプションは、UID 0 のプロセスのみに制限されます。 .It Fl k .Xr krb_realmofhost 3 で決定されるリモートホストの管理領域 (realm) ではなく、指定した管理領域 .Ar realm におけるリモートホスト用チケットを得るように rlogin に要求します。 -./" UNIX MAGAZINE 95/4 および FreeBSD Handbook の日本語訳を参考に、 -./" realm -> 管理領域としています。 -./" Kazuo Horikawa 20 Aug 1997 +.\" UNIX MAGAZINE 95/4 および FreeBSD Handbook の日本語訳を参考に、 +.\" realm -> 管理領域としています。 +.\" Kazuo Horikawa 20 Aug 1997 .It Fl l .Fl l オプションにてリモートログインに別の .Ar username を指定します。 このオプションを指定しないと、ローカルなユーザ名を使用します。 .It Fl x rlogin セッションを通してやりとりされる全てのデータを .Tn DES 暗号化します。 これは応答時間や .Tn CPU 使用率に影響を及ぼしますが、 より高いセキュリティが得られます。 .El .Pp .Dq Ao escape char Ac Ns \&. という形式の行を入力すると、 リモートホストから切断します。 同様に .Dq Ao escape char Ac Ns ^Z という行を入力すると .Nm セッションを中断し、 .Dq Ao escape\ char Ac Ao delayed-suspend\ char Ac を入力すると rlogin の送信部分のみ中断し、リモートシステムからの出力は有効に保ちます。 デフォルトでは はチルダ .Pq Dq ~ であり、 は普通 control-Y .Pq Dq ^Y です。 .Pp エコーは全てリモートサイト側で行われ、(遅延を除き) .Nm は透過的です。 ^S/^Q によるフロー制御や割り込み発生時の入出力のフラッシュは 正しく処理されます。 .Sh KERBEROS 認証 各ユーザはホームディレクトリの .Pa .klogin ファイル中に各個人の認証リストを持つことができます。 このファイルの各行は .Ar principal.instance@realm という形式で Kerberos の principal 名を持っています。 もし最初のユーザが .Pa .klogin 中のある principal 名に認証されれば、 そのアカウントでのアクセスが許可されます。 もし .Pa .klogin ファイルが存在しなければ、次の principal .Ar accountname.@localrealm でのアクセスが許可されます。 これ以外の場合、 .Xr login 1 の場合と同様、リモートマシンにおいてログインとパスワードのプロンプトが 表示されます。 いくつかのセキュリティ問題を回避するため、 .Pa .klogin ファイルはリモートユーザの所有としなければなりません。 .Pp Kerberos 認証に失敗すると、警告メッセージが表示され、 標準的な Berkeley .Nm 方式が用いられます。 .Sh 環境変数 .Nm では以下の環境変数が用いられます: .Bl -tag -width TERM .It Ev TERM ユーザの端末タイプを決定します。 .El .Sh 関連項目 .Xr login 1 , .Xr rsh 1 , .Xr telnet 1 , .Xr setsockopt 2 , .Xr kerberos 3 , .Xr krb_realmofhost 3 , .Xr krb_sendauth 3 , .Xr ruserok 3 , .Xr tty 4 , .Xr auth.conf 5 , .Xr hosts.equiv 5 , .Xr hosts 5 , .Xr rlogind 8 , .Xr rshd 8 .Sh 関連ファイル .Bl -tag -width /etc/hosts -compact .It Pa /etc/hosts .It Pa /etc/hosts.equiv .It Pa /etc/auth.conf .It Ev $HOME Ns Pa /.rhosts .It Ev $HOME Ns Pa /.klogin .El .Sh 歴史 .Nm コマンドは .Bx 4.2 から登場しました。 .Pp IPv6 サポートを WIDE/KAME プロジェクトが追加しました。 .Sh バグ .Nm rlogin は近い将来 .Xr telnet 1 に置き換えられるでしょう。 .Pp より多くの環境が引き継がれるべきです。 diff --git a/ja_JP.eucJP/man/man1/ssh.1 b/ja_JP.eucJP/man/man1/ssh.1 index 7acd08c4a5..dae724cc66 100644 --- a/ja_JP.eucJP/man/man1/ssh.1 +++ b/ja_JP.eucJP/man/man1/ssh.1 @@ -1,1227 +1,1226 @@ .\" -*- nroff -*- .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland .\" All rights reserved .\" .\" As far as I am concerned, the code I have written for this software .\" can be used freely for any purpose. Any derived versions of this .\" software must be clearly marked as such, and if the derived work is .\" incompatible with the protocol description in the RFC file, it must be .\" called by a name other than "ssh" or "Secure Shell". .\" .\" Copyright (c) 1999,2000 Markus Friedl. All rights reserved. .\" Copyright (c) 1999 Aaron Campbell. All rights reserved. .\" Copyright (c) 1999 Theo de Raadt. 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. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. .\" .\" $OpenBSD: ssh.1,v 1.64 2000/10/16 21:46:31 markus Exp $ .\" %FreeBSD: src/crypto/openssh/ssh.1,v 1.4.2.7 2001/03/15 09:27:00 asmodai Exp % -.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/ssh.1,v 1.3 2001/04/30 02:07:02 horikawa Exp $ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/ssh.1,v 1.4 2001/05/26 02:41:01 horikawa Exp $ .\" .Dd September 25, 1999 .Dt SSH 1 .Os .Sh 名称 .Nm ssh .Nd OpenSSH セキュア シェル クライアント (リモート ログイン プログラム) .Sh 書式 .Nm ssh .Op Fl l Ar ログイン名 .Op Ar ホスト名 | ユーザ@ホスト名 .Op Ar コマンド .Pp .Nm ssh .Op Fl afgknqtvxACNPTX246 .Op Fl c Ar 暗号化オプション .Op Fl e Ar エスケープ文字 .Op Fl i Ar identityファイル .Op Fl l Ar ログイン名 .Op Fl o Ar オプション .Op Fl p Ar ポート .Oo Fl L Xo .Sm off .Ar ポート : .Ar ホスト : .Ar ホスト側ポート .Sm on .Xc .Oc .Oo Fl R Xo .Sm off .Ar ポート : .Ar ホスト : .Ar ホスト側ポート .Sm on .Xc .Oc .Op Ar ホスト名 | ユーザ@ホスト名 .Op Ar コマンド .Sh 解説 .Nm (Secure Shell、セキュア シェル) はリモートマシンにログイン したり、リモートマシン上でコマンドを実行するためのプログラムです。 これは rlogin と rsh を置き換えるためのもので、安全でないネットワーク 上にある、2つの信頼されていないホスト間で、暗号化された安全な通信を 提供します。X11 の接続や任意の TCP/IP ポートなども安全な通信路を通して 転送できます。 .Pp .Nm は指定された .Ar hostname に接続し、ログインします。 ユーザはリモートマシンに対して、自分自身であることを証明しなければいけません。 これにはプロトコルのバージョンに応じたいくつかの方法のうちのひとつを使います: .Pp .Ss SSH プロトコル バージョン 1 .Pp 最初に、ユーザがリモートマシン上の .Pa /etc/hosts.equiv あるいは .Pa /etc/ssh/shosts.equiv に記されているマシンからログインしてきて、 さらにそのユーザの名前が両方のホストで同じならば、そのユーザは すぐにログインが許可されます。 つぎに、 .Pa \&.rhosts か .Pa \&.shosts がリモートホスト上のそのユーザのホームディレクトリに存在していて、そこに クライアントホスト名とそのホスト上におけるユーザ名が記されている 行が存在すれば、そのユーザはログインが許可されます。 この形の認証はふつう、これのみではサーバから許可されません。 安全ではないからです。 .Pp 2番目の (原始的な) 認証方法は .Pa rhosts または .Pa hosts.equiv を RSA ベースのホスト認証と組み合わせて使うことです。これは もしログインが .Pa $HOME/.rhosts , .Pa $HOME/.shosts , .Pa /etc/hosts.equiv , あるいは .Pa /etc/ssh/shosts.equiv で許可されていて、さらにサーバ側がクライアントのホスト鍵 ( .Sx 関連ファイル セクションの .Pa /etc/ssh/ssh_known_hosts と .Pa $HOME/.ssh/known_hosts の項を参照) を確認できる場合、そして その場合のみログインが許可されます。この認証方法を使うと IP 詐称、 DNS 詐称 および 経路詐称 によるセキュリティーホールをふさぐことができます。 [管理者の方へ: .Pa /etc/hosts.equiv や .Pa $HOME/.rhosts 、 そして一般的な rlogin/rsh プロトコルは 本質的に危険であり、セキュリティを考えるなら禁止しなくてはいけません] .Pp 3つめの認証方法として、 .Nm は RSA ベースの認証をサポートしています。 このやりかたは公開鍵暗号化技術に基づいています: 暗号システムのなかには、 暗号化/復号化をそれぞれ別の鍵をつかって行うことができ、さらに復号化用の 鍵から暗号化用の鍵が推測することはできないものがあります。RSA はこのような 暗号システムのひとつで、以下のようなアイデアで認証を行います。 まず各ユーザは、認証のための「秘密鍵」「公開鍵」とよばれる鍵の対を つくります。サーバは公開鍵を知っていますが、秘密鍵のほうはユーザだけが 知っているものとします。 .Pa $HOME/.ssh/authorized_keys ファイルには、ログインが許可されている公開鍵の一覧が書かれています。 ユーザがログインするさい、 .Nm プログラムは、そのユーザがどの鍵をつかって 認証したがっているかをサーバに伝えます。サーバはこの鍵が許される ものであるかどうかをチェックし、もし許されているならば、ユーザ (実際には ユーザのために走っている .Nm プログラム) に「チャレンジ(挑戦)」と 呼ばれるものを送ります。これはサーバ側で生成された でたらめな数で、 ユーザの公開鍵によって暗号化されています。このチャレンジはユーザが もっている正しい秘密鍵によってのみ復号化することができます。ユーザ側の クライアントはこのときチャレンジを秘密鍵をつかって復号化してみせること で、秘密鍵の中身をサーバ側に見せることなしに、それを持っていることを サーバに対し証明するのです。 .Pp .Nm は RSA の認証プロトコルを自動的に行います。ユーザは .Xr ssh-keygen 1 をつかって自分の RSA 鍵の対をつくります。このプログラムは秘密鍵を ユーザのホームディレクトリ内の .Pa $HOME/.ssh/identity ファイルに、公開鍵を .Pa $HOME/.ssh/identity.pub ファイルに格納します。ユーザはつぎにこの .Pa identity.pub をリモートマシン上の自分のホームディレクトリにある .Pa $HOME/.ssh/authorized_keys ファイルにコピーしなくてはいけません ( .Pa authorized_keys ファイルは従来の .Pa $HOME/.rhosts ファイルに相当し、1行ごとにひとつの鍵を格納します。 各行はかなり長くなることもあります)。 この後、ユーザはパスワードなしでログインすることができます。 RSA 認証は rhosts 認証よりもずっと安全です。 .Pp RSA 認証を使う際にいちばん便利なのは「認証エージェント」と呼ばれる ものを使うことかもしれません。詳しくは .Xr ssh-agent 1 のマニュアルページを見てください。 .Pp もし他の認証方法が失敗した場合、 .Nm はユーザにパスワードを要求します。 このパスワードはチェックのためリモートホストに送られますが、 すべての通信は暗号化されているため、ネットワークを盗聴している何物かに よってパスワードが見られてしまうようなことはありません。 .Pp .Ss SSH プロトコル バージョン 2 .Pp ユーザがバージョン 2 のプロトコルで接続したときには、別の認証方法が 使えるようになります: まず、クライアントは公開鍵の方法で認証しようと こころみます。これが失敗するとパスワード認証が使われます。 .Pp 公開鍵による方法は前節に書かれている RSA 認証と似ていますが、 特許のある RSA アルゴリズムの代わりに DSA アルゴリズムが使われる点が 違っています。クライアントは .Pa $HOME/.ssh/id_dsa にある自分の DSA 秘密鍵をつかってセッション識別子と 呼ばれるものに署名し、この結果をサーバに送ります。 サーバはこれに対応する公開鍵が .Pa $HOME/.ssh/authorized_keys2 ファイルに存在するかどうかチェックし、 もし両方の鍵が存在してその署名が正しければアクセスを許可します。 セッション識別子は共有 Diffie-Hellman 値によって与えられ、この値は クライアントとサーバのみが知ることができます。 .Pp 公開鍵認証が失敗するか、それが使えなかった場合、リモートホストには そのユーザであることを証明するパスワードが送られます。この プロトコル 2 の実装はまだ Kerberos や OPIE 認証をサポートしていません。 .Pp プロトコル 2 は信頼性 (通信は 3DES, Blowfish, CAST128 または Arcfour によって暗号化されます) や、データが途中で改竄されることを防ぐための追加の機構 (hmac-sha1, hmac-md5) を提供しています。プロトコル 1 では 接続の清潔さを保証する強力なメカニズムは存在しないことに注意してください。 .Pp .Ss ログインセッション と リモート実行 .Pp ユーザの同一性が確認されると、サーバは与えられたコマンドを実行するか、 そのマシンにログインさせユーザに標準のリモートマシンでのシェル環境を 与えます。リモートコマンドあるいはシェルにおけるすべての通信は 自動的に暗号化されます。 .Pp 仮想端末が割り当てられる場合 (通常のログイン時)、ユーザは .Ic ~. という文字を入力することによって接続を切ることができ、 .Ic ~^Z によって .Nm をサスペンドできます。 転送されている接続の一覧は .Ic ~# によって見ることができます。X11 あるいは TCP/IP 接続が 終了するのを待つためにセッションがブロックされているときは、 .Ic ~& を入力することによって ssh をバックグラウンド化することができます (ユーザのシェルがまだ生きているときに これをやってはいけません、 シェルが止まってしまいます)。 使用可能なエスケープ文字の一覧は、 .Ic ~? . で見ることができます。 .Pp チルダ記号そのものを 1回入力するには .Ic ~~ を押します (あるいは上で述べられている以外の文字をチルダに続けます)。 エスケープ文字は、必ず改行の直後に来なければ特別な文字とは 解釈されません。このエスケープ文字は設定ファイルかコマンドラインから 変更することもできます。 .Pp もし仮想端末が割り当てられていない場合、そのセッションは透過となり、 バイナリファイルもきちんと送ることができます。ほとんどのシステムでは エスケープ文字を .Dq none に設定すると、たとえ端末が使われていても 透過なセッションにすることができます。 .Pp セッションは、リモートマシン上のコマンドやシェルが完了し、すべての X11 や TCP/IP 接続が閉じられると終了します。このときのリモート プログラムの終了状態が .Nm ssh の終了状態となります。 .Pp .Ss X11 と TCP の転送 .Pp ユーザが X11 を使っている (環境変数 .Ev DISPLAY が設定されている) 場合には、 X11 ディスプレイへの接続をリモート側に転送するようにできます。これは、 シェル (あるいはコマンド) から起動された X11 プログラムはどれも 暗号化された通信路を通って、本当の X サーバへの接続はローカルマシン上から なされるようになるのです。ユーザは .Ev DISPLAY を手動で設定すべきではありません。 X11 接続の転送はセキュリティを弱めるためデフォルトでは禁止されていますが、 コマンドラインあるいは設定ファイルによって有効にできます。 .Pp .Nm によって設定された .Ev DISPLAY の値はサーバマシン上を指すように なっていますが、ディスプレイ番号は 0 より大きい値になっているでしょう。 これは正常な状態です。 .Nm は暗号化された通信路を介して接続を転送するため、 サーバマシン上に .Dq プロキシーの X サーバをつくるのでこうなるのです。 .Pp また、 .Nm は自動的にサーバマシン上で Xauthority の情報を用意します。 この目的のため、 .Nm はランダムな認証クッキーを生成し、サーバ側の Xauthority に格納し、接続が転送されるときはすべてこのクッキーを持たせる ようにします。そして接続が開かれるときに、これが本物のクッキーと置き換わる ようにするのです。本物の認証クッキーがサーバ側に送られることは 決してありません (し、それに暗号化されないままでクッキーが送られるような こともありません)。 .Pp ユーザが認証エージェントを使っている場合、そのエージェントへの接続は それがコマンドラインあるいは設定ファイルで禁止されていない限り、 自動的にリモート側に転送されます。 .Pp 安全な通信路をつかった任意の TCP/IP 接続への転送は、 コマンドラインあるいは設定ファイルで指定します。TCP/IP 転送の 応用として、ひとつは電子預金への安全な接続が考えられます。ほかにも ファイヤーウォールを抜けるなどの使いみちがあるでしょう。 .Pp .Ss サーバ認証 .Pp .Nm はこれまでに使った鍵すべてが入っているデータベースを 自動的に保持し、チェックします。これらのうち、RSA ホスト鍵はユーザの ホームディレクトリにある .Pa $HOME/.ssh/known_hosts に格納され、 DSA ホスト鍵は .Pa $HOME/.ssh/known_hosts2 に格納されます。 加えて、 .Pa /etc/ssh/ssh_known_hosts および .Pa /etc/ssh/ssh_known_hosts2 が既知のホストとして自動的にチェックされます。 新しいホストはユーザ側のファイルに自動的に追加されていきます。 もし、あるホストの鍵が変わっていた場合、 .Nm は警告を発してパスワード認証を禁止します。 これはトロイの木馬がユーザのパスワードを盗むのを防ぐためです。 この仕組みのもうひとつの目的は、どこか他の場所で man-in-the-middle 攻撃が行われ、暗号化がたくみにかわされてしまうのを防ぐことです。 .Cm StrictHostKeyChecking オプション (下記参照) はホスト鍵が知られていなかったり、 それが変更されていた場合のログインを防ぐために使われます。 .Sh オプション .Bl -tag -width Ds .It Fl a 認証エージェントの接続を転送することを禁止します。 .It Fl A 認証エージェントの接続を転送することを許可します。 これは設定ファイルによってホストごとに指定することも可能です。 .It Fl c Ar blowfish|3des このセッションで使われる暗号化の方法を指定します。デフォルトでは .Ar 3des が使われます。これが安全であると考えられているためです。 .Ar 3des (トリプル des) は 3つの異なる鍵をつかって 暗号化-復号化-暗号化を行うもので、 .Nm ではもう完全にはサポートされなくなった .Ar des 暗号化よりもおそらく安全です。 .Ar blowfish は高速なブロック暗号化アルゴリズムで、非常に安全のようです。 そして .Ar 3des よりかなり速くなります。 .It Fl c Ar "3des-cbc,blowfish-cbc,arcfour,cast128-cbc" さらにプロトコル バージョン 2 では、暗号化の方法をカンマで 区切ったリストにより優先順位をつけて指定することができます。 プロトコル バージョン 2 は 3DES, Blowfish および CAST128 を それぞれ CBC モードでサポートし、Arcfour もサポートします。 .It Fl e Ar ch|^ch|none 仮想端末を使うセッションにおけるエスケープ文字を指定します (デフォルトは .Ql ~ )。エスケープ文字は行頭に来たときのみ認識されます。 エスケープ文字のあとにドット ( .Pq Ql \&. ) がくると接続が閉じられ、control-Z がくると接続はサスペンドされます。 そのエスケープ文字自身がきたときには、その文字が 1回だけ送られます。 エスケープ文字を .Dq none に指定するとあらゆるエスケープ機能が禁止され、 セッションは完全に透過になります。 .It Fl f .Nm がコマンドを実行する直前に、 バックグラウンドに移行するよう指示します。これは .Nm にパスワードあるいはパスフレーズを入力する必要はあるものの、 そのコマンド自体はバックグラウンドで実行させたいときに有用です。 これは .Fl n オプションも含んでいます。 リモートサイトで X11 プログラムを起動させる方法では、 .Ic ssh -f host xterm などとやるのがおすすめです。 .It Fl g リモートホストが転送されたローカルなポートに接続することを許可します。 .It Fl i Ar identityファイル RSA 認証のさい、 identity (秘密鍵) を読むファイルを指定します。 デフォルトはユーザのホームディレクトリにある .Pa $HOME/.ssh/identity になっています。identity ファイルは設定ファイルによって、 ホストごとに指定することもできます。複数の .Fl i オプションを指定することも可能です。 (設定ファイルで複数の鍵を指定することもできます。) .It Fl k Kerberos チケットおよび AFS トークンの転送を禁止します。 これは設定ファイルによって、ホストごとに指定することもできます。 .It Fl l Ar ログイン名 リモートマシン上でログインするユーザ名を指定します。 これは設定ファイルによって、ホストごとに指定することもできます。 .It Fl n 標準入力を .Pa /dev/null からリダイレクトします (つまり標準入力からの読み込みを禁止します)。 .Nm がバックグラウンドで走るときには、このオプションを指定しなくてはいけません。 よくある手としては、リモートマシン上で X11 のプログラムを 走らせるときにこれを使うことです。たとえば、 .Ic ssh -n shadows.cs.hut.fi emacs & で emacs を立ち上げると、X11 接続は暗号化された経路を 介して自動的に転送されます。 .Nm プログラムはこの後バックグラウンドに移行するでしょう。 (これは .Nm がパスワードあるいはパスフレーズを訊いてくるときには使えません。 .Fl f オプションも参照してください。) .It Fl N リモートコマンドを実行しません。これはポート転送のみを 行いたい場合に有用です (プロトコル バージョン 2 のみ)。 .It Fl o Ar オプション 設定ファイルと同じ形式でオプションを与えたいときに使用します。 コマンドラインオプションでは指定できないオプションを指定したいときに 有用です。このときのオプションは設定ファイルの 1行と 同じ形式である必要があります。 .It Fl p Ar ポート リモートホストに接続するポート番号あるいはポート名を指定します。 これは設定ファイルによって、ホストごとに指定することもできます。 .It Fl P 外に向けての接続を、特権ポートでないポートから張るようにします。 これはファイヤーウォールが特権ポートからの接続を禁じているときに 使われます。このオプションを指定すると、 .Cm RhostsAuthentication および .Cm RhostsRSAAuthentication オプションがオフになることに注意してください。 .It Fl q 静かなモード。すべての警告メッセージや診断メッセージは 抑制されます。致命的なエラーだけが表示されます。 .It Fl t 強制的に仮想端末を割り当てます。これはリモートマシン上で 任意の画面ベースのプログラムを実行するときに非常に有用かもしれません。 たとえば、メニューサービスを実装するときなどに。 .It Fl T 仮想端末の割り当てを禁止します (プロトコル バージョン2 のみ)。 .It Fl v 冗長表示モード。 .Nm が進行中のデバッグメッセージを表示するようにします。 これは接続や認証、設定の問題をデバッグするときに助けとなります。 またユーザがパスワードとして "s/key" を入力したときに、 .Xr skey 1 チャレンジを表示するためにも冗長モードが使われます。 複数の -v オプションをつけると冗長性が増します。最大は 3個です。 .It Fl x X11 の転送を禁止します。 .It Fl X X11 の転送を許可します。 これは設定ファイルによって、ホストごとに指定することもできます。 .It Fl C すべてのデータを圧縮するよう指示します (標準入力、標準出力、 標準エラー出力、転送された X11 や TCP/IP 接続を含む)。圧縮に 使われるアルゴリズムは .Xr gzip 1 と同じもので、 .Dq レベル は .Cm CompressionLevel (下記参照) によって制御できます。 圧縮は、モデムその他の遅い接続においては必要ですが、高速な ネットワークでは速度が低下するだけです。このデフォルト値は 2ホスト間ごとに設定ファイルに書くことができます。下の .Cm Compress オプションを参照してください。 .It Fl L Ar ポート:ホスト:ホスト側ポート 与えられたローカル (クライアント) ホスト上のポートが、 与えられたリモートホスト上のポートに転送されるようにします。 これはローカル側で .Ar port に listen (接続受け付け) 用の ソケットを割り当てることにより行われます。 このポートに向けて行われた接続はいつでも 安全な通信路を経由してリモートマシン上に到達し、そこから .Ar host のポート .Ar hostport に接続されるようになります。 ポート転送は設定ファイルによっても指定できます。特権ポートを 転送できるのは root だけです。IPv6 アドレスはこれとは別の 形式で指定されます: .Ar port/host/hostport .It Fl R Ar ポート:ホスト:ホスト側ポート 与えられたリモート (サーバ) ホスト上のポートが、 与えられたローカルホスト上のポートに転送されるようにします。 これはリモート側で .Ar port に listen (接続受け付け) 用の ソケットを割り当てることにより行われます。 このポートに向けて行われた接続はいつでも 安全な通信路を経由してローカルマシン上に到達し、ここから .Ar host のポート .Ar hostport に接続されるようになります。 ポート転送は設定ファイルによっても指定できます。特権ポートを 転送できるのは、リモートマシン上に root としてログインしているときだけです。 .It Fl 2 .Nm がプロトコル バージョン 2 のみを使うよう強制します。 .It Fl 4 .Nm が IPv4 アドレスのみを使うよう強制します。 .It Fl 6 .Nm が IPv6 アドレスのみを使うよう強制します。 .El .Sh 設定ファイル .Nm は次のものから、この順序で設定情報を取得します: コマンドライン オプション、ユーザの設定ファイル .Pq Pa $HOME/.ssh/config 、そしてシステムの設定ファイル .Pq Pa /etc/ssh/ssh_config 。各設定項目は、ぞれそれ 最初に取得されたものが使われます。設定ファイルはいくつかのセクションに 分かれており、これらは .Dq Host 指定子により区切られていて、その 指定子のパターンどれかにマッチするホストに対応するセクションが 適用されます。マッチさせるホストの名前は、コマンドラインから 与えられたものになります。 .Pp 各設定項目で最初に得られた値が使われるので、よりホストに特化した宣言を ファイルの先頭近くに置くようにし、一般的なものを後に置くのが よいでしょう。 .Pp 設定ファイルは以下のような形式になっています: .Pp 空行、および .Ql # で始まる行は、コメントとみなされます。 .Pp それ以外の場合、この行は .Dq キーワード 引数 の形式とみなされます。 とりうるキーワードとその意味は以下のとおりです (設定ファイルは大文字小文字を区別することに注意してください) : .Bl -tag -width Ds .It Cm Host (ホスト) これ以後の宣言 (次の .Cm Host キーワードが現れるまで) を、 このキーワードに与えられるパターンのどれかにマッチするホストのみに 限定します。パターン中では .Ql \&* と .Ql ? がワイルドカードとして使えます。単独の .Ql \&* は、あらゆるホストに対してのデフォルトになります。 ここでのホストとは、コマンドライン引数で与えられた .Ar hostname のことです (つまりホスト名はマッチングの前に正規化されたりしません)。 .It Cm AFSTokenPassing (AFS トークンパス) リモートホストに AFS トークンを渡すかどうかを指定します。 このキーワードがとりうる引数の値は .Dq yes あるいは .Dq no のどちらかになります。 .It Cm BatchMode (バッチ処理モード) これが .Dq yes に設定されているときは passphrase および password の 問い合わせが禁止されます。このオプションはスクリプトその他の バッチ処理中で、パスワードを打ち込むユーザがいない場合に有用です。 引数の値は .Dq yes あるいは .Dq no です。 .It Cm CheckHostIP (ホスト IP のチェック) このフラグが .Dq yes に設定されていると、ssh は .Pa known_hosts ファイルにあるホストの IP アドレスも加えてチェックするようになります。 これによって、DNS 詐称によりホスト鍵が変えられたことを 検出できます。このオプションが .Dq no に設定されている場合は、このチェックは行われません。 .It Cm Cipher (暗号化アルゴリズム) プロトコル バージョン 1 のセッションで使われる暗号化の アルゴリズムを指定します。現在のところ .Dq blowfish および .Dq 3des がサポートされており、デフォルトは .Dq 3des です。 .It Cm Ciphers (複数の暗号化アルゴリズム) プロトコル バージョン 2 で許可されている暗号化アルゴリズムの 優先順位を指定します。複数の暗号化アルゴリズムを指定する場合は カンマで区切ってください。デフォルトは .Dq 3des-cbc,blowfish-cbc,cast128-cbc,arcfour です。 .It Cm Compression (圧縮) データ圧縮を行うかどうかを指定します。 引数の値は .Dq yes あるいは .Dq no です。 .It Cm CompressionLevel (圧縮レベル) 圧縮をおこなうさいの圧縮レベルを指定します。この引数がとる値は 整数の 1 (高速) から 9 (遅いが高圧縮) までです。デフォルトの 値は 6 で、ほとんどのアプリケーションにはこれで充分です。 この値の意味は .Xr gzip 1 と同じです。 .It Cm ConnectionAttempts (接続試行回数) 接続を試みる回数 (1秒に一回) を指定します。これを越えると ssh は rsh に移行するか、終了してしまいます。この値は整数で なければなりません。これは、ときどき接続に失敗する環境での スクリプトなどに有用です。 .It Cm DSAAuthentication (DSA 認証) DSA 認証を行うかどうかを指定します。この引数の値は .Dq yes か .Dq no . です。DSA 認証は DSA identity ファイルが存在するときにのみ 試されます。このオプションはプロトコル バージョン 2 にしか適用されません。 .It Cm EscapeChar (エスケープ文字) エスケープ文字を設定します (デフォルトは .Ql ~ )。エスケープ文字はコマンドラインからも指定できます。 この引数には 1つの文字か、 .Ql ^ に1文字を付けたもの、あるいはエスケープ文字の使用をすべて禁止するなら .Dq none を指定します (これはその接続を、バイナリ データに対して透過にすることになります)。 .It Cm FallBackToRsh (rsh への退行) .Nm 経由の接続が拒否された (connection refused、リモートホスト上で .Xr sshd 8 が listen していない) とき、かわりに (このセッションが 暗号化されていないという適切な警告のあとで) .Xr rsh 1 を自動的に使うべきかどうかを指定します。この引数の値は .Dq yes または .Dq no です。 .It Cm ForwardAgent (エージェント転送) 認証エージェントへの接続を、(それがあれば) リモートマシンに 転送するかどうかを指定します。この引数の値は .Dq yes あるいは .Dq no でなければならず、デフォルトは .Dq no です。 .It Cm ForwardX11 (X11 転送) X11 接続を自動的に安全な通信路へリダイレクトし、 .Ev DISPLAY を設定するかどうかを指定します。この引数の値は .Dq yes あるいは .Dq no でなければならず、デフォルトは .Dq no です。 .It Cm GatewayPorts (ゲートウェイポート) ローカルから転送されたポートに、リモートホストが接続することを 許可するかどうかを指定します。この引数の値は .Dq yes または .Dq no でなければならず、デフォルトは .Dq no です。 .It Cm GlobalKnownHostsFile (大域的 known_host ファイル) .Pa /etc/ssh/ssh_known_hosts のかわりに使用するファイルを指定します。 .It Cm HostName (本当のホスト名) ログインする本当のホスト名を指定します。これはホストの ニックネームや省略形を指定するときに使います。デフォルトは コマンドラインから与えられた名前になります。 (コマンドライン、 .Cm HostName 指示子の両方とも) 数字の IP アドレスでもかまいません。 .It Cm IdentityFile (identity ファイル) ユーザの RSA 認証用 identity (秘密鍵) を読むファイルを 指定します (デフォルトはユーザのホームディレクトリにある .Pa $HOME/.ssh/identity です)。加えて、認証のさいには認証エージェントによって現れる identity も 使われます。ファイル名ではユーザのホームディレクトリを表すのに チルダ表記を使うことができます。設定ファイルには複数の identity が 指定されていてもよく、この場合すべての identity が順に試されます。 .It Cm IdentityFile2 (identity ファイル 2) ユーザの DSA 認証用 identity (秘密鍵) を読むファイルを 指定します (デフォルトはユーザのホームディレクトリにある .Pa $HOME/.ssh/id_dsa です)。ファイル名はユーザのホームディレクトリを 表すのにチルダ表記を使うことができます。 設定ファイルには複数の identity が指定されていてもよく、 この場合すべての identity が順に試されます。 .It Cm KeepAlive (生かしておく) システムが相手のマシンに keepalive メッセージを送るべきかどうかを 指定します。これが送られると、接続の異常終了や相手マシンの クラッシュが通知されるようになります。しかし、これは 経路が一時的にダウンしていても接続が死んでいるということになってしまい、 これが気にいらない人もいます。 .Pp デフォルトは .Dq yes です (keepalive を送る)。クライアントはネットワークがダウンするか、 リモートホストが落ちると通知してきます。 これはスクリプト中では重要であり、多くのユーザもそれを望んでいます。 .Pp Keepalive を禁止するには、 クライアントとサーバ両方の側の設定ファイルでこの値を .Dq no にする必要があります。 .It Cm KerberosAuthentication (Kerberos 認証) Kerberos 認証を使うべきかどうか指定します。この引数の値は .Dq yes あるいは .Dq no です。 .It Cm KerberosTgtPassing (Kerberos TGT パス) Kerberos TGT がサーバを転送するかどうかを指定します。これは その Kerberos サーバが実際に AFS kaserver であるときのみ 機能します。この引数の値は .Dq yes あるいは .Dq no です。 .It Cm LocalForward (ローカル転送) ローカルマシンの TCP/IP ポートを、安全な通信路を経由させて リモートマシン上から与えられた host:port に転送するよう指示します。 最初の引数はポートで、2番目の引数には host:port の形で指定します。 ポート転送は複数指定することができ、コマンド ラインから追加指定することもできます。特権ポートを転送できるのは スーパーユーザだけです。 .It Cm LogLevel (ログレベル) .Nm ssh が出力するログメッセージの冗長性レベルを指定します。 とりうる値は次のとおりです: QUIET, FATAL, ERROR, INFO, VERBOSE および DEBUG。 デフォルトでは INFO です。 .It Cm NumberOfPasswordPrompts (パスワード試行回数) パスワードを何回まで訊くかを指定します。 これを越えるとあきらめてしまいます。 このキーワードの引数は整数でなくてはなりません。 デフォルト値は 3 です。 .It Cm PasswordAuthentication (パスワード認証) パスワード認証を使うかどうかを指定します。この引数の値は .Dq yes または .Dq no です。このオプションはプロトコル バージョン 1 と 2 の 両方に適用されることに注意してください。 .It Cm Port (ポート) リモートホストに接続するときのポート番号あるいはポート名を指定します。 デフォルトは 22 です。 .It Cm Protocol (プロトコル) .Nm がサポートすべきプロトコルのバージョンの優先順位を指定します。 とりうる値は .Dq 1 と .Dq 2 で、複数のバージョンを 指定するときはカンマで区切ってください。デフォルト値は .Dq 1,2 です。これは .Nm がまず始めにバージョン 1 を試し、それが失敗した場合に バージョン 2 を試すことを指示しています .It Cm ProxyCommand (プロキシ コマンド) サーバに接続するのに使用するコマンドを指定します。コマンド文字列は .Pa /bin/sh によって実行され、これは行末まで書くことができます。 コマンド文字列では、 .Ql %h は接続するホスト名に置換され、 .Ql %p はポート番号あるいはポート名に置換されます。 コマンドは基本的に何でもよいのですが、標準入力から読み込み、 標準出力に書き込むようなものでなければいけません。 これは最終的にサーバマシン上で動いている .Xr sshd 8 に接続するか、どこか別の場所で .Ic sshd -i を起動させるようにします。ホスト鍵の管理は接続されているホストの HostName を使って行われます (デフォルトでは、これはユーザが タイプした名前になります)。このオプションを使うと、 .Cm CheckHostIP は使用できませんので注意してください。 [訳注: それと rhosts 認証も使用できなくなります。これは 特権ポートから接続を張る方法がないためです] .Pp .It Cm RemoteForward (リモート転送) リモートマシン上の TCP/IP ポートを、安全な通信路を経由させて ローカルマシン上から与えられた host:post に転送するよう指示します。 最初の引数はポートで、2番目の引数には host:port の 形で指定します。ポート転送は複数指定することができ、コマンド ラインから追加指定することもできます。特権ポートを転送できるのは スーパーユーザだけです。 .It Cm RhostsAuthentication (rhosts 認証) Rhosts ベースの認証を試みるかどうかを指定します。この宣言は クライアント側にのみ影響し、セキュリティにまったくなんの 効果もないことに注意してください。rhosts 認証を禁止すると、 rhosts 認証が使われないときに、遅い接続での認証にかかる時間が 短縮されます。ほとんどのサーバでは RhostsAuthentication は 安全でないという理由で許可されていません (RhostsRSAAuthenticationを参照)。 この引数の値は .Dq yes または .Dq no です。 .It Cm RhostsRSAAuthentication (rhosts-RSA 認証) RSA ホスト認証を使った Rhosts ベースの認証を試みるかどうかを 指定します。これはほとんどのサイトでの基本的な認証方法です。 この引数の値は .Dq yes または .Dq no です。 .It Cm RSAAuthentication (RSA 認証) RSA 認証を試みるかどうかを指定します。この引数の値は .Dq yes または .Dq no にしてください。RSA 認証は identity が存在するか、 認証エージェントが動いているときにのみ試されます。このオプションは プロトコル バージョン 1 にしか適用されないので注意してください。 .It Cm SkeyAuthentication (s/key 認証) .Xr skey 1 認証を使うかどうかを指定します。引数の値は .Dq yes あるいは .Dq no になります。デフォルトは .Dq no です。 .It Cm StrictHostKeyChecking (厳格なホスト鍵チェック) このフラグが .Dq yes に設定されていると、 .Nm が .Pa $HOME/.ssh/known_hosts および .Pa $HOME/.ssh/known_hosts2 に自動的にホスト鍵を追加することはしなくなり、ホスト鍵が変わっている ホストには接続を拒否します。これはトロイの木馬攻撃に対する最大の 防御になります。しかし適切な .Pa /etc/ssh/ssh_known_hosts や .Pa /etc/ssh/ssh_known_hosts2 ファイルをもっていないものの、 しょっちゅう新しいホストに接続するような場合は、この機能は余計な お世話になります。基本的にこのオプションは、ユーザが新しいホストを 手で追加するよう強制するものです。ふつうこのオプションは 禁止されていて、新しいホストは自動的に known_hosts ファイルに 追加されていきます。どちらの場合も known_hosts にあるホスト鍵は 自動的に検証されます。この引数の値は .Dq yes または .Dq no です。 .It Cm UsePrivilegedPort (特権ポートの使用) 外に向けての接続をおこなうときに、 特権ポートを使用するかどうかを指定します。この引数の値は .Dq yes または .Dq no で、デフォルトは .Dq yes になっています。このオプションを .Dq no にすると .Cm RhostsAuthentication および .Cm RhostsRSAAuthentication が使えなくなることに注意してください。 [訳注: .Cm ProxyCommand を使っているときも特権ポートは 使えないため、これらの認証は使えなくなります。] .It Cm User (ユーザ) ログインするユーザ名を指定します。これは異なるマシン上で 異なるユーザ名を持っているような場合に有用です。 これでコマンドラインからわざわざユーザ名を与えなくてもすみます。 .It Cm UserKnownHostsFile (known_hosts ファイルの使用) .Pa $HOME/.ssh/known_hosts の代わりに使われるファイルを指定します。 .It Cm UseRsh (rsh の使用) このホストに対して rlogin/rsh が使われるべきかどうかを指定します。 相手のホストが .Nm プロトコルをまったくサポートしていないということもあり得ます。 こうなったとき .Nm .Xr rsh 1 を exec します。このオプションが指定されていると、 これ以外のすべてのオプション ( .Cm HostName を除く) は無視されます。とりうる値は .Dq yes あるいは .Dq no です。 .It Cm XAuthLocation (xauth の位置) .Xr xauth 1 プログラムの場所を指定します。デフォルトは .Pa /usr/X11R6/bin/xauth です。 .El .Sh 環境変数 .Nm はふつう以下の環境変数を設定します: .Bl -tag -width Ds .It Ev DISPLAY .Ev DISPLAY 変数は X11 サーバの場所を示しています。これは .Nm によって、 .Dq hostname:n という形の値が自動的にセットされます。 ここで hostname の部分はシェルが走っているホストを表しており、 n は n \*(>= 1 の整数です。 .Nm はX11 接続を安全な通信路で転送するために、この特別な値を使うのです。 ユーザはふつう DISPLAY を明示的に設定すべきではありません。 なぜならそうすると X11 の接続が安全でなくなってしまうからです (しかもユーザは認証に必要なクッキーを手でコピーしなければならなくなります)。 .It Ev HOME ユーザのホームディレクトリのパス名に設定されます。 .It Ev LOGNAME .Ev USER と同じです。この環境変数を使うシステムで互換性を保つために設定されます。 .It Ev MAIL ユーザのメールボックスを指しています。 .It Ev PATH デフォルトの .Ev PATH です。これは .Nm ssh のコンパイル時に指定されます。 .It Ev SSH_AUTH_SOCK 認証エージェントと通信するのに使われる Unix ドメインソケットの パスを表しています。 .It Ev SSH_CLIENT 接続の末端にあるクライアントの識別子です。この変数にはスペースで 区切られた 3つの値が入っています: クライアントの IP アドレス、 クライアントのポート、および サーバのポート。 .It Ev SSH_TTY 現在のシェルあるいはコマンドに割り当てられている tty の名前 (端末装置へのパス) にセットされます。現在のセッションが端末を 持たない場合、この変数はセットされません。 .It Ev TZ デーモンが起動したとき、現在の時間帯を表すタイムゾーン変数が セットされていると、それがここにセットされます (つまりデーモンは その値を新規の接続に渡します)。 .It Ev USER ログインしているユーザ名にセットされます。 .El .Pp これらに加えて、 .Nm は .Pa $HOME/.ssh/environment を読み込み、 .Dq VARNAME=value という形式の行を環境変数に追加します。 .Sh 関連ファイル .Bl -tag -width Ds .It Pa $HOME/.ssh/known_hosts ユーザがログインしたことのあるホストすべてのホスト鍵 ( .Pa /etc/ssh/ssh_known_hosts にないもの) を記録します。 .Xr sshd 8 も見てください。 .It Pa $HOME/.ssh/identity, $HOME/.ssh/id_dsa RSA および DSA 認証用のユーザの identity (秘密鍵)を格納します。 これらのファイルには他人に見られるとまずいデータが入っているため、 そのユーザには読めても、他人からはアクセスできないようにしてください (読み込み/書き込み/実行属性ともに)。 .Nm は、他人がアクセスできるようになっている identity ファイルは無視するので注意してください。 鍵を作成するときにパスフレーズを指定することも可能です。この パスフレーズはファイル中の見られるべきでない部分を、 3DES を使って暗号化するのに用いられます。 .It Pa $HOME/.ssh/identity.pub, $HOME/.ssh/id_dsa.pub 認証のための公開鍵を格納します (鍵ファイルのうち公開できる 部分が可読形式で格納されています)。 .Pa $HOME/.ssh/identity.pub ファイルの内容は、RSA 認証を使ってログインしたいすべてのマシン上の .Pa $HOME/.ssh/authorized_keys ファイルに加えられていなければいけません。また、 .Pa $HOME/.ssh/id_dsa.pub ファイルの内容も同様に、 DSA 認証を使ってログインしたいすべてのマシン上にある .Pa $HOME/.ssh/authorized_keys2 ファイルに加えられている必要があります。 これらのファイルは見られてもよいため、他人が読めるように しておいてもかまいません (が必須ではないです)。これらのファイルが 自動的に使われることは決してなく、必要でもありません。これはただ ユーザの便宜をはかるために提供されています。 .It Pa $HOME/.ssh/config これはユーザごとの設定ファイルです。 このファイルの形式は上で説明されているものです。 このファイルは .Nm クライアントによって使われます。 このファイルはふつう特に見られてはまずい情報は含んでいません。 しかし望ましいパーミッションとしては、そのユーザからは 読み/書きが可能で、他人からはアクセス不可能に しておくのがよいでしょう。 .It Pa $HOME/.ssh/authorized_keys このユーザのログインに使われる RSA 公開鍵のリストです。この形式は .Xr sshd 8 のマニュアルで説明されています。 -このファイルのいちばん簡単な形式は、 -.pub 公開鍵ファイルと同じにすることです +このファイルのいちばん簡単な形式は、.pub 公開鍵ファイルと同じにすることです (つまり各行に、係数のビット数、公開されている指数、 係数およびコメントフィールドがスペースで区切られて 格納される)。これは見られても非常にまずいというものでは ありませんが、できればこのユーザからは読み/書きが可能で、 他人からはアクセス不可能なパーミッションに設定しておくのがよいでしょう。 .It Pa $HOME/.ssh/authorized_keys2 このユーザのログインに使われる DSA 公開鍵のリストです。この ファイルも見られて非常にまずいというものではありませんが、 このユーザからは読み/書きが可能で、他人からはアクセス不可能の パーミッションを設定しておくのがよいでしょう。 .It Pa /etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2 システム全体にわたる known hosts 鍵です。 .Pa /etc/ssh/ssh_known_hosts は RSA 鍵を、 .Pa /etc/ssh/ssh_known_hosts2 は DSA 鍵を格納します。 これらのファイルはシステム管理者によって用意され、その組織内で 使われるすべてのマシン用の公開ホスト鍵を格納するようになっているはずです。 このファイルは誰からも読めるようになっていなければいけません。 このファイルは 1行ごとに公開鍵を格納し、これは次のような 形式になっています (各フィールドはスペースで区切られます): システム名、係数のビット数、公開されている指数、係数、そして オプションとしてコメント用フィールド。同一のマシンにいくつかの 異なる名前が使われている場合は、それらをずべてカンマで区切って 列挙する必要があります。この形式は .Xr sshd 8 マニュアルページで説明されています。 .Pp .Xr sshd 8 がログイン時にクライアント側のホストを検証するさいには、 システムの正式な名前 (ネームサーバの返す canonical name) が 使われます。これ以外の名前が必要なのは次のような理由によります。 .Nm は、鍵を検査する前にユーザの指定した名前を正式なものに変換する、 ということをしません。何物かがネームサーバに仕掛けを入れれば、 これを使ってホスト認証をだますことが可能になってしまうからです。 .It Pa /etc/ssh/ssh_config システム全体にわたる設定ファイルです。このファイルはユーザの設定 ファイルでは指定されなかった値を提供し、また設定ファイルを 持たないユーザのためのデフォルトにもなります。このファイルは 誰にでも読み込み可能でなければいけません。 .It Pa $HOME/.rhosts このファイルは .Pa \&.rhosts 認証で使われる、ログインを許可されたホスト名と ユーザの対の一覧です。(このファイルは rlogin と rsh でも 使われるので、安全ではありません。) ファイル中の各行はホスト名 (ネームサーバが返す正式な形式のもの) およびそのホストでの ユーザ名をスペースで区切って格納します。 ユーザのホームディレクトリが NFS パーティション上にあるような マシンでは、このファイルは誰にでも読み込み 可能でなければなりません。 .Xr sshd 8 はこれを root として読むからです。 加えて、このファイルはそのユーザの所有でなければならず、 他の人が書き込み可能であってはいけません。 ほとんどのマシンにおける推奨されるパーミッションは、そのユーザが 読み書き可能で、他の人はアクセス不可能というものです。 .Pp デフォルトでは、 .Xr sshd 8 で \s+2.\s0rhosts 認証が許可されるには、 まず RSA ホスト認証に成功することが必要になっています。 サーバマシンが .Pa /etc/ssh/ssh_known_hosts の中にそのクライアントのホスト鍵を持っていない場合は、 .Pa $HOME/.ssh/known_hosts ファイルにそれを入れておくことができます。 これをするのにいちばん簡単なのは、サーバマシンから ssh を使ってクライアントマシンに接続し直すことです。 こうすることにより、そのホスト鍵が自動的に .Pa $HOME/.ssh/known_hosts に追加されます。 .It Pa $HOME/.shosts このファイルは .Pa \&.rhosts とまったく同じように扱われます。このファイルは、 .Xr rlogin 1 や .Xr rsh 1 ではログインできないようにしつつ、 .Nm で rhosts 認証を使えるようにするためにあります。 .It Pa /etc/hosts.equiv このファイルは .Pa \&.rhosts 認証で使われます。ここには正式なホスト名が各行に記載されています (この形式の完全な説明は .Xr sshd 8 マニュアルページにあります)。このファイルに クライアントホストが載っていると、クライアント側とサーバ側の ユーザ名が同じ場合にログインは自動的に許可されます。普通は RSA ホスト認証が成功してからでなくてはいけません。このファイルは root のみが書き込めるようにしておくべきです。 .It Pa /etc/ssh/shosts.equiv このファイルは .Pa /etc/hosts.equiv とまったく同じように扱われます。このファイルは .Nm を使うが、rsh/rlogin は使わないユーザのログインを許可するのに有用です。 .It Pa /etc/ssh/sshrc このファイルのコマンドは、ユーザがログインしてシェル (あるいはコマンド) が開始する直前に .Nm によって実行されます。より詳しい情報については .Xr sshd 8 マニュアルページを見てください。 .It Pa $HOME/.ssh/rc このファイルのコマンドは、ユーザがログインしてシェル (あるいはコマンド) が開始する直前に .Nm によって実行されます。より詳しい情報については .Xr sshd 8 マニュアルページを見てください。 .It Pa $HOME/.ssh/environment 環境変数の追加定義を格納します。上の .Sx 環境変数 の節を見てください。 .It Pa libcrypto.so.X.1 ssh が動作するためには、このライブラリで RSA アルゴリズムの サポートを含むバージョンが必要です。 .El .Sh 作者 OpenSSH は Tatu Ylonen によってリリースされたオリジナルの (フリー) ssh 1.2.12 から派生したものです。しかしバグがとり除かれ、より新しい機能が 追加されています。1.2.12 がリリースされるとすぐに、オリジナルの ssh は だんだんと制限されたライセンスになっていき、フリーのバージョンに対する 要求が生まれました。 .Pp このバージョンの OpenSSH は… .Bl -bullet .It 何らかの制限的事項 (つまり特許など。 .Xr ssl 8 を参照) がついているコンポーネントはすべて、 ソースコードから直接削除されています。 かわりにライセンスあるいは特許つきのコンポーネントは、 外部ライブラリから取り込まれます。 .It SSH プロトコル 1.5 と 2 をサポートするようにアップデートされました。 これで他のすべての SSH クライアントやサーバと互換になります。 .It .Xr kerberos 8 認証とチケットパスの追加サポートが含まれています。 .It .Xr skey 1 を用いた、使い捨てパスワード (one-time password) 認証をサポートしています。 .El .Pp OpenSSH は以下の人々によって製作されました: Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo de Raadt, そして Dug Song。 .Pp SSH プロトコル 2 のサポートは Markus Friedl の手によるものです。 .Sh 日本語訳 新山 祐介 (euske@cl.cs.titech.ac.jp) 2000/11/23 .Pp 当マニュアルページは氏のご好意により .Fx 日本語マニュアルに収録させていただいています。 翻訳についてのご意見、ご指摘がありましたら新山氏 、および .Fx jpman プロジェクト までお送りください。 .Sh 関連項目 .Xr rlogin 1 , .Xr rsh 1 , .Xr scp 1 , .Xr ssh-add 1 , .Xr ssh-agent 1 , .Xr ssh-keygen 1 , .Xr telnet 1 , .Xr sshd 8 , .Xr ssl 8 diff --git a/ja_JP.eucJP/man/man1/uulog.1 b/ja_JP.eucJP/man/man1/uulog.1 index 71d51ea8af..0fe050dfdf 100644 --- a/ja_JP.eucJP/man/man1/uulog.1 +++ b/ja_JP.eucJP/man/man1/uulog.1 @@ -1,87 +1,87 @@ ''' %FreeBSD: src/gnu/libexec/uucp/uulog/uulog.1,v 1.3 1999/08/27 23:33:57 peter Exp % -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/uulog.1,v 1.6 2001/05/14 01:07:30 horikawa Exp $ .TH uulog 1 "Taylor UUCP 1.06" .SH 名称 uulog \- UUCP のログの記述を表示する .SH 書式 .B uulog [-#] [-n lines] [-sf system] [-u user] [-DSF] [--lines lines] [--system system] [--user user] [--debuglog] [--statslog] [--follow] [--follow=system] [standard UUCP options] .SH 解説 .B uulog プログラムは UUCP ログファイル中の記述を表示するために使われます。特定の システム、もしくは特定のユーザに関する記述を選択することができます。この プログラムを使うことで、過去に処理行列に投入したジョブに何が起ったのかを 調べることができます。 .SH オプション .B uulog には次のオプションを与えることができます。 .TP 5 .B \-#, \-n lines, \-\-lines lines ここで `#' は数字で、たとえば `-10' などと指定します。ログファイルの最後 から、指定された行数が表示されます。デフォルトではファイル全てを表示しま す。`-f'、`-F' もしくは `--follow' オプションを指定した場合は例外で、こ の場合にはデフォルトで 10 行表示します。 .TP 5 .B \-s system, \-\-system system 指定されたシステムに関係する記述のみを表示します。 .TP 5 .B \-u user, \-\-user user 指定されたユーザに関係する記述のみを表示します。 .TP 5 .B \-D, \-\-debuglog デバッグログファイルを表示します。 .TP 5 .B \-S, \-\-statslog 統計ログファイルを表示します。 .B \-F, \-\-follow オプションを指定するとログファイルを永遠に表示し続けます。ログファイルに 新しい行が追加されると、それを表示します。 .TP 5 .B \-f system, \-\-follow=system ログファイルを永遠に表示し続けます。ただし、指定されたシステムに関する記 述のみを表示します。 .TP 5 .B \-X type .TP 5 .B \-\-debug type .TP 5 .B \-I file .TP 5 .B \-\-config file .TP 5 .B \-v, \-\-version .TP 5 .B \-\-help 標準的な UUCP オプションです。 ただし .B uulog はデバッグ種別を指定するのに一般の `-x' ではなく `-X' を使うことに注意し てください。 .PP ある程度 .B uulog の操作は UUCP プログラムによって生成されるログファイルの形式に依存します。 これはコンパイル時にオプションで指定されます。 UUCP プログラムが HDB 形式のログファイルを用いるようにコンパイルされてい た場合 -.BB uulog +.B uulog は以下のように変更します。 .PP 新しいオプション `-x' と `--uuxqtlog' は .B uuxqt ログファイルを表示するのに使われます。 .PP 全てのオプションを省略することはできません。 `--system'、 `-f'、 `--follow=system'、 `-D'、 `--debuglog'、 `-S'、 `--statslog'、 `-x' もしくは `--uuxqtlog' のうち一つは用いられなければな りません。 .PP システムに関係なく全てのログファイルを表示するために `--system ANY' オプ ションを用いることができます。 .SH 関連項目 uucp(1) .SH 作者 Ian Lance Taylor (ian@airs.com) このマニュアルは Taylor UUCP 1.06 texinfo ドキュメントに基づいています。 diff --git a/ja_JP.eucJP/man/man1/zmore.1 b/ja_JP.eucJP/man/man1/zmore.1 index e92521fb27..978a965e7e 100644 --- a/ja_JP.eucJP/man/man1/zmore.1 +++ b/ja_JP.eucJP/man/man1/zmore.1 @@ -1,140 +1,140 @@ .\" %FreeBSD: src/gnu/usr.bin/gzip/zmore.1,v 1.4 1999/08/27 23:35:56 peter Exp % .\" -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/zmore.1,v 1.5 2001/05/14 01:07:31 horikawa Exp $ .TH ZMORE 1 .SH 名称 zmore \- 圧縮したままファイルを閲覧する .SH 書式 .B zmore [ name ... ] .SH 解説 .I zmore は、圧縮を施したファイルもしくはプレーンテキストファイルの 閲覧に使用するフィルタです。 .I zmore は、 .I compress, pack, gzip によって圧縮されたファイルを閲覧することが出来ますが、 非圧縮ファイルも閲覧することが出来ます。 もし、ファイルが見つからない時には .I zmore は同じ名前に .gz, .z, .Z が付いたファイルを探します。 .PP .I zmore は各々の画面の一番下に --More-- と表示をして停止します。 リターンキーを押すともう 1 行表示されます。 スペースキーを押すと次の画面が表示されます。 他の操作は後で説明します。 .PP -.zmore +.I zmore は端末の性質やデフォルトのウィンドウの大きさを決めるために .I /usr/share/misc/termcap を見ます。 端末が 24 行表示できる時には、 デフォルトのウィンドウの大きさは 22 行となります。 .I zmore は、通常はページャとして .I more を用いますが 環境変数 PAGER を指定することで .I less のような他のページャを使用することが出来ます。 .PP .I zmore が停止した時に使える他の文字とその効果は以下の通りです。 (\fIi\fP は整数の引数である。デフォルトは 1 です): .PP .IP \fIi\|\fP さらに .I i 行表示します。 (引数が与えられなければ次の画面を表示します) .PP .IP ^D さらに 11 行表示します (``スクロールする'')。 .I i が与えられていれば、スクロールする大きさは \fIi\|\fP になります。 .PP .IP d ^D (control-D) と同じです。 .PP .IP \fIi\|\fPz \fIi\|\fP が与えられた時に 新しいウィンドウの大きさになる以外は、スペースキーを押すのと同じです。 ウィンドウの大きさは現在のファイルが終了した時にデフォルトに戻ります。 .PP .IP \fIi\|\fPs \fIi\|\fP 行飛ばして画面に表示します。 .PP .IP \fIi\|\fPf \fIi\fP 画面分飛ばして画面に表示します。 .PP .IP "q または Q" 現在のファイルを読むのを終了します。もしあるならば次のファイルに行きます。 .PP .IP "e または q" --More--(Next file: .IR file ) が表示された時に、このコマンドは zmore を終了させます。 .PP .IP s --More--(Next file: .IR file ) が表示された時に、このコマンドは次のファイルをスキップし、続けます。 .PP .IP = 現在の行番号を表示します。 .PP .IP \fIi\|\fP/expr 入力した正規表現 \fIexpr\fP の \fIi\|\fP 番目に現れるものを検索します。 もし、それが見付からなかったら、 .I zmore は (あるならば) 次のファイルに行きます。 そうでなければ、その正規表現が見付かった場所の前 2 行を先頭として、 検索結果を表示します。 ユーザが文字を消す事は正規表現の編集の時に用いられるかもしれません。 最初のカラムの前の文字を消す事は検索コマンドをキャンセルする事になります。 .PP .IP \fIi\|\fPn 最後に入力した正規表現の \fIi\|\fP 番目に現れるものを検索します。 .PP .IP !command シェルをよびだし、\fIcommand\|\fP を実行します。 コマンドに出て来る `!' は直前に行ったシェルのコマンドに置き換えられます。 "\\!" の文字列が "!" に置き換えられます。 .PP .IP ":q or :Q" 現在のファイルを読むのを終了します。もしあるならば次のファイルに行きます。 (q や Q と同じです)。 .PP .IP . (ドット) 直前のコマンドを繰り返します。 .PP コマンドはすぐに効果が現れます。つまり、リターンキーを押す必要がありません。 コマンド文字列を与えるまでに、ユーザは行消去文字を入力し、 数字の引数を消去するかも知れません。 また、ユーザは消去文字を入力し、 --More-- メッセージを再表示するかもしれません。 .PP 出力は端末画面に送られている時はいつでも、 ユーザは終了キーを押す事ができます。(普通はcontrol\-\\) .I zmore は出力を止め、いつもの --More-- を表示します。 ユーザはそこで通常の形式で上記のコマンドの 1 つを入力します。 終了信号が送られると端末画面の出力を待っていたキューの中の文字は 消去されるために、いくつかの出力はこれが行われると失われてしまいます。 .PP 端末出力が連続して行われるように、端末はプログラムによって .I noecho モードにセットされます。 あなたがタイプした / と ! 以外のコマンドは端末に表示されません。 .PP 標準出力がテレタイプで無い時は、 .I zmore はヘッダ各々のファイルの前に印刷される以外は .I zcat のように働きます。 .SH 関連ファイル .DT /etc/termcap 端末データベース .SH 関連項目 more(1), gzip(1), zdiff(1), zgrep(1), znew(1), zforce(1), gzexe(1) diff --git a/ja_JP.eucJP/man/man2/getrlimit.2 b/ja_JP.eucJP/man/man2/getrlimit.2 index 5fa2452109..bb70fe838c 100644 --- a/ja_JP.eucJP/man/man2/getrlimit.2 +++ b/ja_JP.eucJP/man/man2/getrlimit.2 @@ -1,192 +1,192 @@ .\" Copyright (c) 1980, 1991, 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. .\" .\" @(#)getrlimit.2 8.1 (Berkeley) 6/4/93 .\" %FreeBSD: src/lib/libc/sys/getrlimit.2,v 1.10.2.1 2000/04/22 17:06:55 phantom Exp % .\" -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/getrlimit.2,v 1.3 2001/05/14 01:08:21 horikawa Exp $ .Dd June 4, 1993 .Dt GETRLIMIT 2 .Os BSD 4 .Sh 名称 .Nm getrlimit , .Nm setrlimit .Nd 最大システムリソース消費を制御する .Sh ライブラリ -.Ld libc +.Lb libc .Sh 書式 .Fd #include .Fd #include .Fd #include .Ft int .Fn getrlimit "int resource" "struct rlimit *rlp" .Ft int .Fn setrlimit "int resource" "const struct rlimit *rlp" .Sh 解説 現在のプロセス、およびそれが作成する各プロセスによるシステムリソースの 消費限度は、 .Fn getrlimit 呼び出しで取得することができ、 .Fn setrlimit 呼び出しで設定できます。 .Pp .Fa resource パラメータは次のうちの 1 つです。 .Bl -tag -width RLIMIT_FSIZEAA .It Li RLIMIT_CORE 作成できる .Xr core 5 ファイルの最大サイズ (バイト単位) .It Li RLIMIT_CPU 各プロセスが使用する CPU 時間の最大量 (秒単位) .It Li RLIMIT_DATA プロセス用のデータセグメントの最大サイズ (バイト単位)。 これは、プログラムがそのブレークを .Xr sbrk 2 システムコールでどのくらい遠くまで延長できるかを定義します。 .It Li RLIMIT_FSIZE 作成できるファイルの最大サイズ (バイト単位) .It Li RLIMIT_MEMLOCK プロセスが .Xr mlock 2 関数を使用して、プロセスをメモリにロックできる 最大サイズ (バイト単位)。 .It Li RLIMIT_NOFILE このプロセスが開けるファイルの最大数 .It Li RLIMIT_NPROC このユーザ ID が同時に利用できるプロセスの最大数 .It Li RLIMIT_RSS 増加させて良いプロセスの常駐セットサイズの最大サイズ (バイト単位)。 これはプロセスに与えられる物理メモリの量に制限を課します。 メモリが逼迫してシステムがメモリを回収する際に、 宣言された常駐セットサイズを越えるプロセスを回収対象として選択します。 .It Li RLIMIT_STACK プロセスのスタックセグメントの最大サイズ (バイト数)。これによって、 プログラムのスタックセグメントをどのくらい延長できるか定義できます。 スタック延長はシステムによって自動的に実行されます。 .It Li RLIMIT_SBSIZE このユーザが使用できるソケットバッファの最大サイズ (バイト単位)。 このサイズは、ユーザがいつでも保持できるネットワークメモリ量を 制限しますので、したがって mbuf の使用量も制限します。 .El .Pp リソースリミットはソフトリミットおよびハードリミットとして 指定されます。ソフトリミットを越えた場合、 プロセスはシグナルを受信する可能性があります (例えば、CPU 時間またはファイルサイズを越えた場合) が、 ハードリミットに到達する (またはリソースリミットを修正する) まで実行を継続することはできます。 .Em rlimit 構造体を使用してリソースのハードリミットとソフトリミットを指定できます。 .Bd -literal -offset indent struct rlimit { rlim_t rlim_cur; /* 現在の (ソフト) リミット */ rlim_t rlim_max; /* rlim_cur の最大値 */ }; .Ed .Pp スーパユーザだけがリミットの最大値を大きくできます。 他のユーザは 0 から .Fa rlim_max の範囲内で .Fa rlim_cur を変更するか、または .Fa rlim_max を下げられるだけです (撤回はできません)。 .Pp リミットを .Dq 無制限 にする値は .Dv RLIM_INFINITY として定義されます。 .Pp この情報はプロセスごとの情報に保存されるので、 シェルが将来作成するすべてのプロセスに このシステムコールが影響を及ぼすためには、 このシステムコールをシェルが直接実行する必要があります。 このため .Ic limit は .Xr csh 1 の組み込みコマンドになっているのです。 .Pp システムは、通常の方法でリミットを超えようとするときに、 データまたはスタック空間を延長することを拒絶します。 データ空間リミットに到達すると .Xr brk 2 呼び出しは処理に失敗します。スタックリミットに到達すると、 プロセスはセグメント例外 .Pq Dv SIGSEGV を受信します。 シグナルスタックを使用するハンドラによって このシグナルが捕捉されない場合、このシグナルはプロセスを抹消します。 .Pp プロセスのソフトリミットより大きなファイルを 作成するファイルの入出力操作をすると書込みは失敗し、シグナル .Dv SIGXFSZ が生成されます。通常、これによってプロセスは終了しますが、 捕捉することもできます。 CPU 時間のソフトリミットを越えたとき、シグナル .Dv SIGXCPU が障害を起こしているプロセスに送信されます。 .Sh 戻り値 戻り値 0 は呼び出しが正常に完了し、リソースリミットを変更しているか、 またはリソースリミットを返していることを示します。 戻り値 -1 はエラーが起こったことを示し、 エラーコードはグローバル変数 .Va errno に保存されます。 .Sh エラー .Fn getrlimit および .Fn setrlimit は次の場合に失敗します。 .Bl -tag -width Er .It Bq Er EFAULT .Fa rlp で指定したアドレスが不正です。 .It Bq Er EPERM .Fn setrlimit に指定されたリミットがリミットの最大値を上昇させようとしましたが、 呼び出し側はスーパユーザではありません。 .El .Sh 関連項目 .Xr csh 1 , .Xr quota 1 , .Xr quotactl 2 , .Xr sigaltstack 2 , .Xr sigvec 2 , .Xr sysctl 3 .Sh 歴史 .Fn getrlimit 関数は .Bx 4.2 ではじめて登場しました。 diff --git a/ja_JP.eucJP/man/man5/bootptab.5 b/ja_JP.eucJP/man/man5/bootptab.5 index a3e33e8449..a67ab14abd 100644 --- a/ja_JP.eucJP/man/man5/bootptab.5 +++ b/ja_JP.eucJP/man/man5/bootptab.5 @@ -1,412 +1,412 @@ .\" Copyright (c) 1988, 1989, 1991 Carnegie Mellon University .\" .\" %FreeBSD: src/libexec/bootpd/bootptab.5,v 1.4.2.3 2001/03/05 18:21:59 ru Exp % .\" -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man5/bootptab.5,v 1.9 2001/05/14 01:09:27 horikawa Exp $ .Dd October 31, 1991 .Dt BOOTPTAB 5 .Os .Sh 名称 .Nm bootptab .Nd インターネットブートストラッププロトコルサーバのデータベース .Sh 解説 .Nm ファイルは、 .Xr bootpd 8 すなわちインターネットブートストラッププロトコルサーバの 設定データベースファイルです。 このフォーマットは .Xr termcap 5 のものに似ており、2 文字の大文字小文字を区別するタグシンボルが ホストパラメータを表現します。 これらのパラメータ宣言はコロン (:) によって分けられ、次のような形式になります。 .Pp .Dl "hostname:tg=value. . . :tg=value. . . :tg=value. . . ." .Pp ここで .Em hostname は実際の bootp クライアントの名前 (もしくは「ダミーエントリ」) であり、 .Em tg は 2 文字のタグシンボルです。 ダミーエントリは不正なホスト名 ("." を最初の文字とする名前) を持ち、 .Em tc=.dummy-entry 機構を介して他のエントリにデフォルト値を提供します。 ほとんどのタグの後には、上記のように等号と値を続ける必要があります。 値を伴わないブール形式のものもあります (すなわち .Em :tg: の形式です)。 現在、認識されるタグを示します: .Pp .Bl -tag -width xxx -compact .It bf ブートファイル .It bs 512 オクテットブロックでのブートファイルの大きさ .It cs クッキーサーバのアドレスリスト .It df メリットダンプファイル .It dn ドメイン名 .It ds ドメインネームサーバのアドレスリスト .It ef 拡張ファイル .It gw ゲートウェイのアドレスリスト .It ha ホストのハードウェアアドレス .It hd ブートファイルのホームディレクトリ .It hn クライントのホスト名をクライアントに送る .It ht ホストのハードウェアタイプ (Assigned Numbers RFC を参照) .It im インプレスサーバのアドレスリスト .It ip ホストの IP アドレス .It lg ログサーバのアドレスリスト .It lp LPR サーバのアドレスリスト .It ns IEN-116 ネームサーバのアドレスリスト .It nt NTP (時刻) サーバ (RFC 1129) .It ra 返答アドレスの上書き .It rl リソースロケーションプロトコルサーバのアドレスリスト .It rp ルートとしてマウントするルートパス .It sa クライアントが使用すべき TFTP サーバのアドレス .It sm ホストのサブネットマスク .It sw スワップサーバのアドレス .It tc テーブル継続 (同様の「テンプレート」ホストエントリを指します) .It td 「安全な」 TFTP サーバが使用するルートディレクトリ .It to 秒で表現した UTC からのオフセット .It ts タイムサーバのアドレスリスト .It vm ベンダマジッククッキーセレクタ .It yd YP (NIS) のドメイン名 .It ys YP (NIS) のサーバアドレス .El .Pp 包括的な .Pf T Em n タグもあります。ここで .Em n は RFC1084 のベンダフィールドタグ番号です。 これにより、まず .Nm bootpd を変更しなくとも、 RFC1084 に対する将来の拡張の利点をすぐに利用することができます。 包括的なデータは、 16 進数のストリームもしくはクォートされた .Tn ASCII 文字列として表現されます。 包括的なデータの長さは自動的に判定され、 RFC1084 スタイルのブートストラップリプライの適切なフィールドに挿入されます。 .Pp 以下のタグは空白で区切られた IP アドレスのリストを取ります: .Em cs , .Em ds , .Em gw , .Em im , .Em lg , .Em lp , .Em ns , .Em nt , .Em ra , .Em rl , .Em ts 。また .Em ip , .Em sa , .Em sw , .Em sm , .Em ys タグはそれぞれ単一の IP アドレスを取ります。 IP アドレスは全て標準のインターネット「ドット」表記で指定されます。 10 進数、8 進数、16 進数のいずれも使用可能です (8 進数は 0 から始まり、16 進数は '0x' または '0X' から始まります)。 IP アドレスは代りにホスト名で指定可能です。 この場合、 .Nm bootpd はそのホスト名の IP アドレスを得るために .Xr gethostbyname 3 を使用します。 もし .Em ip タグが指定されなかった場合、 .Nm bootpd はエントリ名をホスト名とすることにより IP アドレスを判定します。 (ダミーエントリは不正なホスト名とすることにより、 自動的な IP 検索を避けます) .Pp .Em ht タグは、10 進数・8 進数・16 進数の符号無し整数、 もしくは以下のいずれかのシンボル名をもって、 ハードウェアタイプコードを指定します。 .Em ethernet , .Em ether は 10Mb イーサネットを、 .Em ethernet3 , .Em ether3 は 3Mb の実験的イーサネットを、 .Em ieee802 , .Em tr , .Em token-ring は IEEE 802 ネットワークを、 .Em pronet は Proteon ProNET Token Ring を、 .Em chaos , .Em arcnet , .Em ax.25 は Chaos, ARCNET, AX.25 Amateur Radio networks を、それぞれ表現します。 .Em ha タグは、ホスト名もしくは数値形式で、ハードウェアアドレスを指定します。 数値形式は 16 進数で指定する .Em 必要があります 。可読性のためにピリオドを付けたり、前に '0x' を付けても良いです。 .Em ha タグの前に .Em ht タグがある必要があります (明示的でも暗黙的でもかまいません。後述の .Em tc 参照)。ハードウェアアドレスが指定されない場合、指定されたタイプが \&"ethernet" もしくは \&"ieee802" の場合、 .Nm bootpd は .Xr ether_hostton 3 を使用してハードウェアアドレスを決定しようとします。 .Pp ホスト名・ホームディレクトリ・ブートファイルは .Tn ASCII 文字列であり、 ダブルクォート (") で括ることもできます。 クライアントのリクエストおよび .Em hd シンボルと .Em bf シンボルの値は、bootp リプライパケットのブートファイルフィールドを サーバがどのように埋めるかを決定します。 .Pp クライアントがファイル名を指定した場合、それはそのまま残されます。 そうでない場合は、 .Em bf オプションが指定されていれば、その値がリプライパケットにコピーされます。 もし .Em hd オプションも指定されている場合には、 その値がリプライパケットにコピーされるブートファイルの前に付きます。 ブートファイルの存在確認は .Em bs Ns =auto オプションが使用されているときのみ行われます (ブートファイルサイズ確認のためです)。 ブートファイルが存在しようとしまいと、リプライは送られます。 .Pp 新しいバージョンの .Xr tftpd 8 では、 .Xr chroot 2 システムコールを使用してルートディレクトリを変更するという セキュリティ機能を提供します。 -.em td +.Em td タグは、 .Nm tftpd が使用するこの特殊ルートディレクトリを .Nm bootpd に通知するために使用します。 (代りに .Nm bootpd .Fl c Ar chdir オプションを使用したいかもしれません。) 実際、 .Em hd タグは .Em td タグにより指定されるルートディレクトリからの相対指定です。 例えば、BOOTP クライアントブートファイルの現実の絶対パスが .Pa /tftpboot/bootfiles/bootimage であり、 .Nm tftpd が .Pa /tftpboot を「安全な」ディレクトリとする場合、 .Pa bootptab では次のように指定します。 .Pp .Fl :td=/tftpboot:hd=/bootfiles:bf=bootimage: .Pp ブートファイルを直接 .Pa /tftpboot に置く場合には次のようにします。 .Pp .Dl :td=/tftpboot:hd=/:bf=bootimage: .Pp .Em sa タグは、あなたがクライアントに使用させたい特定の TFTP サーバの IP アドレスを 指定するために使用します。 このタグを指定しないと、 .Nm bootpd が実行されているのと同じマシンに対して TFTP を行うように、 .I bootpd はクライアントに指示します。 .Pp 時刻オフセット .Em to は、クライアントの UTC からのタイムゾーンオフセットを秒で表現した 符号付き 10 進数、 またはサーバのタイムゾーンオフセットを使用することを意味するキーワード .Em auto です。 .Em to シンボルをブール値として指定することは、 .Em auto を値として指定するのと同じ効果があります。 .Pp ブートファイルサイズ .Em bs は、10 進数・8 進数・16 進数の整数で ブートファイルのサイズを 512 オクテットブロックで表現したもの、 またはサーバが各リクエストに際して ブートファイルサイズを自動的に計算することを示すキーワード .Em auto です。 時刻オフセットと同じく、 .Em bs シンボルをブール値として指定することは、 .Em auto を値として指定するのと同じ効果があります。 .Pp ベンダマジッククッキーセレクタ ( .Em vm タグ) は以下のキーワードのいずれかを取ります。 .Em auto (ベンダ情報をクライアントリクエストから判別)、 .Em rfc1048 または .Em rfc1084 (常に RFC1084 スタイルのリプライを強制)、または .Em cmu (常に CMU スタイルのリプライを強制) です。 .Pp .Em hn タグは厳密にブール値のタグです。通常の等号および値を取りません。 このタグが存在すると、ホスト名を RFC1084 クライアントに送ることを意味します。 .Nm bootpd は、構成ファイルで指定されるホスト名全体を送ろうとします。 リプライパケットに収まらない場合、 名前は (存在するならば最初のピリオドまでの) ホストフィールドのみに縮められ、 再度試されます。 任意の長さに縮められたホスト名が送られてしまうということはありません (収まるものがない場合には、なにも送られません)。 .Pp しばしば、多くのホストエントリが特定のタグの共通の値を共有します (ネームサーバなど)。 これらのタグを何度も書くのではなく、 全体仕様を 1 つのホストエントリに記述してこれを .Em tc (テーブル継続) 機構を介して共有することができます。 多くの場合、このテンプレートエントリは実際には存在しないダミーホストであり、 bootp リクエストを送ることはありません。 この機能は、 .Xr termcap 5 で似た端末を記述するための .Em tc 機能に似ています。 .Pa termcap では最後のタグでなければなりませんが、 .Nm bootpd では .Em tc タグシンボルがホストエントリ中のどこにあらわれても良いことに注意してください。 ホストに対して明示的に指定した情報は、エントリ中の .Em tc タグシンボルの位置にかかわらず、これにより暗黙に指定される情報を上書きします。 .Em tc タグの値はホスト名もしくは構成ファイルで前に記述されている IP アドレスです。 .Pp .Em tc タグで暗示された特定のタグの削除が必要になることがあります。 これは .Em tag Ns @ 構造を使用することにより、 .Xr termcap 5 の場合と同様に .Em tag の効果を削除することにより実現できます。 例えば、IEN-116 ネームサーバ仕様を完全に無効にしたい場合には、 構成ファイルのエントリの適切な位置に .Em :ns@: を置きます。 .Em @ を使用して削除を行った後には、 .Em tc 機構を使用してそのタグを再度設定することができます。 .Pp 構成ファイル中の、空行および "#" で始まる行は無視されます。 ホストエントリは改行で分けられます。 単一のホストエントリは、 行がバックスラッシュ (\\) で終る場合に複数行にまたがることができます。 行が 80 文字を越えることも許されます。 タグは任意の順序で現われてかまいませんが、次のような例外があります。 ホスト名はエントリの最初のフィールドである必要があり、 ハードウェアタイプはハードウェアアドレスの前に指定する必要があります。 .Pp .Pa /etc/bootptab ファイルの例を示します: .Pp .Bd -literal -offset indent # Sample bootptab file (domain=andrew.cmu.edu) \&.default:\\ :hd=/usr/boot:bf=null:\\ :ds=netserver, lancaster:\\ :ns=pcs2, pcs1:\\ :ts=pcs2, pcs1:\\ :sm=255.255.255.0:\\ :gw=gw.cs.cmu.edu:\\ :hn:to=-18000: carnegie:ht=6:ha=7FF8100000AF:tc=.default: baldwin:ht=1:ha=0800200159C3:tc=.default: wylie:ht=1:ha=00DD00CADF00:tc=.default: arnold:ht=1:ha=0800200102AD:tc=.default: bairdford:ht=1:ha=08002B02A2F9:tc=.default: bakerstown:ht=1:ha=08002B0287C8:tc=.default: # Special domain name server and option tags for next host butlerjct:ha=08002001560D:ds=128.2.13.42:\\ :T37=0x12345927AD3BCF:\\ :T99="Special ASCII string":\\ :tc=.default: gastonville:ht=6:ha=7FFF81000A47:tc=.default: hahntown:ht=6:ha=7FFF81000434:tc=.default: hickman:ht=6:ha=7FFF810001BA:tc=.default: lowber:ht=1:ha=00DD00CAF000:tc=.default: mtoliver:ht=1:ha=00DD00FE1600:tc=.default: .Ed .Sh 関連ファイル .Bl -tag -width /etc/bootptab -compact .It /etc/bootptab .El .Sh "関連項目" .Xr bootpd 8 , .Xr tftpd 8 .br DARPA Internet Request For Comments RFC951, RFC1048, RFC1084, Assigned Numbers diff --git a/ja_JP.eucJP/man/man7/groff.7 b/ja_JP.eucJP/man/man7/groff.7 index ea42587eff..393c314ad4 100644 --- a/ja_JP.eucJP/man/man7/groff.7 +++ b/ja_JP.eucJP/man/man7/groff.7 @@ -1,2986 +1,2986 @@ .\" st -*- nroff -*- -.\" $FreeBSD$ +.\" $FreeBSD: doc/ja_JP.eucJP/man/man7/groff.7,v 1.5 2001/05/14 01:09:42 horikawa Exp $ .ig groff.7 This file is part of groff, the GNU roff type-setting system. Copyright (C) 2000 Free Software Foundation, Inc. written by Bernd Warken Last update: 17 May 2000 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being this .ig-section and AUTHOR, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the Free Documentation License is included as a file called FDL in the main directory of the groff source package. .\"WORD: diversion ディバージョン[groff.7] .\"WORD: divert 転換する(出力データを別の場所に貯め込むこと)[groff.7] .\"WORD: line adjustment 行の位置揃え[groff.7] .\"WORD: roff formatting system roff 清書システム[groff.7] .\"WORD: control line 制御行[groff.7] .\"WORD: formatting element 整形要素[groff.7] .\"WORD: in-line 行埋め込み式の[groff.7] .\"WORD: scale indicator 単位指定子[groff.7] .\"WORD: trap トラップ[groff.7] .\"WORD: no-break control character 非改行制御文字[groff.7] .\"WORD: center センタリングする(動詞)[groff.7] .\"WORD: special 特別フォント[groff.7] .\"WORD: leader リーダ(目次などで項目とページ番号の間に引く線)[groff.7] .\"WORD: intra-line skip 行間スキップ(行と行の間に入れる空き)[groff.7] .\"WORD: fill 行詰め(する)[groff.7] .\"WORD: built-in condition 組み込み条件式[groff.7] .\"WORD: baseline 基準線(文字位置の基準となる水平線)[groff.7] .. . .\" -------------------------------------------------------------------- .\" Setup .\" -------------------------------------------------------------------- . .if n \{\ . mso tmac.tty-char . ftr CR R . ftr CI I . ftr CB B .\} . .if '\*[.T]'dvi' \{\ . ftr CB CW .\} . .\" a comment macro which does nothing .de c .. . .\" a tab string .ds t "\t . .eo . .c text lines in macro definitions or bracketed sections \{...\} .de text . if 1 \&\$*\& .. . .de option . ds @tmp@ \f(CB\$1\fP . shift 1 . text \*[@tmp@]\$* . rm @tmp@ .. . .als shellcommand option . .c --------- characters --------- . .de character . ds @tmp@ \f(CB\$1\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de 'char . ds @tmp@ \(oq\f(CB\$1\fP\(cq . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de ''char . ds @tmp@ \(lq\f(CB\$1\fP\(rq . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .c --------- requests --------- . .c request synopsis .de REQ . ds @tmp@ \&\$1 . shift 1 . IP "\f(CB\&\*[@tmp@] \fP\f(CI\&\$*\fP" 10n . rm @tmp@ .. . .de request . ds @tmp@ \f(CB\$1\fP . shift 1 . text \*[@tmp@]\$* . rm @tmp@ .. . .c --------- macro or function arguments --------- . .de argument . ds @tmp@ \f(CI\$1\fP . shift 1 . while (\n[.$] >= 2) \{\ . as @tmp@ \/\f(CR\$1\fP\f(CI\,\$2\fP . shift 2 . \} . if \n[.$] .as @tmp@ \/\f(CR\$1\fP . text \*[@tmp@] . rm @tmp@ .. . .c argument followed by a numerical expression .de argterm . ds @tmp@ \f(CI\$1\fP\|\f(CR\$2\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .c --------- numerical elements --------- . .de number . ds @tmp@ \f(CR\$1\fP . shift 1 . text \*[@tmp@]\$* . rm @tmp@ .. . .de prefixednumber . ds @tmp@ \&\$1\ \f(CR\$2\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .als scaleindicator request . .de scalednumber . ds @tmp@ \f(CR\$1\fP\f(CB\$2\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .de operator . ds @tmp@ \(oq\f(CB\$1\fP\(cq . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .c --------- escape sequences --------- . .de esc[arg] . ds @tmp@ \f(CB\(rs\$1[\fP\f(CI\$2\fP\f(CB]\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .de esc(arg . ds @tmp@ \f(CB\(rs\$1(\fP\f(CI\$2\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .de escarg . ds @tmp@ \f(CB\(rs\$1\fP\f(CI\$2\fP . shift 2 . text \*[@tmp@]\$* . rm @tmp@ .. . .de esc[] . ds @tmp@ \f(CB\(rs[\fP\f(CI\$1\fP\f(CB]\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de esc( . ds @tmp@ \f(CB\(rs(\fP\f(CI\$1\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de esc . ds @tmp@ \f(CB\(rs\$1\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de (esc . ds @tmp@ \f(CB\(rs(\$1\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .de [esc] . ds @tmp@ \f(CB\(rs[\$1]\fP . shift . text \*[@tmp@]\$* . rm @tmp@ .. . .c escape sequence synopsis .de ESC . ds @tmp@ \&\$1 . shift 1 . IP "\f(CB\(rs\&\*[@tmp@]\fP\f(CI\&\$*\fP" . rm @tmp@ .. . .c synopsis for escape sequences with a long name .de ESC[] . ds @arg1@ \&\$1 . ds @arg2@ \&\$2 . shift 2 . IP "\f(CB\(rs\&\*[@arg1@][\fP\f(CI\&\*[@arg2@]\fP\f(CB]\&\$*\fP" . rm @arg1@ . rm @arg2@ .. . .c synopsis escape sequence with quoted argument . de ESCq . ds @tmp@ \&\$1 . shift 1 . IP "\f(CB\(rs\&\*[@tmp@]\(cq\fP\f(CI\h'-0.2m'\$*\/\fP\f(CB\(cq\fP" . rm @tmp@ .. . .c synopsis for 2-escapes (special characters) .de ESc . ds @tmp@ \$1 . TP 14n . text \f(CB\(rs(\&\*[@tmp@]\ \ \ \fP\fR\(\*[@tmp@]\fP . shift 1 . text \$*. . rm @tmp@ .. . .c --------- registers --------- . .c synopsis for registers .de REG . TP 10n . text \&\f(CR\(rsn[\fP\f(CB\$1\fP\f(CR]\fP . shift 1 .if \n[.$] \&\$* .. . .als register request . .c --------- warnings --------- . .als warning request . .c description of warnings .de Warning . ne (2v + 1) . TP 12n . text \f(CB\$1\fP . text \f(CI\$2\fP . br .. . .ec . .\" WORD: first measure 最初のステップ (音楽用語では第一小節) .\" -------------------------------------------------------------------- .\" Title .\" -------------------------------------------------------------------- . .TH GROFF 7 "7 December 2000" "Groff Version 1.16.1" .SH 名称 groff \- GNU roff 言語の簡易リファレンス . .\" -------------------------------------------------------------------- .SH 解説 .\" -------------------------------------------------------------------- .I groff とは、 .I GNU roff を表しており、roff 清書システムをフリーで実装したものです。 groff システムの概観ならびに背景については .BR roff (7) を参照してください。 .LP このドキュメントでは、groff 内で使用される、あらかじめ定義された roff 言語要素を簡潔に説明しているだけです。 古くからある機能と groff 拡張機能についての両方とも 扱っています。 .LP 歴史的に、 .I roff 言語 は .IR troff と呼ばれています。 .I groff は、古くからあるシステムと互換性を持ちつつ、独自の拡張機能も 提供しています。そのため GNU 版では、 .IR roff , .IR troff , .I groff 言語 という術語は同義として使うこともできるでしょう。 しかし、 .I troff は、どちらかと言えば古くからの機能に対して適用されるという 傾向があり、それに対して、 .I groff は GNU 拡張に重きを置いています。そして、 .I roff は、この言語の一般的な術語になっています。 .LP このファイルは、 .I groff .BR info (1) ファイルにある完全なドキュメントの簡易版に過ぎません。 info ファイルの方がより詳細で実情に近く、正確な情報を含んでいます。 .LP groff ドキュメントを書くために使う一般的な文法は比較的 やさしいのですが、 roff 言語の拡張機能を書くのは少々骨が折れるかもしれません。 .LP roff 言語は、行指向の言語です。 行には、制御行とテキスト行の 2 種類しかありません。 制御行は制御文字で始まります。制御文字は、デフォルトではピリオド .''char . あるいはシングルクォート .''char ' です。そのほかの文字で始まる行はすべてテキスト行です。 .LP .B 制御行 は、コマンドを表し、オプションで引数を取ることもあります。 制御行は、次のような文法になります。 先頭の制御文字の後には、コマンド名を続けることができます。 引数は、もしあれば、コマンド名や他の引数と空白で分けられます。 例えば、次のようにします。 .RS .LP \&\.command_name arg1 arg2 .RE .LP インデント用に、先頭の制御文字とコマンド名との間にはスペースや タブ文字をいくつ入れても良いですが、制御文字は行の先頭になくては なりません。 .LP .B テキスト行 は、表示される部分のことです。 テキスト行はエスケープシーケンスで変更することができます。 エスケープシーケンスは先頭にバックスラッシュ .'char \(rs を置くことで認識されます。 これらは、行や単語の一部に含まれ、整形要素となったり 関数となったりします。 シングルクォート .''char ' で区切られた引数を取るものもあります。 また、開き括弧 .'char ( で始めたり、角括弧 .'char [ と .'char ] で括ったりする符号化で長さが決まるシーケンスもあります。 .LP roff 言語は、マクロなど、言語拡張機能を書くための柔軟な手段を 提供しています。 マクロ定義を解釈する際に、roff システムは .BR "コピーモード" と呼ばれる特別なモードに入ります。 .LP コピーモードの振る舞いはとても扱いにくいものでもありますが、 確実に安全に使えるようにするルールがいくつかあります。 .IP 1. 表示可能なバックスラッシュは .esc e と記述しなくてはなりません。 もっと正確に言えば、 .esc e は現在のエスケープ文字を表します。 バックスラッシュのグリフを得るには .esc (rs を使用してください。 .IP 2. バックスラッシュはすべて 2 重にしてください。 .IP 3. テキスト行はすべて、スペースをとらない特殊文字 .esc & で始めてください。 .LP このやり方は、一番効率の良いコードが生成できる というわけではありませんが、最初の一歩としては使えるはずです。 さらに良いやり方については groff info ファイルおよび .BR groff_tmac (5) を参照してください。 .LP roff ソースファイルを読むのはこれよりは簡単です。 すべてのマクロ定義部分で 2 重になっているバックスラッシュを 1 つに置き換えればよいだけです。 . .\" -------------------------------------------------------------------- .SH "groff 要素" .\"-------------------------------------------------------------------- roff 言語の要素は、テキストファイルに整形用情報を 付加するものです。基本的な要素は、あらかじめ定義されたコマンド および変数であり、 この要素のおかげで roff は本格的なプログラミング言語に なっているのです。 .LP roff コマンドには 2 種類あります。コマンドは 引数を取ることもあります。 .B リクエスト は、ドット .'char . あるいは .''char ' で始まる行に書かれるものです。これに対して .B エスケープシーケンス は、 バックスラッシュ .'char \(rs で始まる、行埋め込み式の関数や単語中の整形要素です。 .LP ユーザは独自の整形コマンドを .request .de リクエストを使って定義することができます。これらのコマンドは .BR マクロ と呼ばれていますが、実際にはリクエストとまったく同様に使われます。 マクロパッケージは groff 言語で書かれた定義済みのマクロセットです。 ユーザが独自にエスケープシーケンスを作成できる場合というのは 非常に限られており、特殊文字のみマップすることができます。 .LP groff 言語は、インタフェースによってさまざまな種類の変数を 提供しています。定義済みの変数もありますが、 ユーザも同様に自分で変数を定義できます。 .LP .B 文字列 変数は文字列を格納します。 この変数は .request .ds リクエストで設定され、値は .esc * エスケープシーケンスを使って取り出します。 .LP .B レジスタ 変数は数値、スケールファクタつき数字、場合によっては文字列に似た オブジェクトを格納できます。 .request .nr リクエストで設定され、値は .esc n エスケープシーケンスを使って取り出します。 .LP .B 環境 変数は、行の長さやフォントサイズなどのような グローバルな整形パラメータをユーザが後で再利用するために 一時的に格納できるようにする変数です。 .request .ev リクエストによってできます。 .LP .B フォント は、名前もしくは内部番号のどちらかで判別されます。 現在のフォントは .request .ft リクエストもしくは .esc f エスケープシーケンスで選択されます。 デバイスごとに特殊なフォントがありますが、次のフォントはすべての デバイスで利用可能です。 .B R は標準フォント、ローマン体です。 .B B はその .B ボールド体 です。 .I イタリック体 フォントは .B I と呼ばれておりどこででも利用可能ですが、テキストデバイスでは ローマン体フォントに下線がついたものとして表示されます。 グラフィカルの出力デバイスに対しては、次のフォントの固定幅の 修飾文字が存在します。 .BR CR , .BR CI , および .BR CB です。 テキストデバイスでは、いずれにしても文字はすべて固定幅です。 .LP さらに、roff の拡張要素がいくつかあります。 .B ディバージョン は後で利用できるように情報をマクロに格納します。 .B トラップ はページの先頭から何行目とか、ディバージョンや入力において 何行目というような位置条件です。 アクションの中には、条件が揃ったときに自動的に起動するように 指示できるものがあります。 .LP これより詳細な情報については、groff info ファイルに示されています。 . .\" -------------------------------------------------------------------- .SH "制御文字" .\" -------------------------------------------------------------------- ある条件下で特別な制御タスクをもつ文字が いくつかあります。 .TP .character . ドットは、行の先頭あるいは .request .if , .request .ie , .request .el , および .request .while リクエスト中の条件の後にある場合のみ特別です。 その位置では、リクエスト (あるいはマクロ) を導入する制御文字になります。 .esc . エスケープを使うと、この特別な動作を遅らせることができます。 .request .cc リクエストを使うことで、この制御文字を別の文字に設定して、 ドット .'char . を特殊文字でなくすることができます。 .IP "" 他の位置にドットがあるときは、ただのドット文字以上の意味はありません。 テキスト段落の中では、文はそれぞれ新しい行で始めるほうが有利です。 .TP .character ' シングルクォートには 2 つの制御機能があります。行の先頭および 条件リクエスト内では、シングルクォートは非ブレーク制御文字に なります。これは、ドットのようにリクエストを導入しますが、 リクエストが行を折り返さないような追加のプロパティをつけるものです。 .request .c2 リクエストを用いると、非ブレーク制御文字を別の文字に設定する ことができます。 .IP "" 2 つめのタスクとして、シングルクォートは、 いくつかの関数エスケープシーケンスの中で 引数の区切り文字としてよく使用されます (引数に含まれない文字のペアなら どれでも良いのですが)。 その他の場所にあれば、シングルクォート文字あるいはアポストロフィ文字 になります。 groff は、表示用の表記として エスケープシーケンス .esc (cq を提供しています。 .TP .character \(dq ダブルクォートはリクエストおよびマクロ中の引数を括るときに使用されます。 エスケープされたダブルクォート .esc \(dq はコメントの開始になります。 それ以外は、ダブルクォートには特別な機能はありません。 groff は、表示用の表記として エスケープシーケンス .esc (dq を提供しています。 .TP .character \(rs バックスラッシュは、通常エスケープシーケンスの開始を意味しています (この文字は、 .request ec リクエストによって変更できます)。 表示用のエスケープ文字は、エスケープシーケンス .esc e で、バックスラッシュのグリフは .esc (rs で得られます。 .TP .character ( 開き括弧は、エスケープシーケンス内で、ちょうど 2 文字でできた エスケープ名あるいは引数を導入したときのみ特別な意味を持ちます。 groff では、この動作は \f(CB[]\fP の組で置き換えることができます。 .TP .character [ 開き角括弧は、groff のエスケープシーケンス内でのみ特別な意味を持ちます。 これは、長いエスケープシーケンス名やエスケープシーケンスの引数を 導入するときに使用します。 それ以外の場合は、例えばマクロ呼び出しなどでも特別な意味はありません。 .TP .character ] 閉じ角括弧は、groff のエスケープシーケンス内でのみ特別な意味を持ちます。 これは、長いエスケープシーケンス名やエスケープシーケンスの引数を 終わらせます。 それ以外の場合は、特別な意味はありません。 .TP \f(CIspace\fP 空白文字は、機能的な働きしか持たない文字です。これは、 リクエストやマクロの引数の区切り文字、 およびテキスト行における単語の区切り文字です。 また、空白文字は groff の単語間の水平方向の空白計算に作用します。 定義された空白幅を得たい場合は、 .'char "\(rs\ " (エスケープ文字とそれに続いた空白文字)、 .esc | , .esc ^ , あるいは .esc h のようなエスケープシーケンスを使う必要があります。 .IP \f(CInewline\fP テキストの段落においては、改行は空白文字とほぼ同じような作用をします。 連結された行は、エスケープした改行で指定できます。 つまり、行の最後の文字に .'char \(rs を指定するのです。 .IP \f(CItab\fP テキスト中にタブ文字があれば、インタプリタは次の定義済みのタブ位置へ 水平方向にインデントを作ります。 タブ位置の調整には洗練されたインタフェースが存在します。 . .\" -------------------------------------------------------------------- .SH "数式" .\" -------------------------------------------------------------------- .B 数値 は、符号つき整数、符号なし整数、浮動小数点実数のいずれか、およびそれに 単位指定子を付加したものです。 .B 単位指定子 は、計測単位を表す 1 文字の略語です。 単位指定子が後についた数字は、サイズに関する値を意味しています。 デフォルトでは、数値は単位指定を持ちません。つまり、 単なる数字にすぎません。 .LP roff 言語では、次の単位指定子を定義しています。 .LP .na .nh .TS center, tab(@); LfCB Lw(4i). c@センチメートル i@インチ P@パイカ\ \(eq\ 1/6\ インチ p@ポイント\ \(eq\ 1/72\ インチ m@T{ em\ \(eq\ \fRポイント値でのフォントサイズ (文字 `\f(CRm\fR' の幅) T} M@\f(CRem\fR の 100 倍 n@en\ \(eq\ em/2 u@\fR実際の出力デバイスでの基本単位 v@\fR基本単位での行送り幅 z@T{ スケールされたポイント数\ \(eq\ 1 ポイントの 1/\f(CIsizescale\fR 倍 (フォントの \fIDESC\fP ファイルで定義) T} .TE .LP .ad .hy .B 数式 は、先で定義された数値と算術演算子 .operator + , .operator \- , .operator * , .operator / , .operator % .RI ( 剰余 ), 比較演算子 .operator == ( .operator = と同じ), .operator <= , .operator >= , .operator < , .operator > , 論理演算子 .operator & .RI ( 論理積 ), .operator : .RI ( 論理和 ), .operator ! .RI ( 否定 ), および括弧 .operator ( と .operator ) との組み合わせです。 .LP さらに、 .I groff は、数式に対して次の演算子を追加しました。 .LP .na .nh .TS center, tab(@); LfCB Lw(4i). e1\f(CB>?\fPe2@\f(CIe1\fP と \f(CIe2\fP の最大値 e1\f(CB 「特別フォント」 . .REQ .ft 直前のフォントに戻します。 リクエスト .request \(rsfP と同じです。 . .REQ .ft font フォント名または番号 .argument font に変更します。 エスケープシーケンス .esc[arg] f font と同じです。 . .REQ .ftr font1 font2 フォント .argument font1 をフォント .argument font2 に変換します。 . .REQ .hc 追加ハイフネーション指定文字を削除します。 . .REQ .hc c 追加ハイフネーション指定文字として\ \c .argument c を設定します。 . .REQ .hcode c1 code1 c2 code2 ... 文字 .argument c1 のハイフネーションコードを .argument code1 に、文字 .argument c2 のコードを .argument code2 のように設定します。 . .REQ .hla lang 現在のハイフネーション言語を .argument lang に設定します。 . .REQ .hlm n ハイフンされた行の最大連続数を .argument n に設定します。 . .REQ .hpf file ハイフネーションのパターンをファイル .argument file から読み込みます。 . .REQ .hw words 例外的なハイフネーションをする単語のリストを .argument words で指定します。 . .REQ .hy N ハイフネーションモードを .argument N に変更します。 . .REQ .hym n ハイフネーションのマージンを .argument n に設定します (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .hys n ハイフネーションのスペースを .argument n に設定します。 . .REQ .ie cond anything 条件式 .argument cond が真ならば .argument anything を処理します。偽の場合はリクエスト .request .el へ移動します。 . .REQ .if cond anything 条件式 .argument cond が真ならば .argument anything を処理します。偽の場合は何もしません。 . .REQ .ig リクエスト .request .. が呼ばれるまでテキストを無視します。 . .REQ .ig end リクエスト .request .end が呼ばれるまでテキストを無視します。 . .REQ .in インデント量を直前の値に戻します。 . .REQ .in \(+-N 引き数 .argument \(+-N に従ってインデント量を変更します (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .it N trap 入力行のカウントトラップを位置 .argument N に設定します。 . .REQ .kern pairwise kerning を有効にします。 . .REQ .kern n .argument n が 0 ならば pairwise kerning を無効にします。0 でなければ 有効にします。 . .REQ .lc リーダ繰り返し文字の定義を削除します。 . .REQ .lc c リーダ繰り返し文字を\ \c .argument c に設定します。 . .REQ .length register anything 文字列 .argument anything の文字列長をレジスタ .argument register に書き込みます。 . .REQ .lf N file 入力する行数を .argument N に、ファイル名を .argument file に設定します。 . .REQ .lg N 引数 .argument N が 0 より大きければリガチャ (合字) モードにします。 . .REQ .ll 行幅を直前の値に戻します。 . .REQ .ll \(+-N 行幅を引数 .argument \(+-N に従って設定します (デフォルトの設定は .scalednumber 6.5 i で、単位指定子は .scaleindicator m です)。 . .REQ .ls 追加の行間スキップ量を直前の値に戻します。 . .REQ .ls N 追加の行間スキップ量を .argument N に設定します。 つまり、テキストの出力行それぞれの後に .argument N -1 行の空白行を挿入します。 . .REQ .lt \(+-N タイトルの長さです (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .mc マージンの文字を無効にします。 . .REQ .mc c それぞれのテキスト行の後と右側マージンの間に文字 .argument c を出力します。 . .REQ .mc c N マージン文字を .argument c に、右側マージンからの距離を .argument N に設定します (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .mk register 現在の垂直位置を .argument register にマークします。 . .REQ .mso file リクエスト .so と同じですが、tmac ディレクトリにある .I file も検索されます。 . .REQ .na 出力行の位置揃えを行いません。 . .REQ .ne 1 行分の行送りが必要です。 . .REQ .ne N .argument N 行分の行送りが必要です (デフォルトの単位指定子は\ \c .scaleindicator v です)。 . .REQ .nf 出力行に行詰めや位置揃えを行いません。 . .REQ .nh ハイフネーションをしません。 . .REQ .nm 行番号モードを無効にします。 . .REQ .nm \(+-N M S I 行番号モードの、行番号、行番号出力間隔、空白、インデントを 設定します。 . .REQ .nn 次の行に行番号をつけません。 . .REQ .nn N 次の .argument N 行に行番号をつけません。 . .REQ .nr register \(+-N M レジスタの値を、インクリメント値 .argument M で .argument \(+-N に設定・変更します。 . .REQ .nroff 組み込み条件式 .B n を真に、 .B t を偽にします。 . .REQ .ns 空白なしモードにします。 . .REQ .nx filename 次のファイルを表します。 . .REQ .open stream filename ファイル .register filename を書き込みモードでオープンし、名前 .register stream を持つストリームに関連づけます。 . .REQ .opena stream filename リクエスト .request .open と同じですが、追加モードでファイルをオープンします。 . .REQ .os リクエスト .request .sv で指定された行送り量を出力します。 . .REQ .pc ページ番号文字を .'char % に戻します。 . .REQ .pc c ページ番号文字を設定します。 . .REQ .pi program プログラム .argument program に出力をパイプします (nroff のみ)。 . .REQ .pl ページ長をデフォルトの .scalednumber 11 i に設定します。 現在のページ長はレジスタ .register .p に格納されています。 . .REQ .pl \(+-N ページ長を .argument \(+-N に変更します (デフォルトの単位指定子は\ \c .scaleindicator v です)。 . .REQ .pm マクロ名とサイズを出力します (サイズは 1 ブロック 128 バイトの ブロック数です)。 . .REQ ".pm t" マクロ全体のサイズだけを出力します (サイズは 1 ブロック 128 バイトの ブロック数です)。 . .REQ .pn \(+-N 次のページ番号を .argument N に設定します。 . .REQ .pnr 現在定義されている数値レジスタの名前と内容を標準エラー出力に 出力します。 . .REQ .po ページオフセットを直前の値に戻します。現在のページオフセットはレジスタ .register .o に格納されています。 . .REQ .po \(+-N ページオフセットを .argument N に設定します。 . .REQ .ps ポイントサイズを直前の値に戻します。 . .REQ .ps \(+-N ポイントサイズを指定します。エスケープシーケンス .esc[arg] s \(+-N と同じです。 . .REQ .psbb filename PostScript 画像 .argument filename のための矩形領域を取得します。 . .REQ .pso command リクエスト .request .so と同様ですが、 .argument command の標準出力から入力します。 . .REQ .ptr すべてのトラップの名前と位置を標準エラー出力に出力します (入力行のトラップとディバージョンのトラップは含まれません)。 . .REQ .rchar c1 c2... 文字定義 .argument c1 , .argument c2 , .argument ... を削除します。 . .REQ .rd prompt 挿入を読み込みます。 . .REQ .rj n 次の .argument n 行の入力行を右寄せします。 . .REQ .rm name .argument name で指定されたリクエスト、マクロ、文字列を削除します。 . .REQ .rn old new .argument old で指定されたリクエスト、マクロ、文字列の名前を .argument new に変更します。 . .REQ .rnn reg1 reg2 レジスタ名 .argument reg1 を .argument reg2 に変更します。 . .REQ .rr register レジスタ .argument register を削除します。 . .REQ .rs 空白をもとに戻します。つまり空白なしモードを無効にします。 . .REQ .rt \(+-N マークしておいた垂直位置まで戻します (上方向のみ)。 (デフォルトの単位指定子は\ \c .scaleindicator v です)。 . .REQ .shc ソフトハイフン文字を .esc (hy に戻します。 . .REQ .shc c ソフトハイフン文字を .argument c に設定します。 . .REQ .shift n マクロにおいて、引き数を位置 .argument n にシフトします。 . .REQ .so filename ソースファイルをインクルードします。 . .REQ .sp 1 行スキップします。 . .REQ .sp N .argument N の行送りを挿入します。 .argument N の符号によって上下方向が決まります (デフォルトの単位指定子は .scaleindicator v です)。 . .REQ .special s1 s2 ... フォント .argument s1 , .argument s2 , などを特別とします。現在のフォントにない文字をこれらから検索します。 . .REQ .ss N 空白文字のサイズを .argument N /12 に設定します。単位は現在のフォントの空白幅です。 . .REQ .ss N M 空白文字のサイズを .argument N /12 に、文の空白サイズを .argument M /12 に設定します。単位は現在のフォントの空白幅 (\f(CR\(eq1/3 em\fP) です。 . .REQ .sty n style 位置 .argument n のフォントをスタイル .argument style に関連づけます。 . .REQ .substring register n1 n2 レジスタ .argument register の文字列の中の部分文字列 .argument n1 を .argument n2 に置き換えます。 . .REQ .sv 行送り量を .scalednumber 1 v に設定します。 . .REQ .sv N リクエスト -.os +.request os で出力される空白行の送り量を .argument N に設定します。 . .REQ .sy command-line プログラム .argument command-line を実行します。 . .REQ ".ta T" N タブ位置を .argument N の倍数に設定します (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .ta n1 n2 ... nn \f(CBT\fP r1 r2 ... rn 位置 .argument n1 , .argument n2 , \&... , .argument nn のタブ位置をそれぞれ .argument nn + r1 , .argument nn + r2 , \&... .argument nn + rn に、さらにそれ以降を .argument nn + rn + r1 , .argument nn + rn + r2 , \&... .argument nn + rn + rn のように設定します。 . .\".REQ .tar .\"Restore internally saved tab positions. .\". .\".REQ .tas .\"Save tab positions internally. . .REQ .tc タブ繰り返し文字を削除します。 . .REQ .tc c タブ繰り返し文字を\ \c .argument c に設定します。 . .REQ .ti \(+-N 次の行を一時的にインデントします (デフォルトの単位指定子は\ \c .scaleindicator m です)。 . .REQ .tkf font s1 n1 s2 n2 フォント .argument font のトラックカーニングを有効にします。 . .REQ .tl \f(CB'\fPleft\f(CB'\fPcenter\f(CB'\fPright\f(CB'\fP 3 つの部位をもつタイトルです。 . .REQ .trf filename ファイル .argument filename の内容をそのまま出力します。 . .REQ .tm anything .argument anything を端末 (UNIX の標準的なメッセージ出力先) に出力します。 .\" 「ターミナル」 => 「端末」 . .REQ .tr abcd.... 出力で .argument a を .argument b に、 .argument c を .argument d のように変換します。 . .REQ .trnt abcd.... リクエスト .request .tr と同じですが、 .esc ! によってディバージョンへと出力されるテキストは変換されません。 . .REQ .troff 組み込み条件式 .B t を真に、 .B n を偽に設定します。 . .REQ .uf font アンダーラインフォントセットを .argument font に設定します (リクエスト .request .ul で切り替わります)。 . .REQ .ul N 入力行を .argument N 行、アンダーライン付きにします (troff では イタリック体になります)。 . .REQ .vpt n .argument n が 0 でなければ垂直位置のトラップを有効にします。 0 ならば無効にします。 . .REQ .vs 行送り幅を直前の値に戻します。 . .REQ .vs N 行送りの基準線間隔を .argument N に設定します。 デフォルト値は .scalednumber 12 p です。 . .REQ .warn n 警告コードを .argument n に設定します。 . .REQ .wh N trap 位置によるトラップを設定します。負の値の場合はページ末尾からになります。 . .REQ .while cond anything 条件式 .argument cond が真ならば .argument anything を入力として受理します。 . .REQ .write stream anything ストリーム .argument stream へ .argument anything を書き込みます。 . .PD .LP これらの基本的な groff リクエストの他にも、 マクロの呼び出しがあります。 これらはマクロパッケージ (概要は .BR roff (7) を参照) やプリプロセッサに由来するものです。 .LP プリプロセッサマクロを認識するのは容易です。 これらは独特のマクロの対で括られています。 .LP .TS box, center, tab (@); c | c | c CfCB | CfCB | CfCB. プリプロセッサ@開始マクロ@終了マクロ = eqn@.PS@.PE grap@.G1@.G2 grn@.GS@.GE pic@.PS@.PE refer@.R1@.R2 soelim@\fIなし@\fIなし tbl@.TS@.TE .TE .LP . .\" -------------------------------------------------------------------- .SH "エスケープシーケンス" .\" -------------------------------------------------------------------- . エスケープシーケンスは、行中の要素であり、通常は バックスラッシュ .'char \(rs とそれに続けてエスケープ名をつける形で導入されます。場合によっては 必要な引数をつけることもあります。 入力処理は、エスケープ文字あるいはその引数の直後から再開されます。 引数には区切り文字がはさまっているわけではありません。 そのため、エスケープ名や引数の終わりを決定する方法が必要です。 .LP これは、名前 (エスケープ名、および変数名からなる引数) を 角括弧 .esc[] name で囲い、定数引数 (数式および文字) を アポストロフィ (ASCII 0x27) で .IR \(cqconstant\(cq のように囲うことによって実現します。 .LP エスケープ名には短い名前の省略形があります。 2 文字のエスケープ名は開き括弧で .esc( xy のように指定され、閉じ括弧は必要ありません。 そして、特殊文字である .'char [ と .'char ( 以外の 1 文字の名前はすべて .esc \fP\f(CIc のようにマーカなしで指定することができます。 .LP 長さ .number 1 の定数の引数もアポストロフィのマーカを省略できますが、 2 文字の名前のときには省略できません。 .LP 1 文字のエスケープシーケンスは主に行中での 関数とシステムに関連したタスク用に使われるのに対して、 .esc( "" が続いた 2 文字の名前は roff システムで定義済みの特殊文字用に 使われます。 2 文字より多い文字を持った名前 .esc[] name は、ほとんどユーザ定義の文字を表しています ( リクエスト .request .char を参照してください)。 . .\" -------------------------------------------------------------------- .SS "1 文字のエスケープシーケンス" .\" -------------------------------------------------------------------- . .PD 0 . .\" --------- comments --------- . .ESC \(dq コメントの開始です。 行末までのものすべてが無視されます。 . .ESC # 次の改行文字までのものすべてが無視されます。 これは、コピーモードで解釈されます。 .esc \(dq と似ていますが、終端となる改行を無視する点が異なります。 . .\" --------- strings --------- . .ESC * s 1 文字の名前 .argument s を持った文字列変数に格納される文字列です。 . .ESC *( st 2 文字の名前 .argument st を持った文字列変数に格納される文字列です。 . .ESC[] * stringvar 任意の長さの名前 .argument stringvar を持った文字列変数に格納される文字列です。 . .\" --------- macro arguments --------- . .ESC $0 現在のマクロが呼び出されている名前。 リクエスト .request .als は、1 つのマクロに複数の名前をつけることができます。 . .ESC $ x .argument x 番目のマクロの引数。ここで、 .argument x は、1 から 9 までの数値です。 . .ESC $( xy 2 桁の番号 .argument xy 番目のマクロの引数。 . .ESC[] $ nexp .argument nexp 番目のマクロの引数。ここで、 .argument nexp は 1 以上の整数に評価される数値表現です。 . .ESC $* マクロにおいて、引数すべてを空白文字区切りで連結したもの。 . .ESC $@ マクロにおいて、引数すべてをそれぞれダブルクォートで囲い、 空白文字で区切って連結したもの。 . .\" --------- escaped characters --------- . .ESC \(rs バックスラッシュ 1 個に縮退します。コピーモードで エスケープ文字として解釈されるのを遅らせるときに便利です。 表示可能なバックスラッシュには、 .esc e を使用してください。 . .ESC \(cq 揚音アクセント符号 \(aa 。 .esc( aa と同じです。 エスケープなし: アポストロフィ、右クォーテーション記号、シングルクォート (ASCII 0x27)。 . .ESC ` 抑音アクセント符号 \(ga 。 .esc( ga と同じです。 エスケープなし: 左クォート、バッククォート (ASCII 0x60)。 . .ESC \- 現在のフォントでの \- 符号。 . .ESC . 解釈されないドット (ピリオド)。行頭にあってもそうなります。 . .ESC % デフォルトでのオプションのハイフン文字。 . .ESC ! 透過行指定子。 . .ESC ? anything\fB?\fP ディバージョンにおいて、そのまま .argument anything を組み込みます。コピーモードで .argument anything は読み込まれます。 エスケープシーケンス .esc ! および .esc ? も参照してください。 . . .\" --------- spacing --------- . .ESC \& space 連結されない空白の大きさを持った空白文字 (改行もされません)。 . .ESC 0 数字の幅。 . .ESC | 1/6\ em の狭い空白文字。nroff では幅 0 です。 . .ESC ^ 1/12\ em やや狭い空白文字。nroff では幅 0 です。 . .ESC & 表示されない、幅 0 の文字。 . .ESC ) .esc & と同様ですが、文の終わりを認識する目的で、 cflags リクエストを 用いて透過になるように宣言された文字のように振る舞うという 点で異なります。 . .ESC / 次の文字がローマン体であるときには、それの前の文字の幅を増やして 次の文字との間の余白が修正されるようにします。 . .ESC , 前の文字がローマン体であるときには、次の文字の余白を変更して 前の文字との間の余白が修正されるようにします。 . .ESC ~ 改行されない空白。行を調整するとき、通常の単語間の空白のように 引き延ばされます。 . .ESC \& newline 無視される改行。行を連続させるときのためです。 . .\" --------- structuring --------- . .ESC { 条件入力の開始。 . .ESC } 条件入力の終了。 . .\" --------- longer escape names --------- . .ESC ( st 2 文字の名前を持った特殊文字。 セクション .BR "特殊文字" を参照してください。 .ESC[] \& name 任意の長さの名前 .argument name を持った文字 . .\" --------- alphabetical escapes --------- . .ESC a 解釈されないリーダ文字。 . .ESCq A anything .argument anything が文字列、マクロ、ディバージョン、レジスタ、環境、あるいは フォント名として受け付けられるものの場合、 .number 1 です。そうでない場合 .number 0 になります。 . .ESCq b abc... 角括弧を作る関数。 . .ESC c テキスト処理を中断します。 . .ESCq C char .argument char と呼ばれる文字。 .esc[] char と同じですが、他の roff バージョンと互換性があります。 . .ESC d 垂直単位で 1/2 em だけ前方 (下) に移動します (nroff では 1/2 行です)。 . .ESCq D charseq .argument charseq 中の文字で定義されたグラフィカルな要素を描きます。 詳細は groff info ファイルを参照してください。 . .ESC e 現在のエスケープ文字の表示できるバージョン。 . .ESC E エスケープ文字と等価ですが、コピーモードでは評価されません。 . .ESC f F 1 文字の名前もしくは 1 個の数字 .argument F を持つフォントに変更します。 . .ESC f( fo 2 文字の名前もしくは 2 個の数字 .argument fo を持つフォントに変更します。 . .ESC[] f font 任意の長さの名前もしくは数式 .argument font で表されるフォントに変更します。 . .ESC[] g reg リクエスト .request .af に適した、名前 .argument reg を持ったレジスタのフォーマットを返します。 別の形式として .esc(arg g xy および .escarg g x があります。 . .ESCq h N 局所的な水平移動。右側へ .argument N だけ移動します (負の値のときは左側へ移動します)。 . .ESCq H N 現在のフォントの高さを .argument N に設定します。 . .ESC[] k reg 任意の長さの名前 .argument reg を持つレジスタ中の水平入力位置をマークします。 別の形式では .esc(arg k xy と .escarg k x です。 . .ESCq l Nc 水平線描画関数 (文字 .argument c を用いることも可能です)。 . .ESCq L Nc 垂直描画関数 (文字 .argument c を用いることも可能です)。 . .ESC n r 1 文字の名前 .argument r を持つレジスタ変数に格納されている数値。 . .ESC n( re 2 文字の名前 .argument re を持つレジスタ変数に格納されている数値。 . .ESC[] n reg 任意の長さの名前 .argument reg を持つレジスタ変数に格納されている数値。 . .ESCq N n 現在のフォントで、コード .argument n で指定された文字を出力します。特殊フォントは検索されません。 リクエスト .request .char を用いて文字にフォントを追加するときに便利です。 . .ESCq o abc... 文字 .argument a , .argument b , .argument c , などを 2 度打ちします。 . .ESC p 改行のあと出力行を展開します。 . .ESC r 垂直方向に 1\ em 逆戻りします (nroff では 1 行逆戻りします)。 . .ESCq R name \(+-n リクエスト .request .nr .argument name .argument \(+-n と同じです。 . .ESC[] s \(+-N ポイントサイズを .I N スケールポイントに設定します。別の書式として .BI \(rss \(+- [ N ]\c , .BI \(rss' \(+-N '\c , .BI \(rss \(+- ' N '\c , .esc(arg s \(+-xy , .BI \(rss \(+- ( xy\c , .escarg s \(+-x が使えることに注意してください。 これは、リクエスト .request .ps と同じです。 . .ESCq S N 出力を .argument N 度傾けます。 . .ESC t 解釈されない水平タブ。 . .ESC u 垂直方向に 1/2 em 逆戻りします (nroff では 1/2 行逆戻りします)。 . .ESCq v N 局所的な垂直移動。 .argument N だけ下がります (負の値のときは上がります)。 . .ESC[] V env 環境変数 .argument env の内容。別の書式では、 .esc(arg V xy と .escarg V x が使えます。 . .ESCq w string 文字列 .argument string の幅。 . .ESCq x N さらに行送りする関数 (負の値なら前へ、正の値なら後ろへ 行送りします)。 . .ESCq X string .argument string をデバイス制御関数として出力します。 . .ESC[] Y name 文字列変数あるいはマクロ .argument name をデバイス制御関数として解釈しないように出力します。 別の書式では、 .esc(arg Y xy と .escarg Y x になります。 . .ESC z c 幅 0 (空白なし) で .argument c を出力します。 . .ESCq Z anything .argument anything を出力し、水平・垂直位置を元に戻します。 .argument anything にはタブや先頭文字は含まれません。 .PD .LP エスケープシーケンス .esc e , .esc . , .esc \(dq , .esc $ , .esc * , .esc a , .esc n , .esc t , .esc g , および .escarg \& newline はコピーモードで解釈されます。 .LP .esc ( あるいは .esc [ で始まるエスケープシーケンスは 1 文字のエスケープシーケンスを 表してはいませんが、2 つ以上の文字を持ったエスケープ名の 開始を示します。 .LP バックスラッシュの後に定義済みのエスケープシーケンスを 形成しない文字が続く場合は、バックスラッシュは黙って無視され、 文字そのものがマップされます。 . .\" -------------------------------------------------------------------- .SS "特殊文字" .\"-------------------------------------------------------------------- よく使われる特殊文字は文字 .argument x と .argument y を用いた .(esc \fP\f(CIxy の形式のエスケープシーケンスであらかじめ定義されています。 特殊文字の中には通常のフォントに含まれているものも一部ありますが、 ほとんどは特殊フォントでしか利用できません。 最も重要なグリフを抜き出したものを次に示します。完全なリストは、 .BR groff_char (7) にあります。 .RS .LP .PD 0 . .ESc bu 中黒 .ESc co 著作権記号 .ESc ct セント記号 (通貨) .ESc dd 2 重ダガー .ESc de 度記号 .ESc dg ダガー .ESc em 全角ダッシュ .ESc hy ハイフン .ESc rg 登録記号 .ESc sc セクション記号 .ESc ul アンダーライン文字 .ESc == 等号 .ESc >= 以上 .ESc <= 以下 .ESc != 不等号 .ESc -> 右矢印 .ESc <- 左矢印 .ESc +- プラスマイナス記号 .PD .RE . .\" -------------------------------------------------------------------- .SH レジスタ .\" -------------------------------------------------------------------- レジスタは値を格納する変数です。 groff では、ほとんどのレジスタは数値を格納しますが (前述セクション .B 数式 を参照してください)、なかには文字列値を保持できるものもあります。 .LP 各レジスタには名前が与えられています。 任意のレジスタを定義でき、リクエスト .request .nr .argument register で定義・設定できます。 .LP レジスタに格納された値は、エスケープシーケンス .esc n を用いて取り出すことができます。 .LP 最も有用なのは、定義済みのレジスタです。 次からは、レジスタのことを話しているのだということを明確にするため、 .argument name という表記を用いて .register name レジスタのことを示します。 .esc en[] 修飾はレジスタ名の一部ではないことを気にとめておいてください。 . .\" -------------------------------------------------------------------- .SS "読み込み専用レジスタ" .\"-------------------------------------------------------------------- 次のレジスタは、ユーザが書き換えられない定義済みの値を持った レジスタです (通常、ドットで始まるレジスタは読み込み専用です)。 ほとんどは、現在の設定についての情報を提供したり、リクエスト呼び出し からの結果を保存したりするものです。 .LP .PD 0 .REG .$ 現在のマクロの引数の個数 .REG .A オプション .B \-A が使用されているときに .B troff に .number 1 を設定します。 .BR ntoff では常に .number 1 です。 .REG .H 基本単位で表した、利用可能な水平方向の解像度 .REG .T オプション .B \-T が使用されているとき .number 1 が設定されています。 .REG .V 基本単位で表した、利用可能な垂直方向の解像度。 .REG . 最後に .escarg x 'N' を用いて指定した行送り幅。 .REG .C 互換モードが有効になっている場合は 1 で、そうでない場合 0 です。 .REG .c 現在の入力行番号 .REG .cdp 現在の環境に追加された最後の文字の深さ。 最後の文字が基準線から下に突き出ている場合に正になります。 .REG .ce リクエスト .request .ce で設定された中央寄せされる行の残数。 .REG .cht 現在の環境に追加された最後の文字の高さ。 基準線よりも上に文字が突き出ている場合に正になります。 .REG .csk 現在の環境に追加された最後の文字の傾き。 文字の傾きとは、文字の上についたアクセント記号が文字の中央からどれだけ 右に離れて置かれるかということです。 .\"the right of the center of a character...? .\"この訳が正しいと思います。 .REG .d 現在のディバージョンでの垂直方向の位置です。レジスタ .register nl と同じです。 .REG .ev 現在の環境の名前もしくは番号です (文字列の値です)。 .REG .f 現在のフォント番号です。 .REG .fam 現在のフォントファミリです (文字列の値です)。 .REG .fp 次に空いているフォント位置番号。 .REG .g GNU troff では常に 1 です。 マクロ中で groff で動作しているかどうかをテストする場合、 このレジスタを使用する必要があります。 .REG .h 現在のページあるいはディバージョンでのテキスト基準線の 最高点です。 .REG .hla リクエスト .B .hla で設定された現在のハイフネーション言語。 .REG .hlc 直前で連続したハイフネーション行数。 .REG .hlm 連続したハイフネーション行数の許される最大値。これは、 リクエスト .request .hlm で設定されます。 .REG .hy 現在のハイフネーションフラグ ( リクエスト .request .hy で設定されます)。 .REG .hym 現在のハイフネーションのマージン ( リクエスト .request .hym で設定されます)。 .REG .hys 現在のハイフネーション間隔 ( リクエスト .request .hys で設定されます)。 .REG .i 現在のインデント。 .REG .in 現在の出力行に対して適用されるインデント。 .REG .kern pairwise kerning が有効になっている場合 .number 1 で、無効になっていれば .number 0 です。 .REG .l 現在行の長さです。 .REG .lg 現在の合字モード ( リクエスト .request .lg で設定されます)。 .REG .ll 現在の出力行に対して適用される行の長さ。 .REG .lt タイトルの長さ ( リクエスト .request .lt で設定されます)。 .REG .n 直前の出力行でのテキスト部分の長さ。 .REG .ne トラップを生起させる原因となった最後のリクエスト .request .ne が必要とした空白の量。 このレジスタは、 .register .trunc と一緒に使用すると便利です。 .REG .o 現在のページのオフセット。 .REG .p 現在のページの長さ。 .REG .pn 次ページの番号。これは、 リクエスト .request .pn で定義された値もしくは現在ページに 1 を足した番号の いずれかです。 .REG .ps スケールポイントで表した現在のポイントサイズ。 .REG .psr 最後に要求された、スケールポイントで表した ポイントサイズ。 .REG .rj リクエスト .request rj によって設定された右寄せされる行の数。 .REG .s 10 進小数での現在のポイントサイズ。 .REG .sr 10 進小数での最後に要求されたポイントサイズ (文字列値)。 .REG .t 次のトラップまでの距離。 .REG .tabs 現在のタブ設定の文字列表現。 リクエスト .request .ta に対する引数として使用するのに適しています。 .REG .trunc 最近の垂直位置トラップによって切り詰められた垂直スペースの量。 リクエスト .request .ne によるトラップが引き起こされた場合は、そのリクエストによって生じた 垂直移動量をさらにマイナスした値になります。 別の言い方をすれば、トラップが発生した時点での、 トラップが起きなかった場合の垂直位置と現在の垂直位置との差を 表しています。 リクエスト .register .ne と一緒に使用すると便利です。 .REG .ss リクエスト .request .ss の第 1 引数によって設定されたパラメータの値。 .REG .sss リクエスト .request .ss の第 2 引数によって設定されたパラメータの値。 .REG .u 行連結モードのときは 1 で、そうでなければ 0 です。 .REG .v 現在の垂直方向の行送り量。 .REG .vpt 垂直位置トラップが有効なら .number 1 で、無効なら .number 0 です。 .REG .w 直前の文字の幅。 .REG .warn 現在有効になっている警告の番号コードの和。 .REG .x メジャーバージョン番号。 .REG .y マイナバージョン番号。 .REG .Y groff のリビジョン番号。 .REG .z 現在のディバージョン名。 .REG llx 与えられた PostScript 画像 ( .request .psbb で設定されます) の左下 x 座標 (PostScript 単位)。 .REG lly 与えられた PostScript 画像 ( .request .psbb で設定されます) の左下 y 座標 (PostScript 単位)。 .REG rsb .register sb と同様ですが、文字の高さおよび深さを勘定に含めています。 .REG rst .register st と同様ですが、文字の高さおよび深さを勘定に含めています。 .REG sb 文字列の、基準線の下側の深さ (幅関数 .esc w で生成されます)。 .REG skw .esc w 引数の最後の文字の中央からの右スキップ幅。 .REG ssc 添字の直前にある文字に追加すべき水平方向の空白量 (幅関数 .esc w で生成されます) (負の値になる可能性もあります)。 .REG st 文字列の、基準線の上の高さ (幅関数 .esc w で生成されます)。 .REG urx 与えられた PostScript 画像 ( .request .psbb で設定されます) の右上 x 座標 (PostScript 単位)。 .REG ury 与えられた PostScript 画像 ( .request .psbb で設定されます) の右上 y 座標 (PostScript 単位)。 .PD . .\" -------------------------------------------------------------------- .SS "書き込み可能なレジスタ" .\"-------------------------------------------------------------------- 次のレジスタは、ユーザによって読み書き可能です。 定義済みのデフォルト値を持っていますが、ドキュメントを カスタマイズするために変更できます。 .LP .PD 0 .REG % 現在のページ番号。 .REG c. 現在の入力行番号。 .REG ct 文字の種類 (幅関数 .esc w で指定されます)。 .REG dl 最後に行われたディバージョンの最大幅。 .REG dw 現在の曜日 (1-7)。 .REG dy 現在の日 (1-31)。 .REG hp 現在の入力行における水平位置。 .REG ln 出力行番号。 .REG mo 現在の月 (1-12)。 .REG nl 最後に表示されたテキストのベースラインの垂直方向の位置。 .REG slimit 0 よりも大きければ、入力スタック上のオブジェクトの最大数。 0 以下であれば、制限はありません。つまり、仮想メモリを使い果たすまで 再帰呼び出しし続けることができます。 .REG systat 最後の .request .sy リクエストによって実行された .I system() 関数の戻り値。 .REG year 現在の年 (2000 年問題対応です)。 .REG yr 現在の年から 1900 を引いたものです。2000 年問題対応にするには レジスタ .register year を代わりに使用してください。 .PD . .\" -------------------------------------------------------------------- .SH 警告 .\" -------------------------------------------------------------------- groff が生成する警告は各々名前およびコード番号で識別されます。 コードは 2 の累乗になっていて、1 つの整数の上にビットエンコード できるようになっています。名前も警告のグループを参照するのに 使用できます。 .LP 警告と関連のある名前は、 .option \-w および .option \-W オプションで使用されます。 コード番号は リクエスト .request .warn および .esc[arg] n warn レジスタで使用されます。 .LP .PD 0 .Warning all group .warning di , .warning mac および .warning reg を除いたすべての警告です。 伝統的なマクロパッケージでの警告をすべて網羅しています。 .Warning break 4 行連結モード時に、1 行の長さよりも短くなるように 行を分割できませんでした。デフォルトでは有効です。 .Warning char 1 存在しない文字です。デフォルトでは有効です。 .Warning delim 8 閉じ区切り記号がないか、もしくは対応が取れません。 .Warning di 256 現在ディバージョンが存在しないのに 引数なしで .request .di あるいは .request .da を使っています。 .Warning el 16 対応するリクエスト .request .ie が存在しないのに .request .el リクエストを使っています。 .Warning escape 32768 認識されないエスケープシーケンスです。そのためエスケープ文字は 無視されます。 .Warning font 131072 存在しないフォントです。デフォルトでは有効です。 .Warning ig 262144 リクエスト .request \.ig を使って無視されているテキスト中で不正なエスケープがあります。 無視されるテキストの外側でこの警告が発生する場合、 エラーとなる状態です。 .Warning mac 512 定義されていない文字列、マクロ、およびディバージョンが使われました。 自動的に空文字として扱われます。通常は、名前ごとに 1 つしか 警告は出ません。 .Warning missing 8192 オプションではない引数が指定されていないリクエストです。 .Warning input 16384 不正な入力文字です。 .Warning number 2 不正な数式です。デフォルトでは有効です。 .Warning range 64 引数が範囲外です。 .Warning reg 1024 定義されていない番号レジスタを使っています。自動的に 値 0 をもつレジスタとして扱われます。通常は、 名前ごとに 1 つしか警告は出ません。 .Warning right-brace 4096 数字を指定すべき場所で .esc } が使われました。 .Warning scale 32 意味のない単位指定子です。 .Warning space 65536 リクエストあるいはマクロとその引数との間に空白がありません。 そのため、自動的にマクロは定義されません。 デフォルトでは有効です。 この警告は互換モードでは絶対に発生しません。 .Warning syntax 128 数式中の構文が曖昧です。 .Warning tab 2048 タブ文字の使い方が適切ではありません (クォートされていない マクロ引数中や数字を指定すべきところにタブ文字がある)。 .Warning w group すべての警告です。 .PD .LP .TS tab(@), box, expand; c c c | c c c | c c c R RI CB | R RI CB | R RI CB. Bit@Code@警告@Bit@Code@警告@Bit@Code@警告 _ 0@1@char@8@256@di@16@65536@space 1@2@number@9@512@mac@17@131072@font 2@4@break@10@1024@reg@18@262144@ig 3@8@delim@11@2048@tab 4@16@el@12@4096@right-brace 5@32@scale@13@8192@missing 6@64@range@14@16384@input 7@128@syntax@15@32768@escape .TE .LP . .\" -------------------------------------------------------------------- .SH 互換性 .\" -------------------------------------------------------------------- .I groff は、古典的な .I troff 用に書かれた roff コードや他の roff 実装用の roff コードを同じ方法で 処理できるようにする .B 互換モード を提供します。 .LP 互換モードはコマンドラインオプション .option \-C を用いて有効にでき、 .request .cp で有効にしたり無効にしたりできます。番号レジスタ .esc(arg n .C は、互換モードが有効であるとき .number 1 で、無効であるとき .number 0 です。 .LP 長い名前に対する GNU の考え方によってある種の非互換性が 生まれてしまうのでこれが必要になりました。 .I 古典的な troff は、 .IP .B \&.dsabcd .LP を .BR cd という中身を持った文字列 .B ab を定義しているものとして解釈します。 .I groff は、通常これを .request dsabcd という名前のマクロ呼び出しとして解釈します。 .LP さらに、 .I 古典的な troff では .esc *[ または .esc n[ を .register [ と呼ばれる文字列レジスタあるいは番号レジスタへのリファレンスとして 解釈します。 しかし、 .I GNU 独自の .IR モード では通常これを長い名前の始まりとして解釈してしまいます。 .LP .I 互換性 .IR モードでは、 groff はこれらを古典的な方法で解釈するようになりますが、長い名前は 認識されません。 .LP これに対して、 .I GNU 独自モード での groff は、文字列やマクロ、変換、番号レジスタ、フォントあるいは 環境名にエスケープシーケンス .esc e , .esc | , .esc ^ , .esc & , .esc } , .esc { , .esc "\ " (スペース), .esc ' , .esc ` , .esc - , .esc _ , .esc ! , .esc % , .esc c を使うことはできません。これに対して .I 古典的な troff ではこれらのエスケープシーケンスを使えます。 エスケープシーケンス .esc A は、名前の中でこれらのエスケープシーケンスを使わないようにするとき 役に立ちます。 .LP 小数のポイントサイズは、顕著な非互換性を生み出します。 .I 古典的な .IR troff では、 .request .ps リクエストは単位指定子を無視しますので、 .RS .LP .B .ps\ 10u .RE .LP とするとポイントサイズを 10 ポイントに設定します。 これに対して groff 独自のモードでは、ポイントサイズは スケールポイントで 10 ポイントに設定します。 .LP .I groff モードでは、整形されていない入力と整形された出力文字との間に 基本的な違いがあります。 出力文字がどのように出力されるかに影響を与えるものは、すべて その文字と一緒に格納されます。一度出力文字が作られれば、 その後でどのようなリクエストが実行されても出力文字は影響を受けません。 .request .bd , .request .cs , .request .tkf , .request .tr , .request .fp のいずれのリクエストでも同様です。 .LP 通常、出力文字は、入力文字を現在の出力行に追加する直前に 作られます。 マクロ、ディバージョン、文字列は、実はすべて 同じオブジェクトタイプです。 これらは、どのような組み合わせでも入力文字のリスト ならびに出力文字のリストを持っています。 .LP マクロを処理する目的では、出力文字は入力文字と同じような 振る舞いはしません。出力文字は、自分の構築元となった 入力文字ならば持っていたであろう特別な属性を一切 引き継ぎません。 次の例は、これらのことをもっと明解に示しています。 .LP .RS .nf .ft B \&.di x \(rs\(rs\(rs\(rs \&.br \&.di \&.x .ft .fi .RE .LP .I GNU モード では、これは .esc \(rs として表示されます。 つまり、入力されたバックスラッシュの対 .'char \(rs\(rs はそれぞれ 1 つのバックスラッシュ .'char \(rs に変換されます。 そして、結果として出力されるバックスラッシュは、 再度読み込まれるときにはエスケープ文字としては解釈されません。 .LP .I 古典的な troff では、こうしたバックスラッシュは再度読み込まれるときには エスケープ文字として解釈されるので、最終的には 1 つのバックスラッシュ .'char \(rs として出力されるでしょう。 .LP 出力可能な .'char \(rs を得る正しい方法は エスケープシーケンス .esc e を使うことでしょう。 これは、ディバージョン内で使用されているかどうかに関わらず、 現在のエスケープ文字を常に 1 つだけ出力します。 さらにこれは GNU モードでも互換モードでも動作します。 .LP ディバージョン内に、再度読み込まれたときに解釈したい エスケープシーケンスを格納するには、伝統的な 透過出力ファシリティ .esc ! あるいは新しいエスケープシーケンス .esc ? のどちらかが使用できます。 . .\" -------------------------------------------------------------------- .SH バグ .\" -------------------------------------------------------------------- 現在、groff システムのドキュメントは変更・刷新途上にあります。 それぞれのマニュアルには小さな不一致がある可能性があります。 .LP .B 警告 セクションは .BR troff (1) に属しています。 . .\" -------------------------------------------------------------------- .SH 作者 .\"-------------------------------------------------------------------- このドキュメントは groff、すなわち GNU roff 配布物の一部です。 Bernd Warken が書きました。 .LP このドキュメントは、FDL (GNU Free Documentation License) バージョン 1.1 以降の条項のもとに配布されています。 システムに FDL のコピーがあるはずですし、オンライン .RS .LP .I http://www.gnu.org/copyleft/fdl.html .RE .LP でも入手できます。 .LP もともと、groff 言語拡張については .BR troff (1) マニュアルページで管理されていました。 このドキュメントは groff 言語拡張の不可欠な部分を含んではいますが、 詳しい説明については、groff info ファイルの中にあります。 . .\" -------------------------------------------------------------------- .SH "関連項目" .\"-------------------------------------------------------------------- groff 言語の主な情報源は .B groff .BR info (1) ファイルです。 .LP roff および groff システムを調べたり、さらなるドキュメントへの ポインタを得るには、 .BR roff (7) を参照してください。 .LP フォーマッタプログラムについては .BR groff (1) および .BR troff (1) で説明されており、 前もって定義されているグリフ名のすべては .BR groff_char (7) で説明されています。 .LP 古くからある .I troff のドキュメントはオンライン .RS .LP .I http://cm.bell-labs.com/cm/cs/cstr.html .RE および .RS .I http://www.kohala.com/start/troff/ .RE にあります。