OSDN Git Service

info/GNU_coreutils: Ugh, found another bug, fixed.
[linuxjm/jm.git] / info / GNU_coreutils / release / coreutils-ja.texi
1 \input texinfo
2 @c ===========================================================================
3 @c
4 @c This file was generated with po4a. Translate the source file.
5 @c
6 @c ===========================================================================
7 @c %**start of header
8 @setfilename coreutils-ja.info
9 @settitle GNU Coreutils
10 @documentencoding UTF-8
11 @allowcodebreaks false
12
13 @c %**end of header
14
15 @include version.texi
16 @include constants.texi
17
18 @c Define new indices.
19 @defcodeindex op
20 @defcodeindex fl
21
22 @c Put everything in one index (arbitrarily chosen to be the concept index).
23 @syncodeindex fl cp
24 @syncodeindex fn cp
25 @syncodeindex ky cp
26 @syncodeindex op cp
27 @syncodeindex pg cp
28 @syncodeindex vr cp
29
30 @dircategory Basics (in Japanese)
31 @direntry
32 * Coreutils-ja: (coreutils-ja).  Core GNU (file, text, shell) utilities.
33 * Common options-ja: (coreutils-ja)Common options.
34 * File permissions-ja: (coreutils-ja)File permissions.  Access modes.
35 * Date input formats-ja: (coreutils-ja)Date input formats.    
36 @end direntry
37
38 @c FIXME: the following need documentation
39 @c * [: (coreutils)[ invocation.                   File/string tests.
40 @c * pinky: (coreutils)pinky invocation.           FIXME.
41
42 @dircategory Individual utilities (in Japanese)
43 @direntry
44 * arch-ja: (coreutils-ja)arch invocation.          Print machine hardware name.
45 * b2sum-ja: (coreutils-ja)b2sum invocation.        Print or check BLAKE2 digests.
46 * base32-ja: (coreutils-ja)base32 invocation.      Base32 encode/decode data.
47 * base64-ja: (coreutils-ja)base64 invocation.      Base64 encode/decode data.
48 * basename-ja: (coreutils-ja)basename invocation.  Strip directory and suffix.
49 * cat-ja: (coreutils-ja)cat invocation.            Concatenate and write files.
50 * chcon-ja: (coreutils-ja)chcon invocation.        Change SELinux CTX of files.
51 * chgrp-ja: (coreutils-ja)chgrp invocation.        Change file groups.
52 * chmod-ja: (coreutils-ja)chmod invocation.        Change access permissions.
53 * chown-ja: (coreutils-ja)chown invocation.        Change file owners and groups.
54 * chroot-ja: (coreutils-ja)chroot invocation.      Specify the root directory.
55 * cksum-ja: (coreutils-ja)cksum invocation.        Print POSIX CRC checksum. 
56 * comm-ja: (coreutils-ja)comm invocation.          Compare sorted files by line.
57 * cp-ja: (coreutils-ja)cp invocation.              Copy files.
58 * csplit-ja: (coreutils-ja)csplit invocation.      Split by context.
59 * cut-ja: (coreutils-ja)cut invocation.            Print selected parts of lines.
60 * date-ja: (coreutils-ja)date invocation.          Print/set system date and time.
61 * dd-ja: (coreutils-ja)dd invocation.              Copy and convert a file.
62 * df-ja: (coreutils-ja)df invocation.              Report file system disk usage.
63 * dir-ja: (coreutils-ja)dir invocation.            List directories briefly.
64 * dircolors-ja: (coreutils-ja)dircolors invocation.  Color setup for ls.
65 * dirname-ja: (coreutils-ja)dirname invocation.    Strip last file name component.
66 * du-ja: (coreutils-ja)du invocation.              Report on disk usage.
67 * echo-ja: (coreutils-ja)echo invocation.          Print a line of text. 
68 * env-ja: (coreutils-ja)env invocation.            Modify the environment.
69 * expand-ja: (coreutils-ja)expand invocation.      Convert tabs to spaces.
70 * expr-ja: (coreutils-ja)expr invocation.          Evaluate expressions.
71 * factor-ja: (coreutils-ja)factor invocation.      Print prime factors.
72 * false-ja: (coreutils-ja)false invocation.        Do nothing, unsuccessfully.
73 * fmt-ja: (coreutils-ja)fmt invocation.            Reformat paragraph text.
74 * fold-ja: (coreutils-ja)fold invocation.          Wrap long input lines.
75 * groups-ja: (coreutils-ja)groups invocation.      Print group names a user is in.
76 * head-ja: (coreutils-ja)head invocation.          Output the first part of files.
77 * hostid-ja: (coreutils-ja)hostid invocation.      Print numeric host identifier.
78 * hostname-ja: (coreutils-ja)hostname invocation.  Print or set system name.
79 * id-ja: (coreutils-ja)id invocation.              Print user identity.
80 * install-ja: (coreutils-ja)install invocation.    Copy files and set attributes.
81 * join-ja: (coreutils-ja)join invocation.          Join lines on a common field.
82 * kill-ja: (coreutils-ja)kill invocation.          Send a signal to processes.
83 * link-ja: (coreutils-ja)link invocation.          Make hard links between files.
84 * ln-ja: (coreutils-ja)ln invocation.              Make links between files.
85 * logname-ja: (coreutils-ja)logname invocation.    Print current login name.
86 * ls-ja: (coreutils-ja)ls invocation.              List directory contents.
87 * md5sum-ja: (coreutils-ja)md5sum invocation.      Print or check MD5 digests.
88 * mkdir-ja: (coreutils-ja)mkdir invocation.        Create directories.
89 * mkfifo-ja: (coreutils-ja)mkfifo invocation.      Create FIFOs (named pipes).
90 * mknod-ja: (coreutils-ja)mknod invocation.        Create special files.
91 * mktemp-ja: (coreutils-ja)mktemp invocation.      Create temporary files.
92 * mv-ja: (coreutils-ja)mv invocation.              Rename files.
93 * nice-ja: (coreutils-ja)nice invocation.          Modify niceness.
94 * nl-ja: (coreutils-ja)nl invocation.              Number lines and write files.
95 * nohup-ja: (coreutils-ja)nohup invocation.        Immunize to hangups.
96 * nproc-ja: (coreutils-ja)nproc invocation.        Print the number of processors.
97 * numfmt-ja: (coreutils-ja)numfmt invocation.      Reformat numbers.
98 * od-ja: (coreutils-ja)od invocation.              Dump files in octal, etc.
99 * paste-ja: (coreutils-ja)paste invocation.        Merge lines of files.
100 * pathchk-ja: (coreutils-ja)pathchk invocation.    Check file name portability.
101 * pr-ja: (coreutils-ja)pr invocation.              Paginate or columnate files.
102 * printenv-ja: (coreutils-ja)printenv invocation.  Print environment variables.
103 * printf-ja: (coreutils-ja)printf invocation.      Format and print data.
104 * ptx-ja: (coreutils-ja)ptx invocation.            Produce permuted indexes.
105 * pwd-ja: (coreutils-ja)pwd invocation.            Print working directory.
106 * readlink-ja: (coreutils-ja)readlink invocation.  Print referent of a symlink.
107 * realpath-ja: (coreutils-ja)realpath invocation.  Print resolved file names.
108 * rm-ja: (coreutils-ja)rm invocation.              Remove files.
109 * rmdir-ja: (coreutils-ja)rmdir invocation.        Remove empty directories.
110 * runcon-ja: (coreutils-ja)runcon invocation.      Run in specified SELinux CTX.
111 * seq-ja: (coreutils-ja)seq invocation.            Print numeric sequences.
112 * sha1sum-ja: (coreutils-ja)sha1sum invocation.    Print or check SHA-1 digests.
113 * sha2-ja: (coreutils-ja)sha2 utilities.           Print or check SHA-2 digests.
114 * shred-ja: (coreutils-ja)shred invocation.        Remove files more securely.
115 * shuf-ja: (coreutils-ja)shuf invocation.          Shuffling text files.
116 * sleep-ja: (coreutils-ja)sleep invocation.        Delay for a specified time.
117 * sort-ja: (coreutils-ja)sort invocation.          Sort text files.
118 * split-ja: (coreutils-ja)split invocation.        Split into pieces.
119 * stat-ja: (coreutils-ja)stat invocation.          Report file(system) status.
120 * stdbuf-ja: (coreutils-ja)stdbuf invocation.      Modify stdio buffering.
121 * stty-ja: (coreutils-ja)stty invocation.          Print/change terminal settings.
122 * sum-ja: (coreutils-ja)sum invocation.            Print traditional checksum.
123 * sync-ja: (coreutils-ja)sync invocation.          Synchronize memory to disk.
124 * tac-ja: (coreutils-ja)tac invocation.            Reverse files.
125 * tail-ja: (coreutils-ja)tail invocation.          Output the last part of files.
126 * tee-ja: (coreutils-ja)tee invocation.            Redirect to multiple files.
127 * test-ja: (coreutils-ja)test invocation.          File/string tests.
128 * timeout-ja: (coreutils-ja)timeout invocation.    Run with time limit.
129 * touch-ja: (coreutils-ja)touch invocation.        Change file timestamps.
130 * tr-ja: (coreutils-ja)tr invocation.              Translate characters.
131 * true-ja: (coreutils-ja)true invocation.          Do nothing, successfully.
132 * truncate-ja: (coreutils-ja)truncate invocation.  Shrink/extend size of a file.
133 * tsort-ja: (coreutils-ja)tsort invocation.        Topological sort.
134 * tty-ja: (coreutils-ja)tty invocation.            Print terminal name.
135 * uname-ja: (coreutils-ja)uname invocation.        Print system information.
136 * unexpand-ja: (coreutils-ja)unexpand invocation.  Convert spaces to tabs.
137 * uniq-ja: (coreutils-ja)uniq invocation.          Uniquify files.
138 * unlink-ja: (coreutils-ja)unlink invocation.      Removal via unlink(2).
139 * uptime-ja: (coreutils-ja)uptime invocation.      Print uptime and load.
140 * users-ja: (coreutils-ja)users invocation.        Print current user names.
141 * vdir-ja: (coreutils-ja)vdir invocation.          List directories verbosely.
142 * wc-ja: (coreutils-ja)wc invocation.              Line, word, and byte counts.
143 * who-ja: (coreutils-ja)who invocation.            Print who is logged in.
144 * whoami-ja: (coreutils-ja)whoami invocation.      Print effective user ID.
145 * yes-ja: (coreutils-ja)yes invocation.            Print a string indefinitely.
146 @end direntry
147
148 @copying
149 このマニュアルは、GNU core utilities version @value{VERSION} の詳細な解説である。
150 core utilities には、テキストやファイルを操作するための標準的なプログラムが入っている。
151
152 Copyright @copyright{} 1994-2016 Free Software Foundation, Inc.
153
154 Japanese translation copyright @copyright{} 2014-2017 Linux JM project
155
156 @quotation
157 Permission is granted to copy, distribute and/or modify this document under
158 the terms of the GNU Free Documentation License, Version 1.3 or any later
159 version published by the Free Software Foundation; with no Invariant
160 Sections, with no Front-Cover Texts, and with no Back-Cover Texts.  A copy
161 of the license is included in the section entitled ``GNU Free Documentation
162 License''.
163 @end quotation
164
165 【訳者から御注意】 この文書を info コマンドで閲覧なさっている場合は、
166 行末に余計な文字が入って、読みにくいことがあるかもしれない。
167 そうしたときは、Ctrl キーと l (エル) キーを同時に押して、画面を再描画していただきたい。
168 たぶん、表示が正常になるはずである。
169
170 お手元の coreutils のバージョンが @value{VERSION} 以外の場合、
171 この文書の説明と動作が違うことがあるかもしれない 
172 (たとえば、この文書に書いてあるオプションが使えない、あるいは、
173 使えるはずのオプションの説明がないなど)。
174 そうした場合は、お使いの coreutils と同じバージョンの info マニュアルや 
175 man ページに当ってみていただきたい。そちらの方が正しいはずである。
176 @end copying
177
178 @titlepage
179 @title GNU @code{Coreutils}
180 @subtitle Core GNU utilities
181 @subtitle for version @value{VERSION}, @value{UPDATED}
182 @author David MacKenzie et al.
183 @author translated by Linux JM project
184
185 @page
186 @vskip 0pt plus 1filll
187 @insertcopying
188 @end titlepage
189 @shortcontents
190 @contents
191
192 @ifnottex
193 @node Top
194 @top GNU Coreutils
195
196 @insertcopying
197 @end ifnottex
198
199 @cindex core utilities
200 @cindex text utilities
201 @cindex shell utilities
202 @cindex file utilities
203
204 @menu
205 * Introduction::             注意事項、概観、著者
206 * Common options::           共通オプション
207 * Output of entire files::   ファイル全体の出力 (cat tac nl od base32 base64)
208 * Formatting file contents:: ファイルの整形 (fmt pr fold)
209 * Output of parts of files:: ファイルの部分出力 (head tail split csplit)
210 * Summarizing files::        チェックサムなど (wc sum b2sum cksum md5sum
211                                sha1sum sha2)
212 * Operating on sorted files::  ソートなど (sort shuf uniq comm ptx tsort)
213 * Operating on fields::      フィールド操作 (cut paste join)
214 * Operating on characters::  文字操作 (tr expand unexpand)
215 * Directory listing::        ディレクトリ一覧 (ls dir vdir dircolors)
216 * Basic operations::         基本操作 (cp dd install mv rm shred)
217 * Special file types::       特殊ファイル型 (mkdir rmdir unlink mkfifo mknod
218                                ln link readlink)
219 * Changing file attributes:: ファイルの属性変更 (chgrp chmod chown touch)
220 * Disk usage::               ディスク使用量など (df du stat sync truncate)
221 * Printing text::            テキストの表示 (echo printf yes)
222 * Conditions::               条件 (false true test expr)
223 * Redirection::              リダイレクション (tee)
224 * File name manipulation::   ファイル名の操作 (dirname basename pathchk
225                                mktemp realpath)
226 * Working context::          作業環境 (pwd stty printenv tty)
227 * User information::         ユーザ情報 (id logname whoami groups users who)
228 * System context::           システム関連 (date arch nproc uname hostname
229                                hostid uptime)
230 * SELinux context::          SELinux コンテキスト (chcon runcon)
231 * Modified command invocation::  実行環境の変更 (chroot env nice nohup stdbuf
232                                    timeout)
233 * Process control::          プロセス制御 (kill)
234 * Delaying::                 一時停止 (sleep)
235 * Numeric operations::       数値の操作 (factor numfmt seq)
236 * File permissions::         アクセス・モード
237 * Date input formats::       日付文字列の指定法
238 * Opening the software toolbox::  ソフトウェア工具という考え方
239 * About the translation::    翻訳について
240 * GNU Free Documentation License::  Copying and sharing this manual
241 * Concept index::            General index
242
243 @detailmenu
244  --- ノードの詳細なリスト ---
245
246 共通オプション
247
248 * Exit status::              プログラムが実行に成功したか失敗したかの指標
249 * Backup options::           バックアップ・オプション
250 * Block size::               ブロックサイズ
251 * Floating point::           浮動小数点数の表現
252 * Signal specifications::    シグナルの指定
253 * Disambiguating names and IDs::  chgrp, chown, chroot, id
254                                     におけるユーザやグループの指定法
255 * Random sources::           ランダムデータのソース
256 * Target directory::         出力先ディレクトリ
257 * Trailing slashes::         末尾のスラッシュ
258 * Traversing symlinks::      ディレクトリを指すシンボリックリンクのたどり方
259 * Treating / specially::     / (ルート) を特別扱いする
260 * Special built-in utilities::  シェルの組み込みコマンド
261 * Standards conformance::    規格への準拠
262 * Multi-call invocation::    Multi-call プログラムの起動
263
264 ファイル全体の出力
265
266 * cat invocation::           ファイルを結合して、書き出す
267 * tac invocation::           ファイルを結合して、ファイルごとに逆順で書き出す
268 * nl invocation::            行番号を付けて、ファイルを書き出す
269 * od invocation::            ファイルを 8 進数などの形式で書き出す
270 * base32 invocation::        データを ASCII 文字で表示可能なデータに変換する
271 * base64 invocation::        データを ASCII 文字で表示可能なデータに変換する
272
273 ファイル内容の整形
274
275 * fmt invocation::           パラグラフに分かれたテキストを整形し直す
276 * pr invocation::            ページ付けや段組みをしてファイルを表示する
277 * fold invocation::          入力行を指定された幅に合わせて折り返す
278
279 ファイルの部分出力
280
281 * head invocation::          ファイルの先頭部分を出力する
282 * tail invocation::          ファイルの末尾部分を出力する
283 * split invocation::         ファイルを一定のサイズに分割する
284 * csplit invocation::        ファイルを内容を目印にして分割する
285
286 ファイルの要約
287
288 * wc invocation::            行数、単語数、バイト数を表示する
289 * sum invocation::           チェックサムとブロック数を表示する
290 * cksum invocation::         CRC チェックサムとバイト数を表示する
291 * b2sum invocation::         BLAKE2 ダイジェストの表示、または検査をする
292 * md5sum invocation::        MD5 ダイジェストの表示、または検査をする
293 * sha1sum invocation::       SHA-1 ダイジェストの表示、または検査をする
294 * sha2 utilities::           SHA-2 ダイジェストの表示、または検査をする
295
296 ソートしたファイルの操作
297
298 * sort invocation::          テキストファイルを並べ替える
299 * shuf invocation::          テキストファイルをシャッフルする
300 * uniq invocation::          ファイルから重複を省く
301 * comm invocation::          ソート済みの二つのファイルを一行づつ比較する
302 * ptx invocation::           ファイル内容の permuted index を作成する
303 * tsort invocation::         トポロジカル・ソート
304
305 @command{ptx}: パミューテド・インデックスを作成する
306
307 * General options in ptx::   プログラム全体の動作に関係するオプション
308 * Charset selection in ptx:: 使用している文字セットについて
309 * Input processing in ptx::  入力のフィールドと文脈、及びキーワードの選択
310 * Output formatting in ptx:: 出力フォーマットのタイプ、及びフィールドの幅
311 * Compatibility in ptx::     GNU による @command{ptx} の拡張
312
313 フィールド操作
314
315 * cut invocation::           各行の選択した部分を表示する
316 * paste invocation::         複数のファイルの各行をマージする
317 * join invocation::          共通のフィールドに基づいて行を連結する
318
319 文字操作
320
321 * tr invocation::            文字の置換、圧縮、削除を行う
322 * expand invocation::        タブをスペースに変換する
323 * unexpand invocation::      スペースをタブに変換する
324
325 @command{tr}: 文字の置換、圧縮、削除を行う
326
327 * Character sets::           文字集合の指定
328 * Translating::              ある文字集合を別の文字集合に変換する
329 * Squeezing and deleting::   文字の削除
330
331 ディレクトリの一覧表示
332
333 * ls invocation::            ディレクトリの内容を一覧表示する
334 * dir invocation::           ディレクトリの内容を簡潔に表示する
335 * vdir invocation::          ディレクトリの内容を詳細に表示する
336 * dircolors invocation::     @command{ls} のカラー設定
337
338 @command{ls}: ディレクトリの内容を一覧表示する
339
340 * Which files are listed::      表示対象にするファイル
341 * What information is listed::  表示する情報
342 * Sorting the output::          出力のソート
343 * Details about version sort::  バージョン・ソートの詳細
344 * General output formatting::   出力全体の形式
345 * Formatting file timestamps::  タイムスタンプのフォーマット
346 * Formatting the file names::   ファイル名のフォーマット
347
348 基本的なファイル操作
349
350 * cp invocation::            ファイルやディレクトリをコピーする
351 * dd invocation::            ファイルの変換とコピー
352 * install invocation::       ファイルをコピーし属性をセットする
353 * mv invocation::            ファイルの移動 (名前の変更) を行う
354 * rm invocation::            ファイルやディレクトリを削除する
355 * shred invocation::         セキュリティを向上させたファイルの削除
356
357 特殊なファイル型
358
359 * link invocation::     システムコール link を使って、ハードリンクを作成する
360 * ln invocation::       ファイル間のリンクを作成する
361 * mkdir invocation::    ディレクトリを作成する
362 * mkfifo invocation::   FIFO (名前付きパイプ) を作成する
363 * mknod invocation::    ブロック型やキャラクタ型のスペシャルファイルを作成する
364 * readlink invocation:: シムリンクの値、または正規化されたファイル名を表示する
365 * rmdir invocation::    空のディレクトリを削除する
366 * unlink invocation::   システムコール unlink を使って、ファイルを削除する
367
368 ファイルの属性変更
369
370 * chown invocation::         ファイルの所有者やグループを変更する
371 * chgrp invocation::         ファイルの所有グループを変更する
372 * chmod invocation::         アクセス権を変更する
373 * touch invocation::         ファイルのタイムスタンプを変更する
374
375 ディスク使用量
376
377 * df invocation::            ファイルシステムのディスク使用状態を報告する
378 * du invocation::            ファイルのディスク使用量を概算する
379 * stat invocation::          ファイルやファイルシステムの状態を報告する
380 * sync invocation::          キャッシュされた書き込みを永続的な記憶装置に同期する
381 * truncate invocation::      ファイルサイズの短縮・伸長を行う
382
383 テキストの表示
384
385 * echo invocation::          テキストを 1 行表示する
386 * printf invocation::        データを整形して表示する
387 * yes invocation::           中断されるまで文字列を表示する
388
389 条件
390
391 * false invocation::         何もせず、実行失敗のステータスを返す
392 * true invocation::          何もせず、正常終了する
393 * test invocation::          ファイルタイプのチェックや値の比較を行う
394 * expr invocation::          式を評価する
395
396 @command{test}: ファイルタイプのチェックや値の比較を行う
397
398 * File type tests::            ファイルタイプのテスト
399 * Access permission tests::    アクセス許可のテスト
400 * File characteristic tests::  ファイル特性のテスト
401 * String tests::               文字列のテスト
402 * Numeric tests::              数値のテスト
403
404 @command{expr}: 式を評価する
405
406 * String expressions::       文字列式 (+ : match substr index length)
407 * Numeric expressions::      数式 (+ - * / %)
408 * Relations for expr::       論理結合と関係表現 (| & < <= = == != >= >)
409 * Examples of expr::         @command{expr} の使用例
410
411 リダイレクション
412
413 * tee invocation::           出力を複数のファイルやプロセスにリダイレクトする
414
415 ファイル名操作
416
417 * basename invocation::      ファイル名からディレクトリと接尾辞を取り除く
418 * dirname invocation::       ファイル名から最後の要素を取り除く
419 * pathchk invocation::       ファイル名の有効性や可搬性を検査する
420 * mktemp invocation::        テンポラリファイルやディレクトリを作成する
421 * realpath invocation::      ファイル名を展開して表示する
422
423 作業環境
424
425 * pwd invocation::           現在作業中のディレクトリを表示する
426 * stty invocation::          端末の諸特性を表示・変更する
427 * printenv invocation::      環境変数のすべて、あるいは一部を表示する
428 * tty invocation::           標準入力に接続している端末のファイル名を表示する
429
430 @command{stty}: 端末の諸特性を表示・変更する
431
432 * Control::                  制御関係の設定
433 * Input::                    入力に関する設定
434 * Output::                   出力に関する設定
435 * Local::                    ローカル設定
436 * Combination::              組み合わせ設定
437 * Characters::               特殊文字
438 * Special::                  特殊設定
439
440 ユーザ情報
441
442 * id invocation::            ユーザの ID を表示する
443 * logname invocation::       現在のログイン名を表示する
444 * whoami invocation::        実効ユーザ ID を表示する
445 * groups invocation::        ユーザが所属しているグループ名を表示する
446 * users invocation::         現在ログインしている全ユーザのログイン名を表示する
447 * who invocation::           現在誰がログインしているかを表示する
448
449 システム関連
450
451 * date invocation::          システムの日付や時刻を表示、設定する
452 * arch invocation::          マシンのハードウェア名を表示する
453 * nproc invocation::         プロセッサ数を表示する
454 * uname invocation::         システムについて情報を表示する
455 * hostname invocation::      システム名を表示、設定する
456 * hostid invocation::        数値によるホストの識別名を表示する
457 * uptime invocation::        システムの連続稼働時間と負荷を表示する
458
459 @command{date}: システムの日付や時刻を表示、設定する
460
461 * Time conversion specifiers:: 時刻関係の変換指定子 %[HIklMNpPrRsSTXzZ]
462 * Date conversion specifiers:: 日付関係の変換指定子 %[aAbBcCdDeFgGhjmuUVwWxyY]
463 * Literal conversion specifiers::  文字変換指定子 %[%nt]
464 * Padding and other flags::  0 や空白による空き埋め、その他
465 * Setting the time::         システムクロックの変更
466 * Options for date::         現在時以外の指定
467 * Date input formats::       日付文字列の指定法
468 * Examples of date::         用例
469
470 SELinux コンテキスト
471
472 * chcon invocation::         ファイルの SELinux コンテキストを変更する
473 * runcon invocation::        指定された SELinux コンテキストでコマンドを実行する
474
475 コマンド実行条件の変更
476
477 * chroot invocation::        ルートディレクトリを変更して、コマンドを実行する
478 * env invocation::           変更した環境でコマンドを実行する
479 * nice invocation::          niceness を変更して、コマンドを実行する
480 * nohup invocation::         ハングアップ・シグナルで終了しないコマンドを実行する
481 * stdbuf invocation::        入出力バッファリングを変更して、コマンドを実行する
482 * timeout invocation::       タイムリミット付きでコマンドを実行する
483
484 プロセス制御
485
486 * kill invocation::          プロセスにシグナルを送る。
487
488 一時停止
489
490 * sleep invocation::         指定された時間、停止する
491
492 数値の操作
493
494 * factor invocation::        素因数を表示する
495 * numfmt invocation::        数値を整形し直す
496 * seq invocation::           数列を表示する
497
498 @command{numfmt}: 数値を整形し直す
499  
500 * General options in numfmt::  一般オプション
501 * Possible UNITs::             使用できる UNIT
502 * Examples of using numfmt::   numfmt の使用例
503
504
505 ファイルの許可属性
506
507 * Mode Structure::           ファイルのモードビットの構成
508 * Symbolic Modes::           ファイルのモードビットの憶えやすい表記
509 * Numeric Modes::            ファイルのモードビットの 8 進数による表記
510 * Operator Numeric Modes::   8 進数によるモードの追加、削除、絶対指定
511 * Directory Setuid and Setgid::  ディレクトリの Set-User-ID と 
512                                    Set-Group-ID ビット
513
514 日付入力の書式
515
516 * General date syntax::      共通規則
517 * Calendar date items::      19 Dec 1994
518 * Time of day items::        9:20pm
519 * Time zone items::          EST, PDT, UTC, @dots{}
520 * Combined date and time of day items::  1972-09-24T20:02:00,000000-0500
521 * Day of week items::        Monday, Tuesday
522 * Relative items in date strings::  next tuesday, 2 years ago
523 * Pure numbers in date strings::  19931219, 1440
524 * Seconds since the Epoch::  @@1078100502
525 * Specifying time zone rules::  TZ="America/New_York", TZ="UTC0"
526 * Authors of parse_datetime::  Bellovin, Eggert, Salz, Berets, et al.
527
528 ソフトウェアの道具箱
529
530 * Toolbox introduction::     はじめに
531 * I/O redirection::          I/O リダイレクション
532 * The who command::          @command{who} コマンド
533 * The cut command::          @command{cut} コマンド
534 * The sort command::         @command{sort} コマンド
535 * The uniq command::         @command{uniq} コマンド
536 * Putting the tools together::  工具を組み合わせる
537
538 翻訳について
539
540 * About the translation::    翻訳について
541
542 Copying This Manual
543
544 * GNU Free Documentation License::  Copying and sharing this manual
545
546 @end detailmenu
547 @end menu
548
549
550 @node Introduction
551 @chapter 序
552
553 このマニュアルは作成の途上にある。たとえば、多くのセクションで、
554 基本的な概念を初心者にわかりやすく説明するといった試みがなされていない。
555 そこで、お願いがある。もし、関心がおありなら、このマニュアルの改良に参加していただきたい。
556 そうしていただければ、GNU コミュニティ全体が恩恵に浴することになる。
557
558 @cindex POSIX
559 このマニュアルで解説している GNU ユーティリティは、
560 POSIX の規格におおむね準拠している。
561 @cindex bugs, reporting
562
563 バグの報告は、@email{bug-coreutils@@gnu.org} になさっていただきたい。
564 そのとき、プログラムのバージョン番号、マシンのアーキテクチャ、
565 入力に使ったファイルといった情報はもとより、
566 バグの再現に必要な他のいかなる情報も、記載していただきたい。
567 たとえば、どんな入力をしたか、どんな結果を期待していたか、実際の結果はどうだったか、
568 それがおかしいと考える理由は何なのかといったことである。
569
570 @command{sort} や @command{date} コマンドの動作に疑問がある場合は、@option{--debug}
571 オプションを試してみていただきたい。
572 その出力が手がかりになって、バグレポートに対する回答を待つまでもなく、
573 問題の在り処を突き止め、解決できることも多いからだ。
574 デバッグの出力が問題を自分で解決するのに十分でないときは、
575 それを圧縮して、提出するバグレポートに添付していただきたい。
576
577 差分の投稿は歓迎するが、何がどう問題なのかの説明もやはり付けていただきたい。
578 推測するのが難しいこともあるからだ。
579 @xref{Bugs, , , gcc, Using and Porting GNU CC}.
580
581 @cindex Berry, K.
582 @cindex Paterson, R.
583 @cindex Stallman, R.
584 @cindex Pinard, F.
585 @cindex MacKenzie, D.
586 @cindex Meyering, J.
587 @cindex Youmans, B.
588 このマニュアルは、ユーティリティ・プログラムの配布に含まれる
589 Unix man page を元にして作られたものである。そうした man page は、David MacKenzie
590 によって書かれ、Jim Meyering によって改訂されていた。
591 現在読者がお読みになっているこのマニュアルは、そうしたユーティリティについての公式文書であり、
592 man page の方は、今では改訂作業が行われていない。なお、@command{fmt}
593 の最初の man page の著者は、Ross Paterson だった。
594 Texinfo 形式への変換を最初に行ったのは、Fran@,{c}ois Pinard である。
595 Karl Berry が索引を作成し、構成に若干の変更を加えて、その結果に手を入れた。
596 Free Software Foundation の職員である Brian Youman が
597 textutils, fileutils, sh-utils のマニュアルを統合し、
598 多数の項目を含む現在のマニュアルを作成した。こうした作業全般に渡って、
599 Richard Stallman が例によって洞察力に富む貴重な意見を寄せてくれた。
600
601 @node Common options
602 @chapter 共通オプション
603
604 @macro optBackup
605 @item -b
606 @itemx --backup[=@var{method}]
607 @opindex -b
608 @opindex --backup
609 @vindex VERSION_CONTROL
610 @cindex backups, making
611 @xref{Backup options}.  そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。
612 @end macro
613
614 @macro optBackupSuffix
615 @item -S @var{suffix}
616 @itemx --suffix=@var{suffix}
617 @opindex -S
618 @opindex --suffix
619 @option{-b} によって作られる各バックアップファイルの後ろに
620 @var{suffix} を付ける。 @xref{Backup options}.
621 @end macro
622
623 @macro optTargetDirectory
624 @item -t @var{directory}
625 @itemx --target-directory=@var{directory}
626 @opindex -t
627 @opindex --target-directory
628 @cindex target directory
629 @cindex destination directory
630 @var{directory} を出力先ディレクトリに指定する。 @xref{Target directory}.
631 @end macro
632
633 @macro optNoTargetDirectory
634 @item -T
635 @itemx --no-target-directory
636 @opindex -T
637 @opindex --no-target-directory
638 @cindex target directory
639 @cindex destination directory
640 最後のオペランドがディレクトリやディレクトリへのシンボリックリンク
641 でも、それを特別扱いしない。 @xref{Target directory}.
642 @end macro
643
644 @macro outputNUL
645 @cindex output NUL-byte-terminated lines
646 各行の末尾に改行ではなく、ゼロバイト (ASCII NUL)
647 を出力する。このオプションを使用すると、出力するデータの途中に改行が現れる場合でも、
648 他のプログラムがその出力を解析できるようになる。
649 @end macro
650
651 @macro optNull
652 @item -0
653 @itemx --null
654 @opindex -0
655 @opindex --null
656 @outputNUL
657 @end macro
658
659 @macro optZero
660 @item -z
661 @itemx --zero
662 @opindex -z
663 @opindex --zero
664 @outputNUL
665 @end macro
666
667 @macro optZeroTerminated
668 @item -z
669 @itemx --zero-terminated
670 @opindex -z
671 @opindex --zero-terminated
672 @cindex process zero-terminated items
673 項目の区切りに、改行 (ASCII LF) ではなく、ゼロバイトを使用する。
674 すなわち、入力を ASCII NUL で分離された項目として扱い、出力する各項目の末尾に
675 ASCII NUL を付加する。このオプションは、@samp{perl -0},
676 @samp{find -print0}, @samp{xargs -0} などと組み合わせて使用すると、
677 便利なことがある。そうしたコマンドでも、わがままなファイル名を
678 (空白などの特殊文字を含んでいる場合でも) きちんと確実に処理するために、
679 同様なことをしているのである。
680 @end macro
681
682 @macro optSi
683 @item --si
684 @opindex --si
685 @cindex SI output
686 各サイズにの後ろに、メガバイトなら @samp{M} といった、SI 形式の略号を付ける。
687 1024 ではなく、1000 の累乗が使用されるので、@samp{M} は
688 1,000,000 バイトを表している。このオプションは、@option{--block-size=si}
689 と同じことである。1024 の累乗が使いたければ、@option{-h} や
690 @option{--human-readable} を使用すればよい。
691 @end macro
692
693 @macro optHumanReadable
694 @item -h
695 @itemx --human-readable
696 @opindex -h
697 @opindex --human-readable
698 @cindex human-readable output
699 各サイズの後ろに、メビバイトなら @samp{M} といった、大きさを示す文字を付ける。
700 1000 ではなく、1024 の累乗が使われるので、@samp{M} は 1,048,576
701 バイトを表している。このオプションは、@option{--block-size=human-readable}
702 と同じである。1000 の累乗が使いたければ、"@option{--si} オプションを使用すればよい。
703 @end macro
704
705 @macro optStripTrailingSlashes
706 @item --strip-trailing-slashes
707 @opindex --strip-trailing-slashes
708 @cindex stripping trailing slashes
709 @var{source} 引数の後ろにスラッシュが付いていたら、それを削除する。
710 @xref{Trailing slashes}.
711 @end macro
712
713 @macro mayConflictWithShellBuiltIn{cmd}
714 @cindex conflicts with shell built-ins
715 @cindex built-in shell commands, conflicts with
716 シェルの組み込み機能の @command{\cmd\} やエイリアスのために、
717 @command{\cmd\} に何の修飾も付けずに対話的に使ったり、スクリプトの中で使ったりすると、
718 動作がここで述べているものとは違うことがあるかもしれない。
719 シェルによる干渉を避けるためには、@command{env} 経由で @command{\cmd\}
720 を起動すればよい (すなわち、@code{env \cmd\ @dots{}} のようにだ)。
721
722 @end macro
723
724 @macro multiplierSuffixes{varName}
725 @var{\varName\} は、整数であり、
726 以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい
727 (訳注: その場合は、1 が前にあるものと見なされる)。
728 @example
729 @samp{b}  =>            512 ("blocks")
730 @samp{KB} =>           1000 (KiloBytes)
731 @samp{K}  =>           1024 (KibiBytes)
732 @samp{MB} =>      1000*1000 (MegaBytes)
733 @samp{M}  =>      1024*1024 (MebiBytes)
734 @samp{GB} => 1000*1000*1000 (GigaBytes)
735 @samp{G}  => 1024*1024*1024 (GibiBytes)
736 @end example
737 @samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} についても同様。
738 @end macro
739
740 @c FIXME: same as above, but no ``blocks'' line.
741 @macro multiplierSuffixesNoBlocks{varName}
742 @var{\varName\} は、整数であり、
743 以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい
744 (訳注: その場合は、1 が前にあるものと見なされる)。
745 @example
746 @samp{KB} =>           1000 (KiloBytes)
747 @samp{K}  =>           1024 (KibiBytes)
748 @samp{MB} =>      1000*1000 (MegaBytes)
749 @samp{M}  =>      1024*1024 (MebiBytes)
750 @samp{GB} => 1000*1000*1000 (GigaBytes)
751 @samp{G}  => 1024*1024*1024 (GibiBytes)
752 @end example
753 @samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} についても同様。
754 @end macro
755
756 @cindex common options
757
758 いくつかのオプションは、このマニュアルで取り上げるすべてのプログラムで利用することができる。
759 そうしたオプションについては、個々のプログラムで同じ説明を繰り返すことはせず、この場で説明しておく
760 (実のところ、そうしたオプションは、GNU のすべてのプログラムで使用できる (はずである))。
761
762 @vindex POSIXLY_CORRECT
763 通常、オプションとオペランドは、どんな順番で指定してもよい。
764 プログラムは、すべてのオプションがいかなるオペランドよりも前にあるかのごとく振る舞うようになっている。
765 たとえば、@samp{sort -r passwd -t :} は、@samp{:} が @option{-t}
766 のオプション引数 (option-argument) なので、@samp{sort -r -t : passwd}
767 と同じ動作をする。しかしながら、環境変数 @env{POSIXLY_CORRECT}
768 が設定されている場合は、オプションはオペランドの前に置かなければならない。
769 ただし、オプションとオペランドの順番について、そのコマンドに別の決まりがあるときはこのかぎりではない。
770
771 若干のプログラムでは、二番目以降のオペランドとして先頭に
772 @samp{-} が付くオペランドが使えると都合がよい。
773 そうしたプログラムでは、@env{POSIXLY_CORRECT} が設定されていない場合でも、
774 オプションをオペランドの前に置く必要がある。
775 そこで、そうしたプログラムの説明には、その旨注意書きを付けておいた。
776 たとえば、@command{env} コマンドのオプションは、オペランドの前に置かなければならない。
777 オペランドとして指定したコマンドが、それ自身のオプションを伴うことがあるからだ。
778
779 ロングオプションが使えるたいていのプログラムは、誤解の余地がないかぎり、そうしたオプションの省略形を認識する。
780 たとえば、@samp{rmdir --ignore-fail-on-non-empty} は、@samp{rmdir --ignore-fail}
781 という形でも起動できるし、@samp{rmdir --i} でも大丈夫だ。
782 @samp{ls --h} のような誤解の余地のあるオプションは、まさに曖昧だと判定される。
783
784 このマニュアルで説明するプログラムの中には、@option{--help} や @option{--version}
785 オプションを、それが唯一のコマンドライン引数である場合にしか、認識しないものがある。
786 そうしたプログラムの場合、ロングオプションの省略形は、常に認識されるとはかぎらない。
787
788 @table @samp
789
790 @item --help
791 @opindex --help
792 @cindex help, online
793 使用法を表示して利用できるすべてのオプションを列挙し、正常終了する。
794
795 @item --version
796 @opindex --version
797 @cindex version number, finding
798 バージョン番号を表示し、正常終了する。
799
800 @item --
801 @opindex --
802 @cindex option delimiter
803 オプション群の末尾を示す。これ以降に引数があれば、それが @samp{-}
804 で始まっている場合でも、オペランドとして扱われる。たとえば、@samp{sort -- -r}
805 は、@file{-r} という名前のファイルから読み込むということである。
806
807 @end table
808
809 @cindex standard input
810 @cindex standard output
811 単独の @samp{-} はオペランドであって、オプションのように見えるが、
812 オプションでは全くない。単独の @samp{-} はファイル・オペランドであり、
813 プログラム次第で、標準入力、あるいは標準出力として扱われる。
814 後者は、前後の状況からそれが明らかな場合だ。たとえば、@samp{sort -}
815 は、標準入力から読み込むということであり、ただの @samp{sort} と同じである。
816 使用できないとはっきり断っていないかぎり、@samp{-}
817 は、ファイル名が要求されるいかなるところでもオペランドとして使用することができる。
818
819 @menu
820 * Exit status::              プログラムが成功したか失敗したかの指標。
821 * Backup options::           バックアップ・オプション (-b と -S)。
822 * Block size::               ブロックサイズ (BLOCK_SIZE と --block-size)。
823 * Floating point::           浮動小数点数の表現。
824 * Signal specifications::    --signal オプションによるシグナルの指定。
825 * Disambiguating names and IDs::  chgrp, chown, chroot, id における
826                                     ユーザやグループの指定法。
827 * Random sources::           ランダムデータのソース (--random-source)。
828 * Target directory::         出力先ディレクトリの指定。
829 * Trailing slashes::         末尾のスラッシュ (--strip-trailing-slashes)。
830 * Traversing symlinks::      シムリンクをたどる (-H, -L, -P)。
831 * Treating / specially::     --preserve-root や --no-preserve-root の使用。
832 * Special built-in utilities::  組み込みコマンド @command{break}, @command{:} など。
833 * Standards conformance::    POSIX 規格への準拠。
834 * Multi-call invocation::    Multi-call プログラムの起動。
835 @end menu
836
837
838 @node Exit status
839 @section 終了ステータス
840
841 @macro exitstatus
842 終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。
843 @end macro
844
845 ほとんどすべてのコマンドは、実行すると、整数の終了ステータス
846 (@dfn{exit status}) を返し、それは他のコマンドの動作を変更するために使用することができる。
847 大多数のコマンドにとって、終了ステータス @samp{0} は成功を意味している。
848 失敗は @samp{0} 以外の値によって示され、たいていは @samp{1} だが、
849 非標準的なプラットフォームでは違うこともある。POSIX の規定が、@samp{0}
850 以外であることしか要求していないからである。
851
852 しかしながら、ここで詳述しているプログラムの中にも、終了ステータスとして上記以外の値を返すものがあり、
853 @samp{0} や @samp{1} という値に別の意味を与えているプログラムさえ、少数ながら存在する。
854 そうした例外的なプログラムとしては、@command{chroot}, @command{env},
855 @command{expr}, @command{nice}, @command{nohup}, @command{numfmt},
856 @command{printenv}, @command{sort}, @command{stdbuf}, @command{test},
857 @command{timeout}, @command{tty} などを挙げることができる。
858
859
860 @node Backup options
861 @section バックアップ・オプション
862
863 @cindex backup options
864
865 GNU のプログラムの中には、ファイルの新しいバージョンを書き出す前に、
866 もしそうしたければ、バックアップを作成できるものがある
867 (少なくとも @command{cp}, @command{install}, @command{ln}, @command{mv}
868 がそうだ)。下記のオプションは、そうしたバックアップを細かく制御する。
869 こうしたオプションについては、個々のプログラムの説明でも簡単に触れている。
870
871 @table @samp
872
873 @item -b
874 @itemx --backup[=@var{method}]
875 @opindex -b
876 @opindex --backup
877 @vindex VERSION_CONTROL
878 @cindex backups, making
879 通常では上書きされたり、消去されたりする各ファイルのバックアップを作成する。
880 このオプションを指定しないと、元のバージョンは破棄されるわけだ。
881 作成するバックアップのタイプを決めるには、@var{method} を使用する。
882 @var{method} を指定せずに、このオプションを使った場合は、環境変数
883 @env{VERSION_CONTROL} の値が使用される。@env{VERSION_CONTROL}
884 が設定されていない場合、デフォルトのバックアップタイプは @samp{existing} である。
885
886 このオプションの短縮形である @option{-b} は、引数を取らないことに注意していただきたい。
887 @option{-b} の使用は、@option{--backup=existing} を使用するのと同じことである。
888
889 @vindex version-control @r{Emacs variable}
890 このオプションは、Emacs の @samp{version-control} 変数に対応している。
891 すなわち、@var{method} に指定する値は、Emacs で使用される値と同じものである。
892 とは言え、このオプションでは、より説明的な名前も使用できる。
893 @var{method} の有効な値は、以下のものである (他と区別できるならば、省略した表現も使用できる)。
894
895 @table @samp
896 @item none
897 @itemx off
898 @opindex none @r{backup method}
899 バックアップを作成しない。
900
901 @item numbered
902 @itemx t
903 @opindex numbered @r{backup method}
904 どんな場合でも番号付きのバックアップを作成する。
905
906 @item existing
907 @itemx nil
908 @opindex existing @r{backup method}
909 番号付きのバックアップがすでに存在する場合は番号付きで、それ以外の場合は単純形式で、ファイルのバックアップを作成する。
910 (訳注: 単純形式というのは、バックアップファイル名に番号を付けない形式である。
911 @option{--suffix=@var{suffix}} の説明を参照。)
912
913 @item simple
914 @itemx never
915 @opindex simple @r{backup method}
916 どんな場合でも単純形式のバックアップを作成する。@samp{never} と
917 @samp{none} を混同なさらないようにしていただきたい。
918
919 @end table
920
921 @item -S @var{suffix}
922 @itemx --suffix=@var{suffix}
923 @opindex -S
924 @opindex --suffix
925 @cindex backup suffix
926 @vindex SIMPLE_BACKUP_SUFFIX
927 @option{-b} で作成される各バックアップファイルの名前の末尾に
928 @var{suffix} を付ける。このオプションが指定されていない場合は、環境変数
929 @env{SIMPLE_BACKUP_SUFFIX} の値が使用される。@env{SIMPLE_BACKUP_SUFFIX}
930 が設定されていない場合、デフォルトの @var{suffix} は
931 Emacs の場合と同じで、チルダ @samp{~} である。
932
933 @end table
934
935 @node Block size
936 @section ブロックサイズ
937
938 @cindex block size
939
940 GNU プログラムには、ディスクの使用量を「ブロック数」で表示するものがいくつかある
941 (少なくとも、@command{df}, @command{du},@command{ls} がそうだ)。
942 ブロックのサイズや表示の書式は、使用量をわかりやすくするために、変更することができる。
943 表示に使用されるブロックサイズは、ファイルシステムのブロックサイズとは、
944 無関係である。ブロック数に端数が出る場合は、切り上げて整数にする。
945
946 @opindex --block-size=@var{size}
947 @vindex BLOCKSIZE
948 @vindex BLOCK_SIZE
949 @vindex DF_BLOCK_SIZE
950 @vindex DU_BLOCK_SIZE
951 @vindex LS_BLOCK_SIZE
952 @vindex POSIXLY_CORRECT@r{, and block size}
953
954 デフォルトのブロックサイズの選択は、次の環境変数を順番に調べることで行われる。
955 設定されている最初のものがブロックサイズを決めることになる。
956
957 @table @code
958
959 @item DF_BLOCK_SIZE
960 この環境変数は、@command{df} コマンドで使うデフォルトのブロックサイズを指定している。
961 同様に、@env{DU_BLOCK_SIZE} は @command{du} のデフォルトを、
962 @env{LS_BLOCK_SIZE} は @command{ls} のデフォルトを指定している。
963
964 @item BLOCK_SIZE
965 この環境変数は、上記のようなコマンド専用の環境変数が設定されていない場合に、
966 三つのコマンドのすべてが使用するデフォルトのブロックサイズを指定している。
967
968 @item BLOCKSIZE
969 この環境変数は、上記のようなコマンド専用の環境変数と @env{BLOCK_SIZE} のどちらも設定されていない場合に、
970 通常、ブロック数として表示されるすべての値が使用するデフォルトのブロックサイズを指定している。
971 ほかの環境変数とは違って、@env{BLOCKSIZE} は、たとえば @code{ls -l}
972 の出力に含まれるファイルサイズのような、通常バイト数として表示される値には影響を及ぼさない。
973
974 @item POSIXLY_CORRECT
975 @env{@var{command}_BLOCK_SIZE}, @env{BLOCK_SIZE}, @env{BLOCKSIZE}
976 のいづれも設定されていず、この変数が設定されている場合は、
977 ブロックサイズのデフォルトは、512 バイトになる。
978
979 @end table
980
981 上記の環境変数のいづれも設定されていない場合、
982 ブロックサイズのデフォルトは、現在のところたいていの場合、 1024 バイトである。
983 ただし、この数値は、将来変更されるかもしれない。なお、@command{ls}
984 の表示するファイルサイズについては、ブロックサイズのデフォルトは 1 バイトである。
985
986 @cindex human-readable output
987 @cindex SI output
988
989 ブロックサイズの指定には、1 ブロックあたりのバイト数を示す正の整数を使えばよい。
990 あるいは、@code{human-readable} や @code{si} を指定して、
991 「人間に読みやすい」書式を選ぶこともできる。
992 整数の後ろには接尾辞 (suffix) を続けてもよい。そうした接尾辞は、単位の前に付けて
993 @samp{10} の累乗倍を表す SI (国際単位系) の接頭辞 (prefix) や、
994 @samp{2} の累乗倍を表す ISO/IEC 80000-13 (以前は IEC 60027-2 だった)
995 の接頭辞の上位互換である。単位の前に付ける接頭辞については、
996 次の URL を参照していただきたい。@*
997 @uref{http://www.bipm.org/en/publications/si-brochure/chapter3.html, SI
998 prefixes:}.
999 @uref{http://physics.nist.gov/cuu/Units/binary.html, ISO/IEC 80000-13
1000 prefixes:}.
1001
1002 「人間に読みやすい」書式の場合、出力するサイズの後ろに、メガバイトなら
1003 @samp{M} といった、大きさを表す文字が続く。@code{BLOCK_SIZE=human-readable}
1004 の方は、1024 の累乗を使うので、@samp{M} は 1,048,576 バイトを意味している。
1005 @code{BLOCK_SIZE=si} も似ているが、こちらは 1000 の累乗を使用し、さらに @samp{B}
1006 という文字を追加する。そこで、@samp{MB} は 1,000,000 バイトを意味することになる。
1007
1008 @vindex LC_NUMERIC
1009 ブロックサイズの指定の先頭に @samp{'} を付けると、
1010 出力するサイズを数桁ごとに区切って表示することができる。
1011 区切りに使う記号や区切りの位置は、@env{LC_NUMERIC} のロケールによって決まる。
1012 たとえば、アメリカ英語のロケールでは、@samp{--block-size="'1kB"}
1013 と指定すれば、1234000 バイトという容量が @samp{1,234}
1014 と表示されることになるだろう。デフォルトの C ロケールの場合は、
1015 区切り記号が存在しないので、先頭の @samp{'} に効果はない。
1016
1017 ブロックサイズを指定する整数の後ろには、接尾辞を付けて、
1018 その整数の何倍かを示すことができる。大きさを表す (訳注: M, G などの)
1019 文字の後ろに何も続けないときや、@samp{iB} を続けるときは、
1020 1024 の累乗倍ということである。それに対して、大きさを表す文字に
1021 @samp{B} を続ける場合は、1000 の累乗倍ということになる。
1022 たとえば、@samp{1M} や @samp{1MiB} は @samp{1048576} と同じであり、
1023 @samp{1MB} は @samp{1000000} と同じである。
1024
1025 整数を前に付けずに、接尾辞だけを指定したときの動作は、
1026 @samp{1} が前に付いているときとほぼ同じだが、大きさの表示が出力の後ろに付く点が違う。
1027 たとえば、@samp{--block-size="kB"} は、3000 を @samp{3kB} という形で表示する。
1028
1029 以下の接尾辞が定義されている。@code{1Y} のような大きな量は、
1030 算術計算の限界のためにお使いのコンピュータでは使用できないかもしれない。
1031
1032 @table @samp
1033 @item kB
1034 @cindex kilobyte, definition of
1035 キロバイト (kilobyte): @math{10^3 = 1000} バイト。
1036 @item k
1037 @itemx K
1038 @itemx KiB
1039 @cindex kibibyte, definition of
1040 キビバイト (kibibyte): @math{2^{10} = 1024} バイト。
1041 @samp{K} も使えるのは、おまけである。なお本来、SI の接頭辞
1042 (訳注: すなわち @math{10^3} 倍を表す接頭辞) が @samp{k} であり、
1043 ISO/IEC 80000-13 の接頭辞 (訳注: すなわち @math{2^{10}} 倍を表す接頭辞)
1044 が @samp{Ki} だが、これまでの習慣や POSIX の用法では、
1045 @samp{KiB} の意味で @samp{k} を使っている。
1046 @item MB
1047 @cindex megabyte, definition of
1048 メガバイト (megabyte): @math{10^6 = 1,000,000} バイト。
1049 @item M
1050 @itemx MiB
1051 @cindex mebibyte, definition of
1052 メビバイト (mebibyte): @math{2^{20} = 1,048,576} バイト。
1053 @item GB
1054 @cindex gigabyte, definition of
1055 ギガバイト (gigabyte): @math{10^9 = 1,000,000,000} バイト。
1056 @item G
1057 @itemx GiB
1058 @cindex gibibyte, definition of
1059 ギビバイト (gibibyte): @math{2^{30} = 1,073,741,824} バイト。
1060 @item TB
1061 @cindex terabyte, definition of
1062 テラバイト (terabyte): @math{10^{12} = 1,000,000,000,000} バイト。
1063 @item T
1064 @itemx TiB
1065 @cindex tebibyte, definition of
1066 テビバイト (tebibyte): @math{2^{40} = 1,099,511,627,776} バイト。
1067 @item PB
1068 @cindex petabyte, definition of
1069 ペタバイト (petabyte): @math{10^{15} = 1,000,000,000,000,000} バイト。
1070 @item P
1071 @itemx PiB
1072 @cindex pebibyte, definition of
1073 ペビバイト (pebibyte): @math{2^{50} = 1,125,899,906,842,624} バイト。
1074 @item EB
1075 @cindex exabyte, definition of
1076 エクサバイト (exabyte): @math{10^{18} = 1,000,000,000,000,000,000} バイト。
1077 @item E
1078 @itemx EiB
1079 @cindex exbibyte, definition of
1080 エクスビバイト (exbibyte): @math{2^{60} = 1,152,921,504,606,846,976} バイト。
1081 @item ZB
1082 @cindex zettabyte, definition of
1083 ゼタバイト (zettabyte): @math{10^{21} = 1,000,000,000,000,000,000,000} バイト。
1084 @item Z
1085 @itemx ZiB
1086 ゼビバイト (zebibyte): @math{2^{70} = 1,180,591,620,717,411,303,424} バイト。
1087 @item YB
1088 @cindex yottabyte, definition of
1089 ヨタバイト (yottabyte): @math{10^{24} = 1,000,000,000,000,000,000,000,000} バイト。
1090 @item Y
1091 @itemx YiB
1092 ヨビバイト (yobibyte): @math{2^{80} = 1,208,925,819,614,629,174,706,176} バイト。
1093 @end table
1094
1095 @opindex -k
1096 @opindex -h
1097 @opindex --block-size
1098 @opindex --human-readable
1099 @opindex --si
1100
1101 デフォルトのブロックサイズは、コマンドに対して @option{--block-size=@var{size}}
1102 オプションを明示的に指定することで、上書きすることができる。@option{-k}
1103 オプションは、@option{--block-size=1K} と同じであり、環境変数 @env{POSIXLY_CORRECT}
1104 が設定されていないときのデフォルトである。@option{-h} オプションや
1105 @option{--human-readable} オプションは、@option{--block-size=human-readable}
1106 と同じである。@option{--si} オプションは、@option{--block-size=si} と同じだ。
1107 なお、@command{ls} コマンドの場合、
1108 @option{-k} オプションはファイルの見かけのサイズの表示に影響しないのに対し、
1109 @option{--block-size} オプションは影響することに注意していただきたい。
1110
1111 @node Floating point
1112 @section 浮動小数点数
1113 @cindex floating point
1114 @cindex IEEE floating point
1115
1116 浮動小数点数を受け取ったり、生成したりするコマンドは、
1117 下層で動いているシステムの浮動小数点表現法を使用しており、
1118 丸めエラー、オーバーフローなど、浮動小数点にかかわる問題をかかえている。
1119 最近のシステムでは、ほとんどすべてが IEEE-754 の浮動小数点を採用しているので、
1120 今日では IEEE-754 の動作を想定しておけば、たいていどこでも問題がない。
1121 IEEE-754 には、正と負の無限があり、正と負のゼロを区別する。
1122 また、NaN (訳注: Not a Number) という特別な値を使って、
1123 ゼロをゼロで割るといった無効な演算を表現する。
1124 より詳しい情報については、デイビッド・ゴールドバーグの論文
1125 @uref{http://@/www.validlab.com/@/goldberg/@/paper.pdf,
1126 "What Every Computer Scientist Should Know About Floating-Point Arithmetic"}
1127 をご覧になるとよい。
1128
1129 @vindex LC_NUMERIC
1130 浮動小数点数をオプションやオペランドや入力として受け取るコマンドは、
1131 C の標準関数 @code{strtod} や @code{strtold} を使って、
1132 テキストを浮動小数点数に変換している。従って、そうした浮動小数点数には、
1133 @code{1.0e-34} や @code{-10e100} といった指数表現が使用できる。
1134 浮動小数点を解析するコマンドは、大文字小文字を区別しない @code{inf},
1135 @code{infinity},@code{NaN} といった値も理解する。
1136 もっとも、そうした値が役に立つかどうかは、そのコマンド次第だ。
1137 最近の C の実装では、16 進の浮動小数点数も使える。
1138 たとえば、@code{-0x.ep-3} といったものだが、これは @minus{}14/16 掛ける
1139 @math{2^-3} を表し、@minus{}0.109375 に等しい。小数点を表す記号が何になるかは、
1140 @env{LC_NUMERIC} のロケールによって決まる。
1141 @xref{Parsing of Floats,,, libc, The GNU C Library Reference Manual}.
1142
1143 @node Signal specifications
1144 @section シグナルの指定
1145 @cindex signals, specifying
1146
1147 @var{signal} の指定には、@samp{HUP} のようなシグナル名や @samp{1} のようなシグナル番号、
1148 それに、シグナルによって終了させられるときのプロセスの終了ステータスを使うことができる
1149 (訳注: 最後のものは、GNU coreutils の @command{kill} コマンドでは使用できるが、
1150 シェルの組み込みコマンドのような、他の系統の @command{kill}
1151 では使えないかもしれない)。シグナル名は、標準的な形式でも、頭に @samp{SIG}
1152 を付けた形式でも構わない。大文字小文字は区別されない。
1153 以下に挙げるシグナル名とシグナル番号は、POSIX の規格に従っているすべてのシステムで使用できる。
1154
1155 @table @samp
1156 @item HUP
1157 1.  ハングアップ (Hangup)。
1158 @item INT
1159 2.  端末からの割り込みシグナル (Terminal interrupt)。
1160 @item QUIT
1161 3.  端末からの中止シグナル (Terminal quit)。
1162 @item ABRT
1163 6. プロセスの中断 (Process abort)。
1164 @item KILL
1165 9.  強制終了 (Kill) (捕獲することも無視することもできない)。
1166 @item ALRM
1167 14.  アラームクロック (Alarm Clock)。
1168 @item TERM
1169 15.  終了 (Termination)。
1170 @end table
1171
1172 @noindent
1173 これ以外にもサポートされているシグナル名があるが、それに対応するシグナル番号はシステムによって様々である。
1174 POSIX 1003.1-2001 に準拠しているすべてのシステムでは、以下のシグナルも使用できる。
1175
1176 @table @samp
1177 @item BUS
1178 メモリオブジェクトの未定義領域へのアクセス。
1179 @item CHLD
1180 チャイルドプロセスが終了 (terminate)、一時停止 (stop)、または再開 (continue) した。
1181 @item CONT
1182 実行が停止 (stop) しているならば、再開 (continue) する。
1183 @item FPE
1184 誤った算術演算。
1185 @item ILL
1186 不正な命令。
1187 @item PIPE
1188 読み手のないパイプへの書き出し。
1189 @item SEGV
1190 無効なメモリ参照。
1191 @item STOP
1192 実行を一時停止する (stop) (捕獲することも無視することもできない)。
1193 @item TSTP
1194 端末からの一時停止シグナル。
1195 @item TTIN
1196 バックグラウンドプロセスが端末から読み込もうとしている。
1197 @item TTOU
1198 バックグラウンドプロセスが端末へ書き出そうとしている。
1199 @item URG
1200 高帯域幅のデータがソケットに達している。
1201 @item USR1
1202 ユーザ定義シグナル 1。
1203 @item USR2
1204 ユーザ定義シグナル 2。
1205 @end table
1206
1207 @noindent
1208 XSI 拡張に対応している POSIX 1003.1-2001 のシステムでは、以下のシグナルも使用できる。
1209
1210 @table @samp
1211 @item POLL
1212 ポーリング可能なイベント。
1213 @item PROF
1214 プロファイリング・タイマーがタイムアウトした。
1215 @item SYS
1216 不正なシステムコール。
1217 @item TRAP
1218 Trace/breakpoint トラップ。
1219 @item VTALRM
1220 バーチャル・タイマーがタイムアウトした。
1221 @item XCPU
1222 CPU 時間の上限を超過した。
1223 @item XFSZ
1224 ファイルサイズの上限を超過した。
1225 @end table
1226
1227 @noindent
1228 XRT 拡張に対応している POSIX 1003.1-2001 のシステムでは、上記以外にも、
1229 少なくとも 8 個のリアルタイム・シグナルが使用できる。すなわち、@samp{RTMIN},
1230 @samp{RTMIN+1}, @dots{}, @samp{RTMAX-1}, @samp{RTMAX} などだ。
1231
1232 @node Disambiguating names and IDs
1233 @section chown, chgrp, chroot, id: ユーザ名かユーザ ID かを明確にする
1234 @cindex user names, disambiguating
1235 @cindex user IDs, disambiguating
1236 @cindex group names, disambiguating
1237 @cindex group IDs, disambiguating
1238 @cindex disambiguating group names and IDs
1239
1240 @command{chown}, @command{chgrp}, @command{chroot}, @command{id}
1241 といったコマンドでは、引数として @var{owner} や @var{group}
1242 を渡す際に名前で指定しても、ID 番号で指定してもよい。
1243 この指定法が曖昧であることは明らかである。
1244 もし、ユーザ名やグループ名が数字の連続だったら、どうだろう?
1245 @footnote{環境によっては、ユーザ名に数字を使うのは、よくあることである。}
1246 コマンドはそれをユーザ名と解釈すべきだろうか? ID 番号と解釈すべきだろうか?
1247 POSIX では、「こうしたコマンドは、指定された文字列をまず名前として解決することを試み、
1248 それに失敗した場合のみ、ID 番号として解釈しようとすること」と規定している。
1249 この規定では、ユーザが引数として ID 番号、たとえば 42 を指定しようとすると、
1250 面倒な話になる。42 というユーザ名が存在し、それにユーザ ID 番号として別の数字、
1251 たとえば 1000 が割り当てられているといったややこしい状況でも、
1252 うまく処理できなければならないとすると、厄介なことになるのだ。
1253 単に @code{chown 42 F} を実行したのでは、ファイル @file{F} の所有者の
1254 ID 番号が 1000 になってしまう。これはユーザが意図した動作ではない。
1255
1256 GNU の @command{chown}, @command{chgrp}, @command{chroot},@command{id}
1257 は、この問題に対する回避策を用意している。この回避策を使用すると、
1258 データベースの検索を省略するので、処理速度が著しく向上することがあるというおまけまで付く。
1259 ユーザやグループに ID 番号を指定する際には、その前に @samp{+}
1260 を付けさえすればよい。そうすれば、整数として解釈するように強制できるのである。
1261
1262 @example
1263 chown +42 F
1264 chgrp +$numeric_group_id another-file
1265 chown +0:+0 /
1266 @end example
1267
1268 @samp{+} が前に付く各文字列に対しては、ユーザ名の検索プロセスが省略される。
1269 何故なら、@samp{+} を含む文字列が有効なユーザ名やグループ名であることは絶対にないからだ。
1270 この書き方は、よく使われているたいていの Unix システムで使用できるが、Solaris 10 では使用できない。
1271
1272 @node Random sources
1273 @section ランダムデータのソース
1274
1275 @cindex random sources
1276
1277 @command{shuf}, @command{shred}, @command{sort} コマンドは、
1278 作業を行うためにランダムデータを必要とすることがある。たとえば、@samp{sort -R}
1279 ではハッシュ関数をランダムに選ばねばならず、その選択のためにランダムデータを必要としている。
1280
1281 デフォルトでは、こうしたコマンドは、プログラム内部の擬似乱数ジェネレータを、
1282 少量のエントロピーによって初期化して使用するが、
1283 @option{--random-source=@var{file}} オプションで、
1284 外部ソースを使うように指示することもできる。
1285 @var{file} の中身のバイト数が不十分なときは、エラーが通知される。
1286
1287 たとえば、デバイスファイル @file{/dev/urandom} を、
1288 ランダムデータのソースとして使用してもよい。通常、このデバイスは、
1289 デバイスドライバーなどのソースから環境ノイズを集めて、エントロピー・プールに入れ、
1290 そのプールを使って、ランダムなビットを生成する。プールにデータが足りない場合は、
1291 内部プールを再利用し、暗号的に安全な擬似乱数ジェネレータを使って、
1292 より多くのビットを作り出す。
1293 とは言え、このデバイスは、大量のランダムデータの生成のために設計されたものではなく、
1294 比較的動作が遅いことは、承知しておいた方がよい。
1295
1296 たいていの実用には、@file{/dev/urandom} で十分だが、
1297 プライベートなデータの高度で長期に渡る保護が必要になるアプリケーションでは、
1298 @file{/dev/random} や @file{/dev/arandom} のような他のデータソースが必要になるかもしれない。
1299 どんなデータソースが利用できるかは、ご使用のオペレーティング・システム次第だ。
1300
1301 前回コマンドを実行したときの結果を再現するには、
1302 何らかのランダムデータをファイルに保存しておき、
1303 そのコマンドの一回目の実行でも二回目の実行でも、
1304 ランダムソースとしてそのファイルを使用すればよい。
1305 @cindex random seed
1306 ファイルを使用する代わりに、たとえば、次のような方法を使っても、
1307 ある値を種として与えたときの、再現性のある適当な量の擬似ランダムデータを生成することができる。
1308
1309 @example
1310 get_seeded_random()
1311 @{
1312   seed="$1"
1313   openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
1314     </dev/zero 2>/dev/null
1315 @}
1316
1317 shuf -i1-100 --random-source=<(get_seeded_random 42)
1318 @end example
1319
1320 @node Target directory
1321 @section 出力先ディレクトリ
1322
1323 @cindex target directory
1324
1325 通常、@command{cp}, @command{install}, @command{ln}, @command{mv}
1326 といったコマンドは、最後のオペランドがディレクトリやディレクトリへのシンボリックリンクの場合、
1327 それを特別扱いする。たとえば、@samp{cp source dest} は、@file{dest}
1328 がディレクトリならば、@samp{cp source dest/source} と同じことである。
1329 時には、そうした動作が、ユーザが求めている動作とは違うこともある。
1330 そこで、こうしたコマンドは、よりきめ細かな制御ができるように、
1331 以下のオプションをサポートしている。
1332
1333 @table @samp
1334
1335 @item -T
1336 @itemx --no-target-directory
1337 @opindex --no-target-directory
1338 @cindex target directory
1339 @cindex destination directory
1340 最後のオペランドが、ディレクトリやディレクトリへのシンボリックリンクであっても、それを特別扱いしない。
1341 このオプションは、複数のプログラムが共有領域で作業するとき、競合状態を防止する一助になる。
1342 たとえば、@samp{mv /tmp/source /tmp/dest} というコマンドが正常終了しても、
1343 @file{/tmp/source} が @file{/tmp/dest} にリネームされたという保証はない。
1344 もし、何かほかのプロセスが @file{/tmp/dest} をディレクトリとして作成していたら、
1345 @file{/tmp/dest/source} という名前のファイルになってしまうかもしれないのだ。
1346 それに対して、@file{mv -T /tmp/source /tmp/dest} が正常終了した場合は、
1347 @file{/tmp/source} は間違いなく @file{/tmp/dest} にリネームされている。
1348
1349 反対に、最後のオペランドをディレクトリとして扱わせたい、
1350 それができない場合は、エラーメッセージを出したい、ということもある。
1351 そういうときは、@option{--target-directory} (@option{-t}) オプションを使用すればよい。
1352 (訳注: ターゲット・ディレクトリをコマンドラインの最後に置く代わりに、
1353 @option{--target-directory} オプションの引数にするということである。)
1354
1355 @item -t @var{directory}
1356 @itemx --target-directory=@var{directory}
1357 @opindex --target-directory
1358 @cindex target directory
1359 @cindex destination directory
1360 @var{directory} を、出力されるファイルすべてのディレクトリ部分として使用する。
1361
1362 ほとんどのプログラムで、コマンドラインの扱いは次のようになっている。
1363 オプションや、一定数の (0 個のこともある) 位置の固定した引数の処理が終われば、
1364 引数リストにはもう何も残っていないか、残っているとすれば、
1365 それはすべて同じように処理されることになる項目 (通常はファイル) のリストのはずある。
1366 @command{xargs} プログラムは、こうした約束ごとに沿ってうまく動くように作られている。
1367
1368 @command{mv} ファミリーのコマンドが変わっているのは、引数の数が不定であり、
1369 しかも最後の引数を特別扱いするという点である (すなわちターゲット・ディレクトリとして扱う)。
1370 そのため、ある種の作業の実行は、一筋縄ではいかない。
1371 たとえば、「すべてのファイルをここから ../d/ に移動する」がそうだ。
1372 何故なら、@code{mv * ../d/} では、引数を入れておくための領域を使い切ってしまうかもしれないし、
1373 そうかと言って、@code{ls | xargs ...} には、実行対象コマンド (訳注: ここでは、@command{mv})
1374 を起動するたびに最後の引数を特別に指定するためのすっきりした方法がないからである。
1375 (シェルコマンドを駆使すれば、できないことはないが、それでは、人間の労力と脳力を過当に要求することになる。)
1376
1377 @option{--target-directory} (@option{-t}) オプションを使用すると、
1378 @command{cp}, @command{mv}, @command{ln}, @command{install}
1379 といったプログラムを @command{xargs} と一緒に使うとき、たいへん都合がよい。
1380 たとえば、カレントディレクトリから、同じディレクトリ階層にある
1381 @code{d} ディレクトリへファイルを移動するには、こんなふうにすればよい。
1382
1383 @smallexample
1384 ls | xargs mv -t ../d --
1385 @end smallexample
1386
1387 しかし、これでは、ファイル名の先頭に @samp{.}
1388 の付くファイルが移動しない。GNU @command{find}
1389 プログラムを使えば、次のコマンドでそうしたファイルも移動させることができる。
1390
1391 @example
1392 find . -mindepth 1 -maxdepth 1 \
1393   | xargs mv -t ../d
1394 @end example
1395
1396 とは言え、上記のどちらの方法も、カレントディレクトリにファイルが一つもない場合や、
1397 空白などの特殊文字を名前に含むファイルがある場合には、うまく行かない。
1398 次の例はそうした制限を一掃しているが、GNU @command{find} と
1399 GNU @command{xargs} の両方が必要である。
1400
1401 @example
1402 find . -mindepth 1 -maxdepth 1 -print0 \
1403   | xargs --null --no-run-if-empty \
1404       mv -t ../d
1405 @end example
1406
1407 @end table
1408
1409 @noindent
1410 @option{--target-directory} (@option{-t}) オプションと
1411 @option{--no-target-directory} (@option{-T}) オプションを一緒に使うことはできない。
1412
1413 @node Trailing slashes
1414 @section 末尾のスラッシュ
1415
1416 @cindex trailing slashes
1417
1418 いくつかの GNU プログラム (少なくとも、@command{cp} と @command{mv}) では、
1419 @var{source} 引数を処理する前に、その引数の末尾にスラッシュが付いていたら、
1420 それを除去することができるようになっている。@option{--strip-trailing-slashes}
1421 オプションを使用することによって、この動作が有効になる。
1422
1423 @c FIXME: mv's behavior in this case is system-dependent
1424 これが役に立つのは、@var{source} 引数の末尾にスラッシュが付いていて、
1425 しかも、その引数がディレクトリへのシンボリックリンクを指定しているかもしれないときだ。
1426 そうした状況は、実のところ、それほど珍しくない。
1427 と言うのも、シェルの中には、そうしたシンボリックリンクに対してファイル名の補完を行うとき、
1428 末尾にスラッシュを自動的に付加するものがあるからだ。
1429 このオプションを指定しないと、たとえば @command{mv} は、(システムの
1430 rename 関数を通してだが、) 末尾にスラッシュが付いていることを、
1431 「シンボリックリンクの参照をたどれ」という指示として解釈しなければならず、
1432 その結果、シンボリックリンクではなく、間接的に参照されているディレクトリの方をリネームしなければならなくなる。
1433 こうした動作がデフォルトになっているのは意外に思えるかもしれないが、POSIX
1434 で要求されている動作であり、POSIX 規格のほかの部分とも首尾一貫している。
1435
1436 @node Traversing symlinks
1437 @section シンボリックリンクをたどる
1438
1439 @cindex symbolic link to directory, controlling traversal of
1440
1441 @c FIXME: note that 'du' has these options, too, but they have slightly
1442 @c different meaning.
1443 以下のオプションは、@option{--recursive} (@option{-R})
1444 オプションも同時に指定されているとき、@command{chown} コマンドや @command{chgrp}
1445 コマンドがディレクトリ階層をどうたどるか、そのたどり方を変更する。
1446 以下のオプションを複数個指定した場合は、最後に指定したものだけが効果を持つ。
1447 こうしたオプションが指定しているのは、ディレクトリに対するシンボリックリンクを処理する際に、
1448 そのシンボリックリンクそのものを操作の対象にするのか、
1449 それとも、そのディレクトリ以下の階層にあるすべてのファイルを操作の対象にするのかということである。
1450
1451 こうしたオプションは、@option{--dereference} や @option{--no-dereference}
1452 (@option{-h})とは、全く別のものである。あちらは、シンボリックリンクを変更するのか、
1453 それとも、その参照先を変更するのかを制御している。
1454
1455 @table @samp
1456
1457 @macro choptH
1458 @item -H
1459 @opindex -H
1460 @cindex symbolic link to directory, traverse if on the command line
1461 @option{--recursive} (@option{-R}) オプションが指定されている場合に、
1462 コマンドラインで指定された引数がディレクトリへのシンボリックリンクならば、それをたどる。
1463 @end macro
1464 @choptH
1465
1466 @macro choptL
1467 @item -L
1468 @opindex -L
1469 @cindex symbolic link to directory, traverse each that is encountered
1470 ディレクトリ階層を再帰的にたどっている際に、
1471 ディレクトリへのシンボリックリンクに出会ったら、必ずそれをたどる。
1472 @end macro
1473 @choptL
1474
1475 @macro choptP
1476 @item -P
1477 @opindex -P
1478 @cindex symbolic link to directory, never traverse
1479 シンボリックリンクを一切たどらない。これが、@option{-H}, @option{-L}, @option{-P}
1480 のどれも指定されていないときの、デフォルトである。
1481 @end macro
1482 @choptP
1483
1484 @end table
1485
1486
1487 @node Treating / specially
1488 @section @file{/} (ルート) を特別扱いする
1489
1490 ある種のコマンドは、ディレクトリ階層全体に対して破壊的な作用を及ぼす可能性がある。
1491 たとえば、しかるべき特権を持ったユーザが、@samp{rm -rf / tmp/junk}
1492 を誤って実行したら、システム全体のすべてのファイルが消えてしまうかもしれないのだ。
1493 そうしたコマンドの使用が正当であることは、めったにないので、GNU の @command{rm}
1494 は、@file{/} に還元されるようないかなるディレクトリに対しても、通常では、操作を拒否するようになっている。
1495 もし、本当にシステムのすべてのファイルを消去しようと思うのなら、
1496 @option{--no-preserve-root} オプションを使用すればよい。
1497 とは言え、ほとんどの用途で、デフォルトの動作 (明示的に指定するには、
1498 @option{--preserve-root} オプションを使う) の方が安全である。
1499
1500 @command{chgrp}, @command{chmod}, @command{chown}
1501 などのコマンドも、ディレクトリ階層全体に対して破壊的な作用を及ぼす可能性がある。
1502 従って、こうしたコマンドもまた、上記のオプションをサポートしている。
1503 こうしたコマンドは、@command{rm} とは違って、ファイルを実際に削除してしまうわけではないが、
1504 @file{/} から再帰的に働くときは、一層危険だと言うこともできる。
1505 と言うのは、たいていの場合、処理速度がずっと早いので、
1506 注意力のあるユーザがコマンドを中断できるより前に、@command{rm}
1507 の場合より、もっと多くのファイルに被害を与えてしまうからだ。Unix の習慣も
1508 POSIX の規格も、こうしたコマンドが @file{/} から再帰的に働くことを要求している。
1509 それ故、デフォルトが @option{--no-preserve-root} になっているのだが、
1510 こうしたコマンドは、@option{--preserve-root} オプションを使った方が、ほとんどの用途でより安全である。
1511 面倒ならば、エイリアスか、シェル関数を作って、@option{--preserve-root} を指定しておけばよいのだ。
1512
1513 また、@option{--preserve-root} を指定すると、@file{/}
1514 を指しているシンボリックリンクの参照をたどる場合でも、@command{chgrp} や
1515 @command{chown} が、@file{/} のグループや所有者を変更しなくなることも、憶えておいていただきたい。
1516 (訳注: @command{chgrp} や @command{chown} の解説を見ていただけばわかるが、
1517 これは、@option{--recursive} (@option{-R}) を同時に使っているときの話である。)
1518
1519 @node Special built-in utilities
1520 @section 特殊ビルトイン・ユーティリティ
1521
1522 プログラムの中には、@command{nice} のように、ほかのプログラムを起動できるものがある。
1523 たとえば、@samp{nice cat file} というコマンドは、コマンド @samp{cat file}
1524 を実行することによって、@command{cat} プログラムを起動する。しかしながら、@command{exit}
1525 のようなシェルの特殊ビルトイン・ユーティリティ (@dfn{special built-in utilities})
1526 は、この方法で起動することができない。一例を挙げれば、@samp{nice exit}
1527 というコマンドは、どんな動作をするかが明確に定義されていない。
1528 終了する代わりに、エラーメッセージを出すかもしれないのだ。
1529
1530 POSIX 1003.1-2004 の規格では、特殊ビルトイン・ユーティリティとして次のものを挙げている。
1531
1532 @quotation
1533 @t{.@: : break continue eval exec exit export readonly return set shift times
1534 trap unset}
1535 @end quotation
1536
1537 たとえば、@samp{.}, @samp{:}, @samp{exec} は、特殊ビルトイン・ユーティリティなので、
1538 @samp{nice . foo.sh}, @samp{nice :}, @samp{nice exec pwd} といったコマンドの動作は、
1539 読者が予想なさるかもしれないようなものにはならない。
1540
1541 (訳注: exec, exit など対して、同じシェルの組み込みコマンドでも、cd,
1542 alias, fg, kill, pwd, true, umask などは、通常ビルトイン・ユーティリティ
1543 ("regular built-in utilities") と呼ばれている。
1544 もっとも、nice などから実行できないという点では、
1545 特殊ビルトイン・ユーティリティも通常ビルトイン・ユーティリティも変わりがない。
1546 nice などから起動できるとすれば、それは同名の実行ファイルが存在するからだ)。
1547
1548 多くのシェルは、上記のリストを拡張している。
1549 たとえば、bash では、@command{history} や @command{suspend}
1550 といったコマンドが特殊ビルトイン・ユーティリティに追加されている。
1551 そこで、bash の場合、@samp{nice suspend} というコマンドを実行すると、
1552 シェルのサスペンドは起こらず、エラーメッセージが出力される。
1553
1554 @node Standards conformance
1555 @section 規格への準拠
1556
1557 @vindex POSIXLY_CORRECT
1558 GNU ユーティリティのデフォルトの動作が POSIX の規格と一致しない場合が、若干ながら存在する。
1559 そうした非互換性を抑制するには、環境変数 @env{POSIXLY_CORRECT} を設定すればよい。
1560 もっとも、POSIX に準拠しているか否かを点検しているのでもないかぎり、
1561 @env{POSIXLY_CORRECT} を設定する必要は、おそらくないだろうが。
1562
1563 POSIX の新しいバージョンが、古いバージョンと非互換であることが、
1564 ときどきある。たとえば、POSIX の古いバージョンでは、@samp{sort +1} というコマンドは、
1565 各入力行の二番目以後のフィールドに基づいて、行の並べ替えを行うことになっていた。
1566 ところが、POSIX 1003.1-2001 では、同じコマンドが @file{+1}
1567 という名前のファイルの行を並べ替えることになっており、
1568 フィールドに基づいた並べ替えを行うには、@samp{sort -k 2}
1569 という別のコマンドを使わなければならないのだ。
1570 そして、さらにややこしいことに、POSIX 1003.1-2008
1571 では、古い動作と新しい動作のどちらをする実装も認められている。
1572
1573 @vindex _POSIX2_VERSION
1574 通常 GNU のユーティリティは、お使いのシステムが規格として採用している
1575 POSIX のバージョンに従っている。GNU ユーティリティを
1576 POSIX の別のバージョンに準拠させるには、環境変数 @env{_POSIX2_VERSION}
1577 を設定すればよい。この環境変数の値は、@var{yyyymm} という形式であり、
1578 その規格が何年の何月に採択されたかを示している。@env{_POSIX2_VERSION}
1579 の値としては、現在のところ、次の三つがサポートされている。すなわち、@samp{199209},
1580 @samp{200112}, @samp{200809} であり、それぞれ POSIX 1003.2-1992,
1581 POSIX 1003.1-2001, POSIX 1003.1-2008 を表している。
1582 一例を挙げよう。御使用のシステムが POSIX 1003.1-2001
1583 に準拠しているのに、動かしているソフトウェアが @samp{sort +1} や @samp{tail +10}
1584 といった旧来の用法も持っている場合には、環境に @samp{_POSIX2_VERSION=200809}
1585 を設定することで、互換性の問題を回避することができる。
1586
1587 @c This node is named "Multi-call invocation", not the usual
1588 @c "coreutils invocation", so that shell commands like
1589 @c 'info coreutils "touch invocation"' work as expected.
1590 @node Multi-call invocation
1591 @section @command{coreutils}: Multi-call プログラム
1592
1593 @pindex multicall
1594 @cindex combined
1595 @cindex calling combined multi-call program
1596
1597 @command{coreutils} コマンドは個々のユーティリティ・プログラムを呼び出す。
1598 呼び出されるユーティリティ・プログラムは、@command{coreutils}
1599 を呼び出すために使ったファイル名の最後の要素によって自動的に選ばれたものか、
1600 あるいは、@option{--coreutils-prog} オプションを使って明示的に指定されたものである。
1601
1602 書式:
1603
1604 @example
1605 coreutils @option{--coreutils-prog=PROGRAM} @dots{}
1606 @end example
1607
1608 @command{coreutils} は、デフォルトではインストールされない。
1609 従って、移植を考慮したスクリプトでは、その存在を当てにしない方がよい。
1610
1611 (訳注: 少し説明が必要だろう。coreutils 8.23 以来、ls, sort
1612 など、個々のバイナリを作るのではなく、coreutils という一つの大きなバイナリを作り、
1613 ls, sort などは、言わば coreutils のビルトイン・コマンドとして呼び出すことができるようになった。
1614 つまり、ls は今までどおり @samp{ls} や @samp{/bin/ls} でも起動できれば、
1615 @samp{coreutils --coreutils-prog=ls} でも起動できるということである。
1616 前者の場合のベースネームの ls が、本文で言う「@command{coreutils}
1617 を呼び出すために使ったファイル名の最後の要素」に当たるわけだ。
1618 もちろん、今でも個々のコマンドを独立したバイナリとして作ることもでき、
1619 その場合は、たぶん @command{coreutils} というコマンドは存在しないことになる。
1620 詳しくは、coreutils パッケージに含まれる NEWS ファイルをご覧いただきたい。)
1621
1622 @node Output of entire files
1623 @chapter ファイル全体の出力
1624
1625 @cindex output of entire files
1626 @cindex entire files, output of
1627
1628 次のコマンドはファイル全体を読み込んで、書き出す。
1629 内容に対して何らかの変換を行うこともある。
1630
1631 @menu
1632 * cat invocation::           ファイルを結合して、書き出す。
1633 * tac invocation::           ファイルを結合し、ファイルごとに逆順で書き出す。
1634 * nl invocation::            行番号を付けて、ファイルを書き出す。
1635 * od invocation::            ファイルを 8 進数などの形式で書き出す。
1636 * base32 invocation::        データを ASCII 文字で表示可能なデータに変換する。
1637 * base64 invocation::        データを ASCII 文字で表示可能なデータに変換する。
1638 @end menu
1639
1640 @node cat invocation
1641 @section @command{cat}: ファイルを結合して、書き出す
1642
1643 @pindex cat
1644 @cindex concatenate and write files
1645 @cindex copying files
1646
1647 @command{cat} は、各 @var{file} (@samp{-} は標準入力を意味する) を標準出力にコピーする。
1648 @var{file} が一つも指定されていない場合は、標準入力から読み込む。
1649
1650 書式:
1651
1652 @example
1653 cat [@var{option}] [@var{file}]@dots{}
1654 @end example
1655
1656 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
1657
1658 @table @samp
1659
1660 @item -A
1661 @itemx --show-all
1662 @opindex -A
1663 @opindex --show-all
1664 @option{-vET} と同じ。
1665
1666 @item -b
1667 @itemx --number-nonblank
1668 @opindex -b
1669 @opindex --number-nonblank
1670 空行以外のすべての出力行に、1 から始まる番号を付ける。
1671
1672 @item -e
1673 @opindex -e
1674 @option{-vE} と同じ。
1675
1676 @item -E
1677 @itemx --show-ends
1678 @opindex -E
1679 @opindex --show-ends
1680 各行の末尾に @samp{$} 記号を付ける。
1681
1682 @item -n
1683 @itemx --number
1684 @opindex -n
1685 @opindex --number
1686 すべての出力行に、1 から始まる番号を付ける。このオプションは、@option{-b}
1687 が有効になっているときは、無視される。
1688
1689 @item -s
1690 @itemx --squeeze-blank
1691 @opindex -s
1692 @opindex --squeeze-blank
1693 @cindex squeezing empty lines
1694 @cindex squeezing blank lines
1695 連続する空行の表示を抑制する。すなわち、連続する複数の空行の代わりに、
1696 たった 1 行だけ空行を出力する。
1697
1698 @item -t
1699 @opindex -t
1700 @option{-vT} と同じ。
1701
1702 @item -T
1703 @itemx --show-tabs
1704 @opindex -T
1705 @opindex --show-tabs
1706 TAB 文字を @samp{^I} と表示する。
1707
1708 @item -u
1709 @opindex -u
1710 無視される。POSIX との互換のためにある。
1711
1712 @item -v
1713 @itemx --show-nonprinting
1714 @opindex -v
1715 @opindex --show-nonprinting
1716 LFD と TAB 以外の制御文字を @samp{^} 表記を使って表示する。
1717 高位ビットのセットされている文字の前には、@samp{M-} を付ける。
1718
1719 @end table
1720
1721 テキストファイルとバイナリファイルを区別する MS-DOS のようなシステムでは、
1722 @command{cat} は通常、バイナリモードで読み書きを行う。
1723 しかしながら、@option{-bensAE} といったオプションの一つが使われている場合や、
1724 読み込みの対象が標準入力で、しかも、標準入力が端末である場合は、@command{cat}
1725 はテキストモードで読み込みを行う。同様に出力においても、@option{-bensAE}
1726 といったオプションの一つが使用されていたり、標準出力が端末である場合は、
1727 @command{cat} はテキストモードで書き出しを行う。
1728
1729 @exitstatus
1730
1731 用例:
1732
1733 @smallexample
1734 # f の内容、標準入力、g の内容の順で出力する。
1735 cat f - g
1736
1737 # 標準入力を標準出力にコピーする。
1738 cat
1739 @end smallexample
1740
1741
1742 @node tac invocation
1743 @section @command{tac}: ファイルを結合し、ファイルごとに逆順で書き出す
1744
1745 @pindex tac
1746 @cindex reversing files
1747
1748 @command{tac} は、各 @var{file} (@samp{-} は標準入力を意味する) を、@var{file} ごとにレコード
1749 (records、デフォルトでは行) の順番を逆にして、標準出力にコピーする。
1750 @var{file} が一つも指定されていない場合は、標準入力から読み込む。
1751
1752 書式:
1753
1754 @example
1755 tac [@var{option}]@dots{} [@var{file}]@dots{}
1756 @end example
1757
1758 レコード (@dfn{records}) は、ある文字列 (デフォルトでは改行)
1759 が出現することによって区切られる。出力の際、デフォルトでは、この区切り文字列は、
1760 ファイル中でその区切り文字列の直前にあるレコードの末尾に付加される。
1761
1762 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
1763
1764 @table @samp
1765
1766 @item -b
1767 @itemx --before
1768 @opindex -b
1769 @opindex --before
1770 出力の際、区切り文字列は、ファイル中でその区切り文字列の直後に来るレコードの先頭に付加される。
1771
1772 @item -r
1773 @itemx --regex
1774 @opindex -r
1775 @opindex --regex
1776 区切り文字列を正規表現として処理する。
1777
1778 @item -s @var{separator}
1779 @itemx --separator=@var{separator}
1780 @opindex -s
1781 @opindex --separator
1782 改行の代わりに @var{separator} をレコード区切り文字列 (record separator)
1783 として使用する。注意すべきは、@var{separator} に空文字列を指定すると、
1784 ゼロバイトを指定したことになることだ。すなわち、入出力レコードが
1785 ASCII NUL で区切られることになる。
1786
1787 @end table
1788
1789 テキストファイルとバイナリファイルを区別する MS-DOS のようなシステムでは、
1790 @command{tac} はバイナリモードで読み書きを行う。
1791
1792 @exitstatus
1793
1794 用例:
1795
1796 @example
1797 # ファイルを一字一字逆にする。
1798 tac -r -s 'x\|[^x]'
1799 @end example
1800
1801
1802 @node nl invocation
1803 @section @command{nl}: 行番号を付けて、ファイルを書き出す
1804
1805 @pindex nl
1806 @cindex numbering lines
1807 @cindex line numbering
1808
1809 @command{nl} は、各 @var{file} (@samp{-} は標準入力を意味する)
1810 を、すべての行、または、一部の行に行番号を付けて、標準出力に書き出す。
1811 @var{file} が一つも指定されていない場合は、標準入力から読み込む。
1812
1813 書式:
1814
1815 @example
1816 nl [@var{option}]@dots{} [@var{file}]@dots{}
1817 @end example
1818
1819 @cindex logical pages, numbering on
1820 @command{nl} は、入力を (論理) ページセクションに分解する。
1821 デフォルトでは、行番号は各論理ページセクションで 1 にリセットされる。
1822 @command{nl} は、すべての入力ファイルをまとめて、一つのドキュメントとして扱う。
1823 従って、入力ファイルが変わるたびに、論理ページや行番号をリセットすることはない。
1824
1825 @cindex headers, numbering
1826 @cindex body, numbering
1827 @cindex footers, numbering
1828 論理ページは、三つのセクションからなる。すなわち、ヘッダ、本文、フッタである。
1829 どのセクションも空であって構わない。
1830 セクションごとに他のセクションとは異なる番号付けの方式を選ぶこともできる。
1831
1832 入力ファイル中で論理ページの各セクションが始まる位置を指示するには、
1833 以下の区切り文字列の一つのみからなる行を使用する。
1834
1835 @table @samp
1836 @item \:\:\:
1837 ヘッダの先頭。
1838 @item \:\:
1839 本文の先頭。
1840 @item \:
1841 フッタの先頭。
1842 @end table
1843
1844 上記の文字列を構成する二文字は、オプションを使って (下記参照)、@samp{\}
1845 と @samp{:} の組み合わせ以外のものに、変更することができる。
1846 だが、各文字列のパターンや長さは、変えることができない。
1847
1848 セクションの区切りは、出力では空行に置き換えられる。
1849 入力ファイル中の最初のセクション区切り文字列より前にあるテキストは、
1850 いかなるテキストも、本文セクションの一部と見なされる。
1851 従って、@command{nl} は、セクションの区切りを全く含まないファイルを、一個の本文セクションとして扱う。
1852
1853 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
1854
1855 @table @samp
1856
1857 @item -b @var{style}
1858 @itemx --body-numbering=@var{style}
1859 @opindex -b
1860 @opindex --body-numbering
1861 各論理ページの本文セクションにおける行の番号付けの方式を選択する。
1862 行に番号が付かない場合、行番号の現在値は増加しないが、それでも行番号の区切り文字は行の前に付く
1863 (訳注: ここで言う行番号の区切り文字 (line number separator character)
1864 とは、行番号とテキストの区切り文字ではなく、行頭とテキストとの間にある行番号のために用意された空間を埋める空白のことらしい)。
1865 番号付けの方式には、以下のものがある。
1866
1867 @table @samp
1868 @item a
1869 すべての行に番号を振る。
1870 @item t
1871 空ではない行にのみ番号を振る (本文のデフォルト)。
1872 @item n
1873 行番号を付けない (ヘッダとフッタのデフォルト)。
1874 @item p@var{bre}
1875 基本正規表現 @var{bre} にマッチする部分を含む行にのみ番号を振る。
1876 @xref{Regular Expressions, , Regular Expressions, grep, The GNU Grep
1877 Manual}.
1878 @end table
1879
1880 @item -d @var{cd}
1881 @itemx --section-delimiter=@var{cd}
1882 @opindex -d
1883 @opindex --section-delimiter
1884 @cindex section delimiters of pages
1885 セクションの区切り文字を @var{cd} にする。デフォルトは @samp{\:}。
1886 @var{c} のみを指定すると、二番目の文字は、デフォルトと同じ @samp{:} になる。
1887 (@samp{\} などのメタ文字は、シェルが展開しないように、引用符やバックスラッシュで保護するのをお忘れなく。)
1888
1889 @item -f @var{style}
1890 @itemx --footer-numbering=@var{style}
1891 @opindex -f
1892 @opindex --footer-numbering
1893 @option{--body-numbering} と同様。
1894
1895 @item -h @var{style}
1896 @itemx --header-numbering=@var{style}
1897 @opindex -h
1898 @opindex --header-numbering
1899 @option{--body-numbering} と同様。
1900
1901 @item -i @var{number}
1902 @itemx --line-increment=@var{number}
1903 @opindex -i
1904 @opindex --line-increment
1905 行番号を @var{number} づつ増やす (デフォルトは 1)。
1906
1907 @item -l @var{number}
1908 @itemx --join-blank-lines=@var{number}
1909 @opindex -l
1910 @opindex --join-blank-lines
1911 @cindex empty lines, numbering
1912 @cindex blank lines, numbering
1913 空行にも番号を付けるとき、連続する @var{number} (デフォルトは 1) 行の空行を
1914 1 論理行と数え、最後の空行にのみ番号を振る。連続する空行が
1915 @var{number} 行未満のときは、番号を振らない。
1916 空行というのは、文字を全く含まない、スペースやタブさえも含まない行のことである。
1917
1918 @item -n @var{format}
1919 @itemx --number-format=@var{format}
1920 @opindex -n
1921 @opindex --number-format
1922 行番号付けのフォーマットを選択する (デフォルトは @code{rn})。
1923
1924 @table @samp
1925 @item ln
1926 @opindex ln @r{format for @command{nl}}
1927 左詰めにする。先頭を 0 で埋めない。
1928 @item rn
1929 @opindex rn @r{format for @command{nl}}
1930 右詰めにする。先頭を 0 で埋めない。
1931 @item rz
1932 @opindex rz @r{format for @command{nl}}
1933 右詰めにする。先頭を 0 で埋める。
1934 @end table
1935
1936 @item -p
1937 @itemx --no-renumber
1938 @opindex -p
1939 @opindex --no-renumber
1940 論理ページの先頭で行番号をリセットしない。
1941
1942 @item -s @var{string}
1943 @itemx --number-separator=@var{string}
1944 @opindex -s
1945 @opindex --number-separator
1946 出力中で行番号とテキスト部分との区切りに @var{string} を使う (デフォルトはタブ文字)。
1947
1948 @item -v @var{number}
1949 @itemx --starting-line-number=@var{number}
1950 @opindex -v
1951 @opindex --starting-line-number
1952 各論理ページで行番号を @var{number} から始める (デフォルトは 1)。
1953
1954 @item -w @var{number}
1955 @itemx --number-width=@var{number}
1956 @opindex -w
1957 @opindex --number-width
1958 行番号に  @var{number} 個の文字を使用する (デフォルトは 6 文字)。
1959
1960 @end table
1961
1962 @exitstatus
1963
1964
1965 @node od invocation
1966 @section @command{od}: ファイルを 8 進数などの形式で書き出す
1967
1968 @pindex od
1969 @cindex octal dump of files
1970 @cindex hex dump of files
1971 @cindex ASCII dump of files
1972 @cindex file contents, dumping unambiguously
1973
1974 @command{od} は、各 @var{file} (@samp{-} は標準入力を意味する) の内容を、
1975 曖昧さの余地がない形で標準出力に書き出す。@var{file} が一つも指定されていない場合は、
1976 標準入力から読み込む。
1977
1978 書式:
1979
1980 @smallexample
1981 od [@var{option}]@dots{} [@var{file}]@dots{}
1982 od [-abcdfilosx]@dots{} [@var{file}] [[+]@var{offset}[.][b]]
1983 od [@var{option}]@dots{} --traditional [@var{file}]@c
1984  [[+]@var{offset}[.][b] [[+]@var{label}[.][b]]]
1985 @end smallexample
1986
1987 各出力行の構成は、入力中の位置をオフセットで表したものの後に、
1988 ファイルのデータをいくつかのまとまりに分けたものが続くという形になっている。
1989 デフォルトでは、@command{od} はオフセットを 8 進数で表示する。
1990 ファイル・データの個々のまとまりは、入力を C 言語の @code{short int}
1991 ごとに分けたものであり、1 個の 8 進数として表示される。
1992
1993 @var{offset} を指定した場合、それは、整形と出力を始める前に、
1994 入力を何バイト読み飛ばすかを示している。デフォルトでは、@var{offset}
1995 は 8 進数と見なされるが、数字の後ろに小数点を付ければ、10 進数と見なされる。
1996 小数点が指定されず、オフセットの数字が @samp{0x} や @samp{0X} で始まっている場合は、
1997 16 進数として解釈される。もし、数字の後ろに @samp{b} が付いているならば、
1998 読み飛ばすバイト数は、@var{offset} に 512 を掛けたものになる。
1999
2000 (訳注: 数字の後ろに小数点を付けることで @var{offset}
2001 が 10 進数であることを示す方法は、現在では無効のようである。
2002 オフセットを 10 進数で指定したければ、@option{-j} オプションを使用した方がよい。)
2003
2004 コマンドが「書式」における第一の型と第二の型のどちらとも取れるときは、
2005 最後のオペランドが @samp{+} で始まっている場合や、オペランドが 2 個で
2006 2 番目のオペランドが数字で始まっている場合は、第二の型だと見なされる。
2007 たとえば、@samp{od foo 10} や @samp{od +10} では、@samp{10} はオフセットである。
2008 それに対して、@samp{od 10} では、@samp{10} はファイル名である。
2009
2010 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2011
2012 @table @samp
2013
2014 @item -A @var{radix}
2015 @itemx --address-radix=@var{radix}
2016 @opindex -A
2017 @opindex --address-radix
2018 @cindex radix for file offsets
2019 @cindex file offset radix
2020 ファイル・オフセットの表示に使う基数を選択する。@var{radix} には、
2021 以下の一つが使える。
2022
2023 @table @samp
2024 @item d
2025 10 進数
2026 @item o
2027 8 進数
2028 @item x
2029 16 進数
2030 @item n
2031 なし (オフセットを表示しない)
2032 @end table
2033
2034 デフォルトは 8 進数である。
2035
2036 @item --endian=@var{order}
2037 @opindex --endian
2038 @cindex byte-swapping
2039 @cindex endianness
2040 入力のバイトオーダーを変更する。入力を別のバイトオーダーで扱うため、
2041 あるいは、使用システムのエンディアン方式にとらわれない一貫した出力を生成するために使用する。
2042 変換は、@option{--type} で指定されたサイズと @var{order} のエンディアンに従って行われる。
2043 @var{order} には、@samp{little} または @samp{big} が指定できる。
2044
2045 @item -j @var{bytes}
2046 @itemx --skip-bytes=@var{bytes}
2047 @opindex -j
2048 @opindex --skip-bytes
2049 整形と出力を行う前に、入力を @var{bytes} バイト読み飛ばす。@var{bytes} が @samp{0x}
2050 や @samp{0X} で始まっている場合は、16 進数と見なされる。
2051 @samp{0} のみで始まっている場合は、8 進数だ。どちらでもない場合は、10 進数である。
2052 @multiplierSuffixes{bytes}
2053
2054 @item -N @var{bytes}
2055 @itemx --read-bytes=@var{bytes}
2056 @opindex -N
2057 @opindex --read-bytes
2058 入力から最大で @var{bytes} バイト出力する。@code{bytes} に接頭辞や接尾辞を付けると、
2059 @option{-j} オプションの場合と同じように解釈される。
2060
2061 @item -S @var{bytes}
2062 @itemx --strings[=@var{bytes}]
2063 @opindex -S
2064 @opindex --strings
2065 @cindex string constants, outputting
2066 通常の出力はせず、文字列定数 (@dfn{string constants}) のみを出力する。
2067 すなわち、@var{bytes} バイト以上の連続する ASCII 表示文字で、ゼロバイト
2068 (ASCII NUL) が続くものを出力するわけだ。@var{bytes} に接頭辞や接尾辞を付けると、
2069 @option{-j} オプションの場合と同じように解釈される。
2070
2071 @option{--strings} に続く @var{bytes} が省略された場合、デフォルトは 3 である。
2072 (訳注: 短縮形の @option{-S} では @var{bytes} を省略できない。)
2073
2074 @item -t @var{type}
2075 @itemx --format=@var{type}
2076 @opindex -t
2077 @opindex --format
2078 ファイルデータの出力形式を選択する。
2079 @var{type} は、1 個以上の下記の形式指定文字からなる文字列である。
2080 一つの @var{type} 文字列に複数の形式指定文字が含まれている場合や、
2081 このオプションを複数回使用した場合は、@command{od} は出力行ごとに、
2082 指定された各データ形式で表現したその行を、指定された順番で書き出す。
2083
2084 どんな形式指定であれ、その最後に ``z'' を付けると、
2085 形式指定によって生成された出力行の後ろに、
2086 表示可能文字を 1 バイト文字によって表現したものが、出力される。
2087
2088 @table @samp
2089 @item a
2090 文字の名称 (訳注: たとえば、A は A、改行文字は nl)。最上位ビットは無視する。
2091 @item c
2092 表示可能な 1 バイト文字、C 言語のバックスラッシュ・エスケープ、
2093 あるいは 3 桁の 8 進数。
2094 @item d
2095 符号付き 10 進数
2096 @item f
2097 浮動小数点数 (@pxref{Floating point})
2098 @item o
2099 8 進数
2100 @item u
2101 符号なし 10 進数
2102 @item x
2103 16 進数
2104 @end table
2105
2106 @code{a} 形式の出力では、空白文字は @samp{sp}、改行文字は @samp{nl}、ゼロバイトは
2107 @samp{nul} といった具合に表現される。このとき、各バイトの下位 7 ビットのみが使われ、
2108 最上位ビットは無視される。@code{c} 形式の出力では、上記の例は、それぞれ
2109 @samp{ }、@samp{\n}、@code{\0} になる。
2110
2111 @cindex type size
2112 @samp{a} と @samp{c} 形式を除き、形式指定文字の後ろに
2113 10 進数の整数を続けることによって、入力データの各数値を読み込んで、
2114 指定されたデータ形式に変換して行く際に、何バイトづつ使用するかを指定することができる。
2115 あるいは、形式指定文字の後ろに以下の文字の一つを続けることによって、
2116 C コンパイラの組み込みデータ型のいづれかのサイズを指定することも可能だ。
2117 すなわち、整数 (@samp{d}, @samp{o}, @samp{u}, @samp{x})
2118 に対しては、以下を後置する。
2119
2120 @table @samp
2121 @item C
2122 char
2123 @item S
2124 short
2125 @item I
2126 int
2127 @item L
2128 long
2129 @end table
2130
2131  浮動小数点数 (@code{f}) に対しては、次のものが使用できる。
2132
2133 @table @asis
2134 @item F
2135 float
2136 @item D
2137 double
2138 @item L
2139 long double
2140 @end table
2141
2142 @item -v
2143 @itemx --output-duplicates
2144 @opindex -v
2145 @opindex --output-duplicates
2146 連続する行が同一であっても出力する。デフォルトでは、出力する行が、
2147 二行以上連続して全く同一になりそうな場合、@command{od} は最初の行だけを出力し、
2148 次の行にはアステリスクのみを置いて、二行目以下を省略したことを示す。
2149
2150 @item -w[@var{n}]
2151 @itemx --width[=@var{n}]
2152 @opindex -w
2153 @opindex --width
2154 1 出力行当たり、@code{n} バイトの入力をダンプする。
2155 この値は、指定した各出力形式に結び付いているサイズの最小公倍数の倍数でなければならない。
2156
2157 このオプションが全く指定されないときのデフォルトは 16 である。
2158 このオプションが @var{n} なしで指定されたときのデフォルトは 32 である。
2159
2160 @end table
2161
2162 以下に挙げるいくつかのオプションは、形式指定の簡易版である。GNU @command{od}
2163 では、形式指定オプションと簡易版オプションをどのように組み合わせても構わない。
2164 こうしたオプションは、累加されていく。
2165
2166 @table @samp
2167
2168 @item -a
2169 @opindex -a
2170 文字の名称で出力する。@samp{-t a} と同じ。
2171
2172 @item -b
2173 @opindex -b
2174 1 バイトづつ 8 進数として出力する。@samp{-t o1} と同じ。
2175
2176 @item -c
2177 @opindex -c
2178 表示可能な 1 バイト文字か、C 言語のバックスラッシュ・エスケープ、
2179 あるいは 3 桁の 8 進数として出力する。@samp{-t c} と同じ。
2180
2181 @item -d
2182 @opindex -d
2183 2 バイトづつ符号なし 10 進数として出力する。@samp{-t u2} と同じ。
2184
2185 @item -f
2186 @opindex -f
2187 浮動小数点数として出力する。@samp{-t fF} と同じ。
2188
2189 @item -i
2190 @opindex -i
2191 10 進数の int として出力する。@samp{-t dI} と同じ。
2192
2193 @item -l
2194 @opindex -l
2195 10 進数の long int として出力する。@samp{-t dL} と同じ。
2196
2197 @item -o
2198 @opindex -o
2199 2 バイトづつ 8 進数として出力する。@option{-t o2} と同じ。
2200
2201 @item -s
2202 @opindex -s
2203 2 バイトづつ 10 進数として出力する。@option{-t d2} と同じ。
2204
2205 @item -x
2206 @opindex -x
2207 2 バイトづつ 16 進数として出力する。@samp{-t x2} と同じ。
2208
2209 @item --traditional
2210 @opindex --traditional
2211 昔の @command{od} で使用できた、オプションではない引数 @var{label} を認識する。
2212 書式は次のようになる。
2213
2214 @smallexample
2215 od --traditional [@var{file}] [[+]@var{offset}[.][b] [[+]@var{label}[.][b]]]
2216 @end smallexample
2217
2218 @noindent
2219 この書式を使用すると、ファイルは 1 個までしか指定できないが、必要なら、
2220 オフセットを示す引数や、@var{label} という、開始位置の仮アドレスを示す引数を、
2221 続けて指定することができる。引数 @var{label} は @var{offset}
2222 と全く同じように解釈されるが、出力を開始する位置の仮アドレスを指定している。
2223 仮アドレスは、通常のアドレスの後ろに、カッコで囲まれて、表示される。
2224
2225 @end table
2226
2227 @exitstatus
2228
2229
2230 @node base32 invocation
2231 @section @command{base32}: データを表示可能データ (printable data) に変換する
2232
2233 @pindex base32
2234 @cindex base32 encoding
2235
2236 @command{base32} はファイル、または標準入力から読み込んだデータを、
2237 base32 でエンコードした形式に変換する (あるいは、その逆を行う)。
2238 base32 でエンコードした形式は、表示可能な ASCII 文字を用いて、バイナリデータを表現する。
2239 このコマンドの使用法やオプションは、
2240 @command{base64} と全く同じである。  @xref{base64 invocation}.
2241
2242
2243 @node base64 invocation
2244 @section @command{base64}: データを表示可能データ (printable data) に変換する
2245
2246 @pindex base64
2247 @cindex base64 encoding
2248
2249 @command{base64} はファイル、または標準入力から読み込んだデータを、
2250 base64 でエンコードした形式に変換する (あるいは、その逆を行う)。
2251 base64 でエンコードした形式は、表示可能な ASCII 文字を用いて、バイナリデータを表現する。
2252
2253 書式:
2254
2255 @smallexample
2256 base64 [@var{option}]@dots{} [@var{file}]
2257 base64 --decode [@var{option}]@dots{} [@var{file}]
2258 @end smallexample
2259
2260 base64 でエンコードすると、データが元のデータのほぼ 133% に増大する。
2261 base32 エンコーディングの場合は、元のデータのほぼ 160% になる。
2262 こうしたエンコード形式は、RFC4648 に準拠している。
2263 @uref{ftp://ftp.rfc-editor.org/in-notes/rfc4648.txt}
2264
2265 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2266
2267 @table @samp
2268
2269 @item -w @var{cols}
2270 @itemx --wrap=@var{cols}
2271 @opindex -w
2272 @opindex --wrap
2273 @cindex wrap data
2274 @cindex column to wrap data after
2275 エンコード中に、出力が @var{cols} 文字に達したら改行する。この値は、正の整数でなければならない。
2276
2277 デフォルトでは、76 文字で改行する。改行を全く行わないようにするには、値を 0 にする。
2278
2279 @item -d
2280 @itemx --decode
2281 @opindex -d
2282 @opindex --decode
2283 @cindex Decode base64 data
2284 @cindex Base64 decoding
2285 動作モードを変更する。デフォルトの、データをエンコードするモードではなく、
2286 データをデコードするモードになる。入力には、base64
2287 でエンコードしたデータが期待され、出力は、エンコードする前のデータになる。
2288
2289 @item -i
2290 @itemx --ignore-garbage
2291 @opindex -i
2292 @opindex --ignore-garbage
2293 @cindex Ignore garbage in base64 stream
2294 デコードする際、改行文字がどこに現れても、適切に処理する。デコード中に
2295 ASCII 表示可能文字以外を表すバイトが現れたら、一部壊れたデータでもデコードできるように、それを無視する。
2296
2297 @end table
2298
2299 @exitstatus
2300
2301
2302 @node Formatting file contents
2303 @chapter ファイル内容の整形
2304
2305 @cindex formatting file contents
2306
2307 以下のコマンドは、ファイルの内容を整形し直す。
2308
2309 @menu
2310 * fmt invocation::           パラグラフに分かれたテキストを整形し直す。
2311 * pr invocation::            ページ付けや段組みをしてファイルを表示する。
2312 * fold invocation::          入力行を指定された幅に合わせて折り返す。
2313 @end menu
2314
2315
2316 @node fmt invocation
2317 @section @command{fmt}: パラグラフに分かれたテキストを整形し直す
2318
2319 @pindex fmt
2320 @cindex reformatting paragraph text
2321 @cindex paragraphs, reformatting
2322 @cindex text, reformatting
2323
2324 @command{fmt} は行を折り返したり、結合したりして、出力する各行が指定された文字数に納まるように調整する。
2325 1 行のデフォルトはアスキー文字で 75 文字である。
2326 (訳注: 日本語のテキストは、通常単語を空白で区切らないので、うまく整形できない。)
2327
2328 書式:
2329
2330 @example
2331 fmt [@var{option}]@dots{} [@var{file}]@dots{}
2332 @end example
2333
2334 @command{fmt} は、指定された引数 @var{file} から
2335 (指定されていない場合は、標準入力から) テキストを読み込んで、標準出力に書き出す。
2336
2337 デフォルトでは、空行、単語間の空白、インデント (字下げ) は、出力でもそのまま維持される。
2338 インデントの違う入力行が連続する場合は、行の結合は行われない。
2339 タブは入力のときにスペースに展開され、出力でタブに戻される。
2340
2341 @cindex line-breaking
2342 @cindex sentences and line-breaking
2343 @cindex Knuth, Donald E.
2344 @cindex Plass, Michael F.
2345 @command{fmt} は、できるだけ文の終わりで改行しようとする。
2346 また、文の最初の単語の直後や、文の最後の単語の直前で改行するのは避けようとする。
2347 「文の終わり (@dfn{sentence break})」の定義は、パラグラフがそこで終わっているか、
2348 あるいは、単語の末尾に @samp{.?!} のどれかが付き、さらにスペースが 2 個続くか、
2349 行末が来ることである。後者の場合、ピリオドなどとスペース
2350 2 個、あるいは行末の間にカッコや引用符が入っていてもよい。
2351 @TeX{} と同様、@command{fmt} は、どこで行を折り返すかを決める前に、パラグラフ全体を読み込む。
2352 使用しているアルゴリズムは、Donald E. Knuth と Michael F. Plass が ``Breaking
2353 Paragraphs Into Lines'' で提示しているものに変更を加えたものである
2354 (`Software---Practice & Experience 誌'、第 11 巻 第 11 号 (November
2355 1981) 1119-1184 ページ)。
2356
2357 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2358
2359 @table @samp
2360
2361 @item -c
2362 @itemx --crown-margin
2363 @opindex -c
2364 @opindex --crown-margin
2365 @cindex crown margin
2366 クラウンマージン・モード (@dfn{Crown margin} mode)。
2367 パラグラフ中の最初の 2 行のインデントはそのまま維持し、(同一パラグラフの)
2368 それに続く各行の左の余白は 2 行目の左の余白に揃える。
2369
2370 (訳注: これは要するに、1 行目の行頭を字下げしたお馴染みのスタイルのパラグラフ表示である。
2371 逆に 1 行目が左に張り出しているスタイルもありえる。なお、2 行目以降のインデントは、
2372 @option{--crown-margin} オプションによって揃えられるわけではなく、
2373 入力テキストにおいてすでに揃っていなければならない。
2374 さもないと、そもそも同一パラグラフの行と見なされない。)
2375
2376 @item -t
2377 @itemx --tagged-paragraph
2378 @opindex -t
2379 @opindex --tagged-paragraph
2380 @cindex tagged paragraphs
2381 標識 (タグ) 付きパラグラフ・モード (@dfn{Tagged paragraph} mode)。
2382 クラウンマージン・モードに似ているが、次の点が違う。パラグラフの最初の行と
2383 2 番目の行のインデントが同じ場合、最初の行は 1 行からなるパラグラフとして扱われる。
2384
2385 @item -s
2386 @itemx --split-only
2387 @opindex -s
2388 @opindex --split-only
2389 行の分割のみを行う。短い行を結合して、長い行を作ることはしない。
2390 その結果、サンプル・コードの行のような、すでに整形されたテキストをむやみに結合しないで済む。
2391
2392 @item -u
2393 @itemx --uniform-spacing
2394 @opindex -u
2395 @opindex --uniform-spacing
2396 空白の数を一定にする。すなわち、単語間の空白は 1 個に、文の間の空白は 2 個にする。
2397
2398 @item -@var{width}
2399 @itemx -w @var{width}
2400 @itemx --width=@var{width}
2401 @opindex -@var{width}
2402 @opindex -w
2403 @opindex --width
2404 出力する各行を、長くても @var{width} 文字までにする (デフォルトは 75
2405 文字。@var{goal} が指定されている場合は、@var{goal} プラス 10 文字)。
2406
2407 @item -g @var{goal}
2408 @itemx --goal=@var{goal}
2409 @opindex -g
2410 @opindex --goal
2411 とりあえず、各行を @var{goal} 文字の長さにしてみようとする。
2412 これは、デフォルトでは @var{width} より 7% 短い。
2413
2414 @item -p @var{prefix}
2415 @itemx --prefix=@var{prefix}
2416 @var{prefix} で始まる行のみを整形の対象にする (@var{prefix}
2417 の前にホワイトスペースがあってもよい)。@var{prefix}
2418 とそれに先行するホワイトスペースは、整形の際に取り除かれ、整形後に各出力行に付け直される。
2419 このオプションの用途を一つ挙げると、プログラムのコメントのような行だけを整形し、
2420 コードには手を加えないことが考えられる。
2421
2422 @end table
2423
2424 @exitstatus
2425
2426 @node pr invocation
2427 @section @command{pr}: ページ付けや段組みをしてファイルを表示する
2428
2429 @pindex pr
2430 @cindex printing, preparing files for
2431 @cindex multicolumn output, generating
2432 @cindex merging files in parallel
2433
2434 @command{pr} は、各 @var{file} (@samp{-} は標準入力を表す)
2435 を標準出力に書き出す。@var{file} が指定されていない場合は、標準入力を対象にする。
2436 その際、ページ付けを行い、指定があれば段組みをして出力する。また、すべての
2437 @var{file} を一つに統合し、1 段 1 ファイルの形式で平行して表示することもできる。
2438
2439 (訳注: @command{pr} はページ構成をするコマンドであって、
2440 長い行の折り返しなどの整形をするわけではない。そうしたことは、@command{fmt} や
2441 @command{fold} の仕事である。なお、@command{pr} の日本語対応は十分ではない。
2442 とくに段組みがうまくいかない。)
2443
2444 書式:
2445
2446 @example
2447 pr [@var{option}]@dots{} [@var{file}]@dots{}
2448 @end example
2449
2450 @vindex LC_MESSAGES
2451 デフォルトでは、5 行のヘッダが各ページに付く。2 行の空行、
2452 日付・ファイル名・ページ番号からなる 1 行、そしてもう 2 行の空行という形式である。
2453 5 行の空行からなるフッタも出力される。デフォルトのページ長 (@var{page_length})
2454 は 66 行なので、本文に使用されるデフォルトの行数は、56 行になる。
2455 ヘッダのテキスト行は、@samp{@var{date} @var{string} @var{page}} の形を取り、
2456 @var{string} の両側に空白を入れて、行の幅がページ幅 (@var{page_width})
2457 いっぱいになるようにしている。@var{date} は日付であり (詳細については、
2458 @option{--date-format} (@option{-D}) オプションを参照)、
2459 @var{string} は中央揃えのヘッダ文字列 (訳注: デフォルトではファイル名)、
2460 @var{page} はページ番号である。@var{page} という単語の綴りは、
2461 @env{LC_MESSAGES} ロケール・カテゴリによって変わってくる。デフォルトの C
2462 ロケールでは、@samp{Page @var{number}} であり、@var{number} の位置には
2463 10 進数のページ番号が入る。
2464
2465 入力にフォームフィード (Form feed) があると、出力では改ページが行われる。
2466 フォームフィードが続くと、白紙のページが生ずる。
2467
2468 段組みをした場合、どの段の幅も同じになり、段と段の間には任意の文字列
2469 (デフォルトはスペース) が置かれる。多段組みの出力では、@option{-J}
2470 オプションを使用しないかぎり、各行は常に @var{page_width} (デフォルトは 72)
2471 文字までに切り詰められる (訳注: これは、各段や段間の空白などを合計した 1 行の長さが、
2472 最長でも @var{page_width} 文字までになるということであって、
2473 各段がそれぞれ @var{page_width} 文字になるということではない)。
2474 1 段のみの出力では、デフォルトでは行の切り詰めは行われない。
2475 その場合でも、行の切り詰めを行うには、@option{-W} を使用する。
2476
2477 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2478
2479 @table @samp
2480
2481 @item +@var{first_page}[:@var{last_page}]
2482 @itemx --pages=@var{first_page}[:@var{last_page}]
2483 @c The two following @opindex lines evoke warnings because they contain ':'
2484 @c The 'info' spec does not permit that.  If we use those lines, we end
2485 @c up with truncated index entries that don't work.
2486 @c @opindex +@var{first_page}[:@var{last_page}]
2487 @c @opindex --pages=@var{first_page}[:@var{last_page}]
2488 @opindex +@var{page_range}
2489 @opindex --pages=@var{page_range}
2490 表示を @var{first_page} ページから始めて、 @var{last_page} ページで終了する。
2491 @samp{:@var{last_page}} の指定を省略するのは、ファイルの最後までということである。
2492 スキップするページ数を計算する際、入力ファイル中にフォームフィードがあると、
2493 そのたびに 1 ページ進むことになる。ページ番号は、@samp{+@var{first_page}}
2494 を指定してもしなくても同じになる。デフォルトでは、
2495 入力ファイルの最初のページからページ数を数えるからだ (表示される最初のページからではない)。
2496 行番号については @option{-N} オプションで変更することができる。
2497
2498 @item -@var{column}
2499 @itemx --columns=@var{column}
2500 @opindex -@var{column}
2501 @opindex --columns
2502 @cindex down columns
2503 個々の @var{file} に対して @var{column} 段に段組みした出力を生成する
2504 (デフォルトは 1 段)。@option{-a} オプションを使用しない場合、ページ内で本文は、
2505 段内を上から下へと進む。段が増えると、段の幅は自動的に狭くなる。
2506 ただし、@option{-W/-w} を同時に使用して、@var{page_width}
2507 を増加させている場合は、そのかぎりではない。このオプションを使うと、
2508 切り詰められる行がたぶん生じるだろう。ページごとの各段の行数は、
2509 できるだけ揃えられる。多段組みの本文出力では、オプション @option{-e} と
2510 @option{-i} が有効になる。@option{-J} オプションと一緒に使った場合は、
2511 段の整列と行の切り詰めは行われない。各行は、元の長さのまま、不定長フィールドとして
2512 (free field format) 結合されるのである。その際も、@option{-S}
2513 オプションによってフィールド・セパレータを指定することは可能だ。なお
2514 @option{-@var{column}} は、@option{-m} オプションと一緒に使用できない。
2515
2516 @item -a
2517 @itemx --across
2518 @opindex -a
2519 @opindex --across
2520 @cindex across columns
2521 個々の @var{file} を段組みで表示するとき、本文の各行が、段内を上から下へではなく、
2522 左の段から右の段へと進むようにする。@option{-@var{column}}
2523 オプションに指定する段の数は、2 以上でなければならない。
2524 行が段の幅に納まらないほど長い場合、その行は切り詰められる。
2525
2526 @item -c
2527 @itemx --show-control-chars
2528 @opindex -c
2529 @opindex --show-control-chars
2530 制御文字をハット表記 (たとえば、@samp{^G}) を使って表示する。
2531 他の非表示文字は、バックスラッシュ付きの 8 進数表記になる。@command{pr}
2532 のデフォルトでは、非表示文字の表示文字化は行われない。
2533
2534 @item -d
2535 @itemx --double-space
2536 @opindex -d
2537 @opindex --double-space
2538 @cindex double spacing
2539 ダブルスペースで出力する (訳注: すなわち、行間を 1 行分あける)。
2540
2541 @item -D @var{format}
2542 @itemx --date-format=@var{format}
2543 @cindex time formats
2544 @cindex formatting times
2545 ヘッダの日付を @var{format} を用いて整形する。@var{format} には、コマンド
2546 @samp{date +@var{format}} で使うのと同じ指定法が使用できる。@xref{date invocation}.
2547 @samp{%} で始まる日時の指定を除いて、@var{format} 中の文字はそのまま表示される。
2548 従って、このオプションを使用すれば、ヘッダの日付の位置に任意の文字列を指定することもできるわけだ。
2549 たとえば、@option{--date-format="Monday morning"} といった具合に。
2550
2551 @vindex POSIXLY_CORRECT
2552 @vindex LC_TIME
2553 デフォルトの日付書式は @samp{%Y-%m-%d %H:%M} という形である (たとえば、
2554 @samp{2001-12-04 23:59})。だが、環境変数 @env{POSIXLY_CORRECT} が設定され、
2555 しかも @env{LC_TIME} ロケール・カテゴリが POSIX ロケールを指定している場合は、
2556 デフォルトの書式は @samp{%b %e %H:%M %Y} になる
2557 (たとえば、@samp{Dec@ @ 4 23:59 2001})。
2558
2559 @vindex TZ
2560 タイムスタンプは、タイムゾーンのルールに従って表示されるが、
2561 そのルールを指定しているのは、環境変数 @env{TZ} である。
2562 @env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
2563 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
2564 The GNU C Library Reference Manual}.
2565
2566 @item -e[@var{in-tabchar}[@var{in-tabwidth}]]
2567 @itemx --expand-tabs[=@var{in-tabchar}[@var{in-tabwidth}]]
2568 @opindex -e
2569 @opindex --expand-tabs
2570 @cindex input tabs
2571 入力の際にタブをスペースに展開する。省略できる引数 @var{in-tabchar} は、
2572 入力で使われるタブ文字である (デフォルトは TAB 文字)。
2573 これも省略できる二番目の引数 @var{in-tabwidth} は、
2574 入力で使われるタブ文字の幅である。(デフォルトは 8 桁)。
2575
2576 @item -f
2577 @itemx -F
2578 @itemx --form-feed
2579 @opindex -F
2580 @opindex -f
2581 @opindex --form-feed
2582 複数個の改行文字ではなく、1 個のフォームフィードを使用して、
2583 出力する各ページを分離する。このオプションによって、
2584 66 行というデフォルトのページの長さが変わることはない。
2585
2586 @item -h @var{header}
2587 @itemx --header=@var{header}
2588 @opindex -h
2589 @opindex --header
2590 ヘッダのファイル名の部分を、中央揃えの @var{header} という文字列で置き換える。
2591 シェル上では、@var{header} はクォートするべきである。また、@option{-h}
2592 との間に空白を入れた方がよい。
2593
2594 @item -i[@var{out-tabchar}[@var{out-tabwidth}]]
2595 @itemx --output-tabs[=@var{out-tabchar}[@var{out-tabwidth}]]
2596 @opindex -i
2597 @opindex --output-tabs
2598 @cindex output tabs
2599 出力の際にスペースをタブで置き換える。省略できる引数 @var{out-tabchar}
2600 は、出力で使われるタブ文字である (デフォルトは TAB 文字)。
2601 これも省略できる二番目の引数 @var{out-tabwidth} は、出力で使われるタブ文字の幅である
2602 (デフォルトは 8 桁)。
2603
2604 @item -J
2605 @itemx --join-lines
2606 @opindex -J
2607 @opindex --join-lines
2608 長い行は長いまま結合する。段組みオプション @option{-@var{column}}, @option{-a -@var{column}},
2609 @option{-m} と併せて使用する。@option{-W/-w} による行の切り詰めが無効になる。
2610 段の整列も行わなくなる。@option{--sep-string[=@var{string}]} と併せて使ってもよい。
2611 @option{-J} というオプションが (@option{-W} や @option{--sep-string} とともに)
2612 新たに設けられたのは、@option{-w} や @option{-s} という、前からある (POSIX に準拠した)
2613 オプションを 3 種の段組みオプションと組み合わせて使ったときの混乱を解消するためである。
2614
2615
2616 @item -l @var{page_length}
2617 @itemx --length=@var{page_length}
2618 @opindex -l
2619 @opindex --length
2620 1 ページの行数を、ヘッダ行 (及び フッタ行) を含めて、@var{page_length}
2621 行にする (デフォルトは 66 行)。@var{page_length} が 10 行以下だったら、
2622 @option{-t} オプションが指定されたかのように、 ヘッダとフッタは省略する。
2623
2624 @item -m
2625 @itemx --merge
2626 @opindex -m
2627 @opindex --merge
2628 すべての @var{file} を統合し、各段に 1 ファイルを割り当てて、平行表示する。
2629 長すぎて段に納まらない行があれば、@option{-J} オプションが使用されていないかぎり、
2630 切り詰めが行われる。@option{--sep-string[=@var{string}]}
2631 を指定してもよい。いづれかの @var{file} に (フォームフィードの指定により)
2632 空白のページが存在すると、空白の段が生ずるが、それでも段を分離する記号の
2633 @var{string} は表示される。すなわち、統合されたファイルの最初から最後まで、
2634 行番号と (訳注: これはもちろん、@option{-n} オプションが指定されている場合)
2635 段の分離記号は、連続して表示されるわけだ。
2636 ただし、統合されたページのどの段も空白の場合は、分離記号も行番号も表示されない。
2637 デフォルトのヘッダは、@samp{@var{date} @var{page}} という形式になり、
2638 中央には長い空白が挿入される。@option{-h} や @option{--header} オプションを
2639 @option{-m} と一緒に使えば、この中央の空白部分に文字列を入れることができる。
2640
2641 @item -n[@var{number-separator}[@var{digits}]]
2642 @itemx --number-lines[=@var{number-separator}[@var{digits}]]
2643 @opindex -n
2644 @opindex --number-lines
2645 @var{digits} の幅の行番号を表示する (@var{digits} のデフォルトは 5 桁)。
2646 通常の多段組みの出力では、行番号は、各段ごとに本文の最初の @var{digits}
2647 桁分の位置を占めるが、@option{-m} の出力の場合は、各行の先頭だけに表示される。
2648 1 段組みでは、@option{-m} の場合と同様、各行の先頭に付く。
2649 デフォルトでは、行数は、入力ファイルの最初の行から数え始める
2650 (表示される最初の行からではない。@option{--page} や @option{-N} オプションを参照)。
2651 省略可能な引数 @var{number-separator} は、行番号の後ろに付けて、
2652 後に続く本文と区別するための文字であり、デフォルトのセパレータはタブ文字である。
2653 厳密に言うと、常にタブが表示されるのは、1 段組みの出力のときだけである。
2654 タブの幅は、本来タブの現れる位置によって変化し、たとえば、@option{-o}
2655 オプションで指定される左の余白 (@var{margin}) によって変わってくるものである。
2656 しかし、多段組みの出力では、「出力される段の幅が同じになる」ことが優先されるため
2657 (POSIX の仕様)、タブの幅は、最初の段における値に固定され、左の余白の値が変わっても、
2658 変化することはない。従って、@var{number-separator} であるタブの位置には、
2659 常に一定数のスペースが表示されることになる。スペースをタブに置き換えるかどうかは、
2660 出力される位置次第である。
2661
2662 @item -N @var{line_number}
2663 @itemx --first-line-number=@var{line_number}
2664 @opindex -N
2665 @opindex --first-line-number
2666 表示される最初のページの最初の行を @var{line_number} として行を数えて行く
2667 (入力ファイルの最初の行以外から表示を始めるときによく使う)。
2668
2669 @item -o @var{margin}
2670 @itemx --indent=@var{margin}
2671 @opindex -o
2672 @opindex --indent
2673 @cindex indenting lines
2674 @cindex left margin
2675 スペース @var{margin} 個分の余白で各行をインデントする (デフォルトは、
2676 スペース 0 個)。ページの横幅は、@option{-W/-w} で指定した @var{page_width}
2677 と余白を合計したサイズになる。行番号付きの 1 段組み出力では、
2678 行から少しはみ出す文字が生ずるかもしれない (@option{-n} オプション参照)。
2679
2680 @item -r
2681 @itemx --no-file-warnings
2682 @opindex -r
2683 @opindex --no-file-warnings
2684 引数 @var{file} がオープンできないときも、警告メッセージを表示しない
2685 (終了ステータスは、それでもやはり 0 以外になる)。
2686
2687 @item -s[@var{char}]
2688 @itemx --separator[=@var{char}]
2689 @opindex -s
2690 @opindex --separator
2691 段と段の区切りに 1 個の文字 @var{char} を使う。@option{-s}
2692 オプションを指定したときのデフォルトの @var{char} は、@option{-w}
2693 オプションを同時に指定しなければタブ、指定すれば「なし」である。
2694 なお、@option{-s} オプションを指定しない場合のデフォルトのセパレータはスペースだ。
2695 @option{-s[char]} オプションを使用すると、@option{-w} も同時に指定しないかぎり、
2696 3 種の段組みオプション (@option{-COLUMN}|@option{-a -COLUMN}|@option{-m})
2697 のすべてにおいて、行の切り詰めが行われない。これは、POSIX に準拠した仕様である。
2698
2699
2700 @item -S[@var{string}]
2701 @itemx --sep-string[=@var{string}]
2702 @opindex -S
2703 @opindex --sep-string
2704 出力される段の区切りに、文字列 @var{string} を使用する。@option{-s}
2705 オプションが @option{-W/-w} オプションに影響を及ぼすのとは異なり、
2706 @option{-S} オプションは @option{-W/-w} オプションに影響を及ぼさない。
2707 また、行の切り詰めや段の整列にも影響しない。@option{-S} オプションを指定せずに、
2708 @option{-J} オプションを指定すると、@command{pr}
2709 はデフォルトの出力セパレータであるタブを使用する
2710 (訳注: @option{-J} 使用時のデフォルトということだと思う)。@option{-S} も
2711 @option{-J} も指定しない場合、@command{pr} が区切りに使用するのはスペースである
2712 (@option{-S"@w{ }"} と同じこと)。@option{-S} だけで、引数の @samp{@var{string}} を指定しないと、
2713 空文字列 (@samp{""}) を指定したことになる。
2714
2715 @item -t
2716 @itemx --omit-header
2717 @opindex -t
2718 @opindex --omit-header
2719 常とは異なり、各ページにヘッダ (とフッタ) を表示しない。
2720 また、ページの最下部を (空行やフォームフィードで) 埋めることもしない。
2721 ページ構成は行わないが、入力ファイルにあるフォームフィードは、
2722 そのままにしておく。つまり、あらかじめ決めておいたページ分割が、
2723 変更されないということだ。@option{-t} や @option{-T} オプションは、
2724 他のオプションと組み合わせて使うと、便利なことがある。たとえば、@option{-t -e4}
2725 は、入力ファイルのタブ文字を 4 個のスペースに展開するが、
2726 それ以外何の変更も行わない。@option{-t} オプションを使用すると、
2727 @option{-h} オプションが無効になる。
2728
2729 @item -T
2730 @itemx --omit-pagination
2731 @opindex -T
2732 @opindex --omit-pagination
2733 ヘッダ (とフッタ) を表示しない。さらに、入力ファイルにあるフォームフィードをすべて取り除く。
2734
2735 @item -v
2736 @itemx --show-nonprinting
2737 @opindex -v
2738 @opindex --show-nonprinting
2739 非表示文字をバックスラッシュ付きの 8 進数表記で表示する。
2740
2741 @item -w @var{page_width}
2742 @itemx --width=@var{page_width}
2743 @opindex -w
2744 @opindex --width
2745 本文を多段組み出力にしたときにのみ、ページの幅を @var{page_width} 文字にする
2746 (@var{page_width} のデフォルトは 72 字)。各段の幅が等しくなるようにするため、
2747 ページ幅が指定した @var{page_width} より狭くなることがある。
2748 多段組みで @option{-w} オプションを指定せず、@option{-s[CHAR]}
2749 オプションだけ指定すると、デフォルトのページ幅が無効になり、
2750 行の切り詰めや段の整列も行われなくなる。
2751 すなわち、各段の長い行が長いまま結合されてしまうのだ。なお、1 段組みの出力では、
2752 @var{page_width} の指定はできない。以上は、POSIX に準拠した仕様である。
2753
2754 @item -W @var{page_width}
2755 @itemx --page_width=@var{page_width}
2756 @opindex -W
2757 @opindex --page_width
2758 ページの幅を @var{page_width} 文字にする。この指定は、
2759 段組みオプションがあってもなくても、有効である。段組みオプションとともに使った場合、
2760 各段の幅が等しくなるようにするため、ページ幅が指定した @var{page_width}
2761 より狭くなることがある。@option{-J} オプションを使用しないかぎり、本文の行が切り詰められる。
2762 3 種の段組みオプション (@option{-@var{column}}, @option{-a -@var{column}},
2763 @option{-m}) と組み合わせて使った場合、段の整列が常に行われる。
2764 セパレータを指定するオプションの @option{-S} や @option{-s} が、
2765 @option{-W} オプションを無効にすることはない。デフォルトは 72 文字である。
2766 @option{-W @var{page_width}} オプションもなく、
2767 段組みオプションも全く指定されていない場合に、行の切り詰めが行われることは絶対にない
2768 (下位互換を維持しつつ、よく行われる作業のほとんどに対応するために、そうなっている)。
2769 この動作は、@option{-W 72 -J} と同じである。
2770 なお、ヘッダ行が切り詰められることは絶対にない。
2771
2772 @end table
2773
2774 @exitstatus
2775
2776
2777 @node fold invocation
2778 @section @command{fold}: 入力行を指定された幅に合わせて折り返す
2779
2780 @pindex fold
2781 @cindex wrapping long input lines
2782 @cindex folding long input lines
2783
2784 @command{fold} は、各 @var{file} (@option{-} は標準入力を表す)
2785 を、長い行は折り返して、標準出力に書き出す。
2786 @var{file} が指定されていない場合は、標準入力を対象にする。
2787
2788 (訳注: @command{fold} の日本語対応は完全ではない。
2789 3 バイトで表現される UTF-8 の漢字やかなは、1 文字 が 3 桁として計算され、
2790 画面上では 2 桁分を占める。だから、日本語のテキストが
2791 3 バイトの UTF-8 文字だけで書かれているならば、@samp{fold -w 105}
2792 で長い行が 1 行 35 字 (70 桁) できちんと折り返される。
2793 だが、出力行の長さが不適切だったり、ASCII 文字や
2794 4 バイトの漢字が交じったりすると、行末や行頭で文字化けが生じかねない。
2795 もちろん、日本語の禁則処理は期待できない。)
2796
2797 書式:
2798
2799 @example
2800 fold [@var{option}]@dots{} [@var{file}]@dots{}
2801 @end example
2802
2803 デフォルトでは、@command{fold} は 80 桁よりも長い行を折り返す。
2804 出力は必要なら何行にも分割されることになる。
2805
2806 @cindex screen columns
2807 @command{fold} はデフォルトでは、画面上の桁数を数える。従って、タブは
2808 2 桁以上に数えられるかもしれないし、バックスペースは桁数を減らすことになる。
2809 また、復帰文字 (carriage return) は、桁数を 0 にする。
2810
2811 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2812
2813 @table @samp
2814
2815 @item -b
2816 @itemx --bytes
2817 @opindex -b
2818 @opindex --bytes
2819 桁数ではなく、バイト数を数える。従って、タブ、バックスペース、復帰文字も、
2820 他の文字と全く同じように、それぞれ 1 桁を占めるものとして計算される。
2821
2822 @item -s
2823 @itemx --spaces
2824 @opindex -s
2825 @opindex --spaces
2826 単語境界で折り返す。行は、行の最大長より前にある最後の空白の後ろで折り返される。
2827 行にそうした空白がない場合は、通常通り、行の最大長で折り返される。
2828
2829 @item -w @var{width}
2830 @itemx --width=@var{width}
2831 @opindex -w
2832 @opindex --width
2833 行の最大長に 80 桁ではなく、@var{width} 桁を使用する。
2834
2835 互換性のために、@command{fold} は古い書式のオプション @option{-@var{width}}
2836 もサポートしている。新しいスクリプトでは、@option{-w @var{width}} の方を使用すべきである。
2837
2838 @end table
2839
2840 @exitstatus
2841
2842
2843 @node Output of parts of files
2844 @chapter ファイルの部分出力
2845
2846 @cindex output of parts of files
2847 @cindex parts of files, output of
2848
2849 以下のコマンドは、入力の一部を出力する。
2850
2851 @menu
2852 * head invocation::          ファイルの先頭部分を出力する。
2853 * tail invocation::          ファイルの末尾部分を出力する。
2854 * split invocation::         ファイルを分割する
2855 * csplit invocation::        ファイルを内容を目印にして分割する。
2856 @end menu
2857
2858 @node head invocation
2859 @section @command{head}: ファイルの先頭部分を出力する
2860
2861 @pindex head
2862 @cindex initial part of files, outputting
2863 @cindex first part of files, outputting
2864
2865 @command{head} は、各 @var{file} の先頭部分 (デフォルトでは 10 行) を表示する。
2866 ファイルが指定されていない場合や、@var{file} として
2867 @option{-} が指定されている場合は、標準入力から読み込む。
2868
2869 書式:
2870
2871 @example
2872 head [@var{option}]@dots{} [@var{file}]@dots{}
2873 @end example
2874
2875 指定された @var{file} が 2 個以上あると、
2876 @command{head} は、次のような 1 行からなるヘッダを出力する。
2877
2878 @example
2879 ==> @var{file name} <==
2880 @end example
2881
2882 @noindent
2883 このヘッダは、各 @var{file} の出力の前に置かれる。
2884
2885 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2886
2887 @table @samp
2888
2889 @item -c [-]@var{num}
2890 @itemx --bytes=[-]@var{num}
2891 @opindex -c
2892 @opindex --bytes
2893 ファイルの先頭数行を表示する代わりに、先頭から @var{num} バイトを表示する。
2894 ただし、@var{num} の前に @samp{-} が付いている場合は、各ファイルについて、
2895 末尾の @var{num} バイトを除いたすべてを表示することになる。
2896 @multiplierSuffixes{num}
2897
2898 @item -n [-]@var{num}
2899 @itemx --lines=[-]@var{num}
2900 @opindex -n
2901 @opindex --lines
2902 ファイルの先頭から @var{num} 行を表示する。ただし、@var{num} の前に
2903 @samp{-} が付いている場合は、各ファイルについて、末尾の @var{num} 行を除いたすべてを表示することになる。
2904 サイズの乗数接尾辞は、@option{-c} オプションの場合と同様である。
2905
2906 @item -q
2907 @itemx --quiet
2908 @itemx --silent
2909 @opindex -q
2910 @opindex --quiet
2911 @opindex --silent
2912 ファイル名を示すヘッダを出力しない。
2913
2914 @item -v
2915 @itemx --verbose
2916 @opindex -v
2917 @opindex --verbose
2918 ファイル名を示すヘッダを常に出力する。
2919
2920 @optZeroTerminated
2921
2922 @end table
2923
2924 @command{head} は、互換性を考慮して、@option{-[@var{num}][bkm][cqv]}
2925 というオプション指定の古い書式もサポートしている。
2926 ただし、この書式が認識されるのは、最初のオプションとして指定されたときだけである。
2927 @var{num} は 10 進数であり、@option{-c} オプションの場合と同様、
2928 サイズを示す文字 (@samp{b}, @samp{k}, @samp{m}) を後ろに続けてもよく、
2929 また、行数であることを明示する @samp{l} や、ほかのオプション文字
2930 (@samp{cqv}) を続けることもできる。標準的なホストで使うことを意図したスクリプトでは、
2931 古い書式ではなく、@option{-c @var{num}} や @option{-n @var{num}} を使用するべきである。
2932 そのスクリプトが、古い書式にしか対応していないホストでも動作する必要がある場合は、
2933 @command{head} を使わないで済ました方が、たいていの場合簡明である。
2934 たとえば、@samp{head -5} の代わりに、@samp{sed 5q} を使用するわけだ。
2935
2936 @exitstatus
2937
2938
2939 @node tail invocation
2940 @section @command{tail}: ファイルの末尾部分を出力する
2941
2942 @pindex tail
2943 @cindex last part of files, outputting
2944
2945 @command{tail} は、各 @var{file} の末尾部分 (デフォルトでは 10 行) を表示する。
2946 ファイルが指定されていない場合や、@var{file} として
2947 @samp{-} が指定されている場合は、標準入力から読み込む。
2948
2949 書式:
2950
2951 @example
2952 tail [@var{option}]@dots{} [@var{file}]@dots{}
2953 @end example
2954
2955 指定された @var{file} が 2 個以上あると、@command{tail} は、
2956 各 @var{file} の出力の前に、以下のような 1 行からなるヘッダを出力する。
2957
2958 @example
2959 ==> @var{file name} <==
2960 @end example
2961
2962 tail の出力をさらに処理したい場合は、ファイルヘッダを行頭の見出しに変更すると便利かもしれない。
2963 こんなふうにすればよい。
2964
2965 @example
2966 tail @dots{} |
2967 awk '
2968   /^==> .* <==$/ @{prefix=substr($0,5,length-8)":"; next@}
2969   @{print prefix$0@}
2970 ' | @dots{}
2971 @end example
2972
2973 @cindex BSD @command{tail}
2974 GNU の @command{tail} は、出力するデータの量に制限がない (ほかの系統の
2975 @command{tail} には、制限があるものもある)。また、GNU の @command{tail} には、
2976 @option{-r} オプション (逆順で表示する) が存在しない。ファイルを逆順にするのは、
2977 ファイルの末端部分を表示するのとは、全く別の仕事だからだ。BSD の @command{tail}
2978 には、@option{-r} があるが、バッファの大きさまでのファイルしか逆順にできず、
2979 それは通常 32 KiB である。ファイルを逆順にするなら、GNU の @command{tac}
2980 コマンドの方が、信頼性という点でも、用途の広さという点でも優れている。
2981
2982 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
2983
2984 @table @samp
2985
2986 @item -c [+]@var{num}
2987 @itemx --bytes=[+]@var{num}
2988 @opindex -c
2989 @opindex --bytes
2990 ファイルの末尾数行を出力する代わりに、末尾の @var{num} バイトを出力する。
2991 ただし、@var{num} の前に @samp{+} が付いている場合は、各ファイルの末端から
2992 @var{num} バイト目ではなく、先頭から @var{num} バイト目を始点として出力を開始する。
2993 @multiplierSuffixes{num}
2994
2995 @item -f
2996 @itemx --follow[=@var{how}]
2997 @opindex -f
2998 @opindex --follow
2999 @cindex growing files
3000 @vindex name @r{follow option}
3001 @vindex descriptor @r{follow option}
3002 ファイルの末端まで達しても、さらに文字を読み込もうとして、無限ループする。
3003 たぶん、ファイルのサイズが増加し続けているからである。
3004 複数のファイルが指定されている場合、@command{tail} は、
3005 異なるファイルから出力があるたびに、その出力がどのファイルから来たものかわかるように、
3006 ヘッダを表示する。
3007
3008 このオプションを使ってファイルの追跡をするとき、二つの方法が選択できるが、
3009 その違いが現れるのは、追いかけているファイルが消去されたり、
3010 名前を変更されたりしたときだけである。もし、増大しつつあるファイルが削除されたあとでも、
3011 そのファイルの末尾の追跡を続行したいならば、@option{--follow=descriptor}
3012 を使用すればよい。これがデフォルトの動作だが、ログファイルを追跡している際には、
3013 役に立たない。ログファイルは、ローテートされる
3014 (すなわち、消去、または名前を変更されてから、改めてオープンされる)
3015 可能性があるからだ。そうした場合には、@option{--follow=name} を使用すれば、
3016 指定した名前のファイルを追跡することができる。おそらく追跡には、
3017 定期的にその名前のファイルをオープンし直すことで、
3018 何らかのプログラムによってファイルが消去されてから再作成されなかったかどうかを確かめるといった方法が、
3019 使われることだろう。なお、inotify をベースにした実装では、そうしたケースを処理するのに、
3020 ファイルを定期的に再オープンする必要がないことを付記しておく。
3021
3022 どちらの方法を使った場合でも、追跡中のファイルのサイズが小さくなっていることがわかると、
3023 @command{tail} は、ファイルが短縮されたというメッセージを出し、
3024 ファイルの末端と改めて判断したところからファイルの追尾を再開する。
3025
3026 ファイルが消去されたときの @command{tail} の動作は、追いかけているものが、
3027 名前か (@option{--follow=name})、ディスクリプタか (@option{--follow=descriptor})
3028 によって異なっている。名前による追跡の場合、
3029 tail はファイルが消去されたことを検出できるので、その旨メッセージを表示する。
3030 このとき、@option{--retry} も指定されていると、
3031 同じ名前のファイルが再作成されているかどうか、定期的な検査を継続して行う。
3032 ディスクリプタを追跡する場合は、ファイルが削除されたり、名前の変更が行われたりしても、
3033 tail はそれを検出しないので、メッセージを出さない。そうしたファイルが、
3034 もはや元の名前ではアクセスできなくなっていても、なお増大し続けているということもありえる。
3035
3036 @samp{descriptor} や @samp{name} というオプションの値は、
3037 長い方のオプションの形式によってのみ指定できる。@option{-f} では指定できない。
3038
3039 オペランド @var{file} が全く指定されていず、標準入力が
3040 FIFO やパイプである場合は、@option{-f} オプションは無視される。また、標準入力が
3041 FIFO やパイプである場合は、@samp{-} という形で指定されたオペランドがあっても、
3042 @option{-f} はそれに対して効果を持たない。
3043
3044 カーネルが inotify をサポートしていると、出力はファイルの変更が引き金になるので、一般に反応がキビキビしている。
3045 それに対して、カーネルが inotify をサポートしていないと、@command{tail}
3046 はチェックごとに 1 秒間スリープするので
3047 (このデフォルトを変更するには、@option{--sleep-interval=@var{n}} を使用する)、
3048 出力がやや遅めに感じられたり、断続的に感じられたりするかもしれない。inotify
3049 のサポートなしで tail を使用する場合、反応を向上させるには、sleep
3050 する間隔を 1 秒以下に設定すればよい。たとえば、次のようなエイリアスを作成するわけだ。
3051
3052 @example
3053 alias tail='tail -s.1'
3054 @end example
3055
3056 @item -F
3057 @opindex -F
3058 このオプションは @option{--follow=name --retry} と同じである。すなわち、
3059 ファイルが消去された場合、tail はその名前のファイルをオープンし直そうとする。
3060 それに失敗しても、ファイルに再びアクセスできるようになるまで、再オープンを試み続ける。
3061
3062 @item --max-unchanged-stats=@var{n}
3063 @opindex --max-unchanged-stats
3064 名前によってファイルの追尾を行っているとき、連続して @var{n} 回
3065 (デフォルトは n=@value{DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS})
3066 追尾動作を実行しても、その間にファイルに変更がなかった場合に、ファイルを
3067 @code{open} し、@code{fstat} して、
3068 そのファイル名と結びついている「デバイス番号/inode 番号」の組み合わせが、
3069 今でも前と同じままかどうかを確認する。ローテートを行うログファイルを追跡している場合、
3070 この @var{n} は、tail がローテートする前に最後の行を表示してから、
3071 新しいログファイルに溜まっている行を表示するまでの秒数に、ほぼ等しい。
3072 このオプションに意味があるのは、ポーリングを使用して
3073 (すなわち、inotify を使わずに)、名前による追跡を行うときだけである。
3074
3075 @item -n [+]@var{num}
3076 @itemx --lines=[+]@var{num}
3077 @opindex -n
3078 @opindex --lines
3079 末尾の  @var{num} 行を出力する。ただし、@var{num} の前に @samp{+}
3080 が付いている場合は、各ファイルの末端から @var{num} 行目ではなく、
3081 先頭から @var{num} 行目を始点として出力を開始する。サイズの乗数接尾辞は、@option{-c} の場合と同様である。
3082
3083 @item --pid=@var{pid}
3084 @opindex --pid
3085 追跡が名前によって行われていようと、ディスクリプタによって行われていようと、
3086 @var{file} 引数で指定されたすべてのファイルに書き込みを行うプログラムがたった一つならば、
3087 そのプログラムのプロセス番号 @var{pid} を指定することができる。
3088 そうしておくと、そのプロセスが終了する直後に tail も終了するようになるのだ。
3089 これがきちんと動作するのは、書き込みプログラムと tail のプロセスが、
3090 同じマシンで動いているときだけである。たとえば、プログラムをビルドするとき、
3091 その出力をファイルに保存しながら、ファイルが増大して行くのを見守りたいならば、
3092 下記のように @command{make} と @command{tail} を実行すればよい。
3093 そうすれば、ビルドが完了したとき、tail のプロセスも終了する。
3094 このオプションを使わない場合は、@code{tail -f} のプロセスを自分で止めなければならないだろう。
3095
3096 @example
3097 $ make >& makerr & tail --pid=$! -f makerr
3098 @end example
3099
3100 使用されていない @var{pid} を指定した場合や、
3101 tail が対象とするファイルに書き込んでいるプロセスとは別のプロセスの
3102 @var{pid} を指定した場合は、
3103 @command{tail} は、@var{file} の増大が止まるずっと前に終了してしまうかもしれないし、
3104 実際に書き込んでいるプログラムが終了してしまっても、当分の間終了しないかもしれない。
3105 気をつけてほしいが、システムによっては、@option{--pid} が使えないことがある。
3106 その場合、@command{tail} は警告メッセージを出すはずだ。
3107
3108 @item -q
3109 @itemx --quiet
3110 @itemx --silent
3111 @opindex -q
3112 @opindex --quiet
3113 @opindex --silent
3114 ファイル名を示すヘッダを出力しない。
3115
3116 @item --retry
3117 @opindex --retry
3118 指定された名前のファイルを繰り返し何度でもオープンしようとする。
3119 このオプションが役に立つのは、ファイルの末尾を追跡している場合がほとんどである
3120 (それ以外の場合は、警告メッセージを出す)。
3121
3122 ファイル・ディスクリプタによって追跡している場合は (すなわち、
3123 @option{--follow=descriptor} の場合は)、
3124 このオプションは、最初にファイルをオープンするときの動作にしか影響しない。
3125 ひとたびオープンに成功してしまえば、@command{tail} は、ファイル名ではなく、
3126 ファイル・ディスクリプタを追跡することになるからである。
3127
3128 ファイル名によって追跡している場合は (すなわち、@option{--follow=name}
3129 の場合は)、@command{tail} は、ユーザによって中断 (kill) されるまで、
3130 いつまでも繰り返しその名前のファイルを再オープンしようとする。
3131
3132 このオプションを付けないと、 @command{tail} は、ファイルが存在しなくなったり、
3133 何かほかの理由でファイルにアクセスできなくなったりすることがあっても、
3134 その旨報告するだけで、以後再検査を行うことがない。
3135
3136 @item -s @var{number}
3137 @itemx --sleep-interval=@var{number}
3138 @opindex -s
3139 @opindex --sleep-interval
3140 何秒間隔で追尾・表示動作を行うかを変更する (デフォルトは 1.0 秒間隔)。
3141 @command{tail} は動作の繰り返しごとに、指定されたすべてのファイルについて、
3142 サイズが変わっていないかどうかのチェックを行う。@command{tail}
3143 の伝統的な実装では、@var{number} は整数でなければならなかったが、GNU の
3144 @command{tail} では、任意の浮動小数点数を指定することが可能になっている。
3145 @xref{Floating point}.  @command{tail} が inotify を使用していると、
3146 このポーリング関係の (polling-related) オプションは通常無視される。
3147 ただし、@option{--pid=@var{p}} も一緒に指定されている場合は別で、その場合は、
3148 プロセス @var{p} が生きているかどうかを、@command{tail} が少なくとも
3149 @var{number} 間隔でチェックすることになる。
3150
3151 @item -v
3152 @itemx --verbose
3153 @opindex -v
3154 @opindex --verbose
3155 ファイル名を示すヘッダを常に出力する。
3156
3157 @optZeroTerminated
3158
3159 @end table
3160
3161 @command{tail} は互換性のために、@samp{tail -[@var{num}][bcl][f] [@var{file}]}
3162 という古い用法もサポートしているが、それが認識されるのは、
3163 上で説明した用法と衝突しないときだけである。この旧来の書式では、
3164 オプションはただ 1 個しか指定できず、ファイルも 1 個までしか指定できない。
3165 オプション中の @var{num} は、省略可能な 10 進数であり、サイズを表す文字
3166 (@samp{b}, @samp{c}, @samp{l}) を後ろに続けて、1 ブロック当たり
3167 512 バイトのブロック数か、バイト数か、行数かを示すことができる。
3168 さらに、@option{-f} と同じ意味を持つ、@samp{f} を続けてもよい。
3169
3170 @vindex _POSIX2_VERSION
3171 POSIX 1003.1-2001 に準拠していないシステムでは、
3172 旧来のオプション書式において、先頭の @samp{-} を @option{-c}
3173 や @option{-n} オプションの場合と同じ意味で @samp{+} に置き換えることができる。
3174 また、POSIX 1003.1-2001 以前の旧式なシステムでは、
3175 旧来の用法と標準的な用法が衝突する場合には、旧来の用法が優先される。
3176 なお、そうした動作は、環境変数 @env{_POSIX2_VERSION} によってコントロールできる。
3177 (@pxref{Standards conformance})。
3178
3179 標準的なホストで使用するためのスクリプトでは、旧来の書式を使わずに、
3180 @option{-c @var{num}[b]}, @option{-n @var{num}} オプションや @option{-f}
3181 オプションの方を使うべきである。
3182 そのスクリプトが、旧来の書式にしか対応していないホストでも動作しなければならない場合でも、
3183 問題を起こしかねない表現を避けるように書き直すことが、たいていはできるものだ。
3184 たとえば、@samp{tail -1} の代わりに、@samp{sed -n '$p'} を使うといった具合である。
3185 それさえ不可能な場合は、どちらの書式を使うべきかを判断するために、
3186 @samp{if tail -c +1 </dev/null >/dev/null 2>&1; then @dots{}}
3187 といった条件文をスクリプトで使用すればよい。
3188
3189 作成するスクリプトが標準的な動作を想定している場合でも、
3190 POSIX のバージョンによって動作に違いのある用法には、気を付けた方がよい。
3191 たとえば、@samp{tail - main.c} は避けるべきである。@samp{tail main.c}
3192 と解釈することも、@samp{tail -- - main.c} と解釈することもできるからだ。
3193 @samp{tail -c 4} も避けるべきである。@samp{tail -c4} を意味するかもしれないし、
3194 @samp{tail -c 10 4} を意味するかもしれない。@samp{tail +4} も使わない方がよい。
3195 @samp{tail ./+4} の意味にも、@samp{tail -n +4} の意味にも取れるからである。
3196
3197 @exitstatus
3198
3199
3200 @node split invocation
3201 @section @command{split}: ファイルを分割する。
3202
3203 @pindex split
3204 @cindex splitting a file into pieces
3205 @cindex pieces, splitting a file into
3206
3207 @command{split} は、入力ファイル @var{input} を分割して複数の出力ファイルを作成する。
3208 各出力ファイルには、@var{input} の断片が、連続した形で、
3209 あるいは 1 行づつ順番に分配された形で含まれることになる (訳注: 前者は単純な分割であり、
3210 後者は後述の「ラウンド・ロビン方式」である。@option{-n} オプションを参照)。
3211 @var{input} が指定されていない場合や、@samp{-} である場合には、標準入力から読み込む。
3212
3213 書式:
3214
3215 @example
3216 split [@var{option}] [@var{input} [@var{prefix}]]
3217 @end example
3218
3219 デフォルトでは、@command{split} は @var{input} を 1000 行づつ各出力ファイルに書き込む
3220 (最後の断片については、何行であれ残っている行を書き込む)。
3221
3222 @cindex output file name prefix
3223 出力ファイルの名前は、上記書式の @var{prefix} (デフォルトでは @samp{x})
3224 に複数の文字 (デフォルトでは、@samp{aa}, @samp{ab}, @dots{})
3225 を続けたものであり、各出力ファイルをファイル名による伝統的なソート順で結合すると、
3226 元の入力ファイルが再構成されるようになっている
3227 (ただし、@option{-nr/@var{n}} オプションを指定した場合は除く)。
3228 デフォルトでは、split はまず、作成するファイルに 2 文字からなる接尾辞
3229 (訳注: suffix、すなわち上記の @samp{aa}, @samp{ab} など) を生成して付け、
3230 その接尾辞の 1 番目の文字がアルファベットの最後に達した時点で、接尾辞を
3231 2 文字づつ増やして行く (@samp{yz} の次は @samp{zaaa}, @samp{zaab}, @dots{} という具合)。
3232 こうした命名法を使えば、出力ファイルがいくつあっても対応できるし、また
3233 @option{--additional-suffix} オプションを付けたときでも、
3234 出力ファイルが上で述べたような順に並ぶことになるわけだ。
3235 @option{-a} オプションが指定されている場合に、出力ファイルの名前が種切れになってしまうと、
3236 @command{split} はエラーメッセージを出すが、作成した出力ファイルを消去することはない。
3237
3238 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
3239
3240 @table @samp
3241
3242 @item -l @var{lines}
3243 @itemx --lines=@var{lines}
3244 @opindex -l
3245 @opindex --lines
3246 @var{input} から @var{lines} 行づつ各出力ファイルに書き込む。
3247 @option{--separator} オプションが指定されている場合は、@var{lines}
3248 はレコード数の指定になる。
3249
3250 互換性を考慮して、@command{split} は @option{-@var{lines}}
3251 という古いオプションの書式もサポートしている。新規にスクリプトを書くなら、
3252 @option{-l @var{lines}} の方を使うべきである。
3253
3254 @item -b @var{size}
3255 @itemx --bytes=@var{size}
3256 @opindex -b
3257 @opindex --bytes
3258 @var{input} から @var{size} バイトづつ各出力ファイルに書き込む。
3259 @multiplierSuffixes{size}
3260
3261 @item -C @var{size}
3262 @itemx --line-bytes=@var{size}
3263 @opindex -C
3264 @opindex --line-bytes
3265 各出力ファイルに、ファイルサイズが @var{size} バイトを超過しない範囲で、
3266 @var{input} の完全な行をできるだけ多く書き込む。
3267 一つの行やレコードの長さが @var{size} バイトを越える場合は、複数のファイルに分割される。
3268 @var{size} の書式は、@option{--bytes} オプションの場合と同じである。
3269 @option{--separator} オプションが指定されている場合は、
3270 できるだけ多くの行ではなく、できるだけ多くのレコードを書き込むことになる。
3271
3272 @item --filter=@var{command}
3273 @opindex --filter
3274 このオプションを使用すると、各出力は、そのままファイルに書き出されるのではなく、
3275 パイプを通して一つづつ、指定されたシェルコマンド @var{command}
3276 に引き渡される。@var{command} 中では、環境変数 $FILE を使用するべきであり、
3277 この変数には、シェルコマンドを実行するごとに、異なる出力ファイル名が代入される。
3278 たとえば、1TiB の圧縮ファイルがあるとしよう。伸長したら、サイズが大きすぎて、
3279 ディスクに納まり切らない。しかし、それを分割して、もっと扱いやすいサイズの、
3280 それぞれ圧縮したファイルを作らねばならない。そうした課題を解決するには、
3281 次のようなコマンドを実行すればよいだろう。
3282
3283 @example
3284 xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-
3285 @end example
3286
3287 圧縮率が 10:1 だとすると、上のコマンドは 20GiB のファイルを
3288 50 個ほど生成することになるだろう。ファイルの名前は、@file{big-aa.xz},
3289 @file{big-ab.xz}, @file{big-ac.xz} などになる。
3290
3291 @item -n @var{chunks}
3292 @itemx --number=@var{chunks}
3293 @opindex -n
3294 @opindex --number
3295
3296 @var{input} を @var{chunks} 個の出力ファイルに分割する。
3297 @var{chunks} の位置には以下のものが指定できる。
3298
3299 @example
3300 @var{n}      @var{input} の現在のサイズに基づいて @var{n} 個のファイルを生成する。
3301 @var{k}/@var{n}    @var{n} 個中の @var{k} 番目のみを標準出力へ出力する。
3302 l/@var{n}    @var{n} 個のファイルを生成する。行やレコードの途中で分割しない。
3303 l/@var{k}/@var{n}  同上。ただし、@var{n} 個中の @var{k} 番目のみを標準出力に出力する。
3304 r/@var{n}    @samp{l} に似ている。ただし、分配はラウンド・ロビン方式で行う。
3305        (訳注: トランプの親がカードを 1 枚づつ子に配るように、
3306                入力から 1 行 (1 レコード) づつ各出力ファイルに
3307                分配して行く。)
3308 r/@var{k}/@var{n}  同上。ただし、@var{n} 個中の @var{k} 番目のみを標準出力に出力する。
3309 @end example
3310
3311 @var{input} を  @var{n} 個の「部分 (chunk)」に分けたときに出た余りのバイトは、
3312 最後の「部分」に割り振られる。最初に行われる分割のための計算の後で追加されるバイトがあっても、
3313 それは捨て去られる (@samp{r} モードを使用している場合を除く)。
3314
3315 @var{input} の行数が @var{n} 行に足りなかったり、@var{input} が短縮された場合でも、
3316 @var{n} 個のファイルすべてが作成される。
3317
3318 @samp{l} モードについて言うと、「部分」の大きさは、「@var{input} サイズ / @var{n}」前後になる。
3319 @var{input} は、まず @var{n} 個の同一サイズの区画 (partition) に分割され、
3320 余りがあれば、それは最後の区画に割り当てられる。
3321 ある行の先頭が、ある区画の内側にある場合、その行は行末まで、その区画に対応するファイルに書き込まれる。
3322 行やレコードは、たとえ後続する区画にまではみ出していても分割されないので、
3323 書き出されるファイルは、区画のサイズより大きくなることもあれば、小さくなることもある。
3324 行やレコードが後続する区画をすっぽり覆ってしまうほど長い場合には、空っぽのファイルができることさえある。
3325
3326 @samp{r} モードでは、@var{input} のサイズは問題にならない。だから、入力は、
3327 たとえば、パイプからであっても構わない。
3328
3329 @item -a @var{length}
3330 @itemx --suffix-length=@var{length}
3331 @opindex -a
3332 @opindex --suffix-length
3333 使用する接尾辞の長さを @var{length} 文字にする。@var{length} に
3334 0 を指定すると、@option{-a} オプションを (すでに指定していた場合でも)
3335 全く指定しなかったのと同じことになり、従って、デフォルトの動作が有効になる。
3336 すなわち、接尾辞は、2 文字から始まり、@option{-n} や
3337 @option{--numeric-suffixes=@var{from}} オプションが指定されていないかぎり、
3338 必要になるごとに、2 文字づつ自動的に増えて行く。
3339
3340 @item -d
3341 @itemx --numeric-suffixes[=@var{from}]
3342 @opindex -d
3343 @opindex --numeric-suffixes
3344 接尾辞にアルファベットの小文字ではなく、数字を使用する。
3345 数字の接尾辞は、 @var{from} が指定されていれば @var{from} から、
3346 指定されていなければ 0 から数を数えて行く。
3347
3348 @var{from} を指定できるのは、長い形式のオプションを使ったときだけである。
3349 @var{from} を指定すると、@command{split} を一回だけ実行する場合に最初の接尾辞を決めたり、
3350 それぞれ別々にスプリットする入力に対して相互の接尾辞間をどれくらい離すかを決めたりすることができるが、
3351 上で述べた接尾辞の長さを自動的に増やしていく機能は無効になる。
3352 そこで、ユーザとしては、@samp{99} を越える数字を接尾辞として使えるようにするため、
3353 @option{-a} オプションも併せて指定したくなるかもしれない。
3354 なお、@option{--number} オプションが指定され、しかも、生成されるファイルの数より
3355 @var{from} が小さい場合は、一回かぎりの実行と見なされ、接尾辞に最小限必要な長さが、自動的に割り出される。
3356
3357 (訳注: 上記の「なお」以下で言っているのは、@samp{split -d -n100 some.data}
3358 などとすると、x00 から x99 までのファイルが作られるが、@samp{split --numeric-suffixes=1 -n100
3359 some.data}
3360 なら、x001 から x100 まで、3 桁の接尾辞を持つファイルが作られるということらしい。
3361 しかし、coreutils 8.26 では、@samp{split -d -n200 some.data}
3362 や @samp{split --numeric-suffixes=10 -n100 some.data} は、
3363 "output file suffixes exhausted" というエラーになる。
3364 そして、@samp{split -d -n201 some.data} や @samp{split --numeric-suffixes=10
3365 -n101 some.data}
3366 なら、実行に成功するのである。よくわからない仕様だと思う。@option{--suffix-length}
3367 を使って、自分で接尾辞の長さを決めた方が、間違いがない。)
3368
3369 @item --additional-suffix=@var{suffix}
3370 @opindex --additional-suffix
3371 出力ファイル名の末尾に @var{suffix} をさらに追加する。
3372 @var{suffix} 中にスラッシュが含まれていてはならない。
3373
3374 @item -e
3375 @itemx --elide-empty-files
3376 @opindex -e
3377 @opindex --elide-empty-files
3378 サイズ 0 の出力ファイルができないようにする。そうしたものが生成されることがあるのは、
3379 @option{--number} を使ったときである。入力ファイルが (短縮されたりして)
3380 指定された数の出力ファイルを作るには分量が足りない場合や、
3381 1 行が長すぎて、後続する「部分」をすっぽり飲み込んでしまっている場合などがそれに当たる。
3382 このオプションが指定されているときでも、出力ファイルの連続番号が、
3383 順番に増えていくことに変わりはない。
3384
3385 @item -t @var{separator}
3386 @itemx --separator=@var{separator}
3387 @opindex -t
3388 @opindex --separator
3389 @cindex line separator character
3390 @cindex record separator character
3391 レコード・セパレータとしてデフォルトの改行文字 (ASCII LF) の代わりに、
3392 文字 @var{separator} を使用する。ASCII NUL をセパレータに指定するには、
3393 二文字からなる文字列 @samp{\0} を使用すればよい。@samp{split -t '\0'} のようにだ。
3394
3395 @item -u
3396 @itemx --unbuffered
3397 @opindex -u
3398 @opindex --unbuffered
3399 @option{--number r/@dots{}} モードにおいて入力を即座に出力する。
3400 このモードは、作業にかなり時間がかかるのだ。
3401
3402 @item --verbose
3403 @opindex --verbose
3404 各出力ファイルをオープンする直前に、診断メッセージを表示する。
3405
3406 @end table
3407
3408 @exitstatus
3409
3410 @option{--number} (@option{-n}) の動作を理解していただくために、
3411 用例をいくつか挙げてみる。
3412
3413 デフォルトでは、1 行が 2 行以上に分割されることがあるのに、注目していただきたい。
3414
3415 @example
3416 $ seq -w 6 10 > k; split -n3 k; head xa?
3417 ==> xaa <==
3418 06
3419 07
3420 ==> xab <==
3421
3422 08
3423 0
3424 ==> xac <==
3425 9
3426 10
3427 @end example
3428
3429 "l/" 修飾子を使用して、行の途中で分割しないようにする。
3430
3431 @example
3432 $ seq -w 6 10 > k; split -nl/3 k; head xa?
3433 ==> xaa <==
3434 06
3435 07
3436
3437 ==> xab <==
3438 08
3439 09
3440
3441 ==> xac <==
3442 10
3443 @end example
3444
3445 "r/" 修飾子を使用して、ラウンド・ロビン方式で分配する。
3446
3447 @example
3448 $ seq -w 6 10 > k; split -nr/3 k; head xa?
3449 ==> xaa <==
3450 06
3451 09
3452
3453 ==> xab <==
3454 07
3455 10
3456
3457 ==> xac <==
3458 08
3459 @end example
3460
3461 K 番目の「部分」だけ取り出すこともできる。次の例は、33 の「部分」に分け、
3462 そのうちの  7 番目だけを取り出して、表示している。
3463
3464 @example
3465 $ seq 100 > k; split -nl/7/33 k
3466 20
3467 21
3468 22
3469 @end example
3470
3471
3472 @node csplit invocation
3473 @section @command{csplit}: ファイルを内容を目印にして分割する。
3474
3475 @pindex csplit
3476 @cindex context splitting
3477 @cindex splitting a file into pieces by context
3478
3479 @command{csplit} は、入力ファイル @var{input} を分割して 0 個以上の出力ファイルを生成する。
3480 @var{input} が @samp{-} である場合は、標準入力から読み込む。
3481
3482 書式:
3483
3484 @example
3485 csplit [@var{option}]@dots{} @var{input} @var{pattern}@dots{}
3486 @end example
3487
3488 出力ファイルの中身がどうなるかは、以下で詳しく述べるように、引数
3489 @var{pattern} によって決まってくる。引数 @var{pattern} が、
3490 入力ファイル中に存在しない行を指している場合は、エラーになる
3491 (たとえば、入力の残りの部分に、指定された正規表現にマッチする行がもう存在しない場合)。
3492 すべてのパターン・マッチが終わったとき、残っている入力があれば、
3493 最後の出力ファイルに書き出される。
3494
3495 デフォルトでは、@command{csplit} は、出力ファイルを生成した後で、
3496 各出力ファイルに書き込んだバイト数を表示する。
3497
3498 パターン引数 @var{pattern} には、以下のタイプがある。
3499
3500 @table @samp
3501
3502 @item @var{n}
3503 入力の最初から @var{n} 行目の直前までを含む (つまり、@var{n-1} 行目までの)
3504 出力ファイルを作成する (@var{n} は正の整数)。繰り返し回数の指定が後に続く場合は、
3505 繰り返しごとに、入力ファイルの次の @var{n} 行分を含む出力ファイルを作成していく。
3506 (訳注: パターンが @var{N} の場合は、あと何回繰り返すかを正確かつ具体的に指定しなければならない。
3507 すなわち、回数が多かったり、@{*@} を指定すると、@option{-k} も指定しないかぎり、
3508 エラーになり、出力ファイルが作成されない。)
3509
3510 @item /@var{regexp}/[@var{offset}]
3511 現在行から、入力ファイル中の次に @var{regexp} にマッチする行の直前までを内容とする
3512 (すなわち、マッチする行は含まない) 出力ファイルを作成する。
3513 整数の @var{offset} を指定してもよい。指定した場合は、マッチする行にプラス/マイナス
3514 @var{offset} した行の直前までの入力が (つまり、その行は含まない)、
3515 出力ファイルに書き込まれ、書き込まれた次の行から入力の後続部分が始まることになる。
3516
3517 @item %@var{regexp}%[@var{offset}]
3518 上記のタイプと同様だが、出力ファイルを作成しない点が異なる。
3519 要するに、入力ファイルのその部分は捨てられることになるわけだ。
3520
3521 @item @{@var{repeat-count}@}
3522 直前に行ったパターンの検索を、さらに @var{repeat-count} 回繰り返す。
3523 @var{repeat-count} には正の整数か、アステリスクを指定できる。後者は、
3524 入力がなくなるまで、必要なだけ何回でも繰り返すことを意味する。
3525 (訳注: @samp{csplit @var{input} '/@var{pattern_1}/' '@{3@}'
3526 '/@var{pattern_2}/' '@{*@}'}
3527 のように使用する。)
3528
3529 @end table
3530
3531 出力ファイルの名前は、接頭辞 (prefix、デフォルトでは @samp{xx}) に接尾辞
3532 (suffix) を続けたものになる。デフォルトの接尾辞は、二桁の 10 進数を @samp{00}
3533 から @samp{99} まで順番に増やして行ったものである。いかなる場合でも、
3534 出力ファイルを、ファイルの名前によってソートした順番で結合すると、
3535 元の入力ファイルが生成されるようになっている。
3536
3537 @command{csplit} のデフォルトでは、エラーになった場合や、ハングアップ、
3538 割り込み、中止、終了といったシグナルを受け取った場合には、
3539 それまでに作成した出力ファイルをすべて消去してから終了する。
3540
3541 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
3542
3543 @table @samp
3544
3545 @item -f @var{prefix}
3546 @itemx --prefix=@var{prefix}
3547 @opindex -f
3548 @opindex --prefix
3549 @cindex output file name prefix
3550 @var{prefix} を出力ファイル名の接頭辞として使用する。
3551
3552 @item -b @var{format}
3553 @itemx --suffix-format=@var{format}
3554 @opindex -b
3555 @opindex --suffix-format
3556 @cindex output file name suffix
3557 @var{format} を出力ファイル名の接尾辞として使用する。
3558 このオプションを指定する場合、接尾辞として指定する文字列には、@code{printf(3)}
3559 方式の変換指定が必ず一つは (それも、一つだけ) 含まれていなければならない。
3560 変換指定には、形式指定フラグ、フィールド幅、精度指定といった修飾子を付けてもよく、
3561 3 種の修飾子をすべて付けることもできる。
3562 フォーマット文字は、バイナリの符号なし整数である引数を、
3563 人間に読みやすい形式に変換するものでなければならない。フォーマット文字の
3564 @samp{d} と @samp{i} は、@samp{u} の別名であり、@samp{u}, @samp{o},
3565 @samp{x}, @samp{X} 変換が可能である。@var{format} の全体が
3566 (現在の出力ファイルが何番目かという情報とともに) @code{sprintf(3)}
3567 関数に引き渡され、出力ファイルの一つ一つに対して、ファイル名に使う接尾辞が順番に作られることになる。
3568 なお、このオプションを使用すると、@option{--digits} オプションは無視される。
3569
3570 @item -n @var{digits}
3571 @itemx --digits=@var{digits}
3572 @opindex -n
3573 @opindex --digits
3574 出力ファイル名に含まれる数字の桁数を、デフォルトの 2 桁から
3575 @var{digits} 桁にする。
3576
3577 @item -k
3578 @itemx --keep-files
3579 @opindex -k
3580 @opindex --keep-files
3581 エラーが起きても、出力ファイルを消去しない。
3582
3583 @item --suppress-matched
3584 @opindex --suppress-matched
3585 指定した @var{pattern} にマッチする行を出力しない。言い換えれば、
3586 境界になる行が、分割されたファイルの 2 番目以降の断片の先頭に現れないようにする。
3587 (訳注: @var{pattern} が正規表現の場合には、境界になる行がファイル中にたとえ 1 箇所しかなくても、
3588 その行の表示を抑制するには、@samp{csplit --suppress-matched @var{input}
3589 @var{pattern} '@{*@}'} などと、繰り返しの指定をする必要があるようだ。)
3590
3591 @item -z
3592 @itemx --elide-empty-files
3593 @opindex -z
3594 @opindex --elide-empty-files
3595 サイズ 0 の出力ファイルができないようにする (入力ファイルを各部分に区切る行が、
3596 どの部分においても最初の行になることを期待している場合に、
3597 このオプションを使わないと、一番目の出力ファイルがたいていサイズ 0 になる)。
3598 このオプションが指定されているときでも、出力ファイルの連続番号が 0 から始まって、
3599 順番に増えていくことに変わりはない。
3600
3601 @item -s
3602 @itemx -q
3603 @itemx --silent
3604 @itemx --quiet
3605 @opindex -s
3606 @opindex -q
3607 @opindex --silent
3608 @opindex --quiet
3609 出力ファイルのサイズを表示しない。
3610
3611 @end table
3612
3613 @exitstatus
3614
3615 用例を挙げてみよう。まず、練習用に空のディレクトリを作って、そこに移動する。
3616
3617 @example
3618 $ mkdir d && cd d
3619 @end example
3620
3621 次に、1 から 14 まで連続する数を、0 または 5 で終わる行で分割する。
3622
3623 @example
3624 $ seq 14 | csplit - '/[05]$/' '@{*@}'
3625 8
3626 10
3627 15
3628 @end example
3629
3630 ここで表示された各数字は、csplit が今作成した出力ファイルのサイズである。
3631 その出力ファイルの名前をリストする。
3632
3633 @example
3634 $ ls
3635 xx00  xx01  xx02
3636 @end example
3637
3638 @command{head} を使って、内容を見る。
3639
3640 @example
3641 $ head xx*
3642 ==> xx00 <==
3643 1
3644 2
3645 3
3646 4
3647
3648 ==> xx01 <==
3649 5
3650 6
3651 7
3652 8
3653 9
3654
3655 ==> xx02 <==
3656 10
3657 11
3658 12
3659 13
3660 14
3661 @end example
3662
3663 次の例では、入力を空行で分割している。
3664
3665 @example
3666 $ csplit --suppress-matched @var{input.txt} '/^$/' '@{*@}'
3667 @end example
3668
3669 @c
3670 @c TODO: "uniq" already supports "--group".
3671 @c        when it gets the "--key" option, uncomment this example.
3672 @c
3673 @c Example of splitting input file, based on the value of column 2:
3674 @c
3675 @c @example
3676 @c $ cat @var{input.txt} |
3677 @c       sort -k2,2 |
3678 @c       uniq --group -k2,2 |
3679 @c       csplit -m '/^$/' '@{*@}'
3680 @c @end example
3681
3682 @node Summarizing files
3683 @chapter ファイルの要約 (行数、単語数、チェックサム)
3684
3685 @cindex summarizing files
3686
3687 以下のコマンドは、ファイル内容全体を表現する若干の数字を生成する。
3688
3689 @menu
3690 * wc invocation::            行数、単語数、バイト数を表示する。
3691 * sum invocation::           チェックサムとブロック数を表示する。
3692 * cksum invocation::         CRC チェックサムとバイト数を表示する。
3693 * b2sum invocation::         BLAKE2 ダイジェストの表示、または検査をする。
3694 * md5sum invocation::        MD5 ダイジェストの表示、または検査をする。
3695 * sha1sum invocation::       SHA-1 ダイジェストの表示、または検査をする。
3696 * sha2 utilities::           SHA-2 ダイジェストの表示、または検査をする。
3697 @end menu
3698
3699
3700 @node wc invocation
3701 @section @command{wc}: 行数、単語数、バイト数を表示する
3702
3703 @pindex wc
3704 @cindex byte count
3705 @cindex character count
3706 @cindex word count
3707 @cindex line count
3708
3709 @command{wc} は、指定された各 @var{file} に含まれる、バイト数、文字数、ホワイトスペース
3710 (訳注: 空白、タブ、改行など) で区切られた単語数、改行数を算出する。
3711 @var{file} が指定されなかった場合や、@var{file} として @samp{-}
3712 が指定された場合は、標準入力を対象とする。
3713
3714 書式:
3715
3716 @example
3717 wc [@var{option}]@dots{} [@var{file}]@dots{}
3718 @end example
3719
3720 @cindex total counts
3721 @command{wc} は各ファイルにつき、一行の算出結果を出力する。
3722 引数としてファイルが指定されていれば、そのファイル名を数値の後ろに表示する。
3723 複数の @var{file} が指定されている場合は、最後の行で合計を表示し、
3724 ファイル名の列に、「合計 (@file{total})」と書き込む。表示される数値の順番は、
3725 改行数、単語数、文字数、バイト数、最長行の長さになる。
3726 各数値は、フィールドに右詰めで表示され、フィールド間には、少なくとも一個の空白が置かれる。
3727 そうすることで、複数の数字とファイル名が、たいていの場合きちんと整列するようになっているのだ。
3728 数値の入るフィールドの幅は、入力に応じて変化するので、
3729 一定のフィールド幅を当てにするべきではない。ただし、GNU の拡張として、
3730 表示される数値がただ 1 個だけの場合は、その数値の頭に空白を入れないことになっている。
3731
3732 デフォルトでは、@command{wc} は 3 個の数値を表示する。
3733 すなわち、改行数、単語数、バイト数である。
3734 オプションによって、特定の数値のみを表示するように指定することもできる。
3735 どんなオプションも、それ以前に指定されたオプションを取り消すことはない。従って、
3736
3737 @example
3738 wc --bytes --words
3739 @end example
3740
3741 @noindent
3742 上記のコマンドは、バイト数と単語数の両方を表示することになる。
3743
3744 @option{--max-line-length} を指定すると、@command{wc}
3745 はファイルごとの最長行の長さを表示する。さらに、複数のファイルが存在する場合は、
3746 (各最長行の合計ではなく) 最長行中の最長のものを表示する。ここで言う行の長さは、
3747 画面に表示される桁数のことである。表示桁数の計算は現在のロケールに従って行われ、
3748 タブ位置は 8 桁ごとに来るものとされる。
3749
3750 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
3751
3752 @table @samp
3753
3754 @item -c
3755 @itemx --bytes
3756 @opindex -c
3757 @opindex --bytes
3758 バイト数のみを表示する。
3759
3760 @item -m
3761 @itemx --chars
3762 @opindex -m
3763 @opindex --chars
3764 文字数のみを表示する。
3765
3766 @item -w
3767 @itemx --words
3768 @opindex -w
3769 @opindex --words
3770 単語数のみを表示する。
3771
3772 @item -l
3773 @itemx --lines
3774 @opindex -l
3775 @opindex --lines
3776 改行数のみを表示する。
3777
3778 @item -L
3779 @itemx --max-line-length
3780 @opindex -L
3781 @opindex --max-line-length
3782 最長表示行の長さのみを表示する。タブ位置は 8 桁ごとにあるものとする。
3783 ワイド・キャラクタについては、表示される幅を考慮する。非表示文字の幅は 0 とする。
3784
3785 @macro filesZeroFromOption{cmd,withTotalOption,subListOutput}
3786 @item --files0-from=@var{file}
3787 @opindex --files0-from=@var{file}
3788 @c This is commented out to avoid a texi2dvi failure.
3789 @c texi2dvi (GNU Texinfo 4.11) 1.104
3790 @c @cindex including files from @command{\cmd\}
3791 コマンドラインで名前を指定されたファイルの処理を行わない。その代わりに、
3792 ファイル @var{file} に名前が書き込まれているファイルの処理を行う。
3793 なお、@var{file} 中に書かれている各ファイル名は、ゼロバイト (ASCII NUL)
3794 で終端されていなければならない。このオプションは、ファイル名のリストが長すぎて、
3795 コマンドライン長の上限を超過してしまいそうなときに、
3796 \withTotalOption\便利である。そうした場合、@command{\cmd\} を
3797 @command{xargs} 経由で実行するのは、望ましくない。
3798 なぜなら、@command{xargs} はファイルのリストをいくつかの部分に分割して
3799 @command{\cmd\} に渡すので、@command{\cmd\} はリスト全体の\subListOutput\ではなく、
3800 部分リストごとの\subListOutput\を表示してしまうからである。
3801 ASCII NUL で終端されたファイル名のリストを得る方法の一つは、
3802 GNU @command{find} に @option{-print0} を付けて使うことである。
3803 @var{file} に @samp{-} を指定すれば、
3804 ASCII NUL で終端されたファイル名を標準入力から読み込むことができる。
3805 @end macro
3806 @filesZeroFromOption{wc,,合計}
3807
3808 たとえば、カレント・ディレクトリ以下にある、すべての @file{.c} ファイルや
3809 @file{.h} ファイルの内で、最長の行の長さを知るには、次のようにする。
3810
3811 @example
3812 find . -name '*.[ch]' -print0 |
3813   wc -L --files0-from=- | tail -n1
3814 @end example
3815
3816 @end table
3817
3818 @exitstatus
3819
3820
3821 @node sum invocation
3822 @section @command{sum}: チェックサムとブロック数を表示する
3823
3824 @pindex sum
3825 @cindex 16-bit checksum
3826 @cindex checksum, 16-bit
3827
3828 @command{sum} は、指定された各 @var{file} の 16-bit チェックサムを計算する。
3829 @var{file} が指定されなかった場合や、@var{file} として @samp{-} が指定された場合は、
3830 標準入力を対象とする。
3831
3832 書式:
3833
3834 @example
3835 sum [@var{option}]@dots{} [@var{file}]@dots{}
3836 @end example
3837
3838 @command{sum} は各 @var{file} のチェックサムを表示し、その後にファイルのブロック数
3839 (整数に切り上げたもの) を続ける。複数の @var{file} が指定されていると、
3840 ファイル名も表示される (デフォルト)。(@option{--sysv} オプションが指定されている場合は、
3841 引数に一つでもファイルがあれば、そのファイル名が表示される。)
3842
3843 デフォルトでは、GNU の @command{sum} は、BSD の @command{sum}
3844 と互換性のあるアルゴリズムを使って、チェックサムを計算し、
3845 1 ブロック 1024 バイトのブロック数でファイルサイズを表示する。
3846
3847 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
3848
3849 @table @samp
3850
3851 @item -r
3852 @opindex -r
3853 @cindex BSD @command{sum}
3854 デフォルトの (BSD と互換性のある) アルゴリズムを使用する。
3855 このオプションが存在しているのは、System V の @command{sum} との互換性のためである。
3856 前方に @option{-s} オプションも指定されているとき以外、このオプションは効果を持たない。
3857
3858 @item -s
3859 @itemx --sysv
3860 @opindex -s
3861 @opindex --sysv
3862 @cindex System V @command{sum}
3863 System V の @command{sum} のデフォルトと互換性のあるアルゴリズムを使って、
3864 チェックサムを計算し、1 ブロック 512 バイトのブロック数でファイルサイズを表示する。
3865
3866 @end table
3867
3868 @command{sum} は、互換性のために提供されている。新しいアプリケーションでは、
3869 @command{cksum} プログラム (次のセクションを参照) を使う方がよい。
3870
3871 @exitstatus
3872
3873
3874 @node cksum invocation
3875 @section @command{cksum}: CRC チェックサムとバイト数を表示する
3876
3877 @pindex cksum
3878 @cindex cyclic redundancy check
3879 @cindex CRC checksum
3880
3881 @command{cksum} は、指定された各 @var{file} の
3882 CRC (cyclic redundancy check、巡回冗長検査) チェックサムを計算する。
3883 @var{file} が指定されなかった場合や、@var{file} として @samp{-} が指定された場合は、
3884 標準入力を対象とする。
3885
3886 書式:
3887
3888 @example
3889 cksum [@var{option}]@dots{} [@var{file}]@dots{}
3890 @end example
3891
3892 @command{cksum} は、各ファイルの CRC チェックサムとバイト数を表示する。
3893 また、引数が指定されていない場合を除いて、ファイル名も表示する。
3894
3895 @command{cksum} は通常、信頼性の低い方法 (たとえば、netnews)
3896 によって転送されたファイルに損傷がないことを確認するために使用される。
3897 受信したファイルに対する @command{cksum} の出力を、転送元のファイルに対する
3898 @command{cksum} の出力 (たいてい、配布物中に入っている) と比較するわけである。
3899
3900 CRC のアルゴリズムは、POSIX 規格によって規定されており、BSD や
3901 System V の @command{sum} のアルゴリズム (直前のセクションを参照) と互換性がない。
3902 CRC アルゴリズムの方が信頼性が高い。
3903
3904 オプションは、@option{--help} と @option{--version} だけである。
3905 @xref{Common options}.
3906
3907 @exitstatus
3908
3909
3910 @node b2sum invocation
3911 @section @command{b2sum}: BLAKE2 ダイジェストの表示、または検査をする
3912
3913 @pindex b2sum
3914 @cindex BLAKE2
3915 @cindex 512-bit checksum
3916 @cindex checksum, 512-bit
3917 @cindex fingerprint, 512-bit
3918 @cindex message-digest, 512-bit
3919
3920 @command{b2sum} は、指定された各 @var{file} の 512-bit チェックサムを計算する。
3921 @command{md5sum} コマンドと同じ使用法とオプションがサポートされている。
3922 @xref{md5sum invocation}.  なお、@command{b2sum} では、以下のオプションも使用できる。
3923
3924 @table @samp
3925 @item -l
3926 @itemx --length
3927 @opindex -l
3928 @opindex --length
3929 @cindex BLAKE2 hash length
3930 ダイジェストのデフォルトの長さを変更 (短縮) する。
3931 長さは bit で指定する。従って 8 の倍数でなければならない。
3932 @option{--check} オプションが指定されていると、このオプションは無視される。
3933 チェックを行うときは、ダイジェストの長さは自動的に判断されるからである。
3934 @end table
3935
3936 @node md5sum invocation
3937 @section @command{md5sum}: MD5 ダイジェストの表示、または検査をする
3938
3939 @pindex md5sum
3940 @cindex MD5
3941 @cindex 128-bit checksum
3942 @cindex checksum, 128-bit
3943 @cindex fingerprint, 128-bit
3944 @cindex message-digest, 128-bit
3945
3946 @command{md5sum} は、指定された各 @var{file} の 128-bit チェックサムを計算する。
3947 チェックサムは、指紋 (@dfn{fingerprint}) とか、メッセージ・ダイジェスト
3948 (@dfn{message-digest}) とも呼ばれる (訳注: ハッシュ値と呼ばれることもある)。
3949
3950 注意: MD5 ダイジェストは、ファイルの不測の損傷を検知することに関して、
3951 単純な CRC (@command{cksum} コマンドで使用できる) よりも信頼性が高い。
3952 二つのファイルがたまたま同一の MD5 値を持っている確率は、ほとんどゼロだからである。
3953 だからと言って、悪意のある改竄に対して安全だと考えてはならない。
3954 ある特定の MD5 指紋を持つファイルを見つけ出すことは、現在のところ事実上不可能だと考えられているが、
3955 デジタル証明書などのファイルが署名に MD5 ダイジェストを使用しているとき、
3956 そうしたファイルに手を加えて、正当に見えるようする方法なら、周知のことだからである。
3957 もっと安全なハッシュ値が必要なら、SHA-2 の使用を考慮した方がよい。
3958 @xref{sha2 utilities}.
3959
3960 指定された @var{file} が @samp{-} の場合や、ファイルが全く指定されなかった場合は、
3961 @command{md5sum} は標準入力のチェックサムを計算する。また、@command{md5sum}
3962 は、ファイルとチェックサムの間に矛盾がないかどうかを判定することもできる。
3963
3964 書式:
3965
3966 @example
3967 md5sum [@var{option}]@dots{} [@var{file}]@dots{}
3968 @end example
3969
3970 各 @var{file} に対して @samp{md5sum} は、デフォルトでは
3971 MD5 チェックサム、一個の空白、入力モードがバイナリかテキストかを示すフラグ、
3972 それにファイル名を出力する。バイナリモードの指標は @samp{*} であり、
3973 テキストモードの指標は @samp{ } (空白) である。
3974 モードの区別に意味のあるシステムでは、バイナリモードがデフォルトだが、
3975 そうでないシステムではテキストモードがデフォルトである。
3976 @var{file} にバックスラッシュや改行文字が含まれている場合は、出力する行の先頭にバックスラッシュを付け、
3977 さらに、ファイル名中の問題のある各文字をバックスラッシュでエスケープする。
3978 そうすることで、わがままなファイル名があっても、出力に誤解の余地がないようにしているのだ。
3979 @var{file} が指定されていなかったり、@samp{-} という形で指定されている場合は、
3980 標準入力から読み込む。
3981
3982 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
3983
3984 @table @samp
3985
3986 @item -b
3987 @itemx --binary
3988 @opindex -b
3989 @opindex --binary
3990 @cindex binary input files
3991 各入力ファイルをバイナリとして扱う。すなわち、入力ファイルをバイナリモードで読み込み、
3992 出力に @samp{*} というフラグを付ける。このオプションは
3993 @option{--text} の反対である。バイナリファイルとテキストファイルを区別しない GNU
3994 のようなシステムでは、このオプションは入力モードがバイナリであるとのフラグを付けるだけであり、
3995 MD5 チェックサムの値には影響を及ぼさない。
3996 このオプションは、バイナリファイルとテキストファイルを区別する MS-DOS のようなシステムでは、
3997 デフォルトである。だだし、読み込みを標準入力から行い、その標準入力が端末であるときは除く。
3998
3999 @item -c
4000 @itemx --check
4001 各 @var{file} から (@var{file} が指定されなかった場合は、標準入力から)、
4002 ファイル名とチェックサム情報を読み込み
4003 (@var{file} をチェックサム計算の対象となるデータとして読み込むわけはない)、
4004 そのチェックサム情報が、それに対して名前を挙げられているファイルの内容に対応しているかどうかを報告する。
4005 このモードの @command{md5sum} に対する入力は、たいていの場合、事前に @samp{md5sum}
4006 を実行してチェックサムを生成したときの出力である。
4007 入力ファイルの書式は、三種類のものがサポートされている。それは、上記のデフォルトの出力書式、
4008 @option{--tag} オプションを付けたときの出力書式、
4009 それに BSD の逆順表示モード (reversed mode) の書式であり、最後のものは、デフォルトの書式に似ているが、
4010 バイナリとテキストモードを区別する文字を使用しないものである。
4011 @sp 1
4012 そうした入力ファイルの各行に対して、@command{md5sum} は、そこに名前を記載されたファイルを読み込み、
4013 その MD5 チェックサムを計算する。そして、算出したメッセージダイジェストが、
4014 そのファイル名と同じ行にあるチェックサムと一致しなかった場合は、
4015 そのファイルをテストに失敗したものとするのである。
4016 両者が一致した場合は、テストにパスしたことになる。
4017 デフォルトでは、有効な各行に対して標準出力にメッセージを 1 行づつ書き出し、
4018 指名されているファイルがテストにパスしたかどうかを報告する。
4019 また、すべてのチェックが完了したとき、テストに失敗したものが一つでもあれば、
4020 警告メッセージを標準エラーに出力する。
4021 この出力を抑制したければ、@option{--status} オプションを使用すればよい。
4022 リストされたファイルの中に、オープンできなかったり、読み込めなかったりするものがあった場合や、
4023 有効な行に書いてあるチェックサムが対応するファイルの実際の値と一致しなかった場合、
4024 それに、有効な行が全く存在しなかった場合は、@command{md5sum} は 0 以外のステータスで終了する。
4025 それ以外の場合は正常終了することになる。
4026
4027 @item --ignore-missing
4028 @opindex --ignore-missing
4029 @cindex verifying MD5 checksums
4030 このオプションが役に立つのは、チェックサムの照合をするときだけである。
4031 このオプションを指定すると、チェックサムを照合する際にファイルが存在しなくても、
4032 実行に失敗したり、ステータス情報を出したりしなくなる。
4033 ダウンロードしたファイルにチェックサムの長大なリストが付いているとき、
4034 一部のファイルの照合をするのに便利である。
4035
4036 @item --quiet
4037 @opindex --quiet
4038 @cindex verifying MD5 checksums
4039 このオプションが役に立つのは、チェックサムの照合をするときだけである。
4040 このオプションを指定すると、チェックサムを照合する際、
4041 検査に成功したファイルごとに 'OK' (訳注: 日本語では、「成功」または「完了」)
4042 のメッセージを出さなくなる。ただし、ファイルが照合に失敗した場合は、
4043 デフォルトと同じ 1 ファイル 1 行の形式で結果を報告する。
4044 チェックサムに何らかの不一致があった場合は、失敗を総括した警告メッセージも標準出力に表示する。
4045
4046 @item --status
4047 @opindex --status
4048 @cindex verifying MD5 checksums
4049 このオプションが役に立つのは、チェックサムの照合をするときだけである。
4050 このオプションを指定すると、チェックサムを照合する際、デフォルトの
4051 1 ファイルに付き 1 行の判定メッセージを出さなくなる。
4052 また、照合の失敗があっても、それを総括した警告メッセージを出力することもない。
4053 とは言え、ファイルのオープンや読み込みに失敗した場合は、
4054 やはりそれぞれの診断結果を標準エラーに表示する。
4055 リストされたすべてのファイルを読み込むことができ、しかも、すべてのファイルについて、
4056 対応する MD5 チェックサムと矛盾がなければ、正常終了する。
4057 それ以外の場合は、失敗があったことを示すステータスコードで終了する。
4058
4059 @item --tag
4060 @opindex --tag
4061 @cindex BSD output
4062 BSD スタイルのチェックサムを出力する。
4063 つまり、使用したチェックサムのアルゴリズムも表示するということだ。
4064 GNU の拡張として、問題を起こしかねない文字を含むファイル名は、上述したようにエスケープされ、
4065 さらに、行の先頭に エスケープの指標に使われたのと同じ
4066 @samp{\} 文字が付けられる。@option{--tag} オプションはバイナリ・モードを意味し、
4067 @option{--text} オプションと一緒に使うことは認められていない。
4068 そんなことをサポートしても、出力の書式をむやみに繁雑にするだけで、
4069 利益はほとんどないからである。
4070
4071 @item -t
4072 @itemx --text
4073 @opindex -t
4074 @opindex --text
4075 @cindex text input files
4076 各入力ファイルをテキストとして扱う。すなわち、入力ファイルをテキストモードで読み込み、
4077 出力に @samp{ } というフラグを付ける。このオプションは
4078 @option{--binary} の反対である。バイナリファイルとテクストファイルを区別しない GNU
4079 のようなシステムでは、このオプションがデフォルトである。
4080 ほかのシステムでも、読み込みを標準入力から行い、その標準入力が端末であるときは、デフォルトになる。
4081 ただし、@option{--tag} が使用されているときに、このモードがデフォルトになることはない。
4082
4083 @item -w
4084 @itemx --warn
4085 @opindex -w
4086 @opindex --warn
4087 @cindex verifying MD5 checksums
4088 チェックサムを照合する際、MD5 チェックサムを記載した行の書式に正しくないものがあると、
4089 その旨警告を発する。このオプションが役に立つのは、
4090 チェックされる入力中の、数行を除いたすべての行が、有効なときだけである。
4091
4092 @item --strict
4093 @opindex --strict
4094 @cindex verifying MD5 checksums
4095 チェックサムを照合する際、無効な入力行が 1 行でもあれば、
4096 そうした行のすべてについて警告を発したのち、0 以外の終了ステータスで終了する。
4097
4098 @end table
4099
4100 @exitstatus
4101
4102
4103 @node sha1sum invocation
4104 @section @command{sha1sum}: SHA-1 ダイジェストの表示、または検査をする
4105
4106 @pindex sha1sum
4107 @cindex SHA-1
4108 @cindex 160-bit checksum
4109 @cindex checksum, 160-bit
4110 @cindex fingerprint, 160-bit
4111 @cindex message-digest, 160-bit
4112
4113 @command{sha1sum} は、指定された各 @var{file} の 160-bit チェックサムを計算する。
4114 このコマンドの使用法やオプションは、@command{md5sum} と全く同じである。
4115 @xref{md5sum invocation}.
4116
4117 注意: SHA-1 ダイジェストは MD5 より安全であり、コリジョン
4118 (collision、衝突。別のファイルが同一の指紋を持つこと) が起きたという話を聞いたことはない。
4119 しかしながら、大量の --- と言っても非現実的なほどではない --- リソースがあれば、
4120 コリジョンを作り出せることがわかっている。この理由から、
4121 SHA-1 は、もっと安全な SHA-2 ハッシュ・アルゴリズムに徐々に移行すべきだと、一般に考えられている。
4122 @xref{sha2 utilities}.
4123
4124
4125 @node sha2 utilities
4126 @section sha2 utilities: SHA-2 ダイジェストの表示、または検査をする
4127
4128 @pindex sha224sum
4129 @pindex sha256sum
4130 @pindex sha384sum
4131 @pindex sha512sum
4132 @cindex SHA-2
4133 @cindex 224-bit checksum
4134 @cindex 256-bit checksum
4135 @cindex 384-bit checksum
4136 @cindex 512-bit checksum
4137 @cindex checksum, 224-bit
4138 @cindex checksum, 256-bit
4139 @cindex checksum, 384-bit
4140 @cindex checksum, 512-bit
4141 @cindex fingerprint, 224-bit
4142 @cindex fingerprint, 256-bit
4143 @cindex fingerprint, 384-bit
4144 @cindex fingerprint, 512-bit
4145 @cindex message-digest, 224-bit
4146 @cindex message-digest, 256-bit
4147 @cindex message-digest, 384-bit
4148 @cindex message-digest, 512-bit
4149
4150 コマンド @command{sha224sum}, @command{sha256sum}, @command{sha384sum},
4151 @command{sha512sum}
4152 は、一まとめにして SHA-2 ハッシュと呼ばれる様々な長さのチェックサムを計算する
4153 (それぞれ、224, 256, 384, 512 bits である)。
4154 こうしたコマンドの使用法とオプションは、@command{md5sum} や @command{sha1sum}
4155 と全く同じである。 @xref{md5sum invocation}.
4156
4157
4158 @node Operating on sorted files
4159 @chapter ソートしたファイルの操作
4160
4161 @cindex operating on sorted files
4162 @cindex sorted files, operations on
4163
4164 以下のコマンドは、ソートしたファイルを操作 (生成) する。
4165
4166 @menu
4167 * sort invocation::          テキストファイルを並べ替える。
4168 * shuf invocation::          テキストファイルをシャッフルする。
4169 * uniq invocation::          ファイルから重複を省く。
4170 * comm invocation::          ソート済みの二つのファイルを一行づつ比較する。
4171 * ptx invocation::           ファイル内容の permuted index を作成する。
4172 * tsort invocation::         トポロジカル・ソート。
4173 @end menu
4174
4175
4176 @node sort invocation
4177 @section @command{sort}: テキストファイルを並べ替える
4178
4179 @pindex sort
4180 @cindex sorting files
4181
4182 @command{sort} は、指定されたファイルから読み込んだすべての行に対して、ソート
4183 (sort、一定の基準に従った並べ替え)、マージ (merge、データの統合)、比較
4184 (compare) を行う。ファイルが一つも指定されなかった場合や、@var{file} として
4185 @samp{-} が指定された場合は、標準入力から読み込む。デフォルトでは、@command{sort}
4186 は結果を標準出力に書き出す。
4187
4188 書式:
4189
4190 @example
4191 sort [@var{option}]@dots{} [@var{file}]@dots{}
4192 @end example
4193
4194 @cindex sort stability
4195 @cindex sort's last-resort comparison
4196 多くのオプションが、@command{sort} が行を比較する方法に影響を及ぼす。
4197 そこで、結果が期待どおりでないときは、@option{--debug}
4198 オプションを使って、どうしてそうなったかを調べてみていただきたい。
4199 二つの行の比較は、次のように行われる。@command{sort} は、対になる各フィールドを
4200 (@option{--key} オプションを参照)、
4201 コマンドラインで指定された順番で、そのフィールドに結びついた順序関係のオプションに従いつつ比較し、
4202 相違が見つかるか、比較するフィールドがなくなるまでそれを続ける。
4203 キーとなるフィールドが指定されていない場合は、デフォルトのキーである行全体が比較に使用される。
4204 最後に、すべてのキーが同じだったときは、最後の手段として、@option{--reverse} (@option{-r})
4205 以外の順序関係のどんなオプションも指定されていないかのように、行全体を比較する。
4206 @option{--stable} オプションを指定すると、この最後の手段の比較
4207 (@dfn{last-resort comparison}) を行わないようになり、
4208 その結果、すべてのキー・フィールドが等価である行は、互いに対する元の順序がそのまま維持される。
4209 @option{--unique} (@option{-u}) オプションも、最後の手段の比較を行わないようにする。
4210 @vindex LC_ALL
4211 @vindex LC_COLLATE
4212
4213 別の指定がなされていないかぎり、すべての比較は、@env{LC_COLLATE}
4214 のロケールによって指定されている文字の照合順序で行われる。@footnote{POSIX
4215 以外のロケールを使用すると (たとえば、@env{LC_ALL} を @samp{en_US}
4216 に設定すると)、@command{sort} の出力が、見慣れない順序でソートされたものになるかもしれない。
4217 その場合は、環境変数 @env{LC_ALL} を @samp{C} にすればよい。
4218 注意すべきは、@env{LC_COLLATE} だけを設定したのでは、二つの問題が生じてしまうということだ。
4219 一つは、@env{LC_ALL} も設定されている場合、@env{LC_COLLATE}
4220 は無効だということ。二つ目は、@env{LC_CTYPE} が
4221 (@env{LC_CTYPE} が設定されていないときは、@env{LANG} が)
4222 @env{LC_COLLATE} と矛盾する値に設定されている場合、動作が未定義だということである。
4223 たとえば、@env{LC_CTYPE} が @code{ja_JP.PCK} であるのに、
4224 @env{LC_COLLATE} が @code{en_US.UTF-8} の場合、@command{sort} の動作は未定義なのである。}
4225 行末の改行は、比較に当たっては、行の一部として扱われない。
4226 入力ファイルの最後のバイトが改行でなければ、GNU の @command{sort} は黙って改行を追加する。
4227 GNU の @command{sort} では (GNU のすべてのユーティリティについて規定されているとおり)、
4228 入力行の長さに上限がない。すなわち、各行に含まれるバイト数に制限がない。
4229
4230 @command{sort} には三つの動作モードがある。ソート (これがデフォルト)、
4231 マージ、それに、すでにソートされているかどうかのチェックである。
4232 動作モードの変更には、以下のオプションを使用する。
4233
4234 @table @samp
4235
4236 @item -c
4237 @itemx --check
4238 @itemx --check=diagnose-first
4239 @opindex -c
4240 @opindex --check
4241 @cindex checking for sortedness
4242 指定されたファイルがすでにソートされているかどうかをチェックする。
4243 ファイル全体がソート済みでない場合は、診断メッセージを出し、
4244 順番から外れている最初の箇所を示してから、ステータス 1 で終了する。
4245 ファイルがソート済みの場合は、正常終了する。
4246 入力ファイルは、1 個しか指定できない。
4247
4248 @item -C
4249 @itemx --check=quiet
4250 @itemx --check=silent
4251 @opindex -c
4252 @opindex --check
4253 @cindex checking for sortedness
4254 指定されたファイルがすでにソート済みだったら、正常終了する。
4255 さもなければ、ステータス 1 で終了。入力ファイルは、1 個しか指定できない。
4256 このオプションは @option{-c} と同様だが、診断メッセージを出さない点が異なる。
4257
4258 @item -m
4259 @itemx --merge
4260 @opindex -m
4261 @opindex --merge
4262 @cindex merging sorted files
4263 指定された複数のファイルを一つのグループとしてソートすることでデータの統合を行う。
4264 各入力ファイルは、必ずそれぞれがソート済みでなければならない。
4265 マージモードの代わりにソートモードを使えば、
4266 そうした条件なしで、ソートとマージを行うことができる。
4267 マージモードがあるのは、それが使える場合は、その方が高速だからである。
4268
4269 @end table
4270
4271 @cindex exit status of @command{sort}
4272 終了ステータス:
4273
4274 @display
4275 0: エラーが起きなかった。
4276 1: @option{-c} や @option{-C} を付けて実行した際に、入力がソートされていなかった。
4277 2: エラーが起きた。
4278 @end display
4279
4280 @vindex TMPDIR
4281 環境変数 @env{TMPDIR} が設定されていれば、@command{sort}
4282 はその値をテンポラリ・ファイルを置くディレクトリとして @file{/tmp} の代わりに使用する。
4283 @option{--temporary-directory} (@option{-T}) オプションは、環境変数よりさらに優先される。
4284
4285 以下に挙げるオプションは、出力する行の順序に影響を与える。
4286 こうしたオプションは、グローバルなオプションとして指定することもできるし、
4287 キーとなる特定のフィールドに対してのみ働くように指定することもできる。
4288 キーとなるフィールドが全く指定されていない場合は、グローバルなオプションが行全体の比較に使用される。
4289 キー・フィールドの指定がある場合は、グローバルなオプションは、
4290 キー・フィールドのうち、それ自身のオプションが特に指定されていないフィールドに継承される。
4291 POSIX 以前の @command{sort} のバージョンを使用している場合、グローバルなオプションが効果を持つのは、
4292 それより後で指定されるキー・フィールドに対してだけなので、
4293 移植を考慮したシェルスクリプトでは、グローバル・オプションを最初に指定した方がよい。
4294
4295 @table @samp
4296
4297 @item -b
4298 @itemx --ignore-leading-blanks
4299 @opindex -b
4300 @opindex --ignore-leading-blanks
4301 @cindex blanks, ignoring leading
4302 @vindex LC_CTYPE
4303 各行中でソートに使うキーを捜すときに、文字の前にある空白を無視する。
4304 デフォルトの空白は、スペースまたはタブだが、@env{LC_CTYPE} のロケールによっては違うかもしれない。
4305 なお、次のことに留意してほしい。
4306 空白は、使用しているロケールの照合ルールによっては無視されることがあるが、
4307 このオプションを指定しておかないと、@option{-k} オプションで指定されるキー中の文字の位置に関して、
4308 空白が意味を持つことになる。
4309
4310 @item -d
4311 @itemx --dictionary-order
4312 @opindex -d
4313 @opindex --dictionary-order
4314 @cindex dictionary order
4315 @cindex phone directory order
4316 @cindex telephone directory order
4317 @vindex LC_CTYPE
4318 電話帳 (@dfn{phone directory}) 順にソートする。
4319 すなわち、ソートする際にアルファベット、数字、空白以外のすべての文字を無視する。
4320 デフォルトのアルファベットと数字は ASCII のそれであり、空白はスペースまたはタブだが、
4321 後者は @env{LC_CTYPE} のロケールによっては違うかもしれない。
4322
4323 @item -f
4324 @itemx --ignore-case
4325 @opindex -f
4326 @opindex --ignore-case
4327 @cindex ignoring case
4328 @cindex case folding
4329 @vindex LC_CTYPE
4330 アルファベットの小文字を、一回すべて対応する大文字に直してから、比較する。
4331 その結果、たとえば、@samp{b} と @samp{B} は等価なものとしてソートされる。
4332 どの文字がどのタイプに属するか (訳注: たとえば、大文字か小文字か)
4333 を決めているのは、@env{LC_CTYPE} のロケールである。@option{--unique}
4334 オプションと一緒に使用したとき、小文字を使っている等価な行があると、
4335 その小文字の行は捨てられることになる。(大文字を使っている等価な行の方を捨てる方法は、
4336 現在のところ存在しない。(@option{--reverse} オプションがあっても、
4337 それが効果を発揮するのは、小文字の行が捨てられた後の最終結果に対してだけなのだ。))
4338 (訳注: 実際の動作はこの説明と少し違う。最近の @command{sort} では、
4339 @option{--unique} と併せて使用した場合、小文字を使っている行が捨てられるのではなく、
4340 等価な行のうち、最初に現れた行が残り、それ以外のすべてが捨てられるようである。)
4341
4342 @item -g
4343 @itemx --general-numeric-sort
4344 @itemx --sort=general-numeric
4345 @opindex -g
4346 @opindex --general-numeric-sort
4347 @opindex --sort
4348 @cindex general numeric sort
4349 @vindex LC_NUMERIC
4350 各行の先頭部分を倍精度浮動小数点数 (long double-precision floating
4351 point number) に変換して、数値としてソートする
4352 (訳注: 実際には、各行の先頭と言うより、比較される各フィールドの先頭部分を対象にする)。
4353 @xref{Floating point}.  オーバーフロー、アンダーフロー、変換エラーが起きても、
4354 通知しない。行の並ぶ順番は以下のようになる。
4355
4356 @itemize @bullet
4357 @item
4358 数字で始まっていない行 (すべて同じ数値と見なされる)。
4359 @item
4360 NaN (IEEE の浮動小数点演算で使う ``Not a Number'' を表す値)
4361 を一貫した、ただし、マシンに依存する順番で並べる。
4362 @item
4363 マイナスの無限大。
4364 @item
4365 有限数を数値として昇順で並べる (@math{-0} と @math{+0} は等価とする)。
4366 @item
4367 プラスの無限大。
4368 @end itemize
4369
4370 このオプションを使うのは、他に方法がないときのみにすること。
4371 処理速度が @option{--numeric-sort} (@option{-n}) よりずっと遅いし、
4372 浮動小数点数に変換するとき、情報を失う恐れがあるからだ。
4373
4374 @item -h
4375 @itemx --human-numeric-sort
4376 @itemx --sort=human-numeric
4377 @opindex -h
4378 @opindex --human-numeric-sort
4379 @opindex --sort
4380 @cindex human numeric sort
4381 @vindex LC_NUMERIC
4382 数値としてソートする。その際、ソートを、まず数が正か負かによって行い
4383 (負の数、ゼロ、正の数の順)、次に SI 接尾辞 によって行い
4384 (接尾辞なし、@samp{k} や @samp{K}、そして @samp{MGTPEZY} の順  @pxref{Block size})、
4385 最後に数値によって行う。たとえば、@samp{1023M} は @samp{1G} の前に来る。
4386 SI 接尾辞として @samp{M}(メガ) は @samp{G} (ギガ) の前になるからだ。
4387 つまり、このオプションでソートする対象は、接尾辞の意味が 1000
4388 の累乗か、1024 の累乗かを問わず、一貫したやり方で、
4389 数値の規模にもっともふさわしい接尾辞を付けられている数値である。
4390 従って、このオプションは、@command{df}, @command{du}, @command{ls}
4391 などのコマンドに @option{--human-readable} や @option{--si}
4392 オプションを付けて実行したときの、一回分の出力をソートするのに用いられる。
4393 数値の書式は、@option{--numeric-sort} の場合と同じであり
4394 (訳注: すなわち、数値の前に付けた @samp{+} 符号を理解しない)、
4395 SI 接尾辞は、数値の後ろに直接続いていなければならない。
4396 なお、@command{numfmt} コマンドを使用することも考慮していただきたい。@command{numfmt}
4397 を使用すれば、数値をソートした後で、人間に読みやすい形に整形し直すことができるので、
4398 たいていの場合 @command{sort} の対象に、より精密な数値を使うことが可能になるからだ。
4399
4400 @item -i
4401 @itemx --ignore-nonprinting
4402 @opindex -i
4403 @opindex --ignore-nonprinting
4404 @cindex nonprinting characters, ignoring
4405 @cindex unprintable characters, ignoring
4406 @vindex LC_CTYPE
4407 表示できない文字を無視する。どの文字がどのタイプに属するかを決めているのは、
4408 @env{LC_CTYPE} のロケールである。より強力なオプションである
4409 @option{--dictionary-order} (@option{-d}) が一緒に指定されていると、
4410 このオプションは効果を持たない。
4411
4412 @item -M
4413 @itemx --month-sort
4414 @itemx --sort=month
4415 @opindex -M
4416 @opindex --month-sort
4417 @opindex --sort
4418 @cindex months, sorting by
4419 @vindex LC_TIME
4420 比較する部分の先頭が、0 個以上の空白に続いて、月名の短縮形になっているとき、
4421 すべての文字を大文字に直して @samp{JAN} < @samp{FEB} < @dots{} < @samp{DEC}
4422 の順序で比較する。月名として無効な名前は、有効な月名より前に置かれる。
4423 月名のつづりを決めているのは、@env{LC_TIME} カテゴリのロケールである
4424 (訳注: だから、英語の月名によってソートするには、ロケールを英語か
4425 C にしておく必要がある)。デフォルトの空白は、スペースまたはタブだが、
4426 @env{LC_CTYPE} のロケールによっては違うかもしれない。
4427
4428 @item -n
4429 @itemx --numeric-sort
4430 @itemx --sort=numeric
4431 @opindex -n
4432 @opindex --numeric-sort
4433 @opindex --sort
4434 @cindex numeric sort
4435 @vindex LC_NUMERIC
4436 数値としてソートする。数値は行頭から始まり
4437 (訳注: 比較する位置が指定されていれば、実は行頭でなくてもよい)、
4438 任意個の空白、必要なら @samp{-} 符号、それに、0 個以上の数字から構成される。
4439 数値は、区切り記号で 3 桁づつ区切られていてもよく、小数点記号と 0 個以上の数字が続いていてもよい。
4440 数字がない場合は、@samp{0} と見なされる。小数点記号や桁区切りの記号を規定しているのは、
4441 @env{LC_NUMERIC} のロケールである。デフォルトの空白は、スペースまたはタブだが、
4442 @env{LC_CTYPE} のロケールによっては違うかもしれない。
4443
4444 比較は厳密であり、丸めによるエラーはない。
4445
4446 このオプションは、数値に前置した @samp{+} 符号や、指数表記を理解しない。
4447 そうした文字列を数値として比較するには、@option{--general-numeric-sort}
4448 (@option{-g}) を使用するべきである。
4449
4450 @item -V
4451 @itemx --version-sort
4452 @opindex -V
4453 @opindex --version-sort
4454 @cindex version number sort
4455 バージョン名とバージョン番号によってソートする。標準用法のソートと動作が似ているが、
4456 10 進数の数字が連続する各部分をインデックス番号やバージョン番号と見なし、
4457 (文字列としてではなく) 数値として取り扱う点が違う。
4458 (@xref{Details about version sort}.)
4459
4460 @item -r
4461 @itemx --reverse
4462 @opindex -r
4463 @opindex --reverse
4464 @cindex reverse sorting
4465 比較の結果を逆順にする。その結果、出力ではより大きなキーの値を持つ行が、
4466 後ではなく、先に表示される。
4467
4468 @item -R
4469 @itemx --random-sort
4470 @itemx --sort=random
4471 @opindex -R
4472 @opindex --random-sort
4473 @opindex --sort
4474 @cindex random sort
4475 ソートを行うのに、入力中のキーをハッシュしてから、そのハッシュ値をソートするという方法を用いる。
4476 ハッシュ関数はランダムに選択する。
4477 その際、衝突 (collision) が絶対起きないように関数を選択するので、
4478 値の違うキーは必ず違うハッシュ値を持つようになる。
4479 これは、入力のランダムな並び替えに似ているが (@pxref{shuf invocation})、
4480 同じ値を持つキーは一緒に並べるという点が、異なっている。
4481
4482 ランダムソートを行うフィールドが複数指定されている場合は、
4483 ランダムに選択された一つの同じハッシュ関数が、すべてのフィールドで使用される。
4484 フィールドごとに別のランダムなハッシュ関数を使うようにするには、
4485 @command{sort} を複数回呼び出せばよい。
4486
4487 ハッシュ関数の選択は、 @option{--random-source} オプションの影響を受ける。
4488
4489 @end table
4490
4491 その他のオプション。
4492
4493 @table @samp
4494
4495 @item --compress-program=@var{prog}
4496 テンポラリ・ファイルを @var{prog} というプログラムで圧縮する。
4497
4498 @var{prog} プログラムは、
4499 引数が一つも存在しない場合に、標準入力を圧縮して標準出力に書き出し、
4500 @option{-d} オプションの指定があれば、
4501 標準入力を展開して標準出力に書き出すものでなければならない。
4502
4503 @var{prog} が 0 以外のステータスで終了した場合は、
4504 エラーメッセージを出して、@command{sort} の実行を中止する。
4505
4506 @var{prog} の指定中でホワイトスペース (訳注: 空白、タブ、改行など)
4507 やバックスラッシュ文字を使ってはならない。
4508 そうした文字は、将来の使用のために、予約されている。
4509
4510 @filesZeroFromOption{sort,,ソートした結果}
4511
4512 @item -k @var{pos1}[,@var{pos2}]
4513 @itemx --key=@var{pos1}[,@var{pos2}]
4514 @opindex -k
4515 @opindex --key
4516 @cindex sort field
4517 行中の @var{pos1} から @var{pos2} までの部分 (両者を含む)
4518 を、ソートの対象となる場所として指定する。@var{pos2} が省略されている場合は、
4519 @var{pos1} から行末までがソートの対象になる。
4520
4521 最も単純な形の場合、@var{pos} で指定するのは、何番目のフィールドかということである (1 から数える)。
4522 フィールドは 1 個以上の空白文字によって区切られるが、
4523 デフォルトでは、そうした空白文字は比較するとき各フィールドの先頭に含まれることになる。
4524 空白文字の扱い方を調整する方法については、@option{-b} や @option{-t}
4525 オプションの説明をご覧いただきたい。
4526
4527 より一般的に言うと、各 @var{pos} は、@samp{@var{f}[.@var{c}][@var{opts}]} という形式を取る。
4528 @var{f} は、比較に使用するフィールドは何番目かということであり、
4529 @var{c} は、そのフィールドの始めから数えて何番目の文字かということである。
4530 フィールドや文字の位置は、1 から数える。
4531 なお、@var{pos2} の文字の位置として 0 を指定すると、
4532 そのフィールドの最後の文字を指すことになる。@samp{.@var{c}} が、@var{pos1}
4533 で省略されている場合は、デフォルトの 1 (フィールドの最初の文字)
4534 を指定したことになり、@var{pos2} で省略されている場合は、デフォルトの 0
4535 (フィールドの最後の文字) を指定したことになる。
4536 @var{opts} は順序関連のオプションであり、
4537 これを指定することで、各キーを異なったルールでソートすることが可能になる。
4538 詳細については後述しているので、参照していただきたい。
4539 なお、キーは複数のフィールドにまたがることができる。
4540
4541 たとえば、二番目のフィールドでソートするには、@option{--key=2,2} (@option{-k 2,2})
4542 を使用する。後述部分で、キーについてさらに説明し、
4543 用例ももっとたくさん挙げているので、ご覧になっていただきたい。
4544 また、@option{--debug} オプションの説明もご覧になるとよい。@option{--debug}
4545 オプションを使うと、行中のどの部分がソートに使用されているかが明らかになる。
4546
4547 @item --debug
4548 各行のソートに使われている部分を強調表示する。
4549 また、使用法に問題がありそうなときは、標準エラーに警告メッセージを出す。
4550
4551 @item --batch-size=@var{nmerge}
4552 @opindex --batch-size
4553 @cindex number of inputs to merge, nmerge
4554 一度にマージする入力ファイルの数を多くても @var{nmerge} 個までとする。
4555
4556 @var{nmerge} 個を越える入力ファイルをマージしなければならない場合、@command{sort}
4557 は @var{nmerge} 個のファイルからなるグループを作ってマージし、
4558 その結果をテンポラリ・ファイルに保存する。
4559 そして、今度はそれを入力として使用して、後に続くマージを行うのである。
4560
4561 @var{nmerge} の値が大きいと、実行速度が向上し、ハードディスクの一時的な使用が減るかもしれないが、
4562 その分、メモリの使用量と I/O が増加する。
4563 逆に、@var{nmerge} の値が小さいと、メモリに対する要求と I/O は減少するかもしれないが、
4564 その分、ハードディスクの一時的な使用が増え、実行速度が低下することになる。
4565
4566 @var{nmerge} の値は、2 以上でなければならない。デフォルトの値は 16 だが、
4567 これは実装次第なので、将来は変わるかもしれない。
4568
4569 @var{nmerge} の値は、オープンできるファイル・ディスクリプタの上限によって制限されているかもしれない。
4570 @samp{ulimit -n} や @samp{getconf OPEN_MAX}
4571 コマンドを使えば、使用しているシステムの上限を知ることができる。
4572 ただし、そうした上限がさらに小さくなっていることもあり、
4573 使用中のプログラムがすでにファイルをいくつかオープンしている場合や、
4574 オープンできるファイルの数についてオペレーティング・システムに他の制限がある場合が、
4575 それに当たる。@var{nmerge} がリソースの上限を越えているときは、
4576 @command{sort} は警告メッセージを出さずに、より小さい値を使用する。
4577
4578 @item -o @var{output-file}
4579 @itemx --output=@var{output-file}
4580 @opindex -o
4581 @opindex --output
4582 @cindex overwriting of input, allowed
4583 出力を標準出力ではなく、@var{output-file} に書き出す。通常、@command{sort}
4584 は、入力をすべて読み込んでから、@var{output-file} をオープンする。
4585 従って、@code{sort -o F F} や @code{cat F | sort -o F}
4586 といったコマンドを使って、ファイルを直接書き変えるやり方でソートをすることが可能だ。
4587 とは言え、他の用途に使用されていないファイルに出力する方が、おおむね安全である。
4588 ファイルを直接書き変えるやり方でソートしている最中に、システムがクラッシュしたり、
4589 @command{sort} が入出力エラーなど、深刻なエラーに遭遇したりすると、データが失われてしまいかねないからだ。
4590 また、@option{--merge} (@option{-m}) オプションを指定した場合は、@command{sort}
4591 は、入力をすべて読み込む前に、出力ファイルをオープンするかもしれないので、
4592 @code{cat F | sort -m -o F - G} といったコマンドは安全ではない。
4593 @command{cat} が @file{F} の読み込みを済ます前に、@command{sort}
4594 が @file{F} への書き込みを始めてしまうかもしれないからだ。
4595
4596 @vindex POSIXLY_CORRECT
4597 比較的新しいシステムでも、環境変数 @env{POSIXLY_CORRECT} を設定している場合は、
4598 たとえば @samp{sort F -o F} のように、入力ファイルの後に
4599 @option{-o} オプションを置くことはできない。移植を考慮したスクリプトでは、
4600 @option{-o @var{output-file}} を入力ファイルの前で指定するべきである。
4601
4602 @item --random-source=@var{file}
4603 @opindex --random-source
4604 @cindex random source for sorting
4605 @var{file} をランダムデータのソースとして使用する。そのランダムデータは、
4606 @option{-R} オプションでどのランダムハッシュ関数を使うかを決めるのに使用される。
4607 @xref{Random sources}.
4608
4609 @item -s
4610 @itemx --stable
4611 @opindex -s
4612 @opindex --stable
4613 @cindex sort stability
4614 @cindex sort's last-resort comparison
4615
4616 最後の手段の比較 (last-resort comparison) を行うのを止めて、@command{sort}
4617 を入力順尊重 (stable) にする。このオプションは、フィールド指定オプションや、
4618 @option{--reverse} (@option{-r}) 以外のグローバルな順序関係のオプションが指定されていなければ、効果を持たない。
4619
4620 (訳注: いわゆる stable sort (普通、安定ソート、固定ソートと訳される) である。
4621 たとえば、@option{-b} オプションを使って、先行する空白を無視して比較した場合に、等価となる行があったとしよう。
4622 通常では、それでも、最後の手段の比較によって、
4623 先行する空白の有無も考慮に入れた行全体の比較が行われ、
4624 等価な行に順序を付けることになるが、@option{--stable} オプションが指定されていると、
4625 それをしないので、等価な行は入力されたときの順序で出力される)。
4626
4627 @item -S @var{size}
4628 @itemx --buffer-size=@var{size}
4629 @opindex -S
4630 @opindex --buffer-size
4631 @cindex size for main memory sorting
4632 指定された @var{size} のメインメモリをソート用のバッファとして使用する。
4633 デフォルトでは、@var{size} は 1024 バイトを 1 単位とする数値である。@samp{%}
4634 を後ろに付けると、@var{size} は、物理メモリの何パーセントの意味になる。
4635 後置するのが @samp{K} ならば、@var{size} は 1024 倍され (デフォルトと同じ)、
4636 @samp{M} なら 1,048,576 倍、@samp{G} なら 1,073,741,824 倍される。
4637 @samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} の後置も、同じ理屈である。
4638 @samp{b} を後置すると、@var{size} はバイト数と見なされ、掛け算は行われない。
4639
4640 このオプションを指定すると、@command{sort} は作業を始めるとき、
4641 デフォルトよりも大きかったり、小さかったりするソート用のバッファを使用することになり、
4642 そのために動作速度が向上することがある。
4643 とは言え、このオプションは起動直後のバッファサイズにしか影響を持たない。
4644 @command{sort} が @var{size} を越える入力行に出会うと、バッファのサイズは
4645 @var{size} 以上に拡大されるからである。
4646
4647 @item -t @var{separator}
4648 @itemx --field-separator=@var{separator}
4649 @opindex -t
4650 @opindex --field-separator
4651 @cindex field separator character
4652 各行でソートに使うキーを探すとき、文字 @var{separator}
4653 をフィールド・セパレータとして使用する。
4654 デフォルトでフィールドを区分するのは、非空白文字と空白文字の間の空文字列である。
4655 デフォルトの空白は、スペースとタブだが、@env{LC_CTYPE} のロケールによっては、
4656 違うかもしれない。
4657
4658 たとえば、入力行が @w{@samp{ foo bar}} だったとしよう。@command{sort} はこれを
4659 @w{@samp{ foo}} と @w{@samp{ bar}} のフィールドに分割する。
4660 フィールド・セパレータは前後どちらのフィールドにも属さないことになっている。
4661 そこで、@samp{sort @w{-t " "}} を使用した場合は、同じ入力行が、空っぽのフィールド、
4662 @samp{foo}、それに @samp{bar} という 3 個のフィールドを持つことになる。
4663 とは言え、キー・フィールドが、@option{-k 2} のように、行末まで続く場合や、
4664 @option{-k 2,3} のように、範囲からなる場合は、
4665 範囲の両端の間に存在するフィールド・セパレータは、キー・フィールド中にそのまま保持される。
4666
4667 ASCII NUL をフィールド・セパレータに指定するには、二文字からなる文字列
4668 @samp{\0} を使用すればよい。@samp{sort -t '\0'} のようにだ。
4669
4670 @item -T @var{tempdir}
4671 @itemx --temporary-directory=@var{tempdir}
4672 @opindex -T
4673 @opindex --temporary-directory
4674 @cindex temporary directory
4675 @vindex TMPDIR
4676 テンポラリファイルの置き場所にディレクトリ @var{tempdir} を使用する。
4677 この指定は、環境変数 @env{TMPDIR} に優先する。このオプションを二回以上指定すると、
4678 テンポラリファイルの置き場所として、指定されたすべてのディレクトリが使用されることになる。
4679 大規模なソートやマージを行って、I/O が足枷になる場合、このオプションを使って、
4680 別のディスク上にあり、別のコントローラを使用している複数のディレクトリを指定すると、
4681 実行速度が向上することがよくある。
4682
4683 @item --parallel=@var{n}
4684 @opindex --parallel
4685 @cindex multithreaded sort
4686 平行して実行するソートの数を  @var{n} に設定する。デフォルトでは、
4687 @var{n} は、利用できるプロセッサーの数になっている。ただし、上限は
4688 8 であり、これは、それ以上にしても、速度の向上が頭打ちになるからだ。
4689 @var{n} 個のスレッドを使用すると、メモリの使用量が log @var{n} 倍になることにも注意していただきたい。
4690 参照 @ref{nproc invocation}.
4691
4692 @item -u
4693 @itemx --unique
4694 @opindex -u
4695 @opindex --unique
4696 @cindex uniquifying output
4697
4698 通常は、等価と評価される複数の行の内、最初のもののみを出力する。
4699 @option{--check} (@option{-c} または @option{-C}) オプションが指定されている場合は、
4700 等価と評価される行が、2 行連続していないかをチェックする
4701 (訳注: 等価な行の連続があると、終了ステータスが 1 になる)。
4702
4703 また、このオプションを指定すると、デフォルトでは実行する、最後の手段の比較を行わなくなる。
4704
4705 コマンド @code{sort -u} と @code{sort | uniq} は等価である。
4706 しかし、その等価性は、@command{sort} に何か他のオプションが付いたときにまでは及ばない。
4707 たとえば、@code{sort -n -u} は、唯一性のチェックをするとき、行頭にある数字の並びの値しか調べないが、
4708 @code{sort -n | uniq} の方は、行全体を検査するのである。@xref{uniq invocation}.
4709
4710 @optZeroTerminated
4711 @macro newlineFieldSeparator
4712 @option{-z} オプションを使用した場合、改行文字はフィールド・セパレータ扱いになる。
4713 @end macro
4714
4715 @end table
4716
4717 @command{sort} の従来の (すなわち BSD と System V の) 実装では、
4718 いくつかのオプションの解釈が互いに異なっていた。
4719 とりわけ、@option{-b}, @option{-f}, @option{-n} についてそうだった。
4720 GNU の sort は、POSIX 規格の動作に従っており、
4721 これは、たいていの場合 (常にではない!)、System V の動作と同じである。POSIX
4722 によると、@option{-n} はもはや @option{-b} を自動的に設定しない。
4723 そこで、動作の一貫性のために、@option{-M} も同様に変更した。
4724 この変更によって、フィールドを指定するとき、文字の位置がどこを指すかが、
4725 微妙なケースでは変わってくるかもしれない。
4726 これに対する唯一の対処法は、明示的に @option{-b} オプションを指定することである。
4727
4728 @option{-k} によってソート・フィールドを指定するとき、
4729 その位置指定の後ろにオプション文字 @samp{MbdfghinRrV} のうち任意のものを付けることができる。
4730 その場合、そのフィールドは、グローバルな順序関係のオプションを一切引き継がないことになる。
4731 @option{-b} オプションは、フィールド限定のオプションとしては、
4732 フィールド指定の開始位置と終端位置の片方、あるいは両方に付けることができるが、
4733 グローバル・オプションから継承した場合は、両方に付いていることになる。
4734 入力行が、行頭やフィールド間に複数の空白を含んでいる可能性があって、
4735 しかも @option{-t} を使っていない場合は、@option{-k} を使用するとき、@option{-b}
4736 と組み合わせるか、先行する空白を暗黙のうちに無視するオプション (すなわち @samp{Mghn})
4737 と組み合わせるのが普通だ。そうしないと、フィールドにある先行する空白の数の違いのせいで、
4738 結果がわけのわからないものになりかねないからである。
4739
4740 ソートフィールド指定の開始位置が、行末より後ろや、終端側のフィールドより後ろに来てしまうと、
4741 そのフィールドは空になる。@option{-b} オプションを指定した場合、
4742 フィールド指定の @samp{.@var{c}} の部分は、そのフィールドの最初の非空白文字から数えることになる。
4743
4744 @vindex _POSIX2_VERSION
4745 @vindex POSIXLY_CORRECT
4746 POSIX 1003.1-2001 に準拠していないシステムの @command{sort}
4747 では、ソート・キーの指定に、@samp{+@var{pos1} [-@var{pos2}]}
4748 という 0 から数える旧来の書式が使用できる。
4749 @samp{sort +@var{a}.@var{x} -@var{b}.@var{y}} という旧来のコマンドは、
4750 もし @var{y} が @samp{0} であるか、指定されていない場合は、
4751 @samp{sort -k @var{a+1}.@var{x+1},@var{b}} と同じである。
4752 それ以外の場合は、@samp{sort -k @var{a+1}.@var{x+1},@var{b+1}.@var{y}} と同じだ。
4753
4754 (訳注: 旧来の書式と新しい書式の違いは、フィールドやフィールド中の文字の位置を
4755 0 から数えるか、1 から数えるかだけではない。
4756 終端指定の位置が、旧来の書式ではキー・フィールドに含まれないのに対し
4757 (つまり、その直前までなのに対し)、新しい書式では含まれるという違いもある。
4758 そこで、上のようになる。なお、旧来の書式であれ、新しい書式であれ、
4759 デフォルトのフィールド・セパレータは、
4760 「非空白文字と空白文字の間の空文字列」であることに注意していただきたい。)
4761
4762 この旧来の動作は、環境変数 @env{_POSIX2_VERSION} を使えば、コントロールすることができる
4763 (@pxref{Standards conformance})。また、@env{POSIXLY_CORRECT}
4764 が設定されていないときに、@samp{-@var{pos2}} が存在する旧来の書式を使っても、有効になる。
4765
4766 標準的なホストで使用することを意図したスクリプトでは、旧来の書式は使わずに、
4767 @option{-k} の方を使用するべきである。たとえば、@samp{sort +2} は使わない方がよい。
4768 @samp{sort ./+2} と解釈されるか、@samp{sort -k 3} と解釈されるか、わからないからである。
4769 そのスクリプトが、旧来の書式にしか対応していないホストでも動作しなければならないのなら、
4770 スクリプト中で @samp{if sort -k 1 </dev/null >/dev/null 2>&1; then @dots{}}
4771 といったテストを行って、どちらの書式を使うべきかを判断すればよい。
4772
4773 用例をいくつか挙げて、オプションの様々な組み合わせを説明する。
4774
4775 @itemize @bullet
4776
4777 @item
4778 数値としてソートし、降順に (つまり、通常の逆に) 並べる。
4779
4780 @example
4781 sort -n -r
4782 @end example
4783
4784 @item
4785 同時にソートを 4 つまで行う。バッファサイズを 10M にする。
4786
4787 @example
4788 sort --parallel=4 -S 10M
4789 @end example
4790
4791 @item
4792 1 番目と 2 番目のフィールドを無視し、さらに 3 番目のフィールドの先頭の空白も無視して、
4793 アルファベット順に並べる。ここで使っているキーは一つであり、
4794 それは 3 番目のフィールドの最初の非空白文字に始まって、
4795 各行の末尾まで続くすべての文字からなっている。
4796
4797 @example
4798 sort -k 3b
4799 @end example
4800
4801 @item
4802 2 番目のフィールドを数値としてソートし、同点の決着を付けるために、
4803 5 番目のフィールドの 3 番目と 4 番目の文字をアルファベット順でソートする。
4804 フィールドの区切りには @samp{:} を使用する。
4805
4806 @example
4807 sort -t : -k 2,2n -k 5.3,5.4
4808 @end example
4809
4810 ここで注意していただきたいが、もし @option{-k 2,2n} の代わりに @option{-k 2n}
4811 と書いたなら、@command{sort} は、2 番目のフィールドに始まり、行末まで続くすべての文字を、
4812 主キー (primary key) として、それも「数値」のキーとして使用したことだろう。
4813 @command{sort} を実行するたいていの場合について言えることだが、
4814 複数のフィールドにまたがるキーを数値として使用しても、期待する結果は得られないものである。
4815
4816 もう一つ注意していただきたい。
4817 上の例では、@samp{n} 修飾子を最初のキーのフィールド終端指定に付けている。
4818 これは、@option{-k 2n,2} とか @option{-k 2n,2n}
4819 とか指定しても、同じことだったろう。@samp{b} を除くすべての修飾子は、
4820 キー指定のフィールド開始側に付けるか、フィールド終端側に付けるか、
4821 あるいは、その両方に付けるかにかかわりなく、
4822 付けられた「キー・フィールド全体」に適用されるのである。
4823
4824 @item
4825 パスワードファイルを 5 番目のフィールドでソートする。このとき、
4826 先頭の空白は無視する。5 番目のフィールドが同じ値になる行については、
4827 3 番目のフィールドのユーザ ID 番号でソートする。
4828 フィールドの区切りは、@samp{:} という文字である。
4829
4830 @example
4831 sort -t : -k 5b,5 -k 3,3n /etc/passwd
4832 sort -t : -n -k 5b,5 -k 3,3 /etc/passwd
4833 sort -t : -b -k 5,5 -k 3,3n /etc/passwd
4834 @end example
4835
4836 この三つのコマンドは同じ働きをする。
4837 1 番目のコマンドは、最初のキーの開始位置では先行する空白を無視し、
4838 二番目のキーを数値としてソートするように指定している。他の二つのコマンドは、
4839 グローバル・オプションは修飾子がないソート・キーによって継承されるという特性を利用している。
4840 この場合、継承がうまく働くのは、@option{-k 5b,5b} と
4841 @option{-k 5b,5} が同じことだからだ (訳注: 「@option{-b} オプションは @dots{}
4842 グローバル・オプションから継承した場合は、(開始位置と終端位置の)
4843 両方に付いていることになる」ので、3 番目のコマンドは、@option{-k 5b,5b}
4844 と指定するのと事実上等しい)。両者が同じになるのは、@samp{.@var{c}}
4845 という文字位置を欠いたフィールド終端の指定では、
4846 先頭の空白をスキップしてもしなくても、終端位置は変わらないからである。
4847
4848 @item
4849 一群のログファイルをソートする。主キーとして IPv4 アドレスを使用し、
4850 副キーとしてタイムスタンプを使用する。二つの行の主キーと副キーが全く同じ場合は、
4851 入力されたときと同じ順番で、その行を出力する。ログファイルは、次のような行からなっている。
4852
4853 @example
4854 4.150.156.3 - - [01/Apr/2004:06:31:51 +0000] message 1
4855 211.24.3.231 - - [24/Apr/2004:20:17:39 +0000] message 2
4856 @end example
4857
4858 フィールドは、ただ 1 個の空白で区切られている。
4859 IPv4 アドレスのソートは辞書順 (lexicographically) で行う。
4860 たとえば、212.61.52.2 は 212.129.233.201 の前に来る。
4861 61 は 129 よりも小さいからだ。
4862
4863 @example
4864 sort -s -t ' ' -k 4.9n -k 4.5M -k 4.2n -k 4.14,4.21 file*.log |
4865 sort -s -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n
4866 @end example
4867
4868 この例の場合は、@command{sort} を一回起動するだけでは、ことがすまない。
4869 日付が空白 1 個のすぐ後に置かれているだけなのに対して、
4870 IPv4 の構成要素は @samp{.} で区切られているからである。そこで、作業を分割し、
4871 @command{sort} を 2 回起動している。1 回目はタイムスタンプでソートし、
4872 2 回目は IPv4 アドレスでソートするわけだ。タイムスタンプは、
4873 年、月、日のフィールドの順番でソートし、最後に、時・分・秒のフィールドでソートしているが、
4874 それは @option{-k} オプションを使って、各フィールドを分離することで実現している。
4875 時・分・秒を除いて、各キー・フィールドの終端を指定する必要はない。
4876 @samp{n} や @samp{M} 修飾子は、フィールドの先頭にある数値や月名の短縮形に基づいてソートを行うが、
4877 そうしたものは、フィールドの境界を越えられないからである。IPv4 アドレスのソートは、
4878 辞書順で行っている。なお、二回目のソートで @samp{-s} を使っているのは、
4879 主キーで一ヶ所にまとめられる行が、副キーによってソートされているようにするためである。
4880 それに対して、一回目のソートで  @samp{-s} を使っているのは、
4881 二つのソートの組み合わせ全体を入力順尊重 (stable) にするためだ。
4882
4883 @item
4884 アルファベットの大文字小文字の違いを無視してソートし、その順番で
4885 tags ファイルを作成する。
4886
4887 @smallexample
4888 find src -type f -print0 | sort -z -f | xargs -0 etags --append
4889 @end smallexample
4890
4891 この例では、@option{-print0}, @option{-z}, @option{-0} といったオプションを使っている。
4892 そのため、空白などの特殊文字を含んでいるファイル名が、
4893 ソート操作によって分断されることがない。
4894
4895 @c This example is a bit contrived and needs more explanation.
4896 @c @item
4897 @c Sort records separated by an arbitrary string by using a pipe to convert
4898 @c each record delimiter string to @samp{\0}, then using sort's -z option,
4899 @c and converting each @samp{\0} back to the original record delimiter.
4900 @c
4901 @c @example
4902 @c printf 'c\n\nb\n\na\n' |
4903 @c perl -0pe 's/\n\n/\n\0/g' |
4904 @c sort -z |
4905 @c perl -0pe 's/\0/\n/g'
4906 @c @end example
4907
4908 @item
4909 慣用句 DSU (Decorate Sort Undecorate) の手法 (訳注: 指標を付けて、
4910 ソートして、指標を取る) を採用して、短いものから長いものへと、行を並べる。
4911
4912 @example
4913 awk '@{print length, $0@}' /etc/passwd | sort -n | cut -f2- -d' '
4914 @end example
4915
4916 一般に、あるデータが @command{sort} コマンドでは直接ソートできないとか、
4917 効率が悪いというとき、そうしたデータをソートするのに、この手法が役に立つ。
4918
4919 @item
4920 ディレクトリをランダムな順番でで並べる。ただし、各ディレクトリ内のファイルについては、
4921 その順番を維持する。一例を挙げると、この方法で演奏リストを作成すれば、
4922 アルバムはシャッフルするけれど、
4923 各アルバム内の曲は通常のソート順で演奏するといったことが可能になる。
4924
4925 @example
4926 ls */* | sort -t / -k 1,1R -k 2,2
4927 @end example
4928
4929 @end itemize
4930
4931
4932 @node shuf invocation
4933 @section @command{shuf}: テキストをシャッフルする
4934
4935 @pindex shuf
4936 @cindex shuffling files
4937
4938 @command{shuf} は、入力された行をランダムに並べ替えてから出力することによって、
4939 入力のシャッフルを行う。どの並び替えが出力されるかは、確率的に等しい。
4940
4941 書式:
4942
4943 @example
4944 shuf [@var{option}]@dots{} [@var{file}]
4945 shuf -e [@var{option}]@dots{} [@var{arg}]@dots{}
4946 shuf -i @var{lo}-@var{hi} [@var{option}]@dots{}
4947 @end example
4948
4949 @command{shuf} には三つの動作モードがあり、それぞれ、入力行をどこから取得するかが違っている。
4950 デフォルトでは、標準入力から行を読み込む。以下のオプションは、動作モードを変更する。
4951
4952 @table @samp
4953
4954 @item -e
4955 @itemx --echo
4956 @opindex -c
4957 @opindex --echo
4958 @cindex command-line operands to shuffle
4959 コマンドラインの各オペランドを入力行として扱う。
4960
4961 @item -i @var{lo}-@var{hi}
4962 @itemx --input-range=@var{lo}-@var{hi}
4963 @opindex -i
4964 @opindex --input-range
4965 @cindex input range to shuffle
4966 @var{lo} から @var{hi} の範囲の符号なしの 10 進整数を
4967 1 行に 1 個含むファイルから入力があったかのように動作する。
4968
4969 @end table
4970
4971 @command{shuf} の他のオプションは、どの動作モードでも、その動作に影響を与える。
4972
4973 @table @samp
4974
4975 @item -n @var{count}
4976 @itemx --head-count=@var{count}
4977 @opindex -n
4978 @opindex --head-count
4979 @cindex head of output
4980 最大でも @var{count} 行までしか出力しない。デフォルトでは、入力されたすべての行を出力する。
4981
4982 @item -o @var{output-file}
4983 @itemx --output=@var{output-file}
4984 @opindex -o
4985 @opindex --output
4986 @cindex overwriting of input, allowed
4987 出力を、標準出力ではなく、@var{output-file} に書き出す。@command{shuf} は、
4988 入力をすべて読み込んでから、@var{output-file} をオープンする。従って、
4989 @code{shuf -o F <F} や @code{cat F | shuf -o F} というコマンドを使って、
4990 ファイルを直接書き変える形でシャッフルしても安全である。
4991
4992 @item --random-source=@var{file}
4993 @opindex --random-source
4994 @cindex random source for shuffling
4995 ランダムデータのソースとして  @var{file} を使用する。
4996 そのランダムデータはどんな並べ替えになるかを決めるのに使用される。
4997 @xref{Random sources}.
4998
4999 @item -r
5000 @itemx --repeat
5001 @opindex -r
5002 @opindex --repeat
5003 @cindex repeat output values
5004 値の反復出力を行う。別の言い方をすると、置き換えるものについてそのつど選択を行う。
5005 このオプションを使用した場合、出力は入力を並び替えたものになるのではない。
5006 そうではなく、各出力行がすべての入力からランダムに選ばれるのである。
5007 このオプションは、たいてい @option{--head-count} と組み合わせて使用する。
5008 @option{--head-count} を指定しないと、@command{shuf} はいつまでも出力を続けることになる。
5009
5010 @optZeroTerminated
5011
5012 @end table
5013
5014 例を挙げる。
5015
5016 @example
5017 shuf <<EOF
5018 A man,
5019 a plan,
5020 a canal:
5021 Panama!
5022 EOF
5023 @end example
5024
5025 @noindent
5026 上記の結果は、こんな出力になるかもしれない。
5027
5028 @example
5029 Panama!
5030 A man,
5031 a canal:
5032 a plan,
5033 @end example
5034
5035 @noindent
5036 同様に、次のコマンドの出力は、
5037
5038 @example
5039 shuf -e clubs hearts diamonds spades
5040 @end example
5041
5042 @noindent
5043 こうなるかもしれない。
5044
5045 @example
5046 clubs
5047 diamonds
5048 spades
5049 hearts
5050 @end example
5051
5052 @noindent
5053 下記は、@samp{shuf -i 1-4} というコマンドの出力の一例である。
5054
5055 @example
5056 4
5057 2
5058 1
5059 3
5060 @end example
5061
5062 @noindent
5063 上記のどの例でも、入力行は 4 行である。
5064 従って、入力は 24 とおりに並べ替えることが可能であり、@command{shuf}
5065 が生成するのは、そのどれか一つである。
5066 一般的に言うと、入力行が @var{n} 行なら、@var{n}! とおりに
5067 (@var{n} の階乗、すなわち、@w{@var{n} * (@var{n} - 1) * @dots{} * 1} とおりに)
5068 並べ替えて、出力することができる。
5069
5070 @noindent
5071 それぞれが 0 から 9 までの範囲にある数値を 50 回ランダムに出力するには、次のようにする。
5072
5073 @example
5074 shuf -r -n 50 -i 0-9
5075 @end example
5076
5077 @noindent
5078 コイン・トス 100 回をシミュレートする。
5079
5080 @example
5081 shuf -r -n 100 -e Head Tail
5082 @end example
5083
5084 @exitstatus
5085
5086
5087 @node uniq invocation
5088 @section @command{uniq}: ファイルから重複を省く
5089
5090 @pindex uniq
5091 @cindex uniquify files
5092
5093 @command{uniq} は、指定された @var{input} ファイルにある行を、重複を省いて書き出す。
5094 ファイルが指定されていない場合や、@var{input} として
5095 @samp{-} が指定されている場合は、標準入力を対象とする。
5096
5097 書式:
5098
5099 @example
5100 uniq [@var{option}]@dots{} [@var{input} [@var{output}]]
5101 @end example
5102
5103 デフォルトでは、@command{uniq} は入力された行を表示するとき、
5104 隣接する同一行があれば、出力に重複する行が現れないように、最初の行だけを残して、
5105 残りの行を捨ててしまう。また、オプションによっては、重複しない行を捨てることや、
5106 すべての隣接する同一行を捨てることもできる。
5107
5108 入力はソートされている必要はないが、重複する入力行が検出されるのは、
5109 それが隣接しているときだけである。もし、隣接していない重複行も捨てたいのなら、
5110 @code{sort -u} を使うとよいだろう。 @xref{sort invocation}.
5111
5112 @vindex LC_COLLATE
5113 比較には @env{LC_COLLATE} ロケール・カテゴリが指定しているルールを使用する。
5114
5115 @var{output} ファイルが指定されていない場合、@command{uniq} は標準出力に書き出す。
5116
5117 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
5118
5119 @table @samp
5120
5121 @item -f @var{n}
5122 @itemx --skip-fields=@var{n}
5123 @opindex -f
5124 @opindex --skip-fields
5125 重複の検査を行う前に、各行のフィールドを @var{n} 個スキップする。その行に
5126 @var{n} 個より少ないフィールドしかない場合は、比較に空の文字列を使用する。
5127 フィールドとは、少なくとも 1 個以上のスペースやタブで間を区切られた、スペースやタブを含まない文字の連続である。
5128
5129 互換性のために、@command{uniq} は @option{-@var{n}} という旧来のオプション書式をサポートしている。
5130 新しいスクリプトでは、@option{-f @var{n}} の方を使うべきである。
5131
5132 @item -s @var{n}
5133 @itemx --skip-chars=@var{n}
5134 @opindex -s
5135 @opindex --skip-chars
5136 重複の検査を行う前に、@var{n} 文字スキップする。
5137 その行に @var{n} 個より少ない文字しかない場合は、比較に空の文字列を使用する。
5138 フィールドをスキップするオプションと、文字をスキップするオプションの両方を使っている場合は、
5139 フィールドのスキップが先に行われる。
5140
5141 @vindex _POSIX2_VERSION
5142 POSIX 1003.1-2001 に準拠していないシステムでは、@command{uniq} が
5143 @option{+@var{n}} という旧来のオプションの書式をサポートしている。
5144 この旧来の書式は、環境変数 @env{_POSIX2_VERSION} を使えば、コントロールできるが (@pxref{Standards
5145 conformance})、
5146 移植を考慮したスクリプトでは、この環境変数に動作が依存するコマンドの使用は、避けた方がよい。
5147 たとえば、@samp{uniq +10} ではなく、@samp{uniq ./+10} や @samp{uniq -s 10}
5148 を使うべきだ。前者では、@samp{+10} が、オプションかファイル名か、まぎらわしいからである。
5149
5150 @item -c
5151 @itemx --count
5152 @opindex -c
5153 @opindex --count
5154 各行に出現回数を付けて表示する。
5155
5156 @item -i
5157 @itemx --ignore-case
5158 @opindex -i
5159 @opindex --ignore-case
5160 行を比較するとき、アルファベットの大文字小文字を区別しない。
5161
5162 @item -d
5163 @itemx --repeated
5164 @opindex -d
5165 @opindex --repeated
5166 @cindex repeated lines, outputting
5167 重複していない行を除去する。このオプションを単独で使った場合、@command{uniq}
5168 は、連続する同一行のうち、最初の 1 行だけを表示し、それ以外の何も表示しない。
5169
5170 @item -D
5171 @itemx --all-repeated[=@var{delimit-method}]
5172 @opindex -D
5173 @opindex --all-repeated
5174 @cindex all repeated lines, outputting
5175 入力行のうち、連続する同一行の二行目以降を除去せず、重複していない行だけを除去する。
5176 このオプションが役に立つのは、主として、大文字小文字を無視するとか、
5177 選択したフィールドのみを比較するとかいった、他のオプションと組み合わせて使うときである。
5178 長い書式のオプションで使用できる @var{delimit-method} は、
5179 省略可能であり、指定した場合は、重複行のグループ間の区切り方を指示することになる。
5180 @var{delimit-method} は、以下の一つでなければならない。
5181
5182 @table @samp
5183
5184 @item none
5185 重複行のグループ間に、区切りの印を置かない。@option{--all-repeated}
5186 (@option{-D}) とのみ指定するのと同じことである。
5187
5188 @item prepend
5189 重複行の各グループの前に改行を出力する。
5190 @macro nulOutputNote
5191 @option{--zero-terminated} (@option{-z}) を指定している場合は、
5192 区切りの印として改行の代わりに、ゼロバイト (ASCII NUL) を使用する。
5193 @end macro
5194 @nulOutputNote
5195
5196 @item separate
5197 重複行のグループ間を 1 個の改行で分離する。これは、@samp{prepend}
5198 を使うのとほぼ同じだが、最初のグループの前に区切りの印を挿入しないのが異なっている。
5199 それ故、ユーザが出力を直接見る場合に、より適しているかもしれない。@nulOutputNote
5200 @end table
5201
5202 @macro ambiguousGroupNote
5203 注意していただきたいが、グループ同士を改行で分離しているとき、
5204 入力ストリームに複数の空行があると、出力がまぎらわしいものになる。
5205 これを避けるには、入力を @samp{tr -s '\\n'} でフィルタリングして、
5206 複数の空行をなくせばよい。
5207 @end macro
5208 @ambiguousGroupNote
5209
5210 @c FIXME: give an example showing *how* it's useful
5211 このオプションは、GNU による拡張である。
5212
5213 @item --group[=@var{delimit-method}]
5214 @opindex --group
5215 @cindex all lines, grouping
5216 すべての行を出力し、他と区別される各グループの間に区切りを入れる。
5217 @nulOutputNote @var{delimit-method}
5218 は省略可能であり、指定した場合は、グループ間の区切り方を指示することになる。
5219 @var{delimit-method} は、以下の一つでなければならない。
5220
5221 @table @samp
5222
5223 @item separate
5224 他と区別されるグループを 1 個の区切りの印で分離する。
5225 これが、何も指定されていないときの、デフォルトの区切り方であり、
5226 出力をユーザに直接見せる場合に適している。
5227
5228 @item prepend
5229 他と区別される各グループの前に区切りの印を出力する。
5230
5231 @item append
5232 他と区別される各グループの後ろに区切りの印を出力する。
5233
5234 @item both
5235 他と区別される各グループの前後に区切りの印を出力する。
5236 @end table
5237
5238 @ambiguousGroupNote
5239
5240 このオプションは、GNU による拡張である。
5241
5242 @item -u
5243 @itemx --unique
5244 @opindex -u
5245 @opindex --unique
5246 @cindex unique lines, outputting
5247 重複する入力行のグループを表示するときは (訳注: すなわち、@option{--all-repeated}
5248 (@option{-D}) オプションを使用しているときは)、グループの最後の行を表示しない。
5249 このオプションを単独で使用する場合は、ユニークな
5250 (訳注: この場合は、同一行が連続していないという意味) 行だけを表示し、それ以外の何も表示しない。
5251
5252 @item -w @var{n}
5253 @itemx --check-chars=@var{n}
5254 @opindex -w
5255 @opindex --check-chars
5256 各行で (フィールドや文字をスキップする指定があれば、スキップした後で)
5257 文字を何個まで比較するかを指定する。デフォルトでは、行の残り全部が比較の対象になる。
5258
5259 @optZeroTerminated @newlineFieldSeparator
5260
5261 @end table
5262
5263 @exitstatus
5264
5265
5266 @node comm invocation
5267 @section @command{comm}: ソート済みの二つのファイルを一行づつ比較する
5268
5269 @pindex comm
5270 @cindex line-by-line comparison
5271 @cindex comparing sorted files
5272
5273 @command{comm} は、二つの入力ファイルの共通する行と独自な行を、標準出力に区別して書き出す。
5274 @samp{-} というファイル名は、標準入力を意味している。
5275
5276 書式:
5277
5278 @example
5279 comm [@var{option}]@dots{} @var{file1} @var{file2}
5280 @end example
5281
5282 @vindex LC_COLLATE
5283 入力ファイルは、@command{comm} に渡す前に、@env{LC_COLLATE}
5284 のロケールによって規定されている照合順序でソートされていなければならない。
5285 入力ファイルが改行以外の文字で終わっている場合は、自動的に改行が追加される。
5286 @command{sort} コマンドをオプションなしで実行すると、@command{comm} の入力にふさわしいファイルが必ず得られる。
5287
5288 @cindex differing lines
5289 @cindex common lines
5290 @c FIXME: when there's an option to supply an alternative separator
5291 @c string, append "by default" to the above sentence.
5292 オプションを付けずに実行すると、@command{comm} は 3 列の出力を生成する。
5293 1 列目は @var{file1} にのみある行であり、2 列目は @var{file2} にのみある行、そして
5294 3 列目は両方のファイルに共通する行である。各列は、1 個のタブ文字で区切られる。
5295
5296 @opindex -1
5297 @opindex -2
5298 @opindex -3
5299 @option{-1}, @option{-2}, @option{-3} というオプションは、対応する列
5300 (と区切り記号) を表示しないようにする。
5301 オプションについては、「共通オプション」の章も参照すること。 @ref{Common options}.
5302
5303 比較のための他のユーティリティとは違って、@command{comm} の終了ステータスは、
5304 比較結果の如何によらない。@command{comm} は、正常終了すると 0 の終了コードを返す。
5305 エラーがあれば、0 以外のステータスで終了する。
5306
5307 @macro checkOrderOption{cmd}
5308 @option{--check-order} を指定した場合、入力がソートされていないと、
5309 エラーメッセージを出して、実行を中断する。@option{--nocheck-order}
5310 オプションを指定した場合は、入力がソートされていなくても、エラーメッセージを出すことはない。
5311 どちらのオプションも指定されていない場合に、入力がソートされていないとの診断を下すのは、
5312 @ifset JOIN_COMMAND
5313 片方の入力ファイルにもう一方と対にならない行が見つかったときだけであり、
5314 それも入力ファイルのどちらも空ではなく、中身を持っているときだけである。
5315 @end ifset
5316 @ifclear JOIN_COMMAND
5317 片方の入力ファイルにもう一方と対にならない行が見つかったときだけである。
5318 @end ifclear
5319 入力ファイルがソートされていないと診断すると、@command{\cmd\}
5320 は 0 以外のステータスで終了する (従って、そうした出力は使用するべきではない)。
5321
5322 入力ファイルがきちんとソートされていず、しかも、対にならない行を含む場合に、
5323 @option{--nocheck-order} を指定して、そうしたファイルを @command{\cmd\}
5324 で無理矢理処理しても、何か特定の結果をもたらすことは保証できない。
5325 おそらく出力は、期待に添わないものになるだろう。
5326 @end macro
5327 @checkOrderOption{comm}
5328
5329 @table @samp
5330
5331 @item --check-order
5332 入力ファイルのどちらかの内容がきちんとソートされていないと、
5333 エラーメッセージを出して、実行に失敗する。
5334
5335 @item --nocheck-order
5336 入力ファイルの内容がソートされた順番になっているかどうかを、
5337 どちらのファイルについてもチェックしない。
5338
5339 その他のオプション。
5340
5341 @item --output-delimiter=@var{str}
5342 出力における隣り合う列の間に、デフォルトのタブ文字 1 個ではなく、
5343 @var{str} を出力する。
5344
5345 区切り記号の @var{str} は、空であってはならない。
5346
5347 @item --total
5348 最後の行に要約を出力する。
5349
5350 通常の出力と同じように、1 列目は @var{file1} にのみある行の合計数、
5351 2 列目は @var{file2} にのみある行の合計数、3 列目は両方のファイルに共通する行の合計数である。
5352 さらに 4 列目に @samp{total} という文字が追加される。
5353
5354 次の例では、@command{comm} は通常の出力を省略して (@option{-123})、
5355 要約のみを表示している。
5356
5357 @example
5358 $ printf '%s\n' a b c d e     > file1
5359 $ printf '%s\n'   b c d e f g > file2
5360 $ comm --total -123 file1 file2
5361 1       2       4       total
5362 @end example
5363
5364 このオプションは GNU の拡張である (coreutils 8.26 から)。
5365 移植を考慮したスクリプトで合計数を出したければ、@command{wc}
5366 を使用するべきである。たとえば、上記の例なら、次のようにする。
5367
5368 @example
5369 $ comm -23 file1 file2 | wc -l    # file1 にのみある行の行数
5370 1
5371 $ comm -13 file1 file2 | wc -l    # file2 にのみある行の行数
5372 2
5373 $ comm -12 file1 file2 | wc -l    # 両方のファイルに共通する行の行数
5374 4
5375 @end example
5376
5377 @optZeroTerminated
5378
5379 @end table
5380
5381 @node ptx invocation
5382 @section @command{ptx}: パミューテド・インデックスを作成する
5383
5384 @pindex ptx
5385
5386 @command{ptx} の基本的な働きは、テキストファイルを読み込んで、
5387 パミューテド・インデックスを作成することである。パミューテド・インデックスというのは、
5388 各キーワードに前後の文脈を付けて索引項目にするインデックスのことだ。
5389
5390 (訳注: パミューテド・インデックスは、KWIC (Key Word In Context)
5391 インデックスとも言われる。簡単に言えば、本文にあるとおり、
5392 キーワードに前後の文脈を付けて項目として立てる索引のことである。たとえば、"The cow
5393 jumped over the moon." という文があるとしよう。今、キーワードを角カッコ ([])
5394 で示すとすると、@command{ptx} による一番簡単なパミューテド・インデックスの作成では、
5395 この文から、
5396
5397 @example
5398 [The] cow jumped over the moon.
5399 The [cow] jumped over the moon.
5400 The cow [jumped] over the moon.
5401 The cow jumped [over] the moon.
5402 The cow jumped over [the] moon.
5403 The cow jumped over the [moon].
5404 @end example
5405
5406 @noindent
5407 という、キーワードの位置だけが違う 6 個の索引項目が作られ、
5408 キーワードによってソートされて、出力される。
5409 「パミューテド (permuted)」というのは、文中でキーワードが順番に移動するのを、
5410 円順列 (cyclic permutation) に見立てているかららしい。
5411 「順列索引」と訳されることもある。
5412
5413 上記の文を cow.txt というファイルに保存し、それに対して @option{-A} 
5414 オプションのみを付けて @command{ptx} を実行してみよう。
5415 その出力は、次のようになる。出力された行のほぼ中央にある 
5416 (すなわち、少し長めの空白の後ろの) 単語がキーワードである。
5417 大文字小文字を区別してアルファベット順に並んでいるのが、おわかりになるだろう。
5418 各行頭にあるのは、@option{-A} オプションによって生成された参照箇所情報 
5419 (ファイル名と行番号) である。
5420
5421 @example
5422 $ echo "The cow jumped over the moon." >cow.txt
5423 $ ptx -A cow.txt
5424 cow.txt:1:  .                        The cow jumped over the moon
5425 cow.txt:1:                     The   cow jumped over the moon.
5426 cow.txt:1:                 The cow   jumped over the moon.
5427 cow.txt:1: The cow jumped over the   moon.
5428 cow.txt:1:          The cow jumped   over the moon.
5429 cow.txt:1:     The cow jumped over   the moon.
5430 @end example
5431
5432 パミューテド・インデックスの代表的な例としては、
5433 英語などの聖書の巻末に付属している文脈付きの語句索引、「コンコーダンス」を挙げることができる。
5434 実際、この文書でもコンコーダンスをパミューテド・インデックスの同義語として使用している。
5435 なお、この @command{ptx} プログラムは、日本語に対応していない。)
5436
5437 @command{ptx} 実行の書式は次のうちのどちらかである。
5438
5439 @example
5440 ptx [@var{option} @dots{}] [@var{file} @dots{}]
5441 ptx -G [@var{option} @dots{}] [@var{input} [@var{output}]]
5442 @end example
5443
5444 @option{-G} (または、それと等価な @option{--traditional}) オプションを指定すると、
5445 GNU によるすべての拡張が無効になり、従来のモードで動作するようになる。
5446 従って、いくつかの制限が課されるようになり、プログラムのオプションのデフォルトの値がいくつか変更される。
5447 @option{-G} が指定されていない場合は、GNU による拡張が常に有効になる。
5448 @command{ptx} に対する GNU の拡張については、この文書では折に触れて説明している。
5449 拡張の詳細なリストについては、「GNU による @command{ptx} の拡張」の節を御覧になっていただきたい。
5450 @xref{Compatibility in ptx}.
5451
5452 個々のオプションについては、以下に続く節で説明する。
5453
5454 GNU による拡張が有効になっていれば、オプションの後ろに 0 個以上の
5455 @var{file} を指定することができる。@var{file} を一つも指定しない場合は、標準入力が読み込まれる。
5456 @var{file} を 1 個以上指定した場合、それは入力ファイルの名前であり、
5457 入力ファイルはすべて順番に、あたかもすべてのファイルが結合されているかのように読み込まれる。
5458 とは言え、各ファイル同士は文脈的に完全に分離しており、
5459 参照箇所情報の自動作成を指定している場合に、参照箇所のファイル名や行番号が指し示すのは、
5460 個々の入力テキストファイルのそれである。
5461 どの場合でも、@command{ptx} は、パミューテド・インデックスを標準出力に出力する。
5462
5463 GNU による拡張が有効になっていない場合、すなわち、プログラムが従来モードで動作する場合は、
5464 オプションのほかに 0 から 2 個のパラメータを指定できる。パラメータがない場合、
5465 プログラムは標準入力を読み込んで、標準出力にパミューテド・インデックスを出力する。
5466 パラメータが 1 個だけの場合、それが示しているのは、標準入力の代わりに読み込まれるテキストファイル
5467 (訳注: 上記書式の @var{input}) の名前である。
5468 パラメータが二つある場合、それぞれが示しているのは、読み込み対象の @var{input}
5469 ファイルと出力先の @var{output} ファイルの名前だ。
5470 この場合、二番目のパラメータによって指定されたファイルの元の内容が破壊されることに、
5471 くれぐれも気をつけていただきたい。この動作は、System V の @command{ptx}
5472 との互換性を維持するために必要になっているものだが、
5473 通常 GNU の規格では、オプションによって指定されるのではない出力パラメータを、使用しないように勧めている。
5474
5475 オプションの値や入力テキストファイルとして指定するいかなるファイルに対しても、
5476 ファイル名の代わりに 1 個のダッシュ @samp{-} を使用することができる。
5477 その場合は、標準入力が使われることになる。もっとも、この習慣をプログラム
5478 1 回の起動につき 1 回以上使うのは、たぶん理屈に合わない。
5479
5480 @menu
5481 * General options in ptx::   プログラム全体の動作に関係するオプション。
5482 * Charset selection in ptx:: 使用している文字セットについて。
5483 * Input processing in ptx::  入力のフィールドと文脈、及びキーワードの選択。
5484 * Output formatting in ptx:: 出力フォーマットのタイプ、及びフィールドの幅。
5485 * Compatibility in ptx::     
5486 @end menu
5487
5488
5489 @node General options in ptx
5490 @subsection 一般オプション
5491
5492 @table @samp
5493
5494 @item -G
5495 @itemx --traditional
5496 すでに述べたように、このオプションは @command{ptx} に対する
5497 GNU による拡張のすべてを無効にして、動作を従来モードに切り替える。
5498
5499 @item --help
5500 簡単なヘルプメッセージを標準出力に表示し、それ以上の処理をせずに終了する。
5501
5502 @item --version
5503 プログラムのバージョンを標準出力に表示し、それ以上の処理をせずに終了する。
5504
5505 @end table
5506
5507 @exitstatus
5508
5509
5510 @node Charset selection in ptx
5511 @subsection @command{ptx} が使用する文字セット
5512
5513 @c FIXME:  People don't necessarily know what an IBM-PC was these days.
5514 現在の設定では、@command{ptx} プログラムは、入力ファイルが符号化に
5515 8-bit の ISO 8859-1 コード (Latin-1 文字セットとも言われる)
5516 を使用していると見なすようになっている。
5517 ただし、MS-DOS 用にコンパイルされている場合は別で、
5518 その場合は、IBM-PC の文字セットが使用される (GNU の @command{ptx} が
5519 MS-DOS マシンで使えるかどうか、今ではわからないけれど)。
5520 7-bit ASCII と比べると、ISO 8859-1 の文字セットは、アルファベットの部分が異なっている。
5521 そのため、正規表現におけるマッチングの振る舞いが変わってくる。
5522 キーワードに対するデフォルトの正規表現が (訳注: つまり、GNU の拡張が有効なときの
5523 @samp{\w+} が)、英語で使用しない文字や、ウムラウトやアクセントのような発音区別符の付いた文字を受け入れることになるのである。
5524 とは言え、キーワードのソート方法は今だに大雑把であり、使用している文字セットの順序にきわめて盲目的に従っている。
5525
5526 @table @samp
5527
5528 @item -f
5529 @itemx --ignore-case
5530 @opindex -f
5531 @opindex --ignore-case
5532 ソートするとき、小文字を大文字と同じものとして扱う。
5533
5534 @end table
5535
5536
5537 @node Input processing in ptx
5538 @subsection 単語の選択と入力の処理
5539
5540 @table @samp
5541
5542 @item -b @var{file}
5543 @itemx --break-file=@var{file}
5544 @opindex -b
5545 @opindex --break-file
5546
5547 このオプションを使えば、単語を構成するのはどんな文字かを、@option{-W}
5548 とは別のやり方で定義することができる。このオプションでファイルを指名し、
5549 そこに、単語の構成要素になることができない文字のリストを入れておくのである。
5550 このファイルは、@dfn{Break file} と呼ばれる。Break file
5551 に含まれていないいかなる文字も、単語の構成要素になるわけだ。@option{-b}
5552 と @option{-W} の両方のオプションが指定されている場合は、@option{-W}
5553 の方が優先され、@option{-b} は無視される。
5554
5555 GNU の拡張が有効になっているとき、改行を単語区切り文字 (break character)
5556 にしない唯一の方法は、単語区切り文字をすべて Break file に書き込み、
5557 そこに改行を全く含めないことである。Break file 末尾の改行も除かなければならない。
5558 GNU の拡張が無効な場合、スペース、タブ、改行は、それが Break file
5559 に含まれていなくても、常に単語区切り文字と見なされる。
5560
5561 @item -i @var{file}
5562 @itemx --ignore-file=@var{file}
5563 @opindex -i
5564 @opindex --ignore-file
5565
5566 このオプションで指名するファイルには、
5567 出力するコンコーダンスでキーワードとして採用しない単語のリストを入れておく。
5568 このファイルは、@dfn{Ignore file} と呼ばれる。
5569 このファイルは、1 行 1 単語の形式であり、単語の分離は常に行末によって行われて、
5570 @option{-S} オプションの値の影響を受けることはない。
5571
5572 @item -o @var{file}
5573 @itemx --only-file=@var{file}
5574 @opindex -o
5575 @opindex --only-file
5576
5577 このオプションで指名するファイルには、
5578 出力するコンコーダンスでキーワードとして採用する単語のリストを入れておく。
5579 このファイルに書かれていないどんな単語も、キーワードとして採用されることはない。
5580 このファイルは、@dfn{Only file} と呼ばれる。
5581 このファイルは、1 行 1 単語の形式であり、単語の分離は常に行末によって行われて、
5582 @option{-S} オプションの値の影響を受けることはない。
5583
5584 Only file として使われるデフォルトのファイルは存在しない。Only file
5585 と Ignore file の両方が指定されている場合に、ある単語がキーワードと見なされるのは、
5586 その単語が Only file に存在し、しかも Ignore file に存在しないときだけである。
5587
5588 @item -r
5589 @itemx --references
5590 @opindex -r
5591 @opindex --references
5592
5593 各入力行において、行頭にあるホワイトスペース以外の文字の連続を参照箇所情報
5594 (訳注: たとえば、ファイル名、ページ番号、行番号など)
5595 として扱うようにする。この参照箇所情報は、その入力行がどこにあるかを、
5596 作成されるパミューテド・インデックス中で示すために用いられる。
5597 参照箇所情報の生成についての詳細は、次節「出力のフォーマット」を御覧いただきたい。
5598 @xref{Output formatting in ptx}.
5599 このオプションを使用すると、@option{-S} オプションのデフォルトの値が変更されることになる
5600 (訳注: すなわち、GNU の拡張が有効な場合も、@option{-S} オプションのデフォルト値が文末ではなく、行末になる)。
5601
5602 このオプションを使用したとき、@command{ptx} プログラムは、参照箇所情報が出力される文脈に混入しないようにするが、
5603 その試みはそれほど徹底したものではない。しかし、文脈が改行できちんと終止していれば、
5604 @command{ptx} はその試みに成功する。もし、@option{-r} オプションが
5605 @option{-S} オプションのデフォルト値とともに使われているか、
5606 あるいは、GNU の拡張が無効になっているならば、この条件は必ず満たされることになる。
5607 従って、その場合は、参照箇所情報が出力される文脈からきちんと分離される。
5608
5609 (訳注: 文脈 (context) というのは、
5610 出力については、キーワードとその前後と考えておけばよいが、入力について言うと、
5611 @command{ptx} が操作の対象にする本文の単位 --- 入力のまとまり --- を指すことになる。
5612 @option{-S} の値によって、普通は文か、行になる。)
5613
5614 @item -S @var{regexp}
5615 @itemx --sentence-regexp=@var{regexp}
5616 @opindex -S
5617 @opindex --sentence-regexp
5618
5619 このオプションでは、行の終わり、または文の終わりを示す正規表現を指定する。
5620
5621 (訳注: もう少し説明すると、このオプションで指定するのは、
5622 入力を何で区切るかということである。改行で区切れば、いわゆる行が、@command{ptx}
5623 の操作の対象となる入力のまとまり (入力の単位) になり、
5624 ピリオドなどで区切れば、いわゆる文が、入力のまとまりになる。
5625 このまとまりが @command{ptx} にとっての文脈でもある。
5626 ただし、出力では、文脈のすべてが表示されるとはかぎらない。
5627 なお、そうしたければ、行末や文末以外で入力を区切ることもできる。)
5628
5629 実際のテキストでは、ここで指定される正規表現のみが、
5630 行の終わりや文の終わりの指標として使われているとはかぎらない。
5631 また、入力の区切りに何を指定しようとも、このオプションの外で特別な意味を持つことはない
5632 (訳注: すなわち、オプション @option{-A}, @option{-i}, @option{-o}
5633 などには影響が及ばない)。デフォルトでは、GNU の拡張が有効なとき、@option{-r}
5634 オプションが指定されていなければ、文の終わりの方が入力の区切りとして使われる。
5635 その場合は、GNU Emacs から取り込まれた次の正規表現が使用される。
5636
5637 @example
5638 [.?!][]\"')@}]*\\($\\|\t\\|  \\)[ \t\n]*
5639 @end example
5640
5641 GNU の拡張が無効になっている場合や、@option{-r} オプションが指定されている場合は、
5642 行の終わりの方が入力の区切りとして使用される。
5643 その場合、デフォルトの正規表現は、単に次のものである。
5644
5645 @example
5646 \n
5647 @end example
5648
5649 空の @var{regexp} を使用するのは、行末や文末の認識を全く無効にするのと同じである。
5650 その場合、ファイル全体が、たった 1 個の長い行、あるいは、長い文と見なされることになる。
5651 ユーザとしては、オプション @option{-F ""}
5652 を使用して、省略の印の生成も全く行わないようにしたくなるかもしれない。
5653 @xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
5654 Manual}.
5655
5656 キーワードがたまたま入力行や入力文の先頭近くにあると、
5657 出力する文脈行の行頭に、使用しない領域が生ずることがよくある。
5658 また、キーワードが入力行や入力文の末尾近くにあると、
5659 出力する文脈行の行末に、使用しない領域がしばしば生ずる。
5660 @command{ptx} プログラムは、その文脈を折り返して、そうした不使用領域を埋めようと試みる。
5661 すなわち、その入力行や入力文の後続する部分 (@var{tail}) を使って、
5662 出力する行の左にある不使用領域を埋め、その入力行や入力文の先行する部分
5663 (@var{head}) を使って、出力する行の右にある不使用領域を埋めるのである。
5664
5665 このオプションの引数中では、ユーザーの便宜のために、
5666 C 言語由来のよく使うバックスラッシュ・エスケープシーケンスの多くが、@command{ptx}
5667 そのものによって認識され、対応する文字に変換されるようになっている。
5668
5669 @item -W @var{regexp}
5670 @itemx --word-regexp=@var{regexp}
5671 @opindex -W
5672 @opindex --word-regexp
5673
5674 このオプションでは、各キーワードとなる単語とはどのようなものかを示す正規表現を指定する。
5675 デフォルトでは、GNU の拡張が有効になっていれば、単語とはアルファベットの文字の連続である。
5676 すなわち、使用される正規表現は @samp{\w+} だ。
5677 GNU の拡張が無効な場合、デフォルトで単語と見なされるのは、
5678 何であれ、スペース、タブ、改行で区切られているものである。
5679 この場合、使用される正規表現は @samp{[^ \t\n]+} になる。
5680
5681 @var{regexp} に空の文字列を指定するのは、このオプションを使用しないのと同じことである。
5682 @xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
5683 Manual}.
5684
5685 このオプションの引数中では、ユーザーの便宜のために、
5686 C 言語で見られるような、よく使うバックスラッシュ・エスケープシーケンスの多くが、
5687 @command{ptx} そのものによって認識され、対応する文字に変換されるようになっている。
5688
5689 @end table
5690
5691
5692 @node Output formatting in ptx
5693 @subsection 出力のフォーマット
5694
5695 出力のフォーマットを決めるのは、主として @option{-O} と @option{-T} オプションだが、
5696 両者については、以下のオプション一覧で説明している。@option{-O} も @option{-T}
5697 も指定されず、しかも、GNU の拡張が有効な場合、@command{ptx} プログラムは、
5698 ダム端末に適した出力フォーマットを選択する。
5699 各キーワードは一行の中央に表示され、前後の文脈がその左右に出力される。
5700 コンコーダンスとしての出力が一目でわかるように
5701 (訳注: すなわち、どれがキーワードで、どれがその前後の語句かわかりやすいように)、
5702 各フィールドはきちんと揃えられる。おまけの機能として、次のものがある。
5703 参照箇所情報の自動作成が @option{-A} オプションによって選択され、
5704 参照箇所が左側の文脈の前に表示される場合には
5705 (すなわち、@option{-R} オプションが選択されていない場合には)、
5706 参照箇所の後ろにコロンが追加される。こうしておくと、参照箇所を
5707 GNU Emacs の @code{next-error} 処理にうまく渡せるようになるのである。
5708 このデフォルトの出力フォーマットでは、改行やタブのようなホワイトスペース文字は、
5709 それぞれ単にただ 1 個のスペースに変換されるだけであり、
5710 連続するスペースをわざわざ圧縮するようなことは行われない。
5711 この動作は、将来変更されるかもしれない。そうしたホワイトスペース文字を除いて、
5712 使用している 256 文字からなる文字セット中のほかのすべての文字は、
5713 入力から出力へと手を加えずにそのまま送り出される。
5714
5715 出力フォーマットは、以下のオプションによって、さらに制御される。
5716
5717 @table @samp
5718
5719 @item -g @var{number}
5720 @itemx --gap-size=@var{number}
5721 @opindex -g
5722 @opindex --gap-size
5723
5724 出力行の各フィールドは、ホワイトスペースによって区切られるが、
5725 そのフィールド同士の間隔の最小サイズを指定する。
5726
5727 @item -w @var{number}
5728 @itemx --width=@var{number}
5729 @opindex -w
5730 @opindex --width
5731
5732 最終的に出力される各行の最大長を指定する。
5733 参照箇所を使用する際、その長さが最大長に含まれるかどうかは、
5734 @option{-R} オプションを付けるか付けないかよって決まる。
5735 @option{-R} オプションを指定しない場合、
5736 すなわち、参照箇所が左の文脈より前に表示される場合は、すべての参照箇所中の最大長が、
5737 出力行の最大長の長さの内に含まれることになる。@option{-R}
5738 オプションを指定した場合、すなわち、参照箇所が右の文脈より後に表示される場合は、
5739 参照箇所や、それに先行するフィールドの区切りが占める領域は、
5740 出力行の最大長の長さに含まれない。
5741
5742 @item -A
5743 @itemx --auto-reference
5744 @opindex -A
5745 @opindex --auto-reference
5746
5747 参照箇所情報の自動生成を選択する。
5748 ファイル名と行番号からなる参照箇所が自動的に生成されて、各入力行に付くことになる。
5749 ファイル名と行番号は 1 個のコロンで区切られる。
5750 ただし、標準入力から読み込んでいる場合は、ファイル名は空になる。
5751 @option{-A} と @option{-r} の両方のオプションが指定されている場合は、
5752 入力中にある参照箇所情報が読み込まれた上で本文から外されることは @option{-r}
5753 単独の場合と同じだが、出力時に使用されるのは、自動生成された参照箇所の方である。
5754 すなわち、入力中にある参照箇所情報は、自動生成されたもので置き換えられる。
5755
5756 @item -R
5757 @itemx --right-side-refs
5758 @opindex -R
5759 @opindex --right-side-refs
5760
5761 デフォルトの出力フォーマットでは、@option{-R} オプションを使用しない場合、
5762 @option{-r} や @option{-A} オプションの働きによって生成される参照箇所は、
5763 出力行の左の端、すなわち、左の文脈の前に表示される。それに対して、
5764 デフォルトの出力フォーマットで @option{-R} オプションを指定した場合、
5765 参照箇所が表示されるのは、各出力行の右端、すなわち、右の文脈の後ろになる。
5766 ほかのいかなる出力フォーマットにおいても、基本的に @option{-R}
5767 オプションは無視されるが (訳注: デフォルト以外の出力フォーマットでは、
5768 @option{-R} オプションがあってもなくても、参照箇所は右端に出力される)、
5769 それでも、@option{-R} オプションが付いていると、参照箇所の長さが、@option{-w}
5770 で指定した出力行全体の長さの内に入らないという働きだけは残る。
5771
5772 このオプションは、GNU の拡張が無効であるときは、常に自動的に選択される。
5773
5774 @item -F @var{string}
5775 @itemx --flag-truncation=@var{string}
5776 @opindex -F
5777 @opindex --flag-truncation
5778
5779 このオプションを指定すると、出力に省略があった場合、それを示すために文字列 @var{string}
5780 を使用するようになる。ほとんどの出力フィールドは、理論上では、@option{-S}
5781 オプションで何を選択するかによって、現在の行、または、現在の文の、先頭や末尾に向かって伸びて行くものである。
5782 しかし、@option{-w} オプションによって長さを変更できるとは言え、
5783 出力行には許される最大長というものがあり、
5784 その最大長はさらにさまざまな出力フィールドで使用する領域に分割されている。
5785 従って、フィールドは、それを収納する現在の出力行の先頭や末尾を越えて伸ばすことができないために、
5786 切り詰めなければならないことがあり、そういうときに、省略が行われるのである。
5787 省略の指標として使用されるデフォルトの文字列は、1 個のスラッシュである。
5788 これは、@option{-F /} と指定した場合と同じだ。
5789
5790 @var{string} には、@option{-F @dots{}} のように 1 個以上の文字を指定してもよい。
5791 また、@var{string} が空文字列 (@option{-F ""}) の場合には、
5792 省略のフラグは立てられないことになり、従って、省略の指標は一切付加されない。
5793
5794 このオプションの引数中では、ユーザーの便宜のために、
5795 C 言語で見られるような、よく使うバックスラッシュ・エスケープシーケンスの多くが、
5796 @command{ptx} そのものによって認識され、対応する文字に変換されるようになっている。
5797
5798 @item -M @var{string}
5799 @itemx --macro-name=@var{string}
5800 @opindex -M
5801 @opindex --macro-name
5802
5803 @command{nroff} や @command{troff}、あるいは @TeX{}
5804 で処理するのにふさわしい出力フォーマットを生成するとき、
5805 @samp{xx} の代わりに使用する別の文字列 @var{string} を指定する。
5806 (訳注: @option{-O} や @option{-T} オプションを参照。)
5807
5808 @item -O
5809 @itemx --format=roff
5810 @opindex -O
5811 @opindex --format=roff
5812
5813 出力フォーマットとして、@command{nroff} や @command{troff}
5814 で処理するのに適した形式を選択する。各出力行は次のようになる。
5815 (訳注: 下記の @var{tail} と @var{head} については、前節 @option{--sentence-regexp}
5816 オプションの説明の終わりから 2 番目のパラグラフをご覧いただきたい。
5817 @var{ref} は参照箇所である。)
5818
5819 @smallexample
5820 .xx "@var{tail}" "@var{before}" "@var{keyword_and_after}"@c
5821  "@var{head}" "@var{ref}"
5822 @end smallexample
5823
5824 従って、あとは、出力の整形を担当する roff のマクロ @samp{.xx}
5825 を出力ファイルに書き込めばよいことになる。この出力フォーマットは、
5826 GNU の拡張が無効なときのデフォルトである。@samp{xx} を別のマクロ名に変更するには、
5827 @option{-M} オプションを使用すればよい
5828 (訳注: @option{-M "xx"} のように、@samp{xx} の部分のみ指定する)。
5829
5830 この出力フォーマットでは、改行やタブのような非表示文字は、
5831 それぞれただ 1 個のスペースに変換されるだけで、
5832 連続するスペースをわざわざ圧縮するようなことは行われない。
5833 ダブルクォート文字 @samp{"} はそれぞれ二重化されるので、
5834 @command{nroff} や @command{troff} によって正しく処理される。
5835
5836 @item -T
5837 @itemx --format=tex
5838 @opindex -T
5839 @opindex --format=tex
5840
5841 出力フォーマットとして、@TeX{} で処理するのに適した形式を選択する。
5842 各出力行は、次のようになる。
5843 (訳注: 下記の @var{tail} と @var{head} については、前節 @option{--sentence-regexp}
5844 オプションの説明の終わりから 2 番目のパラグラフをご覧いただきたい。
5845 @var{ref} は参照箇所である。)
5846
5847 @smallexample
5848 \xx @{@var{tail}@}@{@var{before}@}@{@var{keyword}@}@c
5849 @{@var{after}@}@{@var{head}@}@{@var{ref}@}
5850 @end smallexample
5851
5852 @noindent
5853 従って、あとは、出力の整形を担当する @code{\xx} コマンドの定義を出力ファイルに書き込めばよいことになる。
5854 なお、参照箇所の生成が行われていない場合、すなわち、@option{-A} オプションも
5855 @option{-r} オプションも指定されていない場合には、
5856 各 @code{\xx} 呼び出しの最後の引数は出力されないことに注意していただきたい。
5857 @samp{xx} を別のマクロ名に変更するには、@option{-M} オプションを使用すればよい
5858 (訳注: @option{-M "xx"} のように、@samp{xx} の部分のみ指定する)。
5859
5860 この出力フォーマットでは、@samp{$}, @samp{%}, @samp{&}, @samp{#}, @samp{_}
5861 のような特殊文字のいくつかは、自動的にバックスラッシュで保護される。
5862 波カッコ @samp{@{}, @samp{@}} は、一対のドル記号とバックスラッシュとで保護される
5863 (強引に数式モードにするわけだ)。
5864 バックスラッシュそのものは、@code{\backslash@{@}} というシーケンスになる。
5865 同形の他の文字と区別するために文字の上下に付ける発音区別符のうち、
5866 サーカムフレックスとチルダは、それぞれ @code{\^@{ @}} と @code{\~@{ @}}
5867 というシーケンスになる (訳注: 実際には @code{@{ @}} の位置に
5868 a  なり e なりといった文字が来る)。
5869 使用している文字セット中の他の発音区別符が付いている文字についても、
5870 可能なかぎり、適切な @TeX{} のシーケンスが生成される。それ以外の文字について言うと、
5871 改行やタブのような非表示文字や、ASCII の文字セットに属さない他のすべての文字は、
5872 単にただ 1 個のスペースに変換され、連続するスペースをわざわざ圧縮するようなことは行われない。
5873 @TeX{} のための特殊文字の処理は以上のようなものだが、
5874 改善する方法があれば、作者までお知らせいただきたい。
5875
5876 @end table
5877
5878
5879 @node Compatibility in ptx
5880 @subsection GNU による @command{ptx} の拡張
5881
5882 このバージョンの @command{ptx} には、System V の @command{ptx}
5883 には存在しない機能がいくつかある。
5884 そうした追加機能は、コマンドラインオプションの @option{-G} を使えば、働かなくなるが、
5885 ほかのコマンドラインオプションによって上書きされれば、話は別である。
5886 もっとも、GNU の拡張の中には、上書きによって回復できないものもあるので、
5887 GNU の拡張を使いたければ、@option{-G} オプションを最初から使わないのが、
5888 すっきりした方法だ。以下に、このプログラムと
5889 System V の @command{ptx} の相違点を挙げておく。
5890
5891 @itemize @bullet
5892
5893 @item
5894 このプログラムでは、一度に複数の入力ファイルを読み込むことができる。
5895 また、生成したコンコーダンスは、常に標準出力に書き出される。
5896 それに対して、System V の @command{ptx} は、ファイルをたった 1 個しか読み込まず、
5897 結果を書き出すのは、標準出力のこともあるが、コマンドに 2 番目の @var{file}
5898 パラメータが指定されていれば、その @var{file} に対してである。
5899
5900 オプションで指定しない出力パラメータを持つのは、危険な習慣であり、
5901 GNU では、できるだけ避けるようにしている。従って、@command{ptx} を GNU と
5902 System V のどちらでも、問題なく同じように使いたいなら、入力ファイルは常に一つしか使わず、
5903 実行結果は常に標準出力に書き出されるものと考えておいた方がよい。
5904 また、@command{ptx} を使用してアプリケーションを作成する場合には、
5905 インストールされている @command{ptx} で @option{-G} オプションが使用できるとわかれば、
5906 @command{ptx} を呼び出すとき、@option{-G} オプションを必ず付けるようにしたくなるかもしれない。
5907
5908 @item
5909 System V の @command{ptx} で利用できるオプションは、@option{-b}, @option{-f}, @option{-g},
5910 @option{-i},
5911 @option{-o}, @option{-r}, @option{-t}, @option{-w} だけである。
5912 他のオプションは、すべて GNU の拡張だが、今この箇条書きで繰り返すことはしない。
5913 なお、オプションの中には、以下でも述べているように、GNU の拡張が有効になっていると、
5914 効果が少し変わるものもある。
5915
5916 @item
5917 GNU の拡張のデフォルトでは、コンコーダンス出力のフォーマットは、
5918 @command{troff} や @command{nroff} 向けになっていない。
5919 むしろ、ダム端末向けのフォーマットになっている。@command{troff} や
5920 @command{nroff} 向けの出力を選択したかったら、@option{-O} オプションを使用すればよい。
5921
5922 @item
5923 @option{-R} オプションを使用しないと、
5924 参照箇所の最大長が、出力行全体の長さから差し引かれる。
5925 GNU の拡張を無効にすると、参照箇所の長さは、出力行の長さの勘定に入らないことになる。
5926
5927 @item
5928 GNU の拡張が無効になっていても、256 バイトの文字セットのすべての文字が ---
5929 ASCII NUL バイト含めて --- 常に入力ファイルから読み込まれて処理され、
5930 有害な作用をもたらすことはない。それに対して、
5931 System V の @command{ptx} は、8-bit の文字を受け付けない。
5932 若干の制御文字も拒否する。また、チルダ @samp{~} も拒否する。
5933
5934 @item
5935 GNU の拡張が無効になっていても、入力行の長さは、利用できるメモリによってしか制限されない。
5936 それに対して、System V の @command{ptx} が処理の対象にするのは、
5937 各行に付き最初の 200 文字だけである。
5938
5939 @item
5940 単語区切り文字 (break character、単語を構成しない文字) のデフォルトは、
5941 使用している文字セットにおけるアルファベットのすべての文字
5942 (発音区別符のあるなしを問わない) 以外のあらゆる文字である。
5943 GNU の拡張が無効な場合は、単語区切り文字のデフォルトは、スペース、タブ、改行のみになる。
5944
5945 @item
5946 このプログラムは、出力行の長さを System V の @command{ptx} より上手に処理する。
5947 GNU の拡張が無効になっている場合、このプログラムは System V
5948 の @command{ptx} の動作をなるべく真似ようとするが、
5949 それでも、System V のちょっとした癖のいくつかは、完全には再現できない。
5950
5951 @item
5952 ユーザは Ignore file と Only file の両方を指定することができる。
5953 System V の @command{ptx} では、そんなことはできない。
5954
5955 @end itemize
5956
5957
5958 @node tsort invocation
5959 @section @command{tsort}: トポロジカル・ソート
5960
5961 @pindex tsort
5962 @cindex topological sort
5963
5964 @command{tsort} は、指定された @var{file} に対してトポロジカル・ソートを行う。
5965 入力ファイルが指定されていない場合や、@var{file} として @samp{-}
5966 が指定されている場合は、標準入力を対象にする。
5967 より詳しい説明や、このコマンドが作成された経緯については、次節「@command{tsort}:
5968 誕生の背景」を御覧になっていただきたい。 @ref{tsort background}
5969
5970 書式:
5971
5972 @example
5973 tsort [@var{option}] [@var{file}]
5974 @end example
5975
5976 @command{tsort} は入力を、空白で区切られた 2 個一組の文字列として読み込む。
5977 そうした文字列の各組は、部分的な順序を示している。
5978 出力は、与えられた部分的な順序に対応する全体としての順序である。
5979
5980 例を挙げよう。
5981
5982 @example
5983 tsort <<EOF
5984 a b c
5985 d
5986 e f
5987 b c d e
5988 EOF
5989 @end example
5990
5991 @noindent
5992 (訳注: 上の例は、"a b/c d/e f/b c/d e" という組を与えている。)
5993
5994 出力は、こうなる。
5995
5996 @example
5997 a
5998 b
5999 c
6000 d
6001 e
6002 f
6003 @end example
6004
6005 もっと現実的な例を考えてみよう。たくさんの関数をすべて一つのファイルに書いているとしよう。
6006 しかも、一つを除いて、他のすべての関数を static として宣言している。
6007 現在のところ、その例外 (@code{main} ということにする)
6008 が、ファイル中で定義されている最初の関数であり、それが直接呼び出す関数群がそれに続き、
6009 さらにその後に、その関数群が呼び出す関数が続く @dots{}
6010 という形になっている。さて、ここで、プロトタイプを利用することにしたとしよう。
6011 そうなると、呼び出される関数のすべてを宣言するか
6012 (そのためには、定義の部分から情報をどっさりコピーしなければならない)、
6013 あるいは、できるだけ多くの関数が、使用される前に定義されているように、
6014 関数群を並べ替えるか、どちらかを選ばなければならない。
6015 後者の作業を自動化する方法の一つが、各関数についてそれが直接呼び出す関数のリストを作成することである。
6016 そうしたリストを生成するプログラムはたくさんある。
6017 いわゆるコール・グラフを作成するプログラムだ。
6018 以下のリストをご覧になっていただきたい。
6019 各行は、左側の関数が右側の関数を直接呼び出していることを示している。
6020
6021 @example
6022 main parse_options
6023 main tail_file
6024 main tail_forever
6025 tail_file pretty_name
6026 tail_file write_header
6027 tail_file tail
6028 tail_forever recheck
6029 tail_forever pretty_name
6030 tail_forever write_header
6031 tail_forever dump_remainder
6032 tail tail_lines
6033 tail tail_bytes
6034 tail_lines start_lines
6035 tail_lines dump_remainder
6036 tail_lines file_lines
6037 tail_lines pipe_lines
6038 tail_bytes xlseek
6039 tail_bytes start_bytes
6040 tail_bytes dump_remainder
6041 tail_bytes pipe_bytes
6042 file_lines dump_remainder
6043 recheck pretty_name
6044 @end example
6045
6046 ここで @command{tsort} を使用すると、
6047 こうした関数について、上記の後者の要求を満たすような順番を作成することができる。
6048
6049 @example
6050 example$ tsort call-graph | tac
6051 dump_remainder
6052 start_lines
6053 file_lines
6054 pipe_lines
6055 xlseek
6056 start_bytes
6057 pipe_bytes
6058 tail_lines
6059 tail_bytes
6060 pretty_name
6061 write_header
6062 tail
6063 recheck
6064 parse_options
6065 tail_file
6066 tail_forever
6067 main
6068 @end example
6069
6070 @command{tsort} は、入力にループがあれば検出し、
6071 出会った最初のループを標準エラーに書き出す。
6072
6073 一般に、ある部分的な順序に対して、唯一の全体的な順序というものは存在しないことに、
6074 留意していただきたい。上記のコール・グラフの場合で言えば、
6075 関数 @code{parse_options} は、@code{main} の前でありさえすれば、
6076 リストのどこにでも来ることができる。
6077
6078 オプションは、@option{--help} と @option{--version} だけである。
6079 @xref{Common options}.
6080
6081 @exitstatus
6082
6083 @menu
6084 * tsort background::         tsort が誕生した経緯。
6085 @end menu
6086
6087 @node tsort background
6088 @subsection @command{tsort}: 誕生の背景
6089
6090 @command{tsort} が存在しているのは、Unix のリンカのごく初期のバージョンでは、
6091 一つのアーカイブファイルの処理をたった一回しか行わず、
6092 それも、ファイルの最初から最後へと順番に見ていくだけだったからである。当時の
6093 @command{ld} は、アーカイブ中の各オブジェクトを読み込むとき、
6094 そのオブジェクトがプログラムに必要かどうかの判断を、
6095 リンク作業のその時点でまだ定義されていない何らかのシンボルを定義しているかどうかを基準にして行っていた。
6096
6097 そのため、アーカイブ中の依存関係には、特別な扱いが必要になった。
6098 たとえば、@code{scanf} はたぶん @code{read} を呼んでいる。
6099 それは、リンカがアーカイブをたった一回最初から順番に読んで行くとき、@code{scanf.o}
6100 が @code{read.o} より前にあることが重要だったということである。
6101 なぜなら、そうなっていないと、@code{scanf} を呼ぶけれど、@code{read}
6102 を呼ばないプログラムでは、@code{read} に対する参照が、予期に反して
6103 "unresolved" になってしまいかねなかったからだ。
6104
6105 この問題に対処する方法は、次のようなものだった。
6106 まず、オブジェクトファイル同士の依存関係の集合を生成した。
6107 この作業は、@command{lorder} というシェルスクリプトによって行われていた。
6108 筆者の知るかぎり、現在 GNU では lorder というツールを提供していないが、
6109 BSD 系のディストリビューションでは、今でもなお見つけることができる。
6110
6111 次に、この @command{lorder} の出力に対して @command{tsort} を実行した。
6112 そして、そのソートされた結果を使って、アーカイブにオブジェクトを追加する順番を決めたのである。
6113
6114 こうした作業全体が、1980 年ごろから時代遅れのものになった。
6115 というのは、Unix のアーカイブは現在ではシンボル・テーブルを内蔵しており
6116 (従来は @command{ranlib} によって作られていたが、今ではたいてい @command{ar}
6117 そのものによって作られている)、Unix のリンカはこのシンボル・テーブルを使用して、
6118 アーカイブファイルに対する複数回の読み込みを効率的に行うからである。
6119
6120 ともあれ、これが tsort が誕生した経緯である。
6121 すなわち、当時のリンカのアーカイブファイルを取り扱う方法に問題があり、
6122 その問題を解決するための工夫だったのだ。
6123 そして、その問題は、その後、別のやり方で解決されるようになったのである。
6124
6125
6126 @node Operating on fields
6127 @chapter フィールド操作
6128
6129 @menu
6130 * cut invocation::           各行の選択した部分を表示する。
6131 * paste invocation::         複数のファイルの各行をマージする。
6132 * join invocation::          共通のフィールドに基づいて行を連結する。
6133 @end menu
6134
6135
6136 @node cut invocation
6137 @section @command{cut}: 各行の選択した部分を表示する
6138
6139 @pindex cut
6140 @command{cut} は、各ファイルから各行の一部を抜き出して、標準出力に書き出す。
6141 ファイルが指定されていない場合や、ファイル名として @samp{-}
6142 が指定されている場合は、標準入力を対象とする。
6143
6144 書式:
6145
6146 @example
6147 cut @var{option}@dots{} [@var{file}]@dots{}
6148 @end example
6149
6150 以下のオプション一覧で @var{byte-list}, @var{character-list}, @var{field-list}
6151 と表記されているものは、コンマで区切られた、1 個以上の数字や範囲からなるリストである
6152 (範囲は、ダッシュを間に挟む 2 個の数字)。バイト、文字、フィールドは 1 から数える。
6153 不完全な範囲を指定することもでき、@option{-@var{m}} は @samp{1-@var{m}}
6154 と同じことであり、@samp{@var{n}-} は @samp{@var{n}}
6155 から行末、あるいは最後のフィールドまでと同じことである。
6156 リストの要素は、繰り返してもよく、部分的に重なり合ってもよく、どんな順序で指定してもよい。
6157 ただし、入力中の選択した部分が書き出されるのは、読み込まれたときと同じ順序であり、
6158 しかも、ただ一度だけである。(訳注: たとえば、@samp{-f 3,1,3}
6159 などと指定することはできるが、出力されるときは field-1, field-3
6160 の順番であり、field-3 が二度出力されることもない。)
6161
6162 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
6163
6164 @table @samp
6165
6166 @item -b @var{byte-list}
6167 @itemx --bytes=@var{byte-list}
6168 @opindex -b
6169 @opindex --bytes
6170 @var{byte-list} で指定された位置にあるバイトのみを選択して、表示する。
6171 タブやバックスペースも他の文字と同様に扱う。
6172 すなわち、そうしたものも 1 バイトを占める。出力用のデリミタ (delimiter、区切りの印)
6173 が指定されている場合は (@option{--output-delimiter} の説明を参照)、
6174 選択されたバイトからなる範囲同士の間にデリミタ文字列を出力する。
6175
6176 @item -c @var{character-list}
6177 @itemx --characters=@var{character-list}
6178 @opindex -c
6179 @opindex --characters
6180 @var{character-list} で指定された位置にある文字のみを選択して、表示する。
6181 現在のところ、@option{-b} と同じだが、プログラムの国際化が進むと、
6182 動作が変わることになるだろう。タブやバックスペースも他の文字と同様に扱う。
6183 すなわち、そうしたものも 1 文字と数える。
6184 出力用のデリミタが指定されている場合は (@option{--output-delimiter} の説明を参照)、
6185 選択された文字からなる範囲同士の間にデリミタ文字列を出力する。
6186
6187 @item -f @var{field-list}
6188 @itemx --fields=@var{field-list}
6189 @opindex -f
6190 @opindex --fields
6191 @var{field-list} で指定されたフィールドのみを選択して、表示する。
6192 フィールドの区切りは、デフォルトではタブ文字 1 個である。
6193 なお、@option{--only-delimited} (@option{-s}) オプションが指定されていない場合は、
6194 デリミタ文字を全く含まない行も表示する。
6195
6196 一言言っておくと、@command{awk} を使えば、もっと洗練されたフィールド処理ができるようになる。
6197 たとえば、フィールドの順番を入れ替える、
6198 空白文字を入れて列が揃うようにしたフィールドを取り扱う、そういったことが可能になる。
6199 @command{awk} ならデフォルトで、フィールドの区切りに空白文字の連続を使用し
6200 (そして、フィールドの前後から除去し)、さらに、行頭と行末の空白を無視してくれるのだ。
6201 @example
6202 @verbatim
6203 awk '{print $2}'      # 2 番目のフィールドを表示する
6204 awk '{print $(NF-1)}' # 最後から 2 番目のフィールドを表示する
6205 awk '{print $2,$1}'   # 最初の 2 フィールドを逆に並べる
6206 @end verbatim
6207 @end example
6208 @command{cut} では、任意の順番でフィールドを指定することができるが、
6209 出力は常にファイル中で出会った順番であることに注意していただきたい。
6210
6211 ありそうにないことだが、@command{awk} が利用できない状況だとしよう。
6212 その場合は、@command{join} コマンドを使えば、
6213 上記で @command{awk} がやっているように、空白文字を処理することができる。
6214 @example
6215 @verbatim
6216 join -a1 -o 1.2     - /dev/null # 2 番目のフィールドを表示する
6217 join -a1 -o 1.2,1.1 - /dev/null # 最初の 2 フィールドを逆に並べる
6218 @end verbatim
6219 @end example
6220
6221 @item -d @var{input_delim_byte}
6222 @itemx --delimiter=@var{input_delim_byte}
6223 @opindex -d
6224 @opindex --delimiter
6225 @option{-f} と併せて使うと、入力のフィールド区切りに @var{input_delim_byte}
6226 の最初のバイトが使用される (デフォルトはタブ)。
6227
6228 @item -n
6229 @opindex -n
6230 マルチバイト文字を分割しない (現在のところ、機能しない)。
6231
6232 @item -s
6233 @itemx --only-delimited
6234 @opindex -s
6235 @opindex --only-delimited
6236 @option{-f} を使うとき、フィールド区切り文字を含まない行の表示をしない。
6237 通常は、フィールド区切り文字を含まない行は、行全体がそのまま表示される。
6238
6239 @item --output-delimiter=@var{output_delim_string}
6240 @opindex --output-delimiter
6241 @option{-f} と一緒に使った場合は、出力フィールド間が
6242 @var{output_delim_string} で区切られる。
6243 @option{-f} を指定したときのデフォルトは、入力時のデリミタを使用することである。
6244 @option{-b} や @option{-c} を使用して、(フィールドの範囲ではなく)
6245 バイト位置や文字位置の範囲を選択した場合は、
6246 選択されたバイトの重なり合わない範囲同士の間に @var{output_delim_string} が出力される。
6247
6248 @item --complement
6249 @opindex --complement
6250 このオプションは GNU の拡張である。@option{-b}, @option{-c}, @option{-f}
6251 オプションで選択されたバイト、文字、フィールドを含まない部分を選択して、表示する。
6252 言い換えれば、そうしたオプションによって指定されたバイトや文字やフィールドは「表示しない」ということだ。
6253 このオプションは、フィールドがたくさんあるとき、そのうちの一部を除いたすべてを表示したい場合に便利である。
6254
6255 @optZeroTerminated
6256
6257 @end table
6258
6259 @exitstatus
6260
6261
6262 @node paste invocation
6263 @section @command{paste}: 複数のファイルの各行をマージする
6264
6265 @pindex paste
6266 @cindex merging files
6267
6268 @command{paste} は、指定された各ファイルの行番号が同じ行を、
6269 タブ文字を間にはさんで連結して、標準出力に書き出す。
6270 入力ファイルが全く指定されていない場合や、ファイル名が @samp{-} だった場合は、
6271 標準入力が使用される。
6272
6273 書式:
6274
6275 @example
6276 paste [@var{option}]@dots{} [@var{file}]@dots{}
6277 @end example
6278
6279 たとえば、次のような 2 個のファイルに対して、
6280 @example
6281 $ cat num2
6282 1
6283 2
6284 $ cat let3
6285 a
6286 b
6287 c
6288 @end example
6289
6290 各ファイルから行を順番に拾う。
6291 @example
6292 $ paste num2 let3
6293 1       a
6294 2       b
6295        @ c
6296 @end example
6297
6298 片方のファイルの行を二回使う。
6299 @example
6300 $ paste num2 let3 num2
6301 1       a      1
6302 2       b      2
6303        @ c
6304 @end example
6305
6306 標準入力から行を取得して混ぜる。
6307 @example
6308 $ paste - let3 - < num2
6309 1       a      2
6310        @ b
6311        @ c
6312 @end example
6313
6314 連続する行を、スペースを間にはさんで結合する。
6315 @example
6316 $ seq 4 | paste -d ' ' - -
6317 1 2
6318 3 4
6319 @end example
6320
6321 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
6322
6323 @table @samp
6324
6325 @item -s
6326 @itemx --serial
6327 @opindex -s
6328 @opindex --serial
6329 各ファイルから 1 行づつ取り出して連結するのではなく、
6330 一つのファイルのすべての行をまとめて 1 行に連結する。
6331 上の例のデータを使用すると、
6332
6333 @example
6334 $ paste -s num2 let3
6335 1       2
6336 a       b       c
6337 @end example
6338
6339 @item -d @var{delim-list}
6340 @itemx --delimiters=@var{delim-list}
6341 @opindex -d
6342 @opindex --delimiters
6343 連結する行の区切りに、タブではなく、@var{delim-list} の各文字を順番に使用する。
6344 @var{delim-list} を使い切ってしまった場合は、最初の文字に戻って使用して行く。
6345 上記のデータを例に取ると、
6346
6347 @example
6348 $ paste -d '%_' num2 let3 num2
6349 1%a_1
6350 2%b_2
6351 %c_
6352 @end example
6353
6354 @optZeroTerminated
6355
6356 @end table
6357
6358 @exitstatus
6359
6360
6361 @node join invocation
6362 @section @command{join}: 共通のフィールドに基づいて行を結合する
6363
6364 @pindex join
6365 @cindex common field, joining on
6366
6367 @command{join} は、二つの入力ファイルを対象に、同一の共通フィールド
6368 (join field) を持つことで「対」になっている各行を、
6369 1 行にまとめて、標準出力に書き出す。
6370
6371 書式:
6372
6373 @example
6374 join [@var{option}]@dots{} @var{file1} @var{file2}
6375 @end example
6376
6377 @var{file1} と @var{file2} の片方は @samp{-}、すなわち標準入力であってもよい
6378 (両方とも標準入力は不可)。@var{file1} と @var{file2} は、
6379 共通フィールドに基づいてソートされているべきである。
6380
6381 @vindex LC_COLLATE
6382 通常、ソート順は、@env{LC_COLLATE} のロケールが規定している照合順序である。
6383 @option{-t} オプションが指定されていない場合は、両ファイルについて並び方を比較する際、
6384 @code{sort -b} の場合と同様に、共通フィールドの先頭にある空白が無視される。
6385 また、@option{--ignore-case} が指定されている場合は、
6386 @code{sort -f} と同様、共通フィールドでアルファベットの大文字と小文字は区別されない。
6387
6388 @command{sort} の出力を @command{join} に渡すなら、@command{sort} と
6389 @command{join} が使用するロケールやオプションは首尾一貫していなければならない。
6390 @samp{sort -k 1b,1} のようなコマンドを使用すれば、
6391 デフォルトの共通フィールドに基づいて、ファイルをソートすることができる。
6392 しかし、ロケール、共通フィールド、区切り記号、比較オプションなどにデフォルト以外のものを使用する場合は、
6393 @command{join} と @command{sort} の間で矛盾が起きないように、そうしたものを選択しなければならないのだ。
6394 @samp{join -t ''} が指定された場合は、行全体が共通フィールドとして考慮の対象になるが、
6395 これは、sort のデフォルトの動作に対応している。
6396
6397 入力のすべての行が対になっている場合は、GNU による拡張が利用できる。
6398 この場合、並んでいる順番は、対になる二つのフィールドが同じであると判断されるならば、どんな順番でもよい。
6399 ただし、並び方の比較を上述のように行ったとき、二つのフィールドが同じだと判断される場合であり、
6400 その場合のみである。例を挙げよう。
6401
6402 @example
6403 $ cat file1
6404 a a1
6405 c c1
6406 b b1
6407 $ cat file2
6408 a a2
6409 c c2
6410 b b2
6411 $ join file1 file2
6412 a a1 a2
6413 c c1 c2
6414 b b1 b2
6415 @end example
6416
6417 @set JOIN_COMMAND
6418 @checkOrderOption{join}
6419 @clear JOIN_COMMAND
6420
6421 デフォルトの動作は次のようになっている。
6422 @itemize
6423 @item 共通フィールド (join field) は、各行の最初のフィールドである。
6424 @item 入力の各フィールドは、1 個以上の空白 (スペースやタブ) で区切られる。
6425 行頭の空白は無視される。
6426 @item 出力の各フィールドは、1 個のスペースで区切られる。
6427 @item 各出力行の構成は、共通フィールド、@var{file1} の残りのフィールド、
6428 @var{file2} の残りのフィールドの順になる。
6429 @end itemize
6430
6431 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
6432
6433 @table @samp
6434
6435 @item -a @var{file-number}
6436 @opindex -a
6437 @var{file-number} (@samp{1} か @samp{2}) のファイルに、もう一方のファイルと対にならない行がある場合、
6438 通常の出力のほかに、その行も表示する。
6439
6440 @item --check-order
6441 入力ファイルのどちらかの内容がきちんとソートされていないと、
6442 エラーメッセージを出して、実行に失敗する。
6443
6444 @item --nocheck-order
6445 入力ファイルの内容がソートされた順番になっているかどうかを、
6446 どちらのファイルについてもチェックしない。これが、デフォルトである。
6447
6448 @item -e @var{string}
6449 @opindex -e
6450 入力では欠けているフィールドを、出力では @var{string} で補う。
6451 すなわち、オプション @option{-1}, @option{-2}, @option{-j}, @option{-o}
6452 などを指定したときに、欠けているフィールドがそれに当たる。
6453
6454 @item --header
6455 @opindex --header
6456 各入力ファイルの最初の行をヘッダ行と見なす。ヘッダ行も結合され、
6457 最初の出力行として表示される。@option{-o} を使って、出力フォーマットを指定している場合は、
6458 ヘッダ行もそのフォーマットに従って出力される。
6459 ヘッダ行は、@option{--check-order} が指定されていても、並び順のチェックを受けない。
6460 なお、両ファイルのヘッダ行がマッチしない場合は、
6461 一番目のファイルのヘッダ・フィールドが使用される。
6462
6463 @item -i
6464 @itemx --ignore-case
6465 @opindex -i
6466 @opindex --ignore-case
6467 キーを比較する際、アルファベットの大文字小文字を区別しない。
6468 このオプションを使用するときは、
6469 両方の入力ファイルの行が、同じように大文字小文字を区別せず並んでいなければならない。
6470 そうした順番で並べるには、@samp{sort -f} を使えばよい。
6471
6472 @item -1 @var{field}
6473 @opindex -1
6474 ファイル 1 では @var{field} 番目のフィールドを共通フィールドとする
6475 (@var{field} は正の整数)。
6476
6477 @item -2 @var{field}
6478 @opindex -2
6479 ファイル 2 では @var{field} 番目のフィールドを共通フィールドとする
6480 (@var{field} は正の整数)。
6481
6482 @item -j @var{field}
6483 @option{-1 @var{field} -2 @var{field}} と等価。
6484
6485 @item -o @var{field-list}
6486 @itemx -o auto
6487 キーワードの @samp{auto} が指定されると、
6488 @command{join} は各ファイルの最初の行を元にして、出力フォーマットを推測する。
6489 それは、デフォルトの出力フォーマットとほぼ同じだが、
6490 それだけでなく、各行に必ず同数のフィールドを出力するようにする。
6491 また、欠けているフィールドがあれば、@option{-e} オプションの指定する文字列で補う。
6492 余分なフィールドは除去する。
6493
6494 @samp{auto} が指定されていない場合は、@var{field-list} のフォーマットに従って、
6495 各出力行を構成する。@var{field-list} の各要素は、@samp{0} 一文字か、@var{m.n}
6496 という形を取る。ここで、@var{m} はファイル番号 (@var{file-number}) であり、@samp{1}
6497 か @samp{2} である。@var{n} はフィールド番号であり、正の整数である。
6498
6499 @samp{0} というフィールド指定は、共通フィールドを指している。ほとんどの場合、
6500 @samp{0} というフィールド指定と同じことが、共通フィールドを明示的に
6501 @var{m.n} で示すことでも、実現できるだろう。しかしながら、(@option{-a}
6502 オプションなり @option{-v} オプションなりを使用して)、対にならない行を表示する場合、
6503 対にならない行が両方のファイルに存在すると、@var{field-list} で @var{m.n}
6504 をどう使おうとも、共通フィールドを指定できないのだ。@command{join}
6505 で共通フィールドの指定が常に可能になるように、POSIX は @samp{0}
6506 というフィールド指定法を考案したのである。
6507
6508 @var{field-list} の各要素は、コンマ、または空白で区切られる。
6509 区切りに空白を使用するときは、シェルによって解釈されないように、
6510 たいていの場合引用符で囲む必要がある。たとえば、コマンド @samp{join -o 1.2,2.2}
6511 と @samp{join -o '1.2 2.2'} は、同じ動作になる。
6512
6513 @var{field-list} の指定は、すべての出力行に適用される。これは、@option{-a} や
6514 @option{-v} オプションによって出力されるものにも当てはまる。
6515
6516 @item -t @var{char}
6517 入出力のフィールドの区切りに、文字 @var{char} を使用する。
6518 @var{char} は、入力ファイルに現れる一つ一つが、有意なものとして扱われる。
6519 @samp{sort -t @var{char}} を @option{-b} なしで実行すれば、
6520 このオプションに対応する順序に行を並べることができる。
6521 @samp{join -t ''} を指定すると、行全体が共通フィールドとして考慮の対象になり、
6522 これは sort のデフォルトの動作に対応している。
6523 @samp{-t '\0'} を指定すると、ASCII NUL 文字がフィールドの区切りに使用される。
6524
6525 @item -v @var{file-number}
6526 通常の出力はせず、@var{file-number} (@samp{1} か @samp{2} である)
6527 のファイルに存在する、対にならない各行を表示する。
6528
6529 @optZeroTerminated @newlineFieldSeparator
6530
6531 @end table
6532
6533 @exitstatus
6534
6535
6536 @node Operating on characters
6537 @chapter 文字操作
6538
6539 @cindex operating on characters
6540
6541 以下のコマンドは、個々の文字に対して操作を行う。
6542
6543 @menu
6544 * tr invocation::            文字の置換、圧縮、削除を行う。
6545 * expand invocation::        タブをスペースに変換する。
6546 * unexpand invocation::      スペースをタブに変換する。
6547 @end menu
6548
6549
6550 @node tr invocation
6551 @section @command{tr}: 文字の置換、圧縮、削除を行う
6552
6553 @pindex tr
6554
6555 書式:
6556
6557 @example
6558 tr [@var{option}]@dots{} @var{set1} [@var{set2}]
6559 @end example
6560
6561 @command{tr} は標準入力を標準出力にコピーするが、
6562 その際に次の操作の一つを行う。
6563
6564 @itemize @bullet
6565 @item
6566 文字を置換する。置換した結果に同一文字の連続があるときは、それを
6567 1 文字に圧縮することもできる。
6568 @item
6569 同一文字の連続を 1 文字に圧縮する。
6570 @item
6571 文字を削除する。
6572 @item
6573 文字を削除する。さらに、削除した結果に同一文字の連続があるときは、
6574 それを 1 文字に圧縮する。
6575 @end itemize
6576
6577 上記書式の @var{set1} と (もし、指定しているなら) @var{set2} の二つの引数には、
6578 順序が意味を持つ文字の集合を指定する。以下の説明で、それぞれ @var{set1}、@var{set2}
6579 と呼ばれることになるそうした文字集合こそ、入力中に存在する文字のうちで
6580 @command{tr} が操作の対象とする文字群である。@option{--complement} (@option{-c},
6581 @option{-C})
6582 オプションを指定すると、@var{set1} の代わりにその補集合
6583 (@var{set1} に含まれないすべての文字) が使われることになる。
6584
6585 現在のところ、@command{tr} が完全に対応しているのは、シングルバイト文字だけである。
6586 将来は、マルチバイト文字もサポートすることになるだろうが、
6587 そのときは、@option{-C} オプションで文字集合の補集合を作り、@option{-c}
6588 オプションで値 (訳注: いわゆる文字コード) の集合の補集合を作ることになるだろう。
6589 この区別が意味を持つのは、指定する値の中に文字ではないものがあるときだけだが、
6590 そういった事態は、マルチバイト・エンコーディングを使用しているロケールで、
6591 入力にエンコーディング・エラーが含まれるときしか起きそうにない。
6592
6593 このプログラムでは、@option{--help} や @option{--version} オプションも使える。
6594 @xref{Common options}. なお、オプションは、オペランドの前で指定しなければならない。
6595
6596 @exitstatus
6597
6598 @menu
6599 * Character sets::           文字集合の指定。
6600 * Translating::              ある文字集合の別の文字集合への変換。
6601 * Squeezing and deleting::   文字の削除。
6602 @end menu
6603
6604
6605 @node Character sets
6606 @subsection 文字集合の指定
6607
6608 @cindex specifying sets of characters
6609
6610 @var{set1} や @var{set2} 引数の書式は、正規表現の書式に似ているが、
6611 正規表現ではなく、文字のリストにすぎない。
6612 そうした文字列中のほとんどの文字は、単にその文字自身を表しているだけだが、
6613 便宜のため文字列中では以下に列挙する簡易記法も使うことができる。
6614 簡易記法によっては、以下で述べているように、
6615 @var{set1} と @var{set2} のどちらか一方でしか使えないこともある。
6616
6617 @table @asis
6618
6619 @item バックスラッシュ・エスケープ
6620 @cindex backslash escapes
6621
6622 以下のバックスラッシュ・エスケープ・シーケンスを認識する。
6623
6624 @table @samp
6625 @item \a
6626 Control-G (ベル).
6627 @item \b
6628 Control-H (バックスペース).
6629 @item \f
6630 Control-L (フォームフィード).
6631 @item \n
6632 Control-J (改行).
6633 @item \r
6634 Control-M (復帰).
6635 @item \t
6636 Control-I (水平タブ).
6637 @item \v
6638 Control-K (垂直タブ).
6639 @item \@var{ooo}
6640 1 から 3 桁の 8 進数 @var{ooo} によって表される値を持つ 8 ビット文字。
6641 @samp{\400} は、@samp{\040} @samp{0}
6642 という連続する 2 バイトに解釈されるので、注意すること。
6643 @item \\
6644 1 個のバックスラッシュ。
6645 @end table
6646
6647 上記以外の 1 個の文字がバックスラッシュに続く場合は、その文字として解釈される。
6648 またバックスラッシュには、特別な意味を打ち消す働きもあるので、
6649 @samp{[}, @samp{]}, @samp{*}, @samp{-} をエスケープするのにも使用できる。
6650
6651 @item 範囲指定
6652 @cindex ranges
6653
6654 @samp{@var{m}-@var{n}} という表記は、昇順で @var{m} から @var{n} までのすべての文字に展開される。
6655 @var{m} は文字の照合順序で @var{n} より前のものでなければならず、
6656 さもないと、エラーになる。たとえば、@samp{0-9} は @samp{0123456789}
6657 と同じである。
6658
6659 System V の書式では、範囲は、角カッコ (square brackets)を使って囲むことになっているが、
6660 GNU の @command{tr} はこの書式をサポートしていない。
6661 System V の書式で指定した場合でも、置換が期待どおり行われることもあるが、
6662 それは、たいていの場合、角カッコが角カッコに置換されるからである。
6663 そうだとしても、予想外の動作をすることもあるので、
6664 角カッコの使用は避けた方がよい。たとえば、@samp{tr -d '[0-9]'}
6665 は、数字だけでなく、角カッコも削除してしまう。
6666
6667 昔からよく使われている範囲の指定法の多くが
6668 --- 正しい用法として認められているものでさえ --- 他のシステムで使えるとはかぎらない。
6669 たとえば、EBCDIC のホストでは、 @samp{A-Z} という範囲の指定をしても、
6670 たいていの人が予想するような結果は得られないだろう。
6671 なぜなら、そこでは @samp{A} から @samp{Z} までが、ASCII
6672 におけるように隣り合ってはいないからである。POSIX 準拠の @command{tr}
6673 を使うことができるならば、この問題を回避する最善の方法は、文字クラスを使用することである
6674 (下記参照)。それができない場合は、範囲の要素を一つ一つ書き込むのが、
6675 一番可搬性のある方法だ (一番野暮ったい方法でもあるけれど)。
6676
6677 @item 文字の繰り返し
6678 @cindex repeated characters
6679
6680 @var{set2} における @samp{[@var{c}*@var{n}]} という表記は、
6681 文字 @var{c} の @var{n} 個の連続に展開される。
6682 従って、@samp{[y*6]} は @samp{yyyyyy} と同じである。また、@var{set2}
6683 における @samp{[@var{c}*]} という表記は、@var{set2} を @var{set1}
6684 と同じ長さにするのに必要な数の @var{c} の連続に展開される。
6685 @var{n} が @samp{0} で始まっている場合は、
6686 8 進数として扱われる。それ以外の場合は、10 進数である。
6687
6688 @item 文字クラス
6689 @cindex character classes
6690
6691 @samp{[:@var{class}:]} という表記は、(あらかじめ定義されている) 文字クラス
6692 @var{class} に属するすべての文字に展開される。
6693 展開された文字に特定の順序はないが、@code{upper} と @code{lower}
6694 の文字クラスは別で、この二つは、昇順に展開される。
6695 @option{--delete} (@option{-d}) と @option{--squeeze-repeats} (@option{-s})
6696 オプションの両方を指定している場合は、@var{set2} で任意の文字クラスを使用することができる。
6697 それ以外の場合 @var{set2} で使えるのは、@code{lower} と @code{upper}
6698 の文字クラスだけであり、それも、対応する文字クラスを (すなわち、@code{upper}
6699 に対しては @code{lower}、@code{lower} に対しては @code{upper} を)、
6700 @var{set1} の対応する位置で指定しているときだけである。
6701 その場合は、大文字小文字の変換を指定していることになるわけだ。
6702 以下に文字クラスの名前を列挙する。なお、無効なクラス名を指定すると、エラーになる。
6703
6704 @table @code
6705 @item alnum
6706 @opindex alnum
6707 アルファベットの文字と数字。
6708 @item alpha
6709 @opindex alpha
6710 アルファベットの文字。
6711 @item blank
6712 @opindex blank
6713 水平方向の空白 (Horizontal whitespace)。
6714 @item cntrl
6715 @opindex cntrl
6716 制御文字。
6717 @item digit
6718 @opindex digit
6719 数字。
6720 @item graph
6721 @opindex graph
6722 表示可能文字。空白を含まない
6723 (訳注: スペースもタブも改行も、すなわち、ホワイトスペースを一切含まない)。
6724 @item lower
6725 @opindex lower
6726 アルファベットの小文字。
6727 @item print
6728 @opindex print
6729 表示可能文字。空白を含む (訳注: タブや改行は含まないが、スペース (0x20) は含む)。
6730 @item punct
6731 @opindex punct
6732 句読点 (訳注: 引用符なども含む)。
6733 @item space
6734 @opindex space
6735 水平方向や垂直方向の空白 (Horizontal or vertical whitespace)。
6736 @item upper
6737 @opindex upper
6738 アルファベットの大文字。
6739 @item xdigit
6740 @opindex xdigit
6741 16 進数の数字。
6742 @end table
6743
6744 @item 等価クラス
6745 @cindex equivalence classes
6746
6747 @samp{[=@var{c}=]} という書式は、@var{c} と等価な文字のすべてに展開される。
6748 展開される文字の間に特定の順序はない。等価クラスは、比較的最近の発明であり、
6749 英語以外のアルファベットをサポートするためのものである。
6750 しかしながら、等価クラスを定義したり、何が等価クラスに含まれるかを決定したりする標準的な方法は存在しないようだ。
6751 そのため、GNU の @command{tr} は、等価クラスを十分に実装していない。
6752 各文字の等価クラスにはその文字しか含まれていないので、あまり使い道がない。
6753
6754 @end table
6755
6756
6757 @node Translating
6758 @subsection 置換
6759
6760 @cindex translating characters
6761
6762 @command{tr} は、@var{set1} と @var{set2} の両方が指定され、@option{--delete}
6763 (@option{-d})
6764 オプションが指定されていない場合は、文字の置換を行う。
6765 @command{tr} は入力の中に @var{set1} に存在する文字が現れるたびに、
6766 それを @var{set2} の対応する文字に置き換える。
6767 入力中の @var{set1} に存在しない文字は、読み飛ばして、変更しない。
6768 ある文字が @var{set1} 中に 2 個以上存在し、@var{set2} 中のそれに対応する文字がすべて同じでない場合、
6769 置換に使用するのは、最後の文字だけである。
6770 たとえば、次の二つのコマンドは、同じ動作をする。
6771
6772 @example
6773 tr aaa xyz
6774 tr a z
6775 @end example
6776
6777 @command{tr} がよく使われるのは、アルファベットの小文字を大文字に変換するときである。
6778 それには、いろいろな方法がある。例を三つほど挙げてみる。
6779
6780 @example
6781 tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
6782 tr a-z A-Z
6783 tr '[:lower:]' '[:upper:]'
6784 @end example
6785
6786 @noindent
6787 ただし、上記の @code{a-z} のような範囲指定の使用は、
6788 可搬性がないことに注意していただきたい。
6789
6790 @command{tr} で置換を行う際には、普通 @var{set1} と @var{set2} を同じ長さにする。@var{set1} が
6791 @var{set2} より短いと、@var{set2} の後尾にある余分な文字が無視されることになる。
6792
6793 逆に、@var{set1} が @var{set2} より長い場合は、可搬性がなくなる。
6794 POSIX の規定では、結果は未定義なのだ。こうした場合、BSD の @command{tr} は、
6795 @var{set2} の最後の文字を必要なだけ繰り返して、@var{set2} が @var{set1}
6796 と同じ長さになるようにする。
6797 System V の @command{tr} は、@var{set1} を @var{set2} と同じ長さに切り詰める。
6798
6799 デフォルトでは、GNU 版の @command{tr} は、この問題を BSD の @command{tr}
6800 と同じやり方で処理する。そして、@option{--truncate-set1} (@option{-t})
6801 オプションが指定されている場合のみ、System V の @command{tr} のように処理するのである。
6802 このオプション (@option{--truncate-set1}) は、置換以外の操作では無視される。
6803
6804 この問題で System V の @command{tr} の動作を選ぶと、
6805 比較的よく使われる BSD 式の次の慣用表現が使えなくなる。
6806
6807 @example
6808 tr -cs A-Za-z0-9 '\012'
6809 @end example
6810
6811 @noindent
6812 なぜなら、System V の動作では、アルファベットと数字以外のすべての文字を改行文字に変換するのではなく、
6813 ゼロバイトしか (ASCII NUL 文字、それが @var{set1} の補集合の最初の要素である)
6814 改行文字に変換しないからだ。
6815
6816 @noindent
6817 ちなみに、上記の慣用表現は、システムによってはうまく動作しない。
6818 なぜなら、範囲指定を使っているからであり、また、改行の 8 進数によるコードを
6819 012 と決め込んでいるからでもある。@command{tr} が POSIX に準拠しているなら、
6820 以下の方が、よりよい書き方である。
6821
6822 @example
6823 tr -cs '[:alnum:]' '[\n*]'
6824 @end example
6825
6826
6827 @node Squeezing and deleting
6828 @subsection 連続する文字の圧縮と文字の削除
6829
6830 @cindex squeezing repeat characters
6831 @cindex deleting characters
6832 @cindex removing characters
6833
6834 @option{--delete} (@option{-d}) オプションのみが指定された場合、@command{tr} は、
6835 @var{set1} に存在する文字が入力中にあれば、それを削除する。
6836
6837 @option{--squeeze-repeats} (@option{-s}) オプションのみが指定され、置換が要求されていない場合、
6838 @command{tr} は、@var{set1} に存在する文字が入力中に連続して現れるたびに、
6839 その部分をただ 1 個のその文字に置き換える。
6840
6841 @option{--delete} と @option{--squeeze-repeats} の両方が指定された場合、
6842 @command{tr} は、まず @var{set1} を使って削除を行い、
6843 その後で、残っている文字に対して、@var{set2} を使って連続する同一文字の圧縮を行う。
6844
6845 @option{--squeeze-repeats} オプションは、置換の際に使用することもできる。
6846 その場合、@command{tr} は、まず置換を実行し、その後で、置換結果に対して、
6847 @var{set2} を使って連続する同一文字の圧縮を行う。
6848
6849 例をいくつか挙げて、オプションの様々な組み合わせを説明する。
6850
6851 @itemize @bullet
6852
6853 @item
6854 すべてのゼロバイトを削除する。
6855
6856 @example
6857 tr -d '\0'
6858 @end example
6859
6860 @item
6861 入力中のすべての単語 (訳注: 空白などで前後を区切られた文字列) を 1 行に 1 個づつ書き出す。
6862 このコマンドは、アルファベットと数字以外のすべてを改行文字に変換し、
6863 さらに、改行が連続して現れるそれぞれの箇所を 1 個の改行文字に圧縮している。
6864
6865 @example
6866 tr -cs '[:alnum:]' '[\n*]'
6867 @end example
6868
6869 @item
6870 連続する改行文字が現れるごとに、それを一個の改行文字に変換する。
6871 すなわち、空行を除去する。
6872
6873 @example
6874 tr -s '\n'
6875 @end example
6876
6877 @item
6878 @c Separate the following two "the"s, so typo checkers don't complain.
6879 文書中の単語の重複を探し出す。たとえば、 改行を挟んで同じ単語を繰り返して、
6880 ``the @w{}the'' のように書いてしまうとことは、よくあることである。
6881 以下の Bourne シェルのスクリプトは、次のように動作する。
6882 まず、句読点や空白文字が 1 個以上続けて現れるたびに、それを 1 個の改行文字に置き換える。
6883 そうすることで、単語が 1 行に 1 個づつ出力されることになるわけだ。
6884 次には、すべての大文字を小文字に変換する。そして、最後に、@command{uniq} を
6885 @option{-d} オプション付きで実行して、重複した単語のみを書き出すのである。
6886
6887 @example
6888 #!/bin/sh
6889 cat -- "$@@" \
6890   | tr -s '[:punct:][:blank:]' '[\n*]' \
6891   | tr '[:upper:]' '[:lower:]' \
6892   | uniq -d
6893 @end example
6894
6895 @item
6896 文字のちょっとした集団を削除するのは、たいていの場合ごく簡単である。
6897 たとえば、@samp{a}, @samp{x}, @samp{M} という文字をすべて消すには、
6898 次のようにするだけでよい。
6899
6900 @example
6901 tr -d axM
6902 @end example
6903
6904 ところが、削除する文字の一つに  @samp{-} があると、@samp{-}
6905 は特殊な意味をもっているので、厄介なことになりかねない。
6906 上記と同様の作業を行うけれど、今度は @samp{-} という文字もついでにすべて削除するとしよう。
6907 @code{tr -d -axM} をやってみるかもしれないが、うまく行かないだろう。
6908 @command{tr} が @option{-a} をコマンドライン・オプションとして解釈しようとするからである。
6909 それではと、ハイフンを文字列の内側に入れてみることもできる。
6910 @code{tr -d a-xM} のようにだ。だが、これもうまく行きそうにない。
6911 @command{tr} が @code{a-x} を 3 個の文字としてではなく、@samp{a}@dots{}@samp{x}
6912 という文字の範囲として解釈することになるからだ。
6913 この問題を解決する方法の一つは、ハイフンを文字のリストの最後に置くことである。
6914
6915 @example
6916 tr -d axM-
6917 @end example
6918
6919 あるいは、@samp{--} を使って、オプション処理はここで終わりと明示することもできる。
6920
6921 @example
6922 tr -d -- -axM
6923 @end example
6924
6925 より普遍的な方法は、等価クラスの記法  @code{[=c=]} を、@samp{c} を @samp{-} で
6926 (あるいは、他の任意の文字で) 置き換えて使うことである。
6927
6928 @example
6929 tr -d '[=-=]axM'
6930 @end example
6931
6932 上記の例では、角カッコがシェルによって解釈されないように、
6933 シングルクォートを使っていることに注意していただきたい。
6934
6935 @end itemize
6936
6937
6938 @node expand invocation
6939 @section @command{expand}: タブをスペースに変換する
6940
6941 @pindex expand
6942 @cindex tabs to spaces, converting
6943 @cindex converting tabs to spaces
6944
6945 @command{expand} は指定された各 @var{file} の内容を標準出力に書き出し、
6946 その際にタブ文字を適切な数のスペースに変換する。
6947 @var{file} が指定されていない場合や、@var{file} として @samp{-}
6948 が指定されている場合は、標準入力を対象にする。
6949
6950 書式:
6951
6952 @example
6953 expand [@var{option}]@dots{} [@var{file}]@dots{}
6954 @end example
6955
6956 デフォルトでは、@command{expand} はすべてのタブをスペースに変換する。
6957 バックスペース文字は、出力にそのまま残しておく。バックスペースには、
6958 タブ幅を計算する際に、桁数を減らす働きがあるのだ。デフォルトの動作は、
6959 @option{-t 8} を指定したときと同じである (タブ位置を 8 桁ごとにする)。
6960
6961 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
6962
6963 @table @samp
6964
6965 @item -t @var{tab1}[,@var{tab2}]@dots{}
6966 @itemx --tabs=@var{tab1}[,@var{tab2}]@dots{}
6967 @opindex -t
6968 @opindex --tabs
6969 @cindex tab stops, setting
6970 タブ位置 (tab stop) が一つだけ指定された場合には、
6971 (訳注: 入力行における) タブ位置が @var{tab1} 桁ごとあるものとする
6972 (デフォルトは 8 桁ごと)。それ以外の場合は、タブ位置を
6973 @var{tab1}, @var{tab2}, @dots{} 桁目に置き (行頭を 0 桁目として数える)、
6974 指定された最後のタブ位置より後ろにあるタブは 1 個のスペースで置き換える。
6975 タブ位置の指定は、コンマで区切ってもよく、空白で区切ってもよい。
6976
6977 互換性を考慮して、GNU の @command{expand} は、@option{-@var{tab1}[,@var{tab2}]@dots{}}
6978 という、
6979 このオプションの古い書式も認めている。新しいスクリプトでは、
6980 @option{-t @var{tab1}[,@var{tab2}]@dots{}} の方を使うべきである。
6981
6982 @item -i
6983 @itemx --initial
6984 @opindex -i
6985 @opindex --initial
6986 @cindex initial tabs, converting
6987 各行の行頭にあるタブ群だけを
6988 (言い換えれば、スペースでもタブでもないどんな文字よりも前にある 1 個以上のタブだけを)
6989 スペースに変換する。
6990
6991 @end table
6992
6993 @exitstatus
6994
6995
6996 @node unexpand invocation
6997 @section @command{unexpand}: スペースをタブに変換する
6998
6999 @pindex unexpand
7000
7001 @command{unexpand} は、指定された各 @var{file} の内容を標準出力に書き出し、
7002 その際に各行の先頭にある複数の空白 (blank) を、必要な数のタブ文字に変換する。
7003 @var{file} が指定されていない場合や、@var{file} として @samp{-} が指定されている場合は、
7004 標準入力を対象にする。デフォルトの POSIX ロケールでは、空白 (@dfn{blank})
7005 とは、スペースかタブのことである。
7006 他のロケールでは、ほかの空白文字が追加されているかもしれない。
7007
7008 書式:
7009
7010 @example
7011 unexpand [@var{option}]@dots{} [@var{file}]@dots{}
7012 @end example
7013
7014 デフォルトでは、@command{unexpand} が変換するのは、各行の行頭にある複数の空白だけである
7015 (言い換えれば、空白以外のどんな文字よりも前にある複数の空白だけ)。
7016 バックスペース文字は、出力にそのまま残しておく。バックスペースには、
7017 タブ幅を計算する際に、桁数を減らす働きがあるのだ。
7018 デフォルトでは、タブ位置は 8 桁ごとに置かれる。
7019
7020 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
7021
7022 @table @samp
7023
7024 @item -t @var{tab1}[,@var{tab2}]@dots{}
7025 @itemx --tabs=@var{tab1}[,@var{tab2}]@dots{}
7026 @opindex -t
7027 @opindex --tabs
7028 タブ位置 (tab stop) が一つだけ指定された場合には、
7029 (訳注: 入力行における) タブ位置をデフォルトの 8 桁ごとではなく、@var{tab1} 桁ごとに設定する。
7030 それ以外の場合は、タブ位置を @var{tab1}, @var{tab2}, @dots{} 桁目に置き
7031 (行頭を 0 桁目として数える)、指定された最後のタブ位置より後ろにある空白は、
7032 変換せず、そのままにする。タブ位置の指定は、コンマで区切ってもよく、空白で区切ってもよい。
7033 このオプションを指定すると、@option{-a} オプションが自動的に設定される。
7034
7035 (訳注: 一例を挙げておく。たとえば、@samp{-t 8,12} なら、入力行は、先頭を
7036 0 桁目として、8 桁目、12 桁目にタブ位置があると見なされる。
7037 そこで、先頭に 12 個のスペースがある行に対して @code{unexpand -t 8,12} を行うと、
7038 空白がタブ 2 個に変換される。出力におけるタブ位置はデフォルトのままなので、
7039 出力ではその行は、 0 から数えて 16 桁目から文字が始まることになる。)
7040
7041 互換性を考慮して、GNU の @command{unexpand} は、
7042 @option{-@var{tab1}[,@var{tab2}]@dots{}} という、このオプションの古い書式も認めている。
7043 そちらを使う場合は、タブ位置を必ずコンマで区切らなければならない。
7044 なお、@option{-t} とは違って、この古いオプションは、@option{-a}
7045 を自動的に設定しない。新しいスクリプトでは (訳注: 古い書式と同じ動作をさせたい場合)、
7046 古い書式に代えて、@option{--first-only -t @var{tab1}[,@var{tab2}]@dots{}}
7047 を使うべきである。
7048
7049 @item -a
7050 @itemx --all
7051 @opindex -a
7052 @opindex --all
7053 空白の連続が、行の中で空白以外の文字の後ろにある場合でも、
7054 タブ位置の直前にある 2 個以上の空白の連続は、すべて変換する。
7055
7056 @end table
7057
7058 @exitstatus
7059
7060
7061 @node Directory listing
7062 @chapter ディレクトリの一覧表示
7063
7064 この章では、@command{ls} とその変種の @command{dir} 及び @command{vdir} について説明する。
7065 こうしたコマンドは、ファイルに関する情報を一覧表示する。
7066
7067 @menu
7068 * ls invocation::            ディレクトリの内容を一覧表示する。
7069 * dir invocation::           簡潔な ls。
7070 * vdir invocation::          詳細な ls。
7071 * dircolors invocation::     ls のカラー設定など。
7072 @end menu
7073
7074
7075 @node ls invocation
7076 @section @command{ls}: ディレクトリの内容を一覧表示する
7077
7078 @pindex ls
7079 @cindex directory listing
7080
7081 @command{ls} プログラムはファイルに関する情報を一覧表示する
7082 (ファイルは、いかなるタイプでもよく、ディレクトリでもよい)。
7083 オプションとファイルを示す引数は、ほとんどのコマンドと同様、どんな順番で指定しても構わない。
7084
7085 コマンドラインで指定したオプション以外の引数がディレクトリならば、
7086 @command{ls} はデフォルトでは、そのディレクトリの内容を一覧表示する。
7087 その際、再帰的な表示はせず、名前が @samp{.} で始まるファイルも表示しない。
7088 オプション以外の引数がディレクトリでなければ、単にそのファイルの名前を表示するのが、
7089 @command{ls} のデフォルトの動作である。
7090 オプション以外の引数が一つも指定されていない場合は、カレントディレクトリを対象にし、あたかも
7091 @samp{.} という引数を一つだけ付けて起動したかのように動作する。
7092
7093 @vindex LC_ALL
7094 デフォルトでは、出力を、現在のロケール設定に従って、アルファベット順でソートする
7095 @footnote{POSIX 以外のロケールを使用している場合は (たとえば、@env{LC_ALL}
7096 を @samp{en_US} に設定している場合は)、@command{ls}
7097 の出力が、見慣れない順序で並んでいるかもしれない。そうした場合は、環境変数
7098 @env{LC_ALL} を @samp{C} にしてみるとよい。}。
7099 標準出力が端末の場合は、出力を多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
7100 表示し、制御文字を疑問符として出力する (ソートは縦方向に行う)。
7101 それ以外の場合は、出力が 1 行 1 ファイルの形式になり、制御文字はそのまま手を加えずに出力する。
7102
7103 (訳注: 端末へ出力されるファイル名は、現在ではデフォルトのスタイルが、
7104 「制御文字を疑問符で」から別のものに変更されているかもしれない。
7105 詳しくは、「ファイル名のフォーマット」の節の @option{--quoting-style}
7106 の訳注をご覧いただきたい。)
7107
7108 @command{ls} はきわめて基本的なプログラムなので、長年の間にオプションがどんどん増えてしまった。
7109 以下のサブセクションでは、そうしたオプションについて説明している。
7110 各サブセクション内では、オプションを (大文字小文字を無視して) アルファベット順に並べている。
7111 このようにオプションをサブセクションに分けてはみたが、この分類法は完全なものではない。
7112 オプションの中には、@command{ls} の動作の複数の側面に作用するものもあるからである。
7113
7114 @cindex exit status of @command{ls}
7115 終了ステータス:
7116
7117 @display
7118 0: 成功
7119 1: 軽微な問題 (たとえば、コマンドライン引数として指定されていない
7120    ファイルやディレクトリにアクセスできなかった場合。ディレクトリの
7121    内容を一覧表示しようとしたとき、その中にあるエントリが今まさに
7122    削除やリネームの最中だと、そういうことが起きる)
7123 2: 深刻なトラブル (たとえば、メモリの不足、無効なオプション、
7124    コマンドライン引数として指定されたファイルやディレクトリに
7125    アクセスできなかった場合、ディレクトリのループなど)
7126 @end display
7127
7128 参照 @ref{Common options}.
7129
7130 @menu
7131 * Which files are listed::      表示対象にするファイル
7132 * What information is listed::  表示する情報
7133 * Sorting the output::          出力のソート
7134 * Details about version sort::  バージョン・ソートの詳細
7135 * General output formatting::   出力全体の形式
7136 * Formatting file timestamps::  タイムスタンプのフォーマット
7137 * Formatting the file names::   ファイル名のフォーマット
7138 @end menu
7139
7140
7141 @node Which files are listed
7142 @subsection 表示対象にするファイル
7143
7144 以下のオプションは、どんなファイルについて @command{ls} が情報を表示するかを決定する。
7145 デフォルトで @command{ls} が表示するのは、コマンドラインで指定されたファイルだが、
7146 ディレクトリが指定された場合は、その内容になる。
7147 ただし、ディレクトリの内容のうち、名前が @samp{.} で始まるファイルは表示しない。
7148
7149 @table @samp
7150
7151 @item -a
7152 @itemx --all
7153 @opindex -a
7154 @opindex --all
7155 ディレクトリの内容を表示する際、@samp{.} で始まるファイル名も無視しない。
7156
7157 @item -A
7158 @itemx --almost-all
7159 @opindex -A
7160 @opindex --almost-all
7161 ディレクトリの内容を表示する際、@file{.} と @file{..} は無視するが、
7162 それ以外の @samp{.} で始まるいかなるファイル名も無視しない。@option{--all}
7163 (@option{-a}) オプションは、このオプションに優先する。
7164
7165 @item -B
7166 @itemx --ignore-backups
7167 @opindex -B
7168 @opindex --ignore-backups
7169 @cindex backup files, ignoring
7170 ディレクトリの内容表示において、@samp{~} で終わるファイルを無視する。
7171 このオプションは、@samp{--ignore='*~' --ignore='.*~'} と同じである。
7172
7173 @item -d
7174 @itemx --directory
7175 @opindex -d
7176 @opindex --directory
7177 @c The following sentence is the same as the one for -F.
7178 ディレクトリについても、ディレクトリ内容の一覧ではなく、
7179 他のタイプのファイルの場合と同じように、名前だけを表示する。
7180 また、@option{--dereference-command-line} (@option{-H}),
7181 @option{--dereference} (@option{-L}),
7182 @option{--dereference-command-line-symlink-to-dir}
7183 といったオプションが指定されていないかぎり、
7184 コマンドラインでシンボリックリンクが指定されても、それをたどらない。
7185
7186 @item -H
7187 @itemx --dereference-command-line
7188 @opindex -H
7189 @opindex --dereference-command-line
7190 @cindex symbolic links, dereferencing
7191 コマンドライン引数がシンボリックリンクを指定している場合、
7192 リンクそのものではなく、リンクが参照しているファイルの情報を表示する。
7193
7194 @item --dereference-command-line-symlink-to-dir
7195 @opindex --dereference-command-line-symlink-to-dir
7196 @cindex symbolic links, dereferencing
7197 原則としてシンボリックリンクの参照を行わないが、一つだけ例外がある。
7198 すなわち、コマンドライン引数がシンボリックリンクを指定し、
7199 それがディレクトリを指している場合は、リンクそのものではなく、そのディレクトリの情報を表示する。
7200 この動作は、リンクの参照に関係する他のオプションが全く指定されていないときの、
7201 @command{ls} のデフォルトの動作である (リンクの参照に関係する他のオプションには、
7202 @option{--classify} (@option{-F}), @option{--directory} (@option{-d}),
7203 @option{-l}, @option{--dereference} (@option{-L}),
7204 @option{--dereference-command-line} (@option{-H}) がある)。
7205
7206 @item --group-directories-first
7207 @opindex --group-directories-first
7208 すべてのディレクトリをまとめてファイルの前に置き、その上で、選択したソート・キーを使って
7209 (@option{--sort} オプション参照)、ディレクトリとファイルをそれぞれ別々にソートする。
7210 別の言い方をすると、このオプションはソートする際の主キーを設定し、
7211 @option{--sort} オプションが副キーを設定するということだ。ただし、
7212 @option{--sort=none} (@option{-U}) を使ったりすると、このオプションは全く無効になる。
7213
7214 @item --hide=PATTERN
7215 @opindex --hide=@var{pattern}
7216 ディレクトリの内容表示において、@option{--all} (@option{-a}) や
7217 @option{--almost-all} (@option{-A}) が同時に指定されていないかぎり、
7218 シェルのパターン @var{pattern} に名前がマッチするファイルを無視する。
7219 このオプションの動作は、@option{--ignore=@var{pattern}}
7220 とほぼ同じだが、@option{--all} (@option{-a}) や @option{--almost-all}
7221 (@option{-A}) が併せて指定されていると、効果がないという点が違う。
7222
7223 このオプションは、シェルのエイリアスで使うと、便利かもしれない。
7224 たとえば、@command{lx} が @samp{ls --hide='*~'} のエイリアスで、@command{ly}
7225 は @samp{ls --ignore='*~'} のエイリアスだとしよう。
7226 その場合、@samp{lx -A} というコマンドは、ファイル @file{README~} を表示するが、
7227 @samp{ly -A} は表示しないことになる。
7228
7229 @item -I @var{pattern}
7230 @itemx --ignore=@var{pattern}
7231 @opindex -I
7232 @opindex --ignore=@var{pattern}
7233 ディレクトリの内容表示において、シェルのパターン (正規表現ではない)
7234 @var{pattern} に名前がマッチするファイルを無視する。
7235 シェルの場合と同様、ファイル名の先頭にある @samp{.} は @var{pattern}
7236 の先頭のワイルドカードとマッチしない。
7237 このオプションを二度以上使うと、便利なことがある。たとえば、
7238
7239 @smallexample
7240 $ ls --ignore='.??*' --ignore='.[^.]' --ignore='#*'
7241 @end smallexample
7242
7243 最初のオプションは @samp{.} で始まる 3 文字以上のファイル名を無視する。
7244 二番目のオプションは @samp{.} で始まる二文字のファイル名のうち、 @samp{..}
7245 を除くすべて無視し、三番目のオプションは @samp{#} で始まるファイル名を無視する。
7246
7247 @item -L
7248 @itemx --dereference
7249 @opindex -L
7250 @opindex --dereference
7251 @cindex symbolic links, dereferencing
7252 シンボリックリンクについてファイル情報を表示する際、リンクそのものではなく、
7253 リンクが参照しているファイルの情報を表示する。とは言え、
7254 このオプションを使用した場合でも、表示されるファイル名については、
7255 リンクそのものの名前のままであり、リンクが指しているファイルの名前にはならない。
7256
7257 @item -R
7258 @itemx --recursive
7259 @opindex -R
7260 @opindex --recursive
7261 @cindex recursive directory listing
7262 @cindex directory listing, recursive
7263 すべてのディレクトリの内容を再帰的に一覧表示する。
7264
7265 @end table
7266
7267
7268 @node What information is listed
7269 @subsection 表示する情報
7270
7271 以下のオプションは、@command{ls} がどんな情報を表示するかに関係している。
7272 @command{ls} がデフォルトで表示するのは、ファイル名だけである。
7273
7274 @table @samp
7275
7276 @item --author
7277 @opindex --author
7278 @cindex hurd, author, printing
7279 詳細形式でディレクトリ内容のリストを出力する際、各ファイルの作成者情報を表示する。
7280 GNU/Hurd では、ファイルの作成者 (author) はファイルの所有者 (owner)
7281 と別人であることがあるが、他のオペレーティング・システムでは、両者は同一である。
7282
7283 @item -D
7284 @itemx --dired
7285 @opindex -D
7286 @opindex --dired
7287 @cindex dired Emacs mode support
7288 詳細表示形式 (@option{-l}) と併せて使用すると、
7289 出力本体の後ろに以下のような追加の行を表示する。
7290
7291 @example
7292 //DIRED// @var{beg1} @var{end1} @var{beg2} @var{end2} @dots{}
7293 @end example
7294
7295 @noindent
7296 @var{begn} や @var{endn} は符号なしの整数であり、
7297 出力における各ファイル名の開始バイト位置と終了バイト位置を示している。このようにすることで、
7298 ファイル名に空白や改行のような普段使わない文字が含まれている場合でも、手の込んだ検索をするまでもなく、
7299 Emacs が簡単にファイル名を見つけられるようにしているのである。
7300
7301 ディレクトリを再帰的にリストしている場合には (@option{-R})、
7302 各サブディレクトリ名のオフセットを記した同様の行も出力する。
7303
7304 @example
7305 //SUBDIRED// @var{beg1} @var{end1} @dots{}
7306 @end example
7307
7308 そして最後に、次の形式の行を出力する。
7309
7310 @example
7311 //DIRED-OPTIONS// --quoting-style=@var{word}
7312 @end example
7313
7314 @noindent
7315 ここで、@var{word} はクォートの方式である
7316 (@pxref{Formatting the file names})。
7317
7318 実例を挙げてみる。
7319
7320 @example
7321 $ mkdir -p a/sub/deeper a/sub2
7322 $ touch a/f1 a/f2
7323 $ touch a/sub/deeper/file
7324 $ ls -gloRF --dired a
7325   a:
7326   total 8
7327   -rw-r--r-- 1    0 Jun 10 12:27 f1
7328   -rw-r--r-- 1    0 Jun 10 12:27 f2
7329   drwxr-xr-x 3 4096 Jun 10 12:27 sub/
7330   drwxr-xr-x 2 4096 Jun 10 12:27 sub2/
7331
7332   a/sub:
7333   total 4
7334   drwxr-xr-x 2 4096 Jun 10 12:27 deeper/
7335
7336   a/sub/deeper:
7337   total 0
7338   -rw-r--r-- 1 0 Jun 10 12:27 file
7339
7340   a/sub2:
7341   total 0
7342 //DIRED// 48 50 84 86 120 123 158 162 217 223 282 286
7343 //SUBDIRED// 2 3 167 172 228 240 290 296
7344 //DIRED-OPTIONS// --quoting-style=literal
7345 @end example
7346
7347 上記 @samp{//DIRED//} 行の 2 個づつ組になっているオフセットは、次の
7348 6 個の名前の区切りとなるバイト位置を示している
7349 (訳注: 別の言い方をするなら、出力の先頭からある名前の直前までのバイト数と、
7350 その名前の最後の文字までのバイト数を示している)。6 個の名前とは、すなわち
7351 @file{f1}, @file{f2}, @file{sub}, @file{sub2}, @file{deeper}, @file{file}
7352 である。
7353 @samp{//SUBDIRED//} の行のオフセットが示しているのは、次のディレクトリ名の区切りである。
7354 @file{a}, @file{a/sub}, @file{a/sub/deeper}, @file{a/sub2}。
7355
7356 下記の例では、5 番目の項目の名前 @samp{deeper} を抜き出してみせている。
7357 この項目の名前は、217 と 223 のオフセットの組に対応している。
7358
7359 @example
7360 $ ls -gloRF --dired a > out
7361 $ dd bs=1 skip=217 count=6 < out 2>/dev/null; echo
7362 deeper
7363 @end example
7364
7365 上記のファイル一覧表示では、@samp{deeper} という項目の後ろにスラッシュが付いているが、
7366 オフセットが名前として選択しているのは、後ろのスラッシュを除いた部分であることに注目していただきたい。
7367 しかしながら、@command{ls} を @option{--dired} とともに @option{--escape}
7368 (短縮形は @option{-b}) のようなオプションを付けて実行し、
7369 名前に特殊文字が入っているファイルを処理の対象にする場合には、
7370 バックスラッシュがオフセットの示す範囲のうちに含まれることに注意しなければならない。
7371
7372 @example
7373 $ touch 'a b'
7374 $ ls -blog --dired 'a b'
7375   -rw-r--r-- 1 0 Jun 10 12:28 a\ b
7376 //DIRED// 30 34
7377 //DIRED-OPTIONS// --quoting-style=escape
7378 @end example
7379
7380 引用符を付加するクォート方式を使用している場合には (たとえば、
7381 @option{--quoting-style=c})、引用符もオフセットの示す範囲に含まれる。
7382 そこで、そうしたクォート方式が、環境変数 @env{QUOTING_STYLE}
7383 によって選択されている可能性も考慮に入れておくべきだ。
7384 すなわち、@option{--dired} を使用するアプリケーションでは、
7385 コマンドラインで明示的に @option{--quoting-style=literal}
7386 オプションを指定するか (@option{-N} や @option{--literal} と指定しても同じことだ)、
7387 あるいは、エスケープされた名前を解析できるするようにしておくか、
7388 どちらかをするべきだということである。
7389
7390 @item --full-time
7391 @opindex --full-time
7392 詳細形式でディレクトリ内容のリストを生成し、日時の情報を省略なしで表示する。
7393 これは、@option{--format=long} を @option{--time-style=full-iso}
7394 と一緒に使うのと同じである (@pxref{Formatting file timestamps})。
7395
7396 @item -g
7397 @opindex -g
7398 詳細形式でディレクトリ内容のリストを生成するが、所有者情報は表示しない。
7399
7400 @item -G
7401 @itemx --no-group
7402 @opindex -G
7403 @opindex --no-group
7404 詳細形式でディレクトリ内容をリスト表示する際に、グループ情報を表示しない
7405 (GNU 版以外の @command{ls} には、この動作がデフォルトのものがある。
7406 そこで、互換性のために、このオプションを用意している)。
7407
7408 @optHumanReadable
7409
7410 @item -i
7411 @itemx --inode
7412 @opindex -i
7413 @opindex --inode
7414 @cindex inode number, printing
7415 ファイル名の左側にそのファイルの inode 番号を表示する (inode
7416 番号は、ファイル連続番号とか、インデックスナンバーとも呼ばれる。
7417 この番号は、ある特定のファイルシステムにある各ファイルを、一意に指し示す)。
7418
7419 @item -l
7420 @itemx --format=long
7421 @itemx --format=verbose
7422 @opindex -l
7423 @opindex --format
7424 @opindex long ls @r{format}
7425 @opindex verbose ls @r{format}
7426 各ファイルの名前のほかに、(訳注: 行頭から順に) ファイルのタイプ、ファイルのモードビット
7427 (訳注: 一般に「アクセス権」とか「許可属性」と言われるもの)、
7428 ハードリンク数、所有者名、グループ名、サイズ、タイムスタンプを表示する
7429 (@pxref{Formatting file timestamps})。
7430 タイムスタンプは、通常は更新日時 (訳注: いわゆる mtime) である。
7431 特定することのできない情報については、疑問符を表示する。
7432
7433 通常、サイズは、桁を区切る記号を付けずに、バイト数で表示されるが、
7434 この表示法は変更することができる (@pxref{Block size})。たとえば、
7435 @option{-h} オプションを指定すると、人間に読みやすい短縮表示になり、
7436 @samp{--block-size="'1"} を指定すると、現在のロケールの区切り記号で
7437 3 桁ごとに区切ったバイト数が表示される。
7438
7439 ディレクトリの内容をリストする場合は、対象となるディレクトリごとに、ファイルのリストの前に
7440 @samp{total @var{blocks}} という行を置く。ここで、@var{blocks} は、
7441 そのディレクトリにあるすべてのファイルに割り当てられたディスク容量の合計である。
7442 現在のところブロックサイズはデフォルトでは 1024 バイトであるが、
7443 この値は変更することができる (@pxref{Block size})。
7444 @var{blocks} の計算では、各ハードリンクを別のものとして計算している。
7445 これはバグだと言えないこともない。
7446
7447 ファイルタイプには、以下の文字の一つが使われる。
7448
7449 @c The commented-out entries are ones we're not sure about.
7450
7451 @table @samp
7452 @item -
7453 通常ファイル
7454 @item b
7455 ブロック・スペシャルファイル
7456 @item c
7457 キャラクタ・スペシャルファイル
7458 @item C
7459 ハイパフォーマンス (``contiguous data'') ファイル
7460 @item d
7461 ディレクトリ
7462 @item D
7463 @c @item F
7464 @c semaphore, if this is a distinct file type
7465 ドア (Solaris 2.5 以上)
7466 @item l
7467 @c @item m
7468 @c multiplexed file (7th edition Unix; obsolete)
7469 シンボリックリンク
7470 @item M
7471 オフライン (``migrated'') ファイル (Cray DMF)
7472 @item n
7473 ネットワーク・スペシャルファイル (HP-UX)
7474 @item p
7475 FIFO (名前付きパイプ)
7476 @item P
7477 @c @item Q
7478 @c message queue, if this is a distinct file type
7479 ポート (Solaris 10 以上)
7480 @item s
7481 @c @item S
7482 @c shared memory object, if this is a distinct file type
7483 @c @item T
7484 @c typed memory object, if this is a distinct file type
7485 @c @item w
7486 @c whiteout (4.4BSD; not implemented)
7487 ソケット
7488 @item ?
7489 上記以外のファイルタイプ
7490 @end table
7491
7492 @cindex permissions, output by @command{ls}
7493 ファイルのモードビットの表示は、アクセス権を設定する際のシンボリックモードの仕様とほぼ同じである (@pxref{Symbolic Modes})。
7494 ただし、@command{ls} は、以下のように、複数のモードビットを一つにまとめて、
7495 アクセス権の各セットの 3 番目の文字で表現している。
7496
7497 @table @samp
7498 @item s
7499 set-user-ID ビットまたは set-group-ID ビットと、対応する実行ビットの両方が立っている場合。
7500
7501 @item S
7502 set-user-ID ビットまたは set-group-ID ビットが立っているが、
7503 対応する実行ビットは立っていない場合。
7504
7505 @item t
7506 削除制限フラグまたはスティキー・ビット (sticky bit) と、
7507 その他のユーザ (other) の実行ビットの両方が立っている場合。
7508 削除制限フラグは、スティッキー・ビットの別名である。 @xref{Mode Structure}.
7509
7510 @item T
7511 削除制限フラグまたはスティキー・ビットが立っているが、
7512 その他のユーザの実行ビットが立っていない場合。
7513
7514 @item x
7515 実行ビットが立っていて、上記のどれにも当てはまらない場合。
7516
7517 @item -
7518 それ以外。
7519 @end table
7520
7521 ファイルのモードビットの後に続く 1 個の文字は、アクセス・コントロール・リスト (ACL)
7522 のような他のアクセス方式が、そのファイルに使われているかどうかを表している。
7523 ファイルのモードビットに続く文字が空白の場合は、他のアクセス方式を使用していないということである。
7524 表示文字が続く場合は、そうしたアクセス方式を使用しているということだ。
7525
7526 GNU の @command{ls} は、SELinux セキュリティ・コンテキストを持つが、
7527 それ以外に他のアクセス方式を使用していないファイルを示すのに、
7528 ピリオド (@samp{.}) を使う。
7529
7530 それ以外で、ファイルが、標準以外のアクセス方式の何らかの組み合わせを使用している場合には、
7531 @samp{+} 文字が印として付く。
7532
7533 @item -n
7534 @itemx --numeric-uid-gid
7535 @opindex -n
7536 @opindex --numeric-uid-gid
7537 @cindex numeric uid and gid
7538 @cindex numeric user and group IDs
7539 詳細形式でディレクトリの内容をリストするが、
7540 所有者やグループの名前の代わりに、数字の user-ID や group-ID を表示する。
7541
7542 @item -o
7543 @opindex -o
7544 詳細形式でディレクトリの内容をリストするが、グループ情報を表示しない。
7545 これは、@option{--format=long} を @option{--no-group} と併せて使うのと同じである。
7546
7547 @item -s
7548 @itemx --size
7549 @opindex -s
7550 @opindex --size
7551 @cindex disk allocation
7552 @cindex size of files, reporting
7553 各ファイルに対するディスク割り当て量をファイル名の左側に表示する。
7554 これはファイルが使用しているディスクスペースの量であり、
7555 普通はファイルのサイズより少し多いが、穴空きファイル (sparse file)
7556 の場合は、少ないこともある。
7557
7558 通常、ディスク割り当て量は 1024 バイトを単位として表示されるが、
7559 これは変更することができる (@pxref{Block size})。
7560
7561 @cindex NFS mounts from BSD to HP-UX
7562 ファイルが HP-UX のシステムから BSD のシステムに NFS マウントされている場合、
7563 このオプションで報告されるディスク使用量は、正確な値の半分である。
7564 それに対して、HP-UX システムの場合は、BSD システムから
7565 NFS マウントされているファイルについて、このオプションは正確な値の 2 倍の量を報告する。
7566 これは、HP-UX システムにある欠陥のせいであり、HP-UX の @command{ls}
7567 プログラムも、そのとばっちりを受けているのである。
7568
7569 @optSi
7570
7571 @item -Z
7572 @itemx --context
7573 @opindex -Z
7574 @opindex --context
7575 @cindex SELinux
7576 @cindex security context
7577 SELinux セキュリティ・コンテキストを表示する。ない場合は、@samp{?}
7578 を表示する。@option{-l} オプションと一緒に使った場合は、
7579 サイズの左にセキュリティ・コンテキストを出力する。
7580
7581 @end table
7582
7583
7584 @node Sorting the output
7585 @subsection 出力のソート
7586
7587 @cindex sorting @command{ls} output
7588 以下のオプションは、@command{ls} が出力する情報を並べる際の順序を変更する。
7589 デフォルトでは、情報は文字コードによってソートされる (たとえば ASCII コード順)。
7590
7591 @table @samp
7592
7593 @item -c
7594 @itemx --time=ctime
7595 @itemx --time=status
7596 @opindex -c
7597 @opindex --time
7598 @opindex ctime@r{, printing or sorting by}
7599 @opindex status time@r{, printing or sorting by}
7600 @opindex use time@r{, printing or sorting files by}
7601 詳細表示形式 (たとえば、@option{-l}, @option{-o}) を使用しているときは、更新日時
7602 (modification time) の代わりに、ステータス変更日時
7603 (status change time、inode の @samp{ctime}) を表示する。
7604 日時によって明示的にソートしているときや (@option{--sort=time} あるいは
7605 @option{-t})、詳細表示形式を使用していないときは、ステータス変更日時によってソートする。
7606
7607 @item -f
7608 @opindex -f
7609 @cindex unsorted directory listing
7610 @cindex directory order, listing by
7611 主な働きは、@option{-U} と同じで、ソートしないことである。
7612 すなわち、ファイルをリストする際、ファイルがディレクトリにどんな順序で格納されていようと、
7613 そのままの順序で出力する。それだけでなく、@option{-a} (すべてのファイルをリストする)
7614 を有効にし、@option{-l}, @option{--color}, @option{-s} を
7615 (@option{-f} より前で指定されていたら) 無効にする働きもある。
7616
7617 @item -r
7618 @itemx --reverse
7619 @opindex -r
7620 @opindex --reverse
7621 @cindex reverse sorting
7622 どんな方法でソートされていようと、逆順にする。
7623 たとえば、ファイルを並べる際に、アルファベットの後ろから並べる、
7624 最新バージョンから先に並べる、サイズの小さいものから先に並べる、などなど。
7625
7626 @item -S
7627 @itemx --sort=size
7628 @opindex -S
7629 @opindex --sort
7630 @opindex size of files@r{, sorting files by}
7631 ファイルのサイズによってソートし、大きいものから順に並べる。
7632
7633 @item -t
7634 @itemx --sort=time
7635 @opindex -t
7636 @opindex --sort
7637 @opindex modification time@r{, sorting files by}
7638 更新日時 (modification time、inode の @samp{mtime}) によってソートし、
7639 新しいものから順に並べる。
7640
7641 @item -u
7642 @itemx --time=atime
7643 @itemx --time=access
7644 @itemx --time=use
7645 @opindex -u
7646 @opindex --time
7647 @opindex use time@r{, printing or sorting files by}
7648 @opindex atime@r{, printing or sorting files by}
7649 @opindex access time@r{, printing or sorting files by}
7650 詳細表示形式 (たとえば、@option{--format=long}) を使用しているときは、
7651 最終アクセス日時 (last access time、inode の @samp{atime}) を表示する。
7652 日時によって明示的にソートしているときや (@option{--sort=time} あるいは
7653 @option{-t})、詳細表示形式を使用していないときは、アクセス日時によってソートする。
7654
7655 @item -U
7656 @itemx --sort=none
7657 @opindex -U
7658 @opindex --sort
7659 @opindex none@r{, sorting option for @command{ls}}
7660 ソートを行わない。すなわち、ファイルをリストする際、ファイルがディレクトリにどんな順序で格納されていようと、
7661 そのままの順序で出力する (@option{-f} が行う、ソートに無関係な他のことは、何もしない)。
7662 このオプションは非常に大きなディレクトリを一覧表示するとき、ことのほか役に立つ。
7663 ソートを全くしないことで、作業速度が著しく向上するからである。
7664
7665 @item -v
7666 @itemx --sort=version
7667 @opindex -v
7668 @opindex --sort
7669 @opindex version@r{, sorting option for @command{ls}}
7670 バージョン名とバージョン番号によってソートし、低いバージョンから順に並べる。
7671 デフォルトのソート方法と動作が似ているが、 10 進数の数字が連続する各部分を、
7672 インデックス番号やバージョン番号と見なし、(文字列としてではなく)
7673 数値として取り扱う点が違う。 (@xref{Details about version sort}.)
7674
7675 @item -X
7676 @itemx --sort=extension
7677 @opindex -X
7678 @opindex --sort
7679 @opindex extension@r{, sorting files by}
7680 ディレクトリの内容をファイルの拡張子 (最後の @samp{.} の後に続く文字)
7681 によってアルファベット順でソートする。拡張子のないファイルは、
7682 最初に並べられる。
7683
7684 @end table
7685
7686
7687 @node Details about version sort
7688 @subsection バージョン・ソートの詳細
7689
7690 ファイル名にはインデックス番号やバージョン番号が含まれていることがしばしばあるが、
7691 バージョン・ソートは、そうした状況に対処している。
7692 通常のソートでは、1 文字づつ文字の比較を行うので、結果がこちらの期待する順番にならないことがよくあるのだ。
7693 バージョン・ソートが特に役に立つのは、
7694 インデックス番号やバージョン番号を名前に含むファイルがたくさんあるディレクトリを一覧するときである。
7695
7696 @example
7697 $ ls -1            $ ls -1v
7698 abc.zml-1.gz       abc.zml-1.gz
7699 abc.zml-12.gz      abc.zml-2.gz
7700 abc.zml-2.gz       abc.zml-12.gz
7701 @end example
7702
7703 バージョン・ソートにおける文字列の比較は、次のように行われる。
7704 @var{ver1} と @var{ver2} がバージョン番号で、@var{prefix} (前置部分) と @var{suffix} (後置部分)
7705 が文字列だとしよう (@var{suffix} は正規表現の @samp{(\.[A-Za-z~][A-Za-z0-9~]*)*}
7706 にマッチするもの)。その場合、@var{ver1} < @var{ver2} ならば、``@var{prefix} @var{ver1}
7707 @var{suffix}''
7708 から構成される名前は ``@var{prefix} @var{ver2} @var{suffix}'' より前に来る。
7709
7710 数字の部分の先行する 0 は無視されることにも注意していただきたい。
7711
7712 @example
7713 $ ls -1            $ ls -1v
7714 abc-1.007.tgz      abc-1.01a.tgz
7715 abc-1.012b.tgz     abc-1.007.tgz
7716 abc-1.01a.tgz      abc-1.012b.tgz
7717 @end example
7718
7719 この機能は gnulib の @code{filevercmp} 関数を使って実装されている。
7720 そこで、知っておいた方がよい注意事項がいくつかある。
7721
7722 @itemize @bullet
7723 @item @env{LC_COLLATE} は無視される。そのため、@samp{ls -v} や @samp{sort -V} は、
7724 数値ではない PREFIX (前置部分) を、@env{LC_COLLATE} ロケール・カテゴリが
7725 @samp{C} に設定されているかのようにソートする。
7726 @item SUFFIX (後置部分) に上記の正規表現がマッチしてくれないことがある。
7727 従って、以下の例は、期待通りの順序ではないかもしれない。
7728
7729 @example
7730 abc-1.2.3.4.7z
7731 abc-1.2.3.7z
7732 @end example
7733
7734 @example
7735 abc-1.2.3.4.x86_64.rpm
7736 abc-1.2.3.x86_64.rpm
7737 @end example
7738 @end itemize
7739
7740 @node General output formatting
7741 @subsection 出力全体の形式
7742
7743 以下のオプションは出力全体の見かけに影響を及ぼす。
7744
7745 @table @samp
7746
7747 @item -1
7748 @itemx --format=single-column
7749 @opindex -1
7750 @opindex --format
7751 @opindex single-column @r{output of files}
7752 1 行 に 1 ファイルを表示する。標準出力が端末でないときの
7753 @command{ls} のデフォルトである。
7754 ファイル名中に改行文字があっても、それをそのまま出力してしまわないようにするには、
7755 @option{-b} や @option{-q} オプションも参照していただきたい。
7756
7757 (訳注: @option{-1} オプションを指定しても、標準出力が端末ならば、
7758 ファイル名中の改行文字を @samp{?} 記号で表示するか、ファイル名を
7759 @samp{shell-escape} スタイルでクォートするか、どちらかをやってくれるはずだ。
7760 上の注意書きは、標準出力が端末でないときの話である。)
7761
7762 @item -C
7763 @itemx --format=vertical
7764 @opindex -C
7765 @opindex --format
7766 @opindex vertical @r{sorted files in columns}
7767 ファイルのリストを多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
7768 表示し、ソートは縦方向に行う。これは、標準出力が端末のときの
7769 @command{ls} のデフォルトである。@command{dir} コマンドにとっては、
7770 これが常にデフォルトになる。GNU の @command{ls} は、
7771 できるだけ少ない行数でできるだけ多くのファイルを表示するために、段の幅を可変にしている。
7772
7773 @item --color[=@var{when}]
7774 @opindex --color
7775 @cindex color, distinguishing file types with
7776 ファイルのタイプを区別するためにカラー表示を使用するかどうかを指定する。
7777 @var{when} は省略してもよく、以下の一つでもよい。
7778 @itemize @bullet
7779 @item none
7780 @vindex none @r{color option}
7781 カラー表示を全く使用しない。これがデフォルトである。
7782 @item auto
7783 @vindex auto @r{color option}
7784 @cindex terminal, using color iff
7785 標準出力が端末の場合のみ、カラー表示を使用する。
7786 @item always
7787 @vindex always @r{color option}
7788 常にカラー表示を使用する。
7789 @end itemize
7790 @var{when} を付けずに @option{--color} を指定するのは、"@option{--color=always}
7791 と同じことである。カラー表示にしたファイルのリストをパイプで @command{more} や
7792 @command{less} のようなページャに送ると、たいての場合、判読に苦しむ羽目になる。
7793 ただし、@code{more -f} を使うと、うまく行くようだ。(訳注: 訳者の手元では、
7794 @samp{less -R} や @samp{lv -c} で一応問題なくカラー表示ができているようだ。)
7795
7796 @vindex LS_COLORS
7797 @vindex SHELL @r{environment variable, and color}
7798 留意すべきは、@option{--color} オプションを使用すると、
7799 大量のファイルがあるディレクトリで @command{ls} を実行したとき、
7800 目に見えて動作速度が低下するかもしれないことである。
7801 これは、カラー表示のデフォルトの設定では、@command{ls} は、
7802 リストするファイルを一つづつ @code{stat} システムコールで調べる必要があるからだ。
7803 とは言え、ファイルタイプのカラー表示はおおむね使用したいけれど、
7804 他の色付けオプションは使わなくてもよいこともある
7805 (たとえば、実行属性、リンク切れ、スティッキー・ビット、その他のユーザの書き込み権限、
7806 ケーパビリティなどは、色で表示しなくてもよい)。
7807 その場合は、こんなふうに、@command{dircolors} コマンドを使用して、環境変数
7808 @env{LS_COLORS} を設定すればよい。
7809 @example
7810 eval $(dircolors -p | perl -pe \
7811   's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)
7812 @end example
7813 そうすれば、@code{dirent.d_type} が使えるファイルシステムなら、
7814 @command{ls} は各コマンドライン引数に対してたった一回だけ
7815 @code{stat} システムコールを行うだけですむようになる。
7816
7817 @item -F
7818 @itemx --classify
7819 @itemx --indicator-style=classify
7820 @opindex -F
7821 @opindex --classify
7822 @opindex --indicator-style
7823 @cindex file type and executables, marking
7824 @cindex executables and file type, marking
7825 @c The following sentence is the same as the one for -d.
7826 各ファイル名の後ろに、ファイルタイプを示す 1 文字を付ける。
7827 通常ファイルの場合も、実行可能ファイルならば、@samp{*} を後置する。
7828 ファイルタイプの指標は、ディレクトリならば @samp{/}、シンボリックリンクならば
7829 @samp{@@}、FIFO ならば @samp{|}、ソケットならば @samp{=}、ドアならば
7830 @samp{>} であり、通常ファイルを表す指標はない。
7831 なお、@option{--dereference-command-line} (@option{-H}),
7832 @option{--dereference} (@option{-L}),
7833 @option{--dereference-command-line-symlink-to-dir}
7834 といったオプションが指定されていないかぎり、コマンドラインで指定されたシンボリックリンクをたどることはない。
7835
7836 @item --file-type
7837 @itemx --indicator-style=file-type
7838 @opindex --file-type
7839 @opindex --indicator-style
7840 @cindex file type, marking
7841 各ファイル名の後ろに、ファイルタイプを示す 1 文字を付ける。
7842 @option{-F} に似ているが、こちらは、実行ファイルに指標を付けない。
7843
7844 @item --indicator-style=@var{word}
7845 @opindex --indicator-style
7846 ファイル名の後ろに指標文字を付けるとき、@var{word} というスタイルを使用する。
7847 @var{word} には次のものがある。
7848
7849 @table @samp
7850 @item none
7851 指標文字を全く付けない。これがデフォルトである。
7852 @item slash
7853 ディレクトリの後ろに @samp{/} を付ける。これは、@option{-p} オプションと同じである。
7854 @item file-type
7855 ディレクトリ、シンボリックリンク、FIFO、ソケットの後ろに、
7856 それぞれ @samp{/}, @samp{@@}, @samp{|},  @samp{=} を付け、
7857 通常ファイルの後ろには何も付けない。これは、@option{--file-type} オプションと同じである。
7858 @item classify
7859 実行可能な通常ファイルの後ろに @samp{*} を付ける。それ以外は、
7860 @samp{file-type} の場合と同じ動作をする。これは、@option{-F} や
7861 @option{--classify} オプションと同じである。
7862 @end table
7863
7864 @item -k
7865 @itemx --kibibytes
7866 @opindex -k
7867 @opindex --kibibytes
7868 デフォルトのブロックサイズを標準の値の 1024 バイトに設定する。
7869 そのとき、環境変数でそれ以外のどんな値が設定されていても、
7870 それを上書きする (@pxref{Block size})。このオプション自身も、
7871 @option{--block-size}, @option{--human-readable} (@option{-h}),
7872 @option{--si} オプションがあれば、それによって上書きされる。
7873
7874 @option{--kibibytes} (@option{-k}) オプションが影響を及ぼすのは、@option{-l}
7875 などのオプションが書き出すディレクトリごとのブロック数や、@option{--size}
7876 (@option{-s}) オプションが表示するディスク割り当て量に対してである。
7877 @option{-l} の表示するファイルサイズには影響を及ぼさない。
7878
7879 @item -m
7880 @itemx --format=commas
7881 @opindex -m
7882 @opindex --format
7883 @opindex commas@r{, outputting between files}
7884 ファイルを横に並べ、各行に収まる範囲でできるだけ多くの項目を表示する。
7885 ファイル同士は @samp{, } (コンマとスペース) で区切る。
7886
7887 @item -p
7888 @itemx --indicator-style=slash
7889 @opindex -p
7890 @opindex --indicator-style
7891 @cindex file type, marking
7892 ディレクトリ名の後ろに @samp{/} を付ける。
7893
7894 @item -x
7895 @itemx --format=across
7896 @itemx --format=horizontal
7897 @opindex -x
7898 @opindex --format
7899 @opindex across@r{, listing files}
7900 @opindex horizontal@r{, listing files}
7901 ファイルのリストを多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
7902 表示し、ソートは横方向に行う。
7903
7904 @item -T @var{cols}
7905 @itemx --tabsize=@var{cols}
7906 @opindex -T
7907 @opindex --tabsize
7908 タブ位置が @var{cols} 桁ごとにあると想定する。デフォルトは 8 桁ごと。
7909 @command{ls} は効率を考慮し、使えるときはタブを出力で使用する。
7910 @var{cols} が 0 の場合は、タブを使用しない。
7911
7912 端末エミュレータの中には、ASCII 以外のバイトが前にあると、
7913 列をタブ位置の右にきちんと揃えてくれないものがあるかもしれない。
7914 この問題を回避するには、@option{-T0} オプションを使うか、環境変数
7915 @code{TABSIZE=0} を設定するかして、列を揃えるのにタブではなく、
7916 スペースを使うよう、@command{ls} に指示すればよい。
7917
7918 @item -w @var{cols}
7919 @itemx --width=@var{cols}
7920 @opindex -w
7921 @opindex --width
7922 @vindex COLUMNS
7923 スクリーンの横幅が @var{cols} 桁だと想定する。デフォルトの値は、
7924 可能ならば端末の設定から取得する。取得できないときは、環境変数
7925 @env{COLUMNS} が設定されていれば、それを使用する。
7926 それも設定されていないときのデフォルトの値は 80 である。
7927 @var{cols} の値を @samp{0} にすると、出力行の長さに制限がなくなる。
7928 その場合、ただ一行の出力中で各項目を分離するのは、タブではなく、スペースになる。
7929
7930 @end table
7931
7932
7933 @node Formatting file timestamps
7934 @subsection タイムスタンプのフォーマット
7935
7936 デフォルトでは、ファイルのタイムスタンプは短縮形式で表示される。
7937 すなわち、最近のタイムスタンプ以外は、@samp{Mar 30@ @ 2002}
7938 といった日付表示になり、最近のタイムスタンプは、@samp{Mar 30 23:45}
7939 といった年度なしの日付と時刻の表示になる。この書式は、後で詳しく述べるように、
7940 使用しているロケールによっては違ったものになるかもしれない。
7941
7942 @cindex clock skew
7943 タイムスタンプは、ここ 6 ヶ月以内のもので、未来の日付が付いていなければ、
7944 最近 (@dfn{recent}) として扱われる。今日の日付のタイムスタンプが、
7945 最近用の書式で表示されない場合、そのタイムスタンプは未来扱いされている。
7946 それは、おそらく時計に狂いが生じているということであり、@command{make}
7947 のような、ファイルのタイムスタンプに頼っているプログラムは、まともに動かないかもしれない。
7948
7949 @vindex TZ
7950 タイムスタンプは、タイムゾーンのルールに従って表示されるが、
7951 そのルールを指定しているのは、環境変数 @env{TZ} である。
7952 @env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
7953 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
7954 The GNU C Library Reference Manual}.
7955
7956 以下のオプションは、ファイルのタイムスタンプの表示方法を変更する。
7957
7958 @table @samp
7959 @item --time-style=@var{style}
7960 @opindex --time-style
7961 @cindex time style
7962 タイムスタンプを @var{style} 形式で表示する。
7963 @var{style} は以下の一つでなければならない。
7964
7965 @table @samp
7966 @item +@var{format}
7967 @vindex LC_TIME
7968 @var{format} を使って、タイムスタンプを表示する。
7969 その場合、@var{format} は、@command{date} コマンドの書式引数と同じように解釈される
7970 (@pxref{date invocation})。
7971 たとえば、@option{--time-style="+%Y-%m-%d %H:%M:%S"} と指定すると、
7972 @command{ls} の表示するタイムスタンプは、@samp{2002-03-30 23:45:56}
7973 のようになる。@command{date} の場合と同様、@var{format}
7974 の解釈は、@env{LC_TIME} ロケール・カテゴリの影響を受ける。
7975
7976 @var{format} に改行で分離された二つの書式文字列がある場合、
7977 前半は最近のファイル以外に使用され、後半は最近のファイルに使用される。
7978 出力される列をきちんと揃えたければ、二つの書式のどちらかに、
7979 空白をいくつか入れる必要があるかもしれない。
7980
7981 @item full-iso
7982 タイムスタンプを省略なしで表示する。
7983 すなわち、ISO 8601 の日付、時刻、タイムゾーンという構成要素を
7984 nanosecond (10 億分の 1 秒) の精度で使用するわけだ。
7985 一例を挙げると、@samp{2002-03-30 23:45:56.477817180 -0700}
7986 といった表示になる。この形式は、@samp{+%Y-%m-%d %H:%M:%S.%N %z} と同じである。
7987
7988 これが有用なのは、タイムスタンプが、オペレーティング・システムから取得できる時間関係のすべての情報を含んでいるからである。
7989 たとえば、GNU の @command{make} は、あるファイルが古いかどうかを判定するのに、
7990 省略なしのタイムスタンプを使用している。そのため、この情報が、@command{make}
7991 の動作を説明するために役立つことがあるのである。
7992
7993 @item long-iso
7994 ISO 8601 の日付と時刻の構成要素を分の単位まで表示する。たとえば、
7995 @samp{2002-03-30 23:45}。このタイムスタンプは、@samp{full-iso} タイム
7996 スタンプより短く、日常作業にはたいてい十分である。この形式は
7997 @samp{+%Y-%m-%d %H:%M} と同じである。
7998
7999 @item iso
8000 最近以外のタイムスタンプでは、ISO 8601 の日付を表示し
8001 (たとえば @samp{2002-03-30@ })、最近のタイムスタンプでは、
8002 ISO 8601 風の月・日・時・分を表示する (たとえば @samp{03-30 23:45})。
8003 この形式は、@samp{long-iso} の形式に比べて見かけがよくないが、
8004 より狭いスペースでほぼ同量の情報を伝えており、また、簡潔なので
8005 @command{ls} の出力を伝統的な 1 行 80 桁の出力行に納めるのに都合がよい。
8006 @command{ls} を実行する以下の二つの方法は、同じことである。
8007
8008 @example
8009 newline='
8010 '
8011 ls -l --time-style="+%Y-%m-%d $newline%m-%d %H:%M"
8012 ls -l --time-style="iso"
8013 @end example
8014
8015 @item locale
8016 @vindex LC_TIME
8017 タイムスタンプをロケール依存形式で表示する。たとえば、
8018 フィンランド語のロケールだと、最近以外のタイムスタンプを
8019 @samp{maalis 30@ @ 2002} のように表示し、最近のタイムスタンプは
8020 @samp{maalis 30 23:45} のように表示するかもしれない。
8021 ロケール依存のタイムスタンプは、概して @samp{iso} のタイムスタンプより長くなるし、
8022 ロケールごとの規則の違いは非常に大きいので、プログラムによる解析がずっと難しくなる。
8023 だが、こちらの方がわかりやすい人も大勢いる。
8024
8025 タイムスタンプの書式を決めているのは、@env{LC_TIME} ロケール・カテゴリである。
8026 デフォルトの POSIX ロケールでは、@samp{Mar 30@ @ 2002} や
8027 @samp{Mar 30 23:45} といったタイムスタンプを使っている。
8028 POSIX ロケールでは、@command{ls} を実行する次の二つの方法は、同じことである。
8029
8030 @example
8031 newline='
8032 '
8033 ls -l --time-style="+%b %e  %Y$newline%b %e %H:%M"
8034 ls -l --time-style="locale"
8035 @end example
8036
8037 しかし、他のロケールでは動作が違う。たとえば、ドイツ語のロケールだと、
8038 @option{--time-style="locale"} は @option{--time-style="+%e. %b %Y
8039 $newline%e. %b %H:%M"}
8040 とおそらく同じになり、@samp{30. M@"ar 2002@ } や
8041 @samp{30. M@"ar 23:45} といったタイムスタンプを生成するだろう。
8042
8043 @item posix-@var{style}
8044 @vindex LC_TIME
8045 @env{LC_TIME} ロケール・カテゴリが POSIX なら、POSIX ロケールのタイムスタンプを表示し、
8046 それ以外なら、@var{style} 形式のタイムスタンプを表示する。
8047 たとえば、@samp{posix-long-iso} という指定は、POSIX ロケールでは
8048 @samp{Mar 30@ @ 2002} や @samp{Mar 30 23:45} といったタイムスタンプを表示し、
8049 それ以外のロケールでは @samp{2002-03-30 23:45} といったタイムスタンプを表示する。
8050 @end table
8051 @end table
8052
8053 @vindex TIME_STYLE
8054 @option{--time-style} オプションのデフォルト値は、環境変数 @env{TIME_STYLE}
8055 を使って指定することができる。@env{TIME_STYLE} が設定されていない場合、
8056 デフォルトの形式は @samp{locale} である。GNU Emacs のバージョン 21.3
8057 以降では、@command{ls} の @option{--dired} オプションを使用しており、
8058 従って、どんな日付のフォーマットでも解析することができる。しかし、Emacs 21.1
8059 や 21.2 を使っていて、POSIX 以外のロケールを指定している場合は、
8060 @samp{TIME_STYLE="posix-long-iso"} を設定する必要があるかもしれない。
8061
8062 ある種のサービス不能化攻撃 (denial-of-service attacks) を回避するため、
8063 1000 バイトより長くなりそうなタイムスタンプは、エラーとして処理されることがある。
8064
8065
8066 @node Formatting the file names
8067 @subsection ファイル名のフォーマット
8068
8069 以下のオプションは、ファイル名の表示方法を変更する。
8070
8071 @table @samp
8072
8073 @item -b
8074 @itemx --escape
8075 @itemx --quoting-style=escape
8076 @opindex -b
8077 @opindex --escape
8078 @opindex --quoting-style
8079 @cindex backslash sequences for file names
8080 ファイル名中の非表示文字を、C 言語で使うような、バックスラッシュにアルファベットや
8081 8 進数を続ける方法を使用して、クォートする (訳注:
8082 このオプションでは、タブや改行だけでなく、空白 (Ox20)
8083 もバックスラッシュでクォートされる)。
8084
8085 @item -N
8086 @itemx --literal
8087 @itemx --quoting-style=literal
8088 @opindex -N
8089 @opindex --literal
8090 @opindex --quoting-style
8091 ファイル名をクォートしない。とは言え、@command{ls} では、出力先が端末の場合は、
8092 @option{--show-control-chars} が指定されていないかぎり、
8093 非表示文字を疑問符として表示するぐらいのことは行う。
8094
8095 @item -q
8096 @itemx --hide-control-chars
8097 @opindex -q
8098 @opindex --hide-control-chars
8099 ファイル名中の非表示文字に代えて、疑問符を表示する。
8100 この動作は、出力先が端末で、プログラムが @command{ls}
8101 の場合のデフォルトである。
8102
8103 (訳注: このオプションの現在の動作は変わっているかもしれない。
8104 すなわち、出力先が端末以外の場合は、上記の通り、非表示文字を疑問符で表示するが、
8105 出力先が端末の場合は、非表示文字を疑問符ではなく、@samp{$''}
8106 という形で表示し、空白 (0x20) を含むファイル名はファイル名全体をシングルクォートで囲むかもしれない。
8107 @option{--quoting-style} の説明の末尾の訳注もご覧になっていただきたい。)
8108
8109 @item -Q
8110 @itemx --quote-name
8111 @itemx --quoting-style=c
8112 @opindex -Q
8113 @opindex --quote-name
8114 @opindex --quoting-style
8115 ファイル名をダブル・クォートで囲み、非表示文字を C 言語と同じやり方でクォートする。
8116
8117 @item --quoting-style=@var{word}
8118 @opindex --quoting-style
8119 @cindex quoting style
8120 ファイル名などの文字列には、通常使われない文字が含まれているかもしれない。
8121 このオプションを指定すると、@var{word} というスタイルを使って、
8122 そうした文字列をクォートすることになる。
8123 @var{word} は、以下に挙げるものの一つでなければならない。
8124
8125 @macro quotingStyles
8126 @table @samp
8127 @item literal
8128 文字列に手を加えず、そのまま出力する。これは、@option{-N} や
8129 @option{--literal} オプションと同じである。
8130 @item shell
8131 文字列にシェルのメタ文字がある場合や、出力が誤解を招くものになりそうな場合に、
8132 シェル向けのクォートを施す。このクォート方法は、@command{bash} のような
8133 POSIX 互換のシェルにはふさわしいものだが、
8134 @command{csh} のような非互換のシェルでは、必ずしもうまく働くとはかぎらない。
8135 @item shell-always
8136 普通ならクォートが不要な場合でも、文字列にシェル向けのクォートを施す。
8137 @item shell-escape
8138 @samp{shell} に似ているが、非表示文字のクォーティングに POSIX 提唱の
8139 @samp{$''} という書式を使用する。ほとんどのシェルに適している。
8140 (訳注: ファイル名中に空白 (0x20) がある場合は、ファイル名全体をシングルクォートで囲む。)
8141 @item shell-escape-always
8142 @samp{shell-escape} に似ているが、普通ならクォートが不要な場合でも、
8143 文字列にクォートを施す。
8144 @item c
8145 C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
8146 文字列をダブル・クォートで囲むことも行う。
8147 これは、@option{-Q} や @option{--quote-name} オプションと同じである。
8148 @item escape
8149 C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
8150 ただし、文字列をダブル・クォートで囲むことはしない。
8151 これは、@option{-b} や @option{--escape} と同じである。
8152 @item clocale
8153 C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
8154 ただし、文字列を囲む引用符には、ロケールにふさわしいものを使う。
8155 @item locale
8156 @c Use @t instead of @samp to avoid duplicate quoting in some output styles.
8157 C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
8158 ただし、文字列を囲む引用符には、ロケールにふさわしいものを使い、
8159 さらに、デフォルトの C ロケールで言うと、@t{"like this"} ではなく、
8160 @t{'like this'} のようにクォートを行う。この方が見栄えのよいディスプレイが多い。
8161 @end table
8162 @end macro
8163 @quotingStyles
8164
8165 @option{--quoting-style} オプションのデフォルト値は、環境変数
8166 @env{QUOTING_STYLE} によって指定することができる。
8167 この環境変数が設定されていない場合、デフォルトの値は、出力先が端末のときは
8168 @samp{shell-escape} であり、端末以外のときは @samp{literal} である。
8169
8170 (訳注: 上記の説明からは、デフォルトの端末に対する出力のスタイルは、
8171 @samp{shell-escape} であるように読める。しかし、@option{--hide-control-chars}
8172 (@option{-q}) の説明や、@command{ls} の章全体の冒頭では、
8173 非表示文字を疑問符として表示するのが、デフォルトの端末に対する出力だと言っている。
8174 info マニュアルの説明に少し混乱があり、部分的に古い記述が残っているらしい。実のところ、coreutils
8175 の開発元では、バージョン 8.25 あたりから、デフォルトの端末に対する出力を
8176 @option{--quoting-style=shell-escape} にしている。
8177 たとえば、ファイル名にタブが含まれている場合、オプションなしの
8178 @command{ls} は、@samp{aaa?bbb} ではなく @samp{'aaa'$'\t''bbb'}
8179 のように端末に表示するのである。また、ファイル名中に空白がある場合は、
8180 ファイル名全体をシングルクォートで囲って、@samp{'/misc/xxx yyy'}
8181 のように表示する。しかし、ディストリビューションによっては、バージョン
8182 8.26 でも、デフォルトの端末に対する出力を
8183 @option{--quoting-style=literal} にしていることもある。
8184 その方が見やすいかもしれないので、それも一見識だと思う。端末に対するデフォルトの出力や
8185 @option{-q} オプションの動作が、ご自分のところではどうなっているか、一度お確かめになっておくとよい。)
8186
8187 @item --show-control-chars
8188 @opindex --show-control-chars
8189 ファイル名中の非表示文字に手を加えず、そのまま出力する。
8190 この動作は、出力先が端末ではない場合や、プログラムが @command{ls}
8191 ではない場合のデフォルトである。
8192
8193 (訳注: 開発元配布のバージョン 8.26 では、@option{--show-contrls-chars}
8194 を指定した場合も、出力先が端末だと、非表示文字を @samp{$''} の書式で表示している。
8195 出力先が端末以外なら、上の説明どおり、非表示文字がそのまま出力される。
8196 しかし、ディストリビューション配布の @command{ls}
8197 では、出力先が端末の場合に上記説明通りの動作をするものもある。
8198 これも、お手元で実際の動作を確かめておいていただきたい。)
8199
8200 @end table
8201
8202
8203 @node dir invocation
8204 @section @command{dir}: ディレクトリの内容を簡潔に表示する
8205
8206 @pindex dir
8207 @cindex directory listing, brief
8208
8209 @command{dir} の動作は、@code{ls -C -b} と同じである。
8210 すなわち、デフォルトでは、ファイルのリストを多段組みで
8211 (訳注: 1 行に複数ファイルの形式で) 表示し、ソートは縦方向に行う。
8212 また、特殊文字は、バックスラッシュ・エスケープシーケンスを使って表示する。
8213
8214 @xref{ls invocation, @command{ls}}.
8215
8216
8217 @node vdir invocation
8218 @section @command{vdir}: ディレクトリの内容を詳細に表示する
8219
8220 @pindex vdir
8221 @cindex directory listing, verbose
8222
8223 @command{vdir} の動作は、@code{ls -l -b} と同じである。
8224 すなわち、デフォルトでは、詳細形式でファイルをリストし、
8225 特殊文字は、バックスラッシュ・エスケープシーケンスを使って表示する。
8226
8227 @xref{ls invocation, @command{ls}}.
8228
8229 @node dircolors invocation
8230 @section @command{dircolors}: @command{ls} のカラー設定
8231
8232 @pindex dircolors
8233 @cindex color setup
8234 @cindex setup for color
8235
8236 @command{dircolors} は、@command{ls} (や @command{dir} など)
8237 でカラー出力をするのに必要な端末設定のためのシェルコマンドのシーケンスを出力する。
8238 通常、次のような形で使用される。
8239
8240 @example
8241 eval "$(dircolors [@var{option}]@dots{} [@var{file}])"
8242 @end example
8243
8244 @var{file} が指定されていると、@command{dircolors} はそれを読み込んで、
8245 どのファイルタイプや拡張子に対してどの色を使うかを決定する。
8246 @var{file} が指定されていない場合は、プログラムに埋め込まれているデータベースが使用される。
8247 そうした設定ファイルの書式について詳しいことを知りたかったら、
8248 @samp{dircolors --print-database} を実行してみるとよい。
8249
8250 ファイル @file{~/.dircolors} が存在していたら、@command{dircolors}
8251 がそれを読み込むようにするには、以下の行を自分の @file{~/.bashrc} に書き込めばよい
8252 (お気に入りのシェルが bash でないなら、適切に書き直すこと)。
8253
8254 @example
8255 d=.dircolors
8256 test -r $d && eval "$(dircolors $d)"
8257 @end example
8258
8259 @vindex LS_COLORS
8260 @vindex SHELL @r{environment variable, and color}
8261 @command{dircolors} の出力は、環境変数 @env{LS_COLORS}
8262 を設定するシェルコマンドである。どのシェルの文法にするかは、
8263 コマンドラインで指定することができる。指定しない場合は、環境変数 @env{SHELL}
8264 の値から @command{dircolors} が推測する。
8265
8266 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
8267
8268 @table @samp
8269 @item -b
8270 @itemx --sh
8271 @itemx --bourne-shell
8272 @opindex -b
8273 @opindex --sh
8274 @opindex --bourne-shell
8275 @cindex Bourne shell syntax for color setup
8276 @cindex @command{sh} syntax for color setup
8277 Bourne シェルのコマンドを出力する。これが、環境変数 @env{SHELL}
8278 が設定されていて、その値が @samp{csh} や @samp{tcsh}
8279 で終わっていないときのデフォルトである。
8280
8281 @item -c
8282 @itemx --csh
8283 @itemx --c-shell
8284 @opindex -c
8285 @opindex --csh
8286 @opindex --c-shell
8287 @cindex C shell syntax for color setup
8288 @cindex @command{csh} syntax for color setup
8289 C シェルのコマンドを出力する。これは、環境変数 @code{SHELL} の値が、
8290 @command{csh} や @command{tcsh} で終わっているときのデフォルトである。
8291
8292 @item -p
8293 @itemx --print-database
8294 @opindex -p
8295 @opindex --print-database
8296 @cindex color database, printing
8297 @cindex database for color setup, printing
8298 @cindex printing color database
8299 (プログラムに埋め込まれている) デフォルトのカラー設定データベースを出力する。
8300 この出力は、それ自体有効な設定ファイルであり、どういう設定が可能かについてかなり詳しく説明している。
8301
8302 @end table
8303
8304 @exitstatus
8305
8306
8307 @node Basic operations
8308 @chapter 基本的なファイル操作
8309
8310 @cindex manipulating files
8311
8312 この章では、基本的なファイル操作のためのコマンドを説明する。
8313 すなわち、コピー、移動 (名前の変更)、消去 (削除) といった操作である。
8314
8315 @menu
8316 * cp invocation::            ファイルをコピーする。
8317 * dd invocation::            ファイルの変換とコピー。
8318 * install invocation::       ファイルをコピーし属性をセットする。
8319 * mv invocation::            ファイルの移動 (名前の変更) を行う。
8320 * rm invocation::            ファイルやディレクトリを削除する。
8321 * shred invocation::         セキュリティを向上させたファイルの削除。
8322 @end menu
8323
8324
8325 @node cp invocation
8326 @section @command{cp}: ファイルやディレクトリをコピーする
8327
8328 @pindex cp
8329 @cindex copying files and directories
8330 @cindex files, copying
8331 @cindex directories, copying
8332
8333 @command{cp} はファイルをコピーする (もしそうしたければ、ディレクトリのコピーもできる)。
8334 コピーによって作られたファイルは、コピー元から全く独立したものになる。
8335 一つのファイルを別のファイルにコピーすることもできるし、
8336 好きなだけたくさんのファイルをコピー先のディレクトリに一遍にコピーすることもできる。
8337
8338 書式:
8339
8340 @example
8341 cp [@var{option}]@dots{} [-T] @var{source} @var{dest}
8342 cp [@var{option}]@dots{} @var{source}@dots{} @var{directory}
8343 cp [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
8344 @end example
8345
8346 @itemize @bullet
8347 @item
8348 ファイル名を二つ指定すると、@command{cp} は最初のファイルを 2 番目のファイルにコピーする。
8349
8350 @item
8351 @option{--target-directory} (@option{-t}) オプションを指定した場合や、
8352 あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
8353 @option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
8354 @command{cp} は、各コピー元 (@var{source}) ファイルを、指定されたディレクトリにコピー元
8355 (@var{source}) と同じ名前でコピーする。
8356 @end itemize
8357
8358 ほとんどの場合、ファイルは読み込まれたとおりに書き出される。
8359 例外については、後述の @option{--sparse} オプションをご覧になっていただきたい。
8360
8361 デフォルトでは、@command{cp} はディレクトリをコピーしない。
8362 ただし、@option{-R}, @option{-a}, @option{-r} オプションを指定すると、
8363 @command{cp} は再帰的なコピーを行う。
8364 すなわち、コピー元のディレクトリを段階的に下って、対応するコピー先のディレクトリにファイルをコピーすることになる。
8365
8366 コピー元がシンボリックリンクの場合、@command{cp} がリンクをたどるのは
8367 (訳注: すなわち、リンクそのものではなく、参照先の実ファイルをコピーするのは)、
8368 通常では、再帰的なコピーをしていないときか、あるいは、@option{--link}
8369 (@option{-l}) オプションが使用されているときだけである。
8370 このデフォルトの動作は、次に挙げるオプションによって変更することができる。
8371 @option{--archive} (@option{-a}), @option{-d}, @option{--dereference}
8372 (@option{-L}),
8373 @option{--no-dereference} (@option{-P}), @option{-H}。
8374 こうしたオプションを二つ以上指定すると、@command{cp} は警告を出さず、最後のオプションで他のものを上書きする。
8375
8376 (訳注: 最近の @command{cp} では @option{--link} オプションの動作が変更されている。
8377 コピー元がシンボリックリンクの場合、coreutils-8.21 までは、
8378 デフォルトでは、シンボリックリンクのハードリンクを作っていたが、8.22
8379 以後の @command{cp} では参照先ファイルのハードリンクを作るようになっている。)
8380
8381 コピー先がシンボリックリンクの場合、@command{cp} がリンクをたどるのは
8382 (訳注: すなわち、コピー元ファイルで、リンクそのものではなく、参照先のファイルを上書きするのは)、
8383 そのリンクが、存在する通常ファイルを指しているときだけである。
8384 それに対して、コピー先のシンボリックリンクがリンク切れしている場合は、@command{cp}
8385 は、デフォルトではコピーを拒否し、エラーメッセージを出して、実行に失敗する。
8386 そうした操作は、本質的に危険だからである。
8387 この動作は、伝統的な習慣や POSIX の仕様に反している。
8388 たとえリスクがあろうとも、リンク切れしたシンボリックリンクの参照先を
8389 @command{cp} が作成するようにしたいなら、環境変数 @env{POSIXLY_CORRECT}
8390 を設定すればよい。なお @option{--backup} や @option{--link}
8391 といったオプションが、コピーする前にコピー先ファイルの名前変更や削除を行う場合、
8392 @command{cp} は、リンクが指しているファイルではなく、シンボリックリンクの名前変更や削除を行う。
8393
8394 デフォルトでは、@command{cp} がスペシャルファイルの内容をコピーするのは、
8395 再帰的なコピーをしていないときだけである。このデフォルトの動作は、
8396 @option{--copy-contents} によって変更できる。
8397
8398 @cindex self-backups
8399 @cindex backups, making only
8400 @command{cp} は通常、ファイルを自分自身にコピーすることを拒否するが、次の例外がある。
8401 @var{source} と @var{dest} が同一で、しかも、通常ファイルを指しているとき、
8402 @option{--force --backup} オプションが指定されると、@command{cp}
8403 はバックアップファイルを作成することになる。バックアップファイルを標準のものにするか
8404 (訳注: ファイルの末尾にチルダ @samp{~} が 1 個付く)、番号付きのものにするかは、
8405 いつもどおりの方法で指定できる (@pxref{Backup options})。
8406 存在するファイルに変更を加える前に、そのバックアップをちょっと作っておきたい場合、この動作は便利である。
8407
8408 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
8409
8410 @table @samp
8411 @item -a
8412 @itemx --archive
8413 @opindex -a
8414 @opindex --archive
8415 コピー元ファイルの構造と属性をコピー先でもできるだけ維持する
8416 (ただし、ディレクトリの内部構造を維持しようとはしない。そのため、コピー先で
8417 @samp{ls -U} を実行すると、コピー元とは違った順序でファイルがリストされるかもしれない)。
8418 SELinux コンテキストや拡張属性 (xattr) も維持しようとするが、
8419 そうした操作に失敗しても無視し、その旨エラーメッセージを表示することはない。
8420 エラーメッセージが少ないだけで、@option{-dR --preserve=all} と同じある。
8421
8422 @item --attributes-only
8423 @opindex --attributes-only
8424 コピー元ファイルの指定された属性のみを、コピー先にコピーする。
8425 コピー先ファイルがすでに存在している場合、その内容を変更することはない。
8426 属性のうち、何をコピーするかを決める方法については、@option{--preserve}
8427 オプションの項を見ていただきたい。
8428
8429 @item -b
8430 @itemx --backup[=@var{method}]
8431 @opindex -b
8432 @opindex --backup
8433 @vindex VERSION_CONTROL
8434 @cindex backups, making
8435 @xref{Backup options}.
8436 そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。
8437 特殊な用法としては、次のものがある。force と backup
8438 の両方のオプションが指定されているとき、コピー元 (@var{source})
8439 とコピー先 (@var{dest}) が同じ名前で、しかも実在する通常ファイルを指していると、
8440 @command{cp} はコピー元 (@var{source}) のバックアップを作成する。
8441 次のちょっとした Bourne シェルのスクリプトは、オプションのこの組み合わせの応用だが、便利である。
8442
8443 @example
8444 #!/bin/sh
8445 # Usage: backup FILE...
8446 # リストされた各 FILE について GNU スタイルのバックアップを
8447 # 作成する
8448 fail=0
8449 for i; do
8450   cp --backup --force --preserve=all -- "$i" "$i" || fail=1
8451 done
8452 exit $fail
8453 @end example
8454
8455 @item --copy-contents
8456 @cindex directories, copying recursively
8457 @cindex copying directories recursively
8458 @cindex recursively copying directories
8459 @cindex non-directories, copying as special files
8460 再帰的なコピーを行っている際に、スペシャルファイル (たとえば、FIFO やデバイスファイル)
8461 の内容を、操作対象が通常ファイルであるかのようにコピーする。
8462 要するに、コピー元の各ファイルからデータを読み込んで、それをコピー先に書き出そうとするわけである。
8463 このオプションを使うのは、ほとんどの場合誤りである。なぜなら、
8464 FIFO や、通常 @file{/dev} ディレクトリにあるようなスペシャルファイルを対象にした場合、
8465 望ましくない結果を生ずることが珍しくないからだ。
8466 @code{cp -R --copy-contents} は、FIFO や @file{/dev/console}
8467 のようなスペシャルファイルからデータを読み込もうとすると、
8468 たいていの場合、いつまでも無反応になるだろうし、@file{/dev/zero}
8469 をコピーしようとすれば、コピー先のディスクを溢れさせてしまうだろう。
8470 このオプションは、再帰的なコピーをするとき以外、効果を持たない。
8471 また、シンボリックリンクのコピーには影響しない。
8472
8473 @item -d
8474 @opindex -d
8475 @cindex symbolic links, copying
8476 @cindex hard links, preserving
8477 シンボリックリンクをコピーする際、リンクが指しているファイルをコピーするのではなく、
8478 シンボリックリンクをシンボリックリンクとしてコピーする。
8479 また、コピー元において複数のファイルがハードリンクの関係にある場合、
8480 コピー先でもその関係を維持する。
8481 @option{--no-dereference --preserve=links} と同じである。
8482
8483 @item -f
8484 @itemx --force
8485 @opindex -f
8486 @opindex --force
8487 このオプションを付けずにコピーを行う場合、
8488 コピー先ファイルがすでに存在し、しかも書き込みモードでオープンできないと、コピーに失敗する。
8489 それに対して、@option{--force} を付けた場合は、コピー先ファイルがオープンできないと、
8490 @command{cp} は、まずそれを削除してから、再度オープンを試みる。
8491 この動作は、@option{--force} と一緒に @option{--link} や @option{--symbolic-link}
8492 を使用した場合に行われる動作とは、違うことに注意していただきたい。
8493 後者の場合は、すでに存在するコピー先ファイルは一度もオープンされず、
8494 むしろ無条件で削除されるのである。@option{--remove-destination} の説明も参照すること。
8495
8496 このオプションは、@option{--interactive} や @option{-i}
8497 オプションとは無関係である。どちらも他方の効果を無効にすることはない。
8498
8499 @option{--no-clobber} や @option{-n} オプションを使用している場合、このオプションは無視される。
8500
8501 @item -H
8502 @opindex -H
8503 コマンドラインの引数がシンボリックリンクを指定している場合には、
8504 シンボリックリンクそのものではなく、それが指しているファイルをコピーする。
8505 とは言え、再帰的にディレクトリ・ツリーをたどっているときにシンボリックに出会った場合は、
8506 そのまま (つまり、シンボリックリンクとして) コピーする。
8507
8508 @item -i
8509 @itemx --interactive
8510 @opindex -i
8511 @opindex --interactive
8512 ディレクトリ以外のファイルをコピーする際に、コピー先ファイルがすでに存在していると、
8513 プロンプトを出して、ファイルを上書きしてよいかどうか、ユーザに問い合わせる。
8514 @option{-i} オプションは、@option{-n} オプションが前にあるとき、それを無効にする。
8515
8516 @item -l
8517 @itemx --link
8518 @opindex -l
8519 @opindex --link
8520 コピー元がディレクトリ以外の場合、コピーする代わりに、ハードリンクを作成する。
8521
8522 @item -L
8523 @itemx --dereference
8524 @opindex -L
8525 @opindex --dereference
8526 コピー元がシンボリックリンクの場合は、その参照先をコピーする。
8527 また、このオプションを使った場合、@command{cp} はシンボリックリンクを作ることができない。
8528 たとえば、コピー元のディレクトリ・ツリー中に (通常ファイルに対する)
8529 シンボリックリンクがあると、コピー先のディレクトリ・ツリーには、通常ファイルとしてコピーされることになる。
8530
8531 @item -n
8532 @itemx --no-clobber
8533 @opindex -n
8534 @opindex --no-clobber
8535 存在するファイルを上書きしない。@option{-n} オプションは、@option{-i}
8536 オプションが前にあるとき、それを無効にする。このオプションと @option{-b}
8537 (@option{--backup}) オプションは、どちらか一方しか指定できない。
8538
8539 @item -P
8540 @itemx --no-dereference
8541 @opindex -P
8542 @opindex --no-dereference
8543 @cindex symbolic links, copying
8544 コピー元がシンボリックリンクの場合、それが指しているファイルをコピーするのではなく、
8545 シンボリックリンクとしてコピーする。このオプションが作用を及ぼすのは、
8546 コピー元のシンボリックリンクに対してだけであり、
8547 コピー先に指定されたシンボリックリンクについては、可能なかぎり常に参照先がたどられる。
8548
8549 @item -p
8550 @itemx --preserve[=@var{attribute_list}]
8551 @opindex -p
8552 @opindex --preserve
8553 @cindex file information, preserving, extended attributes, xattr
8554 コピー元ファイルの属性のうち、指定されたものをコピー先でも維持する。
8555 @var{attribute_list} を指定する場合は、一つ以上の以下の文字列をコンマで区切ったリストでなければならない。
8556
8557 @table @samp
8558 @item mode
8559 ファイルのモードビット (訳注: 一般にアクセス権とか、許可属性と言われるもの)
8560 やアクセス・コントロール・リストを維持する。
8561 @item ownership
8562 所有者とグループを維持する。ほとんどの最近のシステムでは、
8563 ファイルの所有者を変更できるのは、しかるべき権限を持ったユーザだけである。
8564 また、一般ユーザがファイルのグループを維持できるのは、
8565 維持しようとするグループに、たまたまそのユーザが属しているときのみである。
8566 @item timestamps
8567 最終アクセス日時 (last access time) と最終更新日時 (last modification time)
8568 を、可能ならば、維持する。古いシステムでは、対象となるファイルがシンボリックリンクの場合、
8569 そうした属性を維持することができない。
8570 それに対して、最近のシステムでは、たいていのものが @code{utimensat}
8571 関数を用意しているので、シンボリックリンクの場合でも、日時関係の属性維持が可能である。
8572 @item links
8573 コピー元のファイル同士が (ハードリンクであれ、シンボリックリンクであれ)
8574 リンクの関係にあるとき、コピー先の対応するファイル同士でも、その関係を維持する。
8575 ただし、@option{-L} や @option{-H} と一緒に使った場合、
8576 このオプションがシンボリックリンクをハードリンクに変更することがあるのに、
8577 注意していただきたい。一例を挙げる。
8578 @example
8579 $ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
8580 74161745 a
8581 74161745 b
8582 @end example
8583 @noindent
8584 コピー元に注目していただきたい。@file{b} は、通常ファイル @file{a} を指すシンボリックリンクである。
8585 ところが、コピー先ディレクトリ @file{c/} の二つのファイルは、ハードリンクになっている。
8586 @option{-a} は @option{--no-dereference} を意味するのだから、
8587 シンボリックリンクがコピーされそうに思えるが、この場合は、後に続く
8588 @option{-H} が、コマンドライン引数の参照をたどるように @command{cp}
8589 に命じているので、@command{cp} には、同じ inode 番号を持った
8590 2 個のファイルがコマンドラインで指定されているように見えるのである。
8591 さらに、@option{-a} は @option{--preserve=links} オプションを意味してもいるので、
8592 この働きによって、ハードリンクと認識された両ファイルの関係が、コピー先でも維持されることになるのである。
8593
8594 次のものは、@command{cp} の @option{-L} を使った場合の類似例である。
8595 @smallexample
8596 $ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b
8597 74163295 a
8598 74163295 b
8599 @end smallexample
8600
8601 @item context
8602 ファイルの SELinux セキュリティ・コンテキストを維持する。
8603 それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。
8604 @item xattr
8605 ファイルの拡張属性を維持する。それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。
8606 @command{cp} が xattr のサポートなしでビルドされている場合は、このオプションは無視される。
8607 SELinux コンテキスト、ACL、ケーパビリティなどを xattr を使って実装している場合には、
8608 そうした属性もこのオプションによって、明示的な指定がない場合でも維持される。
8609 すなわち、@option{--preserve=mode} や @option{--preserve=context}
8610 を指定しないでも維持されるわけだ。
8611 @item all
8612 ファイルの属性をすべて維持する。上記のすべてを指定するのと同じことだが、
8613 SELinux セキュリティ・コンテキストや拡張属性の維持に失敗しても、
8614 @command{cp} の終了ステータスが変わらないという点が異なっている。
8615 @option{-a} とは違って、@samp{Operation not supported}
8616 以外のすべての警告メッセージを出力する。
8617 @end table
8618
8619 @var{attribute_list} なしで @option{--preserve} を使用するのは、
8620 @option{--preserve=mode,ownership,timestamps} と同じことである。
8621
8622 このオプションを使わない場合、コピー先ファイルがすでに存在している場合は、
8623 その許可属性は変更されない。一方、新しくファイルが作成される場合は、
8624 対応するコピー元ファイルのモードを元にして、
8625 そこから set-user-ID ビット、set-group-ID ビット、スティッキー・ビットを落としたものが、
8626 各ファイルに付けられ、そしてさらに、オペレーティング・システムが
8627 umask なり、デフォルトの ACL なりを適用する。
8628 結果はより厳しいファイルモードになるかもしれない。 @xref{File permissions}.
8629
8630 @item --no-preserve=@var{attribute_list}
8631 @cindex file information, preserving
8632 指定された属性を維持しない。@var{attribute_list} の書式は、@option{--preserve}
8633 の場合と同じである。
8634
8635 @item --parents
8636 @opindex --parents
8637 @cindex parent directories and @command{cp}
8638 コピー先の各ファイル名を生成する際、出力先に指定されたディレクトリの末尾にスラッシュを付け、
8639 その後ろにコピー元として指定されたファイル名を付け足すことによってそれを行う。
8640 @command{cp} に渡す最後の引数は、実在するディレクトリの名前でなければならない。
8641 一例を挙げる。
8642
8643 @example
8644 cp --parents a/b/c existing_dir
8645 @end example
8646
8647 @noindent
8648 ファイル @file{a/b/c} を上記のコマンドでコピーすると、ファイル
8649 @file{existing_dir/a/b/c} が出来る。
8650 途中のディレクトリが存在していなければ、それも作成される。
8651
8652 @item -R
8653 @itemx -r
8654 @itemx --recursive
8655 @opindex -R
8656 @opindex -r
8657 @opindex --recursive
8658 @cindex directories, copying recursively
8659 @cindex copying directories recursively
8660 @cindex recursively copying directories
8661 @cindex non-directories, copying as special files
8662 ディレクトリを再帰的にコピーする。デフォルトでは、@option{--link} (@option{-l})
8663 オプションが同時に使われていないかぎり、コピー元にあるシンボリックリンクの参照をたどることをしない。
8664 @option{--archive} (@option{-a}), @option{-d}, @option{--dereference}
8665 (@option{-L}), @option{--no-dereference} (@option{-P}), @option{-H}
8666 などのオプションを参照。スペシャルファイルについては、
8667 コピーする際に、コピー元ファイルと同じファイル型のコピー先ファイルを作成する。
8668 @option{--copy-contents} を参照。シンボリックリンクやスペシャルファイルのコピーに
8669 @option{-r} オプションを使用するのは、どのシステムでも通用することではない。
8670 GNU 以外のシステムの中には、歴史的な理由から @option{-r} が、@option{-L} と
8671 @option{--copy-contents} を同時に指定するのと等価になっているものもあるからだ。
8672 また、シンボリックリンクをコピーするのに @option{-R} を使用するのも、@option{-P}
8673 も併せて指定しないかぎり、どのシステムでも通用することではない。
8674 デフォルトでシンボリックリンクの参照先をたどる実装が、POSIX で認められているからである。
8675
8676 @item --reflink[=@var{when}]
8677 @opindex --reflink[=@var{when}]
8678 @cindex COW
8679 @cindex clone
8680 @cindex copy on write
8681 ファイルシステムがサポートしていれば、軽便コピー、すなわち、
8682 書き込み時コピー(copy-on-write (COW) copy) を行う。
8683 留意すべきは、これが成功した場合、コピー元とコピー先のファイルは、
8684 どちらかに対して変更が加えられるまで、ディスクの同じデータブロックを共有しているということである。
8685 従って、ディスク I/O エラーが起きて、片方のファイルのデータブロックが損傷を受ければ、
8686 もう一方のファイルも同じ被害に会う。
8687
8688 @var{when} の値には、次のうちの一つが使える。
8689
8690 @table @samp
8691 @item always
8692 デフォルトの動作である。copy-on-write がサポートされていない場合は、
8693 各ファイルについて失敗した旨を報告し、失敗を示すステータスで終了する。
8694
8695 @item auto
8696 copy-on-write 操作がサポートされていない場合は、copy-on-write
8697 をあきらめて、標準のコピー動作を行う。
8698 @end table
8699
8700 このオプションは、@option{--link}, @option{--symbolic-link}
8701 @option{--attributes-only}
8702 オプションによって無効になるので、データをコピーする際の @command{cp}
8703 のデフォルト動作の設定に使用することができる。
8704 たとえば、次のエイリアスを使うと、@command{cp} は、ファイルシステムがサポートする範囲で、
8705 ディスクスペースの使用を最少に留めるようになる。
8706
8707 @example
8708 alias cp='cp --reflink=auto --sparse=always'
8709 @end example
8710
8711 @item --remove-destination
8712 @opindex --remove-destination
8713 コピー先ファイルがすでに存在する場合、その各々についてオープンを試みる前に、削除する
8714 (上述の @option{-f} と比較すること)。
8715
8716 @item --sparse=@var{when}
8717 @opindex --sparse=@var{when}
8718 @cindex sparse files, copying
8719 @cindex holes, copying files with
8720 @findex read @r{system call, and holes}
8721 穴空きファイル (@dfn{sparse file}) とは、穴 (@dfn{holes}) を含むファイルである。
8722 穴というのは、物理的なディスクブロック上には存在しないゼロバイトの連続で、
8723 @samp{read} システムコールがそれを読む込むとき、ゼロの連続として扱うものである。
8724 バイナリ・ファイルには、連続するゼロバイトがたくさん含まれていることが多いので、
8725 この仕組みは、ディスクスペースを大いに節約してくれるし、動作速度の向上をもたらしてもくれる。
8726 デフォルトで @command{cp} は、かなり大雑把な発見的手法を使って、
8727 コピー元ファイルにある穴を検出し、対応するコピー先ファイルも穴空きファイルにする。
8728 なお、穴空きファイルにできるのは、通常ファイルだけである。
8729
8730 @var{when} の値には、次のうちの一つが使える。
8731
8732 @table @samp
8733 @item auto
8734 デフォルトの動作である。すなわち、コピー元が穴空きファイルなら、
8735 コピー先も穴空きファイルにしようとする。
8736 ただし、コピー先ファイルがすでに存在していても、通常ファイル以外を指している場合には、
8737 それを穴空きにしようとはしない。
8738
8739 @item always
8740 たとえ、コピー元ファイルが穴空きファイルに見えなくても、十分に長いゼロバイトの連続があれば、
8741 その各々に対応する穴をコピー先ファイルに設けようとする。この動作が役に立つのは、
8742 コピー元ファイルが、穴空きファイルをサポートしていないファイルシステムにあるのに対し
8743 (たとえば、SGI IRIX 5.3 以前の @samp{efs} ファイルシステム)、
8744 コピー先ファイルは穴空きファイルをしっかりサポートするタイプのファイルシステムにある場合である。
8745 穴を作ることができるのは、通常ファイルだけなので、コピー先が通常ファイル以外なら、
8746 @command{cp} がそのファイルを穴空きにしようと試みることもない。
8747
8748 @item never
8749 コピー先ファイルを穴空きにしない。
8750 これは、@command{mkswap} コマンドで使用するファイルを作成するときに役に立つ。
8751 そうしたファイルには、穴があってはならないからである。
8752 @end table
8753
8754 @optStripTrailingSlashes
8755
8756 @item -s
8757 @itemx --symbolic-link
8758 @opindex -s
8759 @opindex --symbolic-link
8760 @cindex symbolic links, copying with
8761 コピー元がディレクトリ以外の場合、コピーする代わりに、シンボリックリンクを作成する。
8762 出力先ファイルをカレント・ディレクトリに作成する場合を除いて、
8763 コピー元ファイルの名前は、すべて (@samp{/} で始まる) 絶対パス表記でなければならない。
8764 シンボリックリンクをサポートしていないシステムでは、このオプションはエラーメッセージを出すだけである。
8765
8766 @optBackupSuffix
8767
8768 @optTargetDirectory
8769
8770 @optNoTargetDirectory
8771
8772 @item -u
8773 @itemx --update
8774 @opindex -u
8775 @opindex --update
8776 @cindex newer files, copying only
8777 ディレクトリ以外のものをコピーする際、それがコピー先にも存在し、
8778 しかもその更新日時 (modification time) がコピー元と同じか、より新しい場合、
8779 コピーを行わない。コピー元からコピー先へタイムスタンプを引き継がせている場合には、
8780 コピー元のタイムスタンプの精度を、コピー先のファイルシステム、
8781 及びタイプスタンプの更新に使われるシステムコールの精度に落とした上で、比較を行う。
8782 これは、同じコピー元とコピー先のファイルに対して @samp{cp -pu}
8783 コマンドを何回か実行する場合に、余計なコピー作業が起きるのを避けるためである。
8784 @option{--preserve=links} が一緒に指定されている場合は
8785 (たとえば、@samp{cp -au} だとそうなる)、そちらが優先されることになる。
8786 その結果、コピー元でファイルが処理される順番によっては、
8787 コピー元のハードリンクを反映させるために、コピー先のより新しいファイルが置き換えられることもある。
8788
8789 @item -v
8790 @itemx --verbose
8791 @opindex -v
8792 @opindex --verbose
8793 コピーを行う前に、コピーするファイル名を表示する。
8794
8795 @item -x
8796 @itemx --one-file-system
8797 @opindex -x
8798 @opindex --one-file-system
8799 @cindex file systems, omitting copying to different
8800 あるファイルシステムでコピーを始めた場合、別のファイルシステムにあるサブディレクトリをスキップする。
8801 ただし、マウントポイントのディレクトリはコピーされる。
8802
8803 @macro optContext
8804 @item -Z
8805 @itemx --context[=@var{context}]
8806 @opindex -Z
8807 @opindex --context
8808 @cindex SELinux, setting/restoring security context
8809 @cindex security context
8810 @var{context} が指定されていない場合は、出力するファイルの SELinux
8811 セキュリティ・コンテキストを、出力先におけるシステムのデフォルトのタイプに合わせて調整する。
8812 これは、@command{restorecon} コマンドの動作に似ている。
8813 このオプションの長い形式を使って、コンテキストを明示的に指定した場合、
8814 そのコンテキストが設定されるのは、新しく作成されるファイルに対してのみである。
8815 コンテキストを指定した場合に、SELinux と SMACK のどちらも無効になっていると、
8816 警告メッセージを出す。
8817 @end macro
8818 @optContext このオプションと
8819 @option{--preserve=context} オプションは、どちらか一方しか指定できない。
8820 また、このオプションは @option{--preserve=all} や @option{-a} オプションに優先する。
8821
8822 @end table
8823
8824 @exitstatus
8825
8826
8827 @node dd invocation
8828 @section @command{dd}: ファイルの変換とコピー
8829
8830 @pindex dd
8831 @cindex converting while copying a file
8832
8833 @command{dd} はファイルをコピーする (デフォルトでは、標準入力から標準出力へコピーする)。
8834 その際、入出力のブロックサイズを変更することができる。
8835 また、データ形式の変換を行いつつコピーすることもできる。
8836
8837 書式:
8838
8839 @example
8840 dd [@var{operand}]@dots{}
8841 dd @var{option}
8842 @end example
8843
8844 指定できるオプションは、@option{--help} と @option{--version} だけである。
8845 @xref{Common options}.  @command{dd} では、以下のオペランドが使える。
8846 オペランドの書式の元になったのは、OS/360 の JCL (Job Control Language) の
8847 DD 文 (Data Definition statement) である。
8848
8849 @table @samp
8850
8851 @item if=@var{file}
8852 @opindex if
8853 標準入力の代わりに、@var{file} から読み込む。
8854
8855 @item of=@var{file}
8856 @opindex of
8857 標準出力の代わりに、@var{file} に書き出す。@samp{conv=notrunc}
8858 が指定されていない場合、@command{dd} は、出力を開始する前に、@var{file} を
8859 0 バイトに (あるいは、@samp{seek=} で指定されたサイズに) 短縮する。
8860
8861 @item ibs=@var{bytes}
8862 @opindex ibs
8863 @cindex block size of input
8864 @cindex input block size
8865 入力ブロックサイズを @var{bytes} にする。@command{dd} が 1 ブロック @var{bytes}
8866 バイトで読み込みを行うようになる。デフォルトは 512 バイトである。
8867
8868 @item obs=@var{bytes}
8869 @opindex obs
8870 @cindex block size of output
8871 @cindex output block size
8872 出力ブロックサイズを @var{bytes} にする。@command{dd} が 1 ブロック @var{bytes}
8873 バイトで書き出しを行うようになる。デフォルトは 512 バイトである。
8874
8875 @item bs=@var{bytes}
8876 @opindex bs
8877 @cindex block size
8878 入力、出力、両方のブロックサイズを @var{bytes} にする。@command{dd} が
8879 1 ブロック @var{bytes} バイトで読み書きを行うようになり、@samp{ibs} や @samp{obs}
8880 の指定は、あっても無効になる。なお、データ変換を行う @option{conv}
8881 オプションが指定されていない場合は、入力は、それがブロックサイズより小さくても、
8882 読み込まれるやいなや、出力にコピーされることになる。
8883
8884 @item cbs=@var{bytes}
8885 @opindex cbs
8886 @cindex block size of conversion
8887 @cindex conversion block size
8888 @cindex fixed-length records, converting to variable-length
8889 @cindex variable-length records, converting to fixed-length
8890 変換ブロックサイズを @var{bytes} にする。
8891 可変長のレコードを固定長のレコードに変換するときや
8892 (@option{conv=block})、その逆を行うとき
8893 (@option{conv=unblock})、固定長レコードの長さとして @var{bytes} の値を使用する。
8894
8895 @item skip=@var{n}
8896 @opindex skip
8897 入力ファイルで @samp{ibs} バイトのブロックを @var{n} 個読み飛ばしてから、
8898 コピーを行う。@samp{iflag=skip_bytes} が指定されている場合は、@var{n}
8899 はブロック数ではなく、バイト数と見なされる。
8900
8901 @item seek=@var{n}
8902 @opindex seek
8903 出力ファイルで @samp{obs} バイトのブロックを @var{n} 個スキップしてから、
8904 コピーを行う。@samp{oflag=seek_bytes} が指定されている場合は、 @var{n}
8905 はブロック数ではなく、バイト数と見なされる。
8906
8907 @item count=@var{n}
8908 @opindex count
8909 入力ファイルの末尾まで全部ではなく、@samp{ibs} バイトのブロックを @var{n}
8910 個だけ入力ファイルからコピーする。@samp{iflag=count_bytes}
8911 が指定されている場合は、@var{n} はブロック数ではなく、バイト数と見なされる。
8912 なお、次のことに注意してほしい。パイプから読み込んでいる場合などに時おり起きることだが、
8913 入力からの読み込みがブロックの大きさに足りないことがある。そうした場合に
8914 @samp{iflag=fullblock} が指定してあると、@samp{count=}
8915 は、一杯になるまで読み込むブロックの個数を意味するようになる。
8916 入力から読み込みを実行する回数という POSIX で規定されている伝統的な動作ではなくなるのだ。
8917
8918 @item status=@var{level}
8919 @opindex status
8920 通常では @samp{INFO} シグナルを受け取った時点や、@command{dd} が終了したときに、
8921 転送情報が標準エラーに出力される。
8922 @var{level} の指定によって、表示する情報の量を調節することができる。
8923 指定された @var{level} のうち、最後のものが優先される。
8924
8925 @table @samp
8926
8927 @item none
8928 @opindex none @r{dd status=}
8929 情報メッセージや警告メッセージを標準エラーに全く表示しない。
8930 エラーメッセージは通常どおり出力する。
8931
8932 @item noxfer
8933 @opindex noxfer @r{dd status=}
8934 最終的な転送速度や転送量の統計を表示しない。通常は、そうした情報がステータス表示の最後の行になる。
8935
8936 @item progress
8937 @opindex progress @r{dd status=}
8938 各入力ブロックを処理するとき、転送速度と転送量の統計を標準エラーに表示する。
8939 転送量の統計は 1 行に表示され、最も頻繁な場合、1 秒ごとに出力されるが、
8940 I/O 待ちが起きると、更新が遅れることがある。
8941
8942 @end table
8943
8944 @item conv=@var{conversion}[,@var{conversion}]@dots{}
8945 @opindex conv
8946 @var{conversion} 引数 (複数可) で指定されたようにファイルを変換する。
8947 (コンマの前後にスペースを入れてはいけない。)
8948
8949 @var{conversion} には次のものが指定できる:
8950
8951 @table @samp
8952
8953 @item ascii
8954 @opindex ascii@r{, converting to}
8955 POSIX が規定している変換テーブルを使って、EBCDIC を ASCII に変換する。
8956 変換テーブル中の 256 バイトのすべてについて、1 対 1 の変換が行われる。
8957 このオプションを指定すると、@samp{conv=unblock} も指定されることになる。
8958 入力はまず ASCII に変換され、その後で末尾のスペースが除去される。
8959
8960 @item ebcdic
8961 @opindex ebcdic@r{, converting to}
8962 ASCII を EBCDIC に変換する。これは @samp{ascii} 変換の逆の動作である。
8963 このオプションを指定すると、@samp{conv=block} も指定されることになる。
8964 末尾にスペースが追加されてから、EBCDIC に変換される。
8965
8966 @item ibm
8967 @opindex alternate ebcdic@r{, converting to}
8968 この指定の動作は @samp{conv=ebcdic} に似ている。
8969 ただし、POSIX が規定しているもう一つの変換テーブルを使って、変換する点が違う。
8970 こちらは 1 対 1 の変換ではないが、@samp{~}, @samp{[}, @samp{]}
8971 について、よく使われる伝統的な慣行を反映している。
8972
8973 @samp{ascii}, @samp{ebcdic}, @samp{ibm} は、どれか一つしか指定できない。
8974 こうしたオプションの一つを使う場合は、@samp{cbs=} も指定すべきである。
8975
8976 @item block
8977 @opindex block @r{(space-padding)}
8978 入力 1 行あたり、@samp{cbs} バイトを出力する。
8979 入力中の改行はスペースに置き換え、@samp{cbs} バイトに足りない分はスペースで埋める。
8980
8981 @item unblock
8982 @opindex unblock
8983 @samp{cbs} バイトの大きさからなる各入力ブロックに対して、末尾にスペースがあれば、
8984 それをすべて削除し、改行を追加する。
8985
8986 @samp{block} と @samp{unblock} は、どちらか一方しか指定できない。
8987
8988 @item lcase
8989 @opindex lcase@r{, converting to}
8990 大文字を小文字に変換する。
8991
8992 @item ucase
8993 @opindex ucase@r{, converting to}
8994 小文字を大文字に変換する。
8995
8996 @samp{lcase} と @samp{ucase} は、どちらか一方しか指定できない。
8997
8998 @item sparse
8999 @opindex sparse
9000 出力ブロックが NUL のみからなっているとき、それを書き出さずに、seek を試みる。
9001 穴空きファイル (sparse file) をサポートしているシステムでは、
9002 この動作は、出力ファイルを書き出しているときに、穴空きの出力を作成することになる。
9003 このオプションを @samp{conv=notrunc} や @samp{oflag=append}
9004 と一緒に使う際は、気をつけなければならない。@samp{conv=notrunc} が付いていると、
9005 入力中の NUL ブロックに対応する位置にある、出力ファイル中の存在するデータは、
9006 そのまま保持されることになる。@samp{oflag=append} を付けた場合は、
9007 seek は行っても効果がない。なお、@samp{conv=sparse} では、
9008 出力先がファイルではなく、デバイスの場合も、入力中の NUL ブロックはやはりコピーされない。
9009 そんなわけで、このオプションが最も役に立つのは、仮想デバイスや、前もって
9010 0 で初期化したデバイスに対してである。
9011
9012 @item swab
9013 @opindex swab @r{(byte-swapping)}
9014 @cindex byte-swapping
9015 入力された全バイトを 2 個づつ組にして、前後を入れ替える。GNU の
9016 @command{dd} は、他の @command{dd} とは違って、読み込むバイトが奇数個でも動作する。
9017 最後のバイトは (入れ替えるものがないので) そのままコピーするのである。
9018
9019 @item sync
9020 @opindex sync @r{(padding with ASCII NULs)}
9021 すべての入力ブロックに対して @samp{ibs} の大きさになるまで、末尾をゼロバイトで埋める。
9022 @samp{block} や @samp{unblock} と一緒に使用すると、ゼロバイトの代わりにスペースで埋める。
9023
9024 @end table
9025
9026 以下の @var{conversion} は、実のところファイルの扱いに関するフラグなので、内的な処理には影響を及ぼさない。
9027
9028 @table @samp
9029 @item excl
9030 @opindex excl
9031 @cindex creating output file, requiring
9032 出力ファイルがすでに存在する場合は、実行に失敗する。
9033 言い換えれば、@command{dd} が出力ファイルを自分で作成しなければならないということである。
9034
9035 @item nocreat
9036 @opindex nocreat
9037 @cindex creating output file, avoiding
9038 出力ファイルを作成しない。言い換えれば、出力ファイルは前もって存在していなければならないということだ。
9039
9040 @samp{excl} と @samp{nocreat} は、どちらか一方しか指定できない。
9041
9042 @item notrunc
9043 @opindex notrunc
9044 @cindex truncating output file, avoiding
9045 出力ファイルに対して短縮操作をしない (訳注: @samp{of=@var{file}} の項を参照)。
9046
9047 @item noerror
9048 @opindex noerror
9049 @cindex read errors, ignoring
9050 読み込みエラーがあっても、作業を続行する。
9051
9052 @item fdatasync
9053 @opindex fdatasync
9054 @cindex synchronized data writes, before finishing
9055 コマンドを終了する直前に、出力データを同期させる。
9056 すなわち、出力データをディスクに実際に書き込む。
9057
9058 @item fsync
9059 @opindex fsync
9060 @cindex synchronized data and metadata writes, before finishing
9061 コマンドを終了する直前に、出力データだけでなく、メタデータも同期させる。
9062 すなわち、出力データとメタデータをディスクに実際に書き込む。
9063
9064 @end table
9065
9066 @item iflag=@var{flag}[,@var{flag}]@dots{}
9067 @opindex iflag
9068 引数 @var{flag} によって指定されたフラグを使って、入力ファイルにアクセスする。
9069 (コンマの前後にスペースを入れてはいけない。)
9070
9071 @item oflag=@var{flag}[,@var{flag}]@dots{}
9072 @opindex oflag
9073 引数 @var{flag} によって指定されたフラグを使って、出力ファイルにアクセスする。
9074 (コンマの前後にスペースを入れてはいけない。)
9075
9076 フラグには次のものがある。どのオペレーティング・システムでも、
9077 すべてのフラグが使えるわけではない。
9078
9079 @table @samp
9080
9081 @item append
9082 @opindex append
9083 @cindex appending to the output file
9084 追加モードで書き込む。従って、何か別のプロセスが問題のファイルに書き出している場合でも、
9085 @command{dd} の書き込みは、書き込むたびに、そのファイルの今現在の内容に追加されることになる。
9086 このフラグは出力に対してしか意味がない。なお、このフラグを
9087 @samp{of=@var{file}} オペランドと組み合わせて使うのなら、
9088 @samp{conv=notrunc} も一緒に指定した方がよい。
9089 さもないと、出力ファイルは、追加書き込みが始まる前に、短縮操作を受けることになる。
9090
9091 @item cio
9092 @opindex cio
9093 @cindex concurrent I/O
9094 データに対してコンカレント I/O (CIO) モードを使用する。
9095 このモードでは、ダイレクト I/O を行いつつ、同じファイルに対するすべての
9096 I/O は順番に行わなければならないという POSIX の要件は無視する。
9097 一つのファイルを CIO モードと標準的な方法の両方で同時にオープンすることはできない。
9098
9099 @item direct
9100 @opindex direct
9101 @cindex direct I/O
9102 データに対してダイレクト I/O を使用し、バッファ・キャッシュを介さないようにする。
9103 カーネルが read バッファや write バッファのサイズに制限をかけていることがあるのに注意していただきたい。
9104 たとえば、出力先のファイルシステムが ext4 で、カーネルが linux
9105 ベースの場合、出力バッファのサイズが 512 の倍数でなければ、@samp{oflag=direct}
9106 を指定すると、@code{EINVAL} で書き込みに失敗することになる。
9107
9108 @item directory
9109 @opindex directory
9110 @cindex directory I/O
9111
9112 ファイルがディレクトリでなければ、実行に失敗する。
9113 ほとんどのオペレーティング・システムがディレクトリに対する I/O
9114 を許していない。従って、このフラグが役に立つ機会はめったにない。
9115
9116 @item dsync
9117 @opindex dsync
9118 @cindex synchronized data reads
9119 データに対して同期 I/O を使用する。出力ファイルについては、
9120 このフラグは、各書き込みごとに出力データをディスクに実際に書き込ませる。
9121 入力ファイルについてこのフラグが意味を持つかもしれないのは、
9122 読み込んでいるのがリモートのファイルであり、
9123 それが何か他のプロセスによって同期的に書き込まれているときである。
9124 メタデータ (たとえば、最終アクセス日時や最終更新日時) は、必ずしも同期されない。
9125
9126 @item sync
9127 @opindex sync
9128 @cindex synchronized data and metadata I/O
9129 データとメタデータに対して同期された I/O を使用する。
9130
9131 @item nocache
9132 @opindex nocache
9133 @cindex discarding file cache
9134 システムの持つファイルのデータ・キャッシュを廃棄するよう要求する。
9135 count=0 の場合は、ファイルのキャッシュされたデータ全体を指定することになる。
9136 それ以外の場合は、ファイルのキャッシュのうち、処理の対象になった部分だけが捨てられる。
9137 また、count=0 のとき、キャッシュの廃棄に失敗すると、
9138 その旨メッセージが表示され、終了ステータスに反映する。
9139
9140 念のために言っておくと、
9141 ストレージへの書き込みがまだ終了していないデータが、キャッシュから捨てられることはない。
9142 そこで、下記の用例で ``sync'' オプションを使っていることに注目していただきたい。
9143 @samp{nocache} フラグの効率を最大にするために使用しているのである。
9144
9145 用例をいくつか挙げておく。
9146
9147 @example
9148 # ファイル全体のキャッシュを捨てるように指示する。
9149 dd if=ifile iflag=nocache count=0
9150
9151 # ファイル全体のキャッシュを確実に捨てる。
9152 dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
9153
9154 # ファイル中の一部分のキャッシュを捨てる。
9155 dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
9156
9157 # read-ahead キャッシュのみを使って、データを転送する。
9158 # @samp{direct} フラグの項も参照すること。
9159 dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
9160 @end example
9161
9162 @item nonblock
9163 @opindex nonblock
9164 @cindex nonblocking I/O
9165 ノンブロッキング I/O を使用する。
9166
9167 @item noatime
9168 @opindex noatime
9169 @cindex access time
9170 ファイルのアクセス日時を更新しない。古いシステムの中には、
9171 エラーや警告も出さずに、このフラグを無視するものがある。
9172 そこで、このフラグを使用する前に、有効かどうか、お手元のファイルで試してみるとよい。
9173
9174 @item noctty
9175 @opindex noctty
9176 @cindex controlling terminal
9177 入力 (または、出力) ファイルを @command{dd} の制御端末にしない。
9178 このフラグは、そのファイルが端末でなければ、効果がない。
9179 このフラグが全く効果を持たないホストが、たくさんある
9180 (たとえば、GNU/Linux ホストがそうである)。
9181
9182 @item nofollow
9183 @opindex nofollow
9184 @cindex symbolic links, following
9185 シンボリックリンクをたどらない。
9186
9187 @item nolinks
9188 @opindex nolinks
9189 @cindex hard links
9190 ファイルに複数のハードリンクがあれば、実行に失敗する。
9191
9192 @item binary
9193 @opindex binary
9194 @cindex binary I/O
9195 バイナリ I/O を使用する。このフラグは、バイナリ I/O とテキスト I/O
9196 を区別する非標準的なプラットフォームでしか効果がない。
9197
9198 @item text
9199 @opindex text
9200 @cindex text I/O
9201 テキスト I/O を使用する。このフラグが標準的なプラットフォームで効果がないのは、
9202 @samp{binary} と同様である。
9203
9204 @item fullblock
9205 @opindex fullblock
9206 各ブロックが一杯になるまで入力から読み込む。@code{read} システムコールは、
9207 入力がブロックの分量に足りない場合、早めに戻ってくることがある。
9208 そうした場合に、@code{read} の呼び出しを繰り返して、ブロックの残りを埋めようとする。
9209 このフラグは、@code{iflag} でのみ使用できる。
9210 このフラグが役に立つのは、たとえばパイプと組み合わせて使うときである。
9211 パイプとの組み合わせでは、入力からの読み込みがブロックの大きさに足りないことがあるからだ。
9212 そうした場合に、@samp{count=} の引数が、読み込み動作の回数ではなく、
9213 読み込むブロック数だと確実に解釈されるようにするには、このフラグが必要になる。
9214
9215 @item count_bytes
9216 @opindex count_bytes
9217 @samp{count=} オペランドをブロック数ではなく、バイト数の指定と見なす。
9218 そうすることで、I/O ブロックサイズの倍数ではない長さが、指定できるようになるわけだ。
9219 このフラグは @code{iflag} でしか使用できない。
9220
9221 @item skip_bytes
9222 @opindex skip_bytes
9223 @samp{skip=} オペランドをブロック数ではなく、バイト数の指定と見なす。
9224 そうすることで、I/O ブロックサイズの倍数ではないオフセットが、指定できるようになるわけだ。
9225 このフラグは @code{iflag} でしか使用できない。
9226
9227 @item seek_bytes
9228 @opindex seek_bytes
9229 @samp{seek=} オペランドをブロック数ではなく、バイト数の指定と見なす。
9230 そうすることで、I/O ブロックサイズの倍数ではないオフセットが、指定できるようになるわけだ。
9231 このフラグは @code{oflag} でしか使用できない。
9232
9233 @end table
9234
9235 以上のフラグは、すべてのシステムでサポートされているわけではなく、
9236 サポートされていないシステムで使用しようとすると、@samp{dd} に拒否される。
9237 標準入力から読み込んでいる場合や、標準出力に書き出している場合は、
9238 @samp{nofollow} や @samp{noctty} フラグは指定するべきではない。
9239 また、他のフラグ (たとえば @samp{nonblock}) は、
9240 対象となるファイルのファイル・ディスクリプタに対する他のプロセスの動作に、@command{dd}
9241 が終了した後までも、影響を及ぼすかもしれない。
9242
9243 @end table
9244
9245 @cindex multipliers after numbers
9246 上記中の数値を表す文字列  (@var{n} や @var{bytes}) には、乗数を示す文字を後ろに付けることができる。
9247 すなわち、@samp{b}=512, @samp{c}=1, @samp{w}=2, @samp{x@var{m}}=@var{m}
9248 といった文字である (訳注: 最後のものは、10xM という表記は 10M と書くのと同じだということ)。
9249 あるいは、@samp{k}=1024 のような、ブロックサイズに付ける標準の接尾辞の一つを続けてもよい
9250 (@pxref{Block size})。
9251
9252 @samp{bs=}, @samp{ibs=}, @samp{obs=}, "@samp{cbs=} を使って指定するブロックサイズは、
9253 大きすぎない方がよい。数メガバイトを越える値は、一般的に言って無駄だし、
9254 (ギガバイト @dots{} エクサバイトを使ったときのように) 全く逆効果だったり、
9255 エラーの元になったりする。
9256
9257 データのオフセット位置やサイズが I/O ブロックサイズの倍数ではない場合に、
9258 そうしたデータを処理するには、@samp{skip_bytes}, @samp{seek_bytes},
9259 @samp{count_bytes} といったフラグを使用すればよい。あるいは、@command{dd}
9260 を別々に呼び出すという伝統的な手法を使用することもできる。
9261 一例を挙げると、以下のシェルコマンドは、1 ブロック を 512 KiB
9262 にして、ディスクとテープの間でデータをコピーしている。
9263 ただし、ディスクの先頭にある 4 KiB のラベルについては、保存も復元も行っていない。
9264
9265 @example
9266 disk=/dev/rdsk/c0t1d0s2
9267 tape=/dev/rmt/0
9268
9269 # ラベル以外のすべてをディスクからテープへコピーする。
9270 (dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape
9271
9272 # テープからディスクへ書き戻す。ただし、ディスクのラベルには手を
9273 # 付けない。
9274 (dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk
9275 @end example
9276
9277 @cindex ddrescue
9278 @cindex disks, failing
9279 壊れかけたディスクについては、様々なおまけ機能が付いたツールが他にあり、
9280 そうしたものを使えば、ディスクが本当にダメになってしまう前に、できるだけ多くのデータを救済することが容易になる。
9281 たとえば、@uref{http://www.gnu.org/software/ddrescue/, GNU @command{ddrescue}
9282 がその一つだ}。
9283 しかしながら、場合によっては、そうしたツールが使えないこともあるし、
9284 管理者にとって @command{dd} を操作する方が安心できるということもある。
9285 そうした場合は、簡単なレスキュー方法として、@command{dd} を以下の例で示すように実行すればよい。
9286 @samp{conv=noerror,sync} オプションを使っているのは、リードエラーがあっても続行し、
9287 読み込めなかった部分 (bad read) を NUL で埋めるためである。
9288 また、@samp{iflag=fullblock} は、ショートリードに対する用心だ
9289 (そうしたことが磁気ディスクを使っているデバイスで起きたことは、これまでにないけれど)。
9290
9291 @example
9292 # 壊れかけたディスクのパーティションから (マウントしていない
9293 # パーティションだ!) データを救済する。
9294 dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
9295 @end example
9296
9297 実行中の @command{dd} のプロセスに @samp{INFO} シグナルを送ると
9298 (それが使えないシステムでは、@samp{USR1} シグナルを送る)、
9299 @command{dd} は入出力の統計情報を標準エラーに書き出し、それからコピー作業を続行する。
9300 以下の例では、@command{dd} をバックグラウンドで実行し
9301 5GB のデータのコピーを行っている。@command{kill} コマンドが実行されると、
9302 @command{dd} は実行途中の入出力統計を表示する。
9303 そして、正常に作業を完了するか、@code{SIGINT} シグナルによって中断されたとき、
9304 最終的な統計情報を出力する。
9305
9306 @example
9307 # シェルが子プロセスである dd をうっかり終了させてしまうことが
9308 # 絶対にないように、USR1 シグナルを「無視する」にしておく。
9309 # なお、SIGINFO が利用できる場合は、これをやる必要はない。
9310 trap '' USR1
9311
9312 # シグナルを受けることが引き鉄になって、ショートリードが起きるかも
9313 # しれない。それを避けるために、dd を iflag=fullblock で実行する。
9314 dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!
9315
9316 # 1 秒ごとに統計情報を出力する。
9317 while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
9318 @end example
9319
9320 上記のスクリプトの出力は、次のようなフォーマットになる。
9321
9322 @example
9323 3441325+0 records in
9324 3441325+0 records out
9325 3441325000 bytes (3.4 GB, 3.2 GiB) copied, 1.00036 s, 3.4 GB/s
9326 5000000+0 records in
9327 5000000+0 records out
9328 5000000000 bytes (5.0 GB, 4.7 GiB) copied, 1.44433 s, 3.5 GB/s
9329 @end example
9330
9331 @samp{status=progress} オプションを付けると、転送統計を表す上記の最後の行が定期的に更新される。
9332
9333 @vindex POSIXLY_CORRECT
9334 @samp{INFO} シグナルが存在しないシステムでは、 環境変数 @env{POSIXLY_CORRECT}
9335 が設定されていないかぎり、@command{dd} は @samp{INFO} の代わりに @samp{USR1} に反応する。
9336
9337 @exitstatus
9338
9339
9340 @node install invocation
9341 @section @command{install}: ファイルをコピーし属性をセットする
9342
9343 @pindex install
9344 @cindex copying files and setting attributes
9345
9346 @command{install} はファイルをコピーするとき、ファイルのモードビット
9347 (訳注: 一般にアクセス権とか、許可属性と言われるもの) をセットし、可能ならば、
9348 所有者やグループも設定する。
9349
9350 書式:
9351
9352 @example
9353 install [@var{option}]@dots{} [-T] @var{source} @var{dest}
9354 install [@var{option}]@dots{} @var{source}@dots{} @var{directory}
9355 install [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
9356 install [@var{option}]@dots{} -d @var{directory}@dots{}
9357 @end example
9358
9359 @itemize @bullet
9360 @item
9361 ファイル名を二つ指定すると、@command{install} は最初のファイルを
9362 2 番目のファイルにコピーする。
9363
9364 @item
9365 @option{--target-directory} (@option{-t}) オプションを指定した場合や、
9366 あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
9367 @option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
9368 @command{install} は各 @var{source} ファイルを指定されたディレクトリに、@var{source}
9369 の名前でコピーする。
9370
9371 @item
9372 @option{--directory} (@option{-d}) を指定すると、@command{install} は各
9373 @var{directory} を作成する。
9374 このとき、親ディレクトリが存在しなければ、それも作成する。
9375 作成される親ディレクトリのモードは、@option{-m} オプションの指定や現在の umask
9376 にかかわりなく、@samp{u=rwx,go=rx} (755) になる。
9377 親ディレクトリの set-user-ID ビットや set-group-ID ビットの継承については、
9378 次の節を参照していただきたい。@xref{Directory Setuid and Setgid}.
9379 @end itemize
9380
9381 @cindex Makefiles, installing programs in
9382 @command{install} は @command{cp} に似ているが、コピー先ファイルの属性を自由に設定できる点が違う。
9383 @command{install} は通常、Makefile の中で、プログラムを目標のディレクトリにコピーするために使用される。
9384 @command{install} では、ファイルをそれ自身にコピーすることはできない。
9385
9386 @cindex extended attributes, xattr
9387 @command{install} が拡張属性 (xattr) を保存することはない。
9388
9389 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
9390
9391 @table @samp
9392
9393 @optBackup
9394
9395 @item -C
9396 @itemx --compare
9397 @opindex -C
9398 @opindex --compare
9399 インストール元とインストール先の対応するファイルを比較し、
9400 インストール先にあるファイルがインストール元と内容が同じで、
9401 しかも、所有者、グループ、許可属性、場合によっては SELinux
9402 コンテキストについて、そのどれもが指定されているものと同一であるときは、
9403 インストール先ファイルを全く変更しない。
9404 このオプションは、@option{--user}, @option{--group}, @option{--mode}
9405 オプションと併せて使うのが最善である。そういうものを指定しない場合、
9406 @command{install} コマンドが、(たとえば、ディレクトリに
9407 setgid が付いていることや、POSIX のデフォルトの ACL を顧慮しないせいで)、
9408 インストールされるファイルがデフォルトで持つはずの属性を不正確に決めてしまうかもしれないのだ。
9409 そんなことがあると、無駄なコピーが行われたり、
9410 属性が正しいデフォルト値に設定されなかったりといった不都合が生じかねない。
9411
9412 @item -c
9413 @opindex -c
9414 無視する。Unix の古いバージョンの  @command{install} との互換性のために
9415 ある。
9416
9417 @item -D
9418 @opindex -D
9419 @var{dest} の指定中に存在していない親ディレクトリがあれば、
9420 それを作成してから、@var{source} を @var{dest} にコピーする。
9421 @option{-D} とともに明示的に @option{--target-directory=@var{dir}}
9422 を指定した場合も、やはり出力先のディレクトリ階層が確実に存在するようになる。
9423
9424 @item -d
9425 @itemx --directory
9426 @opindex -d
9427 @opindex --directory
9428 @cindex directories, creating with given attributes
9429 @cindex parent directories, creating missing
9430 @cindex leading directories, creating missing
9431 まず、存在していない親ディレクトリがあれば作成し、それにデフォルトの属性を与える。
9432 それから、指定された各ディレクトリを作成し、所有者、グループ、許可属性を、
9433 コマンドラインで指定されたとおりに、またはデフォルトの値に設定する。
9434
9435 @item -g @var{group}
9436 @itemx --group=@var{group}
9437 @opindex -g
9438 @opindex --group
9439 @cindex group ownership of installed files, setting
9440 インストールするファイルやディレクトリの所有グループを @var{group} にする。
9441 デフォルトでは、プロセスの現在のグループになる。
9442 @var{group} は、グループ名でも、グループの ID 番号でもよい。
9443
9444 @item -m @var{mode}
9445 @itemx --mode=@var{mode}
9446 @opindex -m
9447 @opindex --mode
9448 @cindex permissions of installed files, setting
9449 インストールするファイルやディレクトリのモードビットを @var{mode} にする。
9450 @var{mode} の指定は、@samp{a=} (誰にもアクセスを許さない) を基点として行い、
9451 8 進数でも、@command{chmod} で使うようなシンボリックモードでもよい
9452 (@pxref{File permissions})。デフォルトのモードは、
9453 @samp{u=rwx,go=rx,a-s} である。すなわち、所有者には読み、書き、実行を許可し、
9454 グループとその他のユーザには読みと実行のみを許可、
9455 set-user-ID と set-group-ID は無効にする。このデフォルトは、@samp{755}
9456 と全く同じではない。なぜなら、デフォルトの方は、ディレクトリについて
9457 set-user-ID や set-group-ID を引き継がず、無効にしているからである。
9458 @xref{Directory Setuid and Setgid}. 
9459
9460 @item -o @var{owner}
9461 @itemx --owner=@var{owner}
9462 @opindex -o
9463 @opindex --owner
9464 @cindex ownership of installed files, setting
9465 @cindex appropriate privileges
9466 @vindex root @r{as default owner}
9467 @command{install} が適切な権限を持っている場合に
9468 (つまり、root 権限で実行されている場合に)、インストールするファイルやディレクトリの所有者を
9469 @var{owner} にする。デフォルトでは @code{root} になる。@var{owner}
9470 の指定は、ユーザ名でも、ユーザの ID 番号でもよい。
9471
9472 @item --preserve-context
9473 @opindex --preserve-context
9474 @cindex SELinux
9475 @cindex security context
9476 ファイルやディレクトリの SElinux セキュリティ・コンテキストを引き継ぐ。
9477 ファイルやディレクトリすべてのセキュリティ・コンテキストを引き継げなかった場合は、
9478 終了ステータスが 1 になる。SElinux が無効になっているときは、警告を出し、
9479 このオプションを無視する。
9480
9481 @item -p
9482 @itemx --preserve-timestamps
9483 @opindex -p
9484 @opindex --preserve-timestamps
9485 @cindex timestamps of installed files, preserving
9486 インストール先各ファイルの最終アクセス日時 (last access time) と最終更新日時
9487 (last modification time) を、対応するインストール元各ファイルのそれぞれの日時に合わせる。
9488 このオプションを付けずにインストールした場合、各ファイルの最終アクセス日時と最終更新日時は、
9489 両方ともインストールした日時になる。インストール先ファイルの最終更新日時を、
9490 最後にインストールした日付ではなく、最後にビルドした日付の記録として使用したい場合、
9491 このオプションは便利である。
9492
9493 @item -s
9494 @itemx --strip
9495 @opindex -s
9496 @opindex --strip
9497 @cindex symbol table information, stripping
9498 @cindex stripping symbol table information
9499 インストールされるバイナリの実行ファイルからシンボル・テーブルを取り除く。
9500
9501 @item --strip-program=@var{program}
9502 @opindex --strip-program
9503 @cindex symbol table information, stripping, program
9504 バイナリからシンボル・テーブルを取り除くために使用するプログラムを指定する。
9505
9506 @optBackupSuffix
9507
9508 @optTargetDirectory @option{-D} オプションも指定すると、
9509 ディレクトリの存在が保証される。
9510
9511 @optNoTargetDirectory
9512
9513 @item -v
9514 @itemx --verbose
9515 @opindex -v
9516 @opindex --verbose
9517 コピーを行う前に、コピーするファイル名を表示する。
9518
9519 @optContext このオプションと @option{--preserve-context}
9520 オプションは、どちらか一方しか指定できない。
9521 (@var{context} を省略できるのは、coreutils-8.22 から)
9522
9523
9524 @end table
9525
9526 @exitstatus
9527
9528
9529 @node mv invocation
9530 @section @command{mv}: ファイルの移動 (名前の変更) を行う
9531
9532 @pindex mv
9533
9534 @command{mv} は、ファイル (やディレクトリ) の移動、または名前の変更を行う。
9535
9536 書式:
9537
9538 @example
9539 mv [@var{option}]@dots{} [-T] @var{source} @var{dest}
9540 mv [@var{option}]@dots{} @var{source}@dots{} @var{directory}
9541 mv [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
9542 @end example
9543
9544 @itemize @bullet
9545 @item
9546 ファイル名を二つ指定すると、@command{mv} は最初のファイルを 2 番目のファイルに移動する。
9547
9548 @item
9549 @option{--target-directory} (@option{-t}) オプションを指定した場合や、
9550 あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
9551 @option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
9552 @command{mv} は各 @var{source} ファイルを指定されたディレクトリに、@var{source}
9553 の名前で移動する。
9554 @end itemize
9555
9556 @command{mv} はいかなるタイプのファイルでも、
9557 一つのファイルシステムから別のファイルシステムへ移動させることができる。
9558 fileutils パッケージのバージョン @code{4.0} 以前では、@command{mv}
9559 がファイルシステム間を移動させることができたのは、通常ファイルだけだった。
9560 それに対して、現在の @command{mv} では、
9561 たとえば、スペシャル・デバイスファイルを含むディレクトリ階層の全体を、
9562 あるパーティションから別のパーティションへ移動させることが可能になっている。
9563 @command{mv} は、まず @code{cp -a} が使用するのと同じコードを使って、
9564 指定されたディレクトリやファイルをコピーし、その後で (コピーに成功した場合は) コピー元を削除する。
9565 コピーに失敗した場合は、移動先のパーティションにすでにコピーした部分を消去することになる。
9566 仮に、あるパーティションから別のパーティションに、3 個のディレクトリをコピーしようとして、
9567 最初のディレクトリのコピーには成功したものの、2 番目のディレクトリのコピーに失敗したとしよう。
9568 その場合、最初のディレクトリは、移動先のパーティションに残るが、2 番目と
9569 3 番目のディレクトリは、元のパーティションに残ることになる。
9570
9571 @cindex extended attributes, xattr
9572 @command{mv} は拡張属性 (xattr) を常にコピーしようとする。
9573 この拡張属性は、SELinux コンテキストや ACL、ケーパビリティであってもよい。
9574 拡張属性のコピーに失敗したときは、@samp{Operation not supported}
9575 以外のすべての警告が出力される。
9576
9577 @cindex prompting, and @command{mv}
9578 移動先ファイルがすでに存在し、それが普通なら書き込みのできないものである場合、
9579 標準入力が端末であり、@option{-f} や @option{--force} オプションが指定されていなければ、
9580 @command{mv} はプロンプトを出して、ファイルを置き換えるかどうか、ユーザに問い合わせる
9581 (ファイルの書き込み権限がなくても、自分がそのファイルの所有者であったり、
9582 そのディレクトリの書き込み権限を持っていたりすることは、ありえることである)。
9583 答えが肯定でなければ、そのファイルはスキップされる。
9584
9585 警告: 名前変更の対象 (または、移動元) がディレクトリへのシンボリックリンクかもしれないときは、
9586 その名前を指定する際に、末尾にスラッシュを付けてはいけない。
9587 さもないと、@command{mv} の動作は内部で使っている rename
9588 システムコール次第なので、全く予想外のことが起きるかもしれないのだ。
9589 Linux ベースの最近のカーネルを使っているシステムでは、@code{errno=ENOTDIR}
9590 で実行に失敗する。しかし、他のシステムでは (少なくとも、FreeBSD 6.1 や
9591 Solaris 10 では)、シンボリックリンクではなく、リンクが参照しているディレクトリの名前の方を、
9592 警告なしで変更するのである。 @xref{Trailing slashes}.
9593
9594 注意: @command{mv} が移動先にあるディレクトリを置き換えるのは、そのディレクトリが空のときだけである。
9595 移動先にある名前の衝突する (訳注: 要するに移動元ディレクトリと同名の) ディレクトリにファイルがあるときは、
9596 「ディレクトリが空ではない」旨のメッセージを出して、そのディレクトリをスキップする。
9597
9598 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
9599
9600 @table @samp
9601
9602 @optBackup
9603
9604 @item -f
9605 @itemx --force
9606 @opindex -f
9607 @opindex --force
9608 @cindex prompts, omitting
9609 移動先のファイルを消去する前に、プロンプトを出してユーザに問い合わせることをしない。
9610 @macro mvOptsIfn
9611 @option{-i}, @option{-f}, @option{-n} オプションを同時に指定している場合は、
9612 最後に指定したもののみが効果を持つ。
9613 @end macro
9614 @mvOptsIfn
9615
9616 @item -i
9617 @itemx --interactive
9618 @opindex -i
9619 @opindex --interactive
9620 @cindex prompts, forcing
9621 ファイルの許可属性に関係なく、存在する各移動先ファイルを上書きするかどうかを、プロンプトを出してユーザに問い合わせる。
9622 答えが肯定でなければ、そのファイルをスキップする。@mvOptsIfn
9623
9624 @item -n
9625 @itemx --no-clobber
9626 @opindex -n
9627 @opindex --no-clobber
9628 @cindex prompts, omitting
9629 存在するファイルを上書きしない。@mvOptsIfn
9630 このオプションは、@option{-b} や @option{--backup} オプションと一緒には使えない。
9631
9632 @item -u
9633 @itemx --update
9634 @opindex -u
9635 @opindex --update
9636 @cindex newer files, moving only
9637 ディレクトリ以外のものを移動する際、それが移動先にも存在し、しかもその更新日時
9638 (modification time) が移動元と同じか、より新しい場合には、移動を行わない。
9639 移動が別のファイルシステムに向かって行われる場合、
9640 タイムスタンプの比較は、移動元のタイムスタンプを移動先のファイルシステム、
9641 及びタイムスタンプの更新に使われるシステムコールの精度に落とした上で行われる。
9642 これは、同じ移動元と移動先に対して、@samp{mv -u} コマンドが何回か実行される場合に、
9643 コピー作業が繰り返されるのを避けるためである。
9644
9645 @item -v
9646 @itemx --verbose
9647 @opindex -v
9648 @opindex --verbose
9649 移動する前に各ファイルの名前を表示する。
9650
9651 @optStripTrailingSlashes
9652
9653 @optBackupSuffix
9654
9655 @optTargetDirectory
9656
9657 @optNoTargetDirectory
9658
9659 @item -Z
9660 @itemx --context
9661 @opindex -Z
9662 @opindex --context
9663 @cindex SELinux, restoring security context
9664 @cindex security context
9665 このオプションは @command{restorecon} と似た働きをする。
9666 すなわち、移動先における SELinux セキュリティ・コンテキストを、
9667 移動先のファイルやそこに作られる各ディレクトリに対する、システムのデフォルトのタイプに合わせて調整する。
9668
9669 @end table
9670
9671 @exitstatus
9672
9673
9674 @node rm invocation
9675 @section @command{rm}: ファイルやディレクトリを削除する
9676
9677 @pindex rm
9678 @cindex removing files or directories
9679
9680 @command{rm} は、指定された各ファイルを削除する。
9681 デフォルトでは、ディレクトリの削除は行わない。
9682
9683 書式:
9684
9685 @example
9686 rm [@var{option}]@dots{} [@var{file}]@dots{}
9687 @end example
9688
9689 @cindex prompting, and @command{rm}
9690 @option{-I} または @option{--interactive=once} オプションが指定されている場合に、
9691 削除するファイルが 4 個以上あるか、あるいは @option{-r}, @option{-R},
9692 @option{--recursive} などのオプションが指定されていると、@command{rm}
9693 はプロンプトを出して、作業を最後まで行うかどうか、ユーザに問い合わせる。
9694 答えが肯定でなければ、コマンド全体が中止になる。
9695
9696 それ以外の場合でも、削除するファイルが書き込み不可で、標準入力が端末、しかも
9697 @option{--force} (@option{-f}) オプションが指定されていない場合や、@option{-i}
9698 または @option{--interactive=always} オプションが指定されている場合には、@command{rm}
9699 はプロンプトを出して、そのファイルを削除するかどうか、ユーザに問い合わせる。
9700 答えが肯定でなければ、そのファイルをスキップする。
9701
9702 ファイル名の最後の構成要素 (訳注: ファイル名 (いわゆるパス名) の最後の / より後ろの部分)
9703 が @file{.} や @file{..} であるファイルを削除しようとしても、@command{rm}
9704 はそれを実行せず、ユーザに問い合わせることもない。これは POSIX が要求している動作である。
9705
9706 警告: @command{rm} を使って、ファイルを削除しても、たいていの場合、そのファイルの内容を復元することが可能である。
9707 ファイルの内容が間違いなく復元不可能であるとの、より一層の保証が欲しいのなら、
9708 @command{shred} コマンドの使用をお考えになるとよい。
9709
9710 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
9711
9712 @table @samp
9713
9714 @item -d
9715 @itemx --dir
9716 @opindex -d
9717 @opindex --dir
9718 @cindex directories, removing
9719 指定されたディレクトリが空ならば、それを削除する。
9720
9721 @item -f
9722 @itemx --force
9723 @opindex -f
9724 @opindex --force
9725 指定したファイルが存在しなかったり、削除の対象を一つも指定しなかったりしても、
9726 問題にしない (訳注: 言い換えれば、エラーにならない)。
9727 また、ユーザに対する問い合わせも全く行わない。
9728 @option{--interactive} (@option{-i}) オプションが前にあっても、それを無視する。
9729
9730 @item -i
9731 @opindex -i
9732 プロンプトを出して、各ファイルを削除するかどうか、ユーザに問い合わせる。
9733 答えが肯定でなければ、そのファイルをスキップする。
9734 @option{--force} (@option{-f}) オプションが前にあっても、それを無視する。
9735
9736 @item -I
9737 @opindex -I
9738 4 個以上のファイルが指定された場合や、再帰的な削除が要求された場合に、
9739 プロンプトを出して、コマンドを続行するかどうか、ユーザに一度だけ尋ねる。
9740 @option{--force} (@option{-f}) オプションが前にあっても、それを無視する。
9741 @option{--interactive=once} と同じである。
9742
9743 @item --interactive [=@var{when}]
9744 @opindex --interactive
9745 問い合わせのプロンプトをいつ出すかを指定する。@var{when} には以下の一つを指定できるが、なくてもよい。
9746 @itemize @bullet
9747 @item never
9748 @vindex never @r{interactive option}
9749 - 問い合わせを全くしない。
9750 @item once
9751 @vindex once @r{interactive option}
9752 - 4 個以上のファイルが指定された場合や、再帰的な削除が要求された場合に、
9753 一度だけ問い合わせをする。@option{-I} と同じ。
9754 @item always
9755 @vindex always @r{interactive option}
9756 - 削除されるすべてのファイルに対して問い合わせをする。@option{-i} と同じ。
9757 @end itemize
9758 @option{--interactive} に @var{when} を指定しないのは、@option{--interactive=always}
9759 と同じである。
9760
9761 @item --one-file-system
9762 @opindex --one-file-system
9763 @cindex one file system, restricting @command{rm} to
9764 ディレクトリ階層を再帰的に削除する際に、
9765 コマンドラインで引数として指定したディレクトリが存在するファイルシステムとは別のファイルシステム上にある、
9766 いかなるディレクトリも削除しない。
9767
9768 @cindex bind mount
9769 このオプションが役に立つのは、ビルド用の ``chroot'' ディレクトリ階層を削除する場合である。
9770 通常、そうしたディレクトリ階層に重要なデータは含まれていない。
9771 しかしながら、普段使っているスタートアップ・ファイルを利用しやすくするために、
9772 そうしたディレクトリ階層に @file{/home} を bind-mount するのは、珍しいことではない。
9773 問題は、@file{/home} のアンマウントを忘れやすいことである。
9774 アンマウントをやり忘れたまま、@command{rm -rf} を使って、通常使い捨てにする
9775 chroot 環境を削除しようとすると、@file{/home} 以下にあるすべてまで削除してしまうことになる。
9776 @option{--one-file-system} オプションを使えば、@command{rm} は警告を出した上で、
9777 他のファイルシステムにあるディレクトリをスキップしてくれる。
9778 当然ながら、@file{/home} と chroot 環境が同じファイルシステムにある場合は、
9779 このオプションを使っても、@file{/home} が助かるわけではない。
9780
9781 @item --preserve-root
9782 @opindex --preserve-root
9783 @cindex root directory, disallow recursive destruction
9784 @option{--recursive} オプションと一緒に使った場合、ルートディレクトリ
9785 (@file{/}) を削除しようとした時点で、実行に失敗する。これがデフォルトの動作である。
9786 @xref{Treating / specially}.
9787
9788 (訳注: 確かに @option{--preserve-root} が有効になっていれば、@code{rm -rf /}
9789 とした場合に、ルートディレクトリが保護されることになる。
9790 だが、@code{rm -rf /*} とした場合には、あまり役に立たない。なぜなら、@file{/*}
9791 は、@file{/bin}, @file{/usr}, @file{/home}
9792 などに展開されるが、そうしたディレクトリの消去は、@option{--preserve-root}
9793 によっては止められないからである。)
9794
9795 @item --no-preserve-root
9796 @opindex --no-preserve-root
9797 @cindex root directory, allow recursive destruction
9798 再帰的に削除を行う際、@file{/} を特別扱いしない。
9799 コンピュータ上にあるすべてのファイルを本当に削除したい場合以外、
9800 このオプションの使用はお勧めできない。 @xref{Treating / specially}.
9801
9802 @item -r
9803 @itemx -R
9804 @itemx --recursive
9805 @opindex -r
9806 @opindex -R
9807 @opindex --recursive
9808 @cindex directories, removing (recursively)
9809 コマンドラインにリストされたディレクトリとその中身を再帰的に削除する。
9810
9811 @item -v
9812 @itemx --verbose
9813 @opindex -v
9814 @opindex --verbose
9815 削除を行う前に、各ファイルの名前を表示する。
9816
9817 @end table
9818
9819 @cindex files beginning with @samp{-}, removing
9820 @cindex @samp{-}, removing files beginning with
9821 よくある質問の一つに、名前が @samp{-} で始まるファイルを削除するには、どうしたらよいか、
9822 というものがある。GNU の @command{rm} では、@code{getopt}
9823 を使用して引数の解析を行っているあらゆるプログラムと同様、@samp{--}
9824 オプションを使って、以下の引数はすべてオプションではない、と示すことが可能になっている。
9825 カレントディレクトリにある @file{-f} というファイルを削除するには、
9826 次のどちらかをタイプすればよい。
9827
9828 @example
9829 rm -- -f
9830 @end example
9831
9832 @noindent
9833 あるいは、
9834
9835 @example
9836 rm ./-f
9837 @end example
9838
9839 @opindex - @r{and Unix @command{rm}}
9840 Unix の @command{rm} プログラムが、この用途に @samp{-} を 1 個だけ使っていたのは、
9841 @code{getopt} の標準シンタックスが開発される以前のことである。
9842
9843 @exitstatus
9844
9845
9846 @node shred invocation
9847 @section @command{shred}: セキュリティを向上させたファイルの削除
9848
9849 @pindex shred
9850 @cindex data, erasing
9851 @cindex erasing data
9852
9853 @command{shred} はデバイスやファイルを上書きして、
9854 非常に高価な装置を使用しても、データの復元ができないようにする。
9855
9856 通常、ファイルを削除しても (@pxref{rm invocation})、データが実際に消去されるわけではない。
9857 単に、ファイルが格納されている場所をリストしたインデックスが破棄されるだけであり、
9858 そうすることで、そのデータの格納場所が再利用可能になるのである。
9859 世の中には、インデックスの再構築を試みる復元ソフト (undelete utilities)
9860 というものが存在する。そうしたものは、ファイルの存在したスペースが再利用されていなければ、
9861 ファイルを復元することができるのだ。
9862
9863 頻繁に使われているシステムで、ディスクがほとんど一杯になっている場合、
9864 スペースは数秒のうちに再利用されるかもしれない。だが、それを確実に知る方法は全くない。
9865 また、他人に見られては困るデータがあったところで、
9866 見られても構わないデータでそのファイルを上書きしてしまえば、
9867 復元は絶対不可能だと考えたいかもしれない。
9868
9869 しかしながら、そういうことをした後でも、ディスクを研究所に持ち込んで、
9870 高感度の (そして高価な) 装置を山ほど使用すれば、
9871 上書きされたデータの下にある元のデータのかすかな「痕跡 (echoes)」を検出することが可能なのだ。
9872 もし、データがたった一回しか上書きされていなかったら、それはさほど難しいことでもない。
9873
9874 データを復元できないように消去する最善の方法は、
9875 それが載っているメディアを酸で破壊するとか、熱で溶かすとかすることである。
9876 フロッピーディスクのような廉価なリムーバブル・メディアの場合、それがよく使われる方法だ。
9877 だが、ハードディスクは高価だし、熱で溶かすのも難しい。
9878 そこで、@command{shred} ユーティリティは、物質的な破壊以外の方法で、
9879 同様の効果を実現しようとするのである。
9880
9881 そのためには、元のデータに与える損傷を最大にするように選ばれたデータパターンで繰り返し上書きするという方法が採られる。
9882 この方法は、フロッピーディスクにも効果があるものの、パターンはハードディスクで最も効果を上げるように工夫されたものだ。
9883 詳細については、ソースコードや、第 6 回 USENIX セキュリティ・シンポジウム
9884 (San Jose, California, July 22--25, 1996) の議事録にある
9885 Peter Gutmann の次の論文をご覧になっていただきたい。@*
9886 @uref{http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html,
9887 @cite{Secure Deletion of Data from Magnetic and Solid-State Memory}}
9888
9889 ここで心に銘記してしていただきたいのは、@command{shred} には非常に重要な前提があるということである。
9890 すなわち、ファイルシステムはデータを、それが存在する場所で上書きするものでなければならない。
9891 それは、こうした操作を行うときの伝統的な方法であるが、
9892 最近のファイルシステムの設計には、この前提を満たさないものが多い。
9893 そうした例外には、次のようなものがある。
9894
9895 @itemize @bullet
9896
9897 @item
9898 ログ構造化 (log-structured) ファイルシステムや、ジャーナル化
9899 (journaled) ファイルシステム。たとえば、ATX や Solaris
9900 で提供されているもの。JFS, ReiserFS, XFS, Ext3 (@code{data=journal} モードの場合),
9901 BFS, NTFS などが、「データ」のジャーナリングをするように設定されている場合もこれに当たる。
9902
9903 @item
9904 データを冗長化して書き込んだり、一部の書き込みに失敗することがあっても、
9905 動作し続けるファイルシステム。たとえば、RAID ベースのファイルシステム。
9906
9907 @item
9908 Network Appliance の NFS サーバのように、スナップショットを作成するファイルシステム。
9909
9910 @item
9911 NFS バージョン 3 のクライアントのように、一時領域にキャッシュを作るファイルシステム。
9912
9913 @item
9914 圧縮ファイルシステム。
9915 @end itemize
9916
9917 特に ext3 ファイルシステムについて言うと、上記の例外に当てはまるのは
9918 (その結果、@command{shred} が限定された効果しか持たないのは)、@code{data=journal}
9919 モードの場合だけである。これは、メタデータだけでなく、
9920 ファイルデータもジャーナリングするモードだ。@code{data=ordered} (デフォルト)
9921 と @code{data=writeback} の両モードでは、@command{shred} は通常どおり役に立つ。
9922 ext3 のジャーナリング・モードを変更するには、mount のマニュアルに書いてあるように
9923 (man mount)、@file{/etc/fstab} ファイルで問題のファイルシステムのマウントオプションに
9924 @code{data=something} オプションを追加すればよい。
9925
9926 ファイルシステムがどういう動作をしているか、よくわからない場合は、
9927 データをそれが存在する場所で上書きしていないと考えておいた方がよい。
9928 すなわち、そのファイルシステムでは、通常ファイルに対する @command{shred}
9929 の動作は、信頼できないということである。
9930
9931 一般的に言って、@command{shred} は、ファイルよりデバイスに対して使った方が信頼できる。
9932 そうすれば、上に述べたファイルシステムの設計の問題を回避できるからだ。
9933 しかしながら、@command{shred} のデバイスに対する使用も、必ずしも全面的に信頼できるわけではない。
9934 たとえば、ほとんどのディスクが、バッドセクターを使用に割り当てる領域から外して、
9935 アプリケーションから見えないようにしている。
9936 そこで、バッドセクターに他人に見られたくないデータがある場合、@command{shred}
9937 はそれを破壊できないことになる。
9938
9939 @command{shred} は、バックアップに対して何の対処も行おうとしないが、
9940 バッドセクターの問題についても全く同様で、検知しようともしないし、通知しようともしない。
9941 それでも、@command{shred} はファイルに対して行うより、デバイスに対して行う方が信頼できるので、
9942 デフォルトでは、出力ファイルをサイズ 0 に短縮したり、削除したりしないようになっている。
9943 このデフォルトは、ファイルよりデバイスに適した動作だ。
9944 デバイスは一般に短縮できないし、削除するべきでもないからである。
9945
9946 最後になったが、バックアップやミラーの持つリスクも考慮した方がよい。
9947 削除することのできないファイルのコピーが、ファイルシステムのバックアップやリモートのミラーに残っているかもしれないのだ。
9948 そして、そうしたものが残っていれば、@command{shred}
9949 で破壊したファイルを後日復元することが可能になる。
9950 だから、後で @command{shred} を使って破棄したくなりそうなデータがある場合には、
9951 そのバックアップやミラーがないことを確認すべきなのである。
9952
9953 @example
9954 shred [@var{option}]@dots{} @var{file}[@dots{}]
9955 @end example
9956
9957 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
9958
9959 @table @samp
9960
9961 @item -f
9962 @itemx --force
9963 @opindex -f
9964 @opindex --force
9965 @cindex force deletion
9966 必要ならば、ファイルの許可属性を無視して、上書きできるようにする。
9967
9968 @item -n @var{number}
9969 @itemx --iterations=@var{number}
9970 @opindex -n @var{number}
9971 @opindex --iterations=@var{number}
9972 @cindex iterations, selecting the number of
9973 デフォルトで @command{shred} は、上書きを @value{SHRED_DEFAULT_PASSES} 回する。
9974 時間を節約するために、回数を減らすこともできるし、
9975 その方がよいと思えば、回数を増やすこともできる。
9976 25 回上書きすると、プログラムが内部に持っている上書き用のパターンのすべてが、
9977 少なくとも一回は使われたことになる。
9978
9979 @item --random-source=@var{file}
9980 @opindex --random-source
9981 @cindex random source for shredding
9982 上書きに使用するランダムデータのソースとして @var{file} を使用する。
9983 また、このランダムデータは、上書きパターンの順番を決めるのにも使用される。
9984
9985 @item -s @var{bytes}
9986 @itemx --size=@var{bytes}
9987 @opindex -s @var{bytes}
9988 @opindex --size=@var{bytes}
9989 @cindex size of file to shred
9990 ファイルの最初の @var{bytes} バイトを shred 処理する。デフォルトは、
9991 ファイル全体の shred である。@var{bytes} の後ろには、その何倍かを示すために
9992 @samp{K}, @samp{M}, @samp{G} といった、サイズの指定を付けることができる。
9993  @xref{Block size}.
9994
9995 @item -u
9996 @itemx --remove[=@var{how}]
9997 @opindex -u
9998 @opindex --remove
9999 @opindex --remove=unlink
10000 @opindex --remove=wipe
10001 @opindex --remove=wipesync
10002 @cindex removing files after shredding
10003 shred 処理したファイルを (可能ならば) サイズ 0 に短縮し
10004 (truncate)、その上で削除する。ファイルが複数のリンクを持っている場合に、
10005 削除されるのは名前を指定されたリンクだけである。
10006 ファイルの名前は、ファイルの内容ほど秘密性を必要としないことも多い。
10007 そうした場合は、長い書式のオプションでサポートされている @var{how}
10008 パラメータを付けることで、各ディレクトリエントリのより効率的な削除法を指定することができる。
10009 @var{how} パラメータに @samp{unlink} を指定した場合は、標準の unlink 呼び出しをするだけだが、
10010 @samp{wipe} を指定すると、unlink する前にファイル名を構成するバイトの難読化を行う。
10011 @samp{wipesync} を指定した場合は、ファイル名を難読化するだけでなく、
10012 それを 1 バイトづつディスクに sync することまで行う。
10013 留意していただきたいのは、@samp{wipesync} はデフォルトの方法だが、
10014 すべてのファイル名のすべての文字ごとに sync を行うことになるので、
10015 負荷が重くなるかもしれないということである。
10016 ファイル数が多い場合には、無視できない負荷になるかもしれない。
10017 また、使用しているシステムがメタデータの同期アップデートを提供している場合には、
10018 やらないでもよいことかもしれない。
10019
10020 @item -v
10021 @itemx --verbose
10022 @opindex -v
10023 @opindex --verbose
10024 shred 処理が進行する間、更新される進行状態の情報のすべてを標準エラーに表示する。
10025
10026 @item -x
10027 @itemx --exact
10028 @opindex -x
10029 @opindex --exact
10030 デフォルトでは、@command{shred} は、
10031 通常ファイルのサイズを、ファイルシステムのブロックサイズの倍数に切り上げて、
10032 ファイルの最後のブロックの不使用領域まで完全に抹消する。
10033 この領域には、システムによっては、たとえば、現在のシステムメモリの一部が入っているかもしれない。
10034 この動作を抑制するには、@option{--exact} オプションを使用すればよい。
10035 すなわち、デフォルトでは、1 ブロック 512 バイトのシステムで
10036 10 バイトの通常ファイルを shred すると、結果として 512 バイトのファイルが出来上がる。
10037 だが、このオプションを使えば、shred はファイルの見かけのサイズを増加させないのだ。
10038
10039 @item -z
10040 @itemx --zero
10041 @opindex -z
10042 @opindex --zero
10043 通常、@command{shred} は、最後の 1 回でもランダムデータを書き込む。
10044 そんなファイルがハードディスクにあると、(たとえば、暗号化されたデータに見えて)
10045 目立ってしまうのではないかと思うのなら、あるいは、単にそっちの方がもっとすっきりしていると思うのなら、
10046 @option{--zero} オプションを指定して、もう一回、 すべて 0 ビットで上書きさせればよい。
10047 これは、@option{--iterations} オプションで指定した上書き回数のほかに、もう一回ということである。
10048
10049 @end table
10050
10051 第 1 ドライブのフロッピーディスクに作成したファイルシステムを跡形もなく消し去るには、
10052 次のコマンドを使えばよいだろう。このコマンドで ``1.44MB'' (実際には 1440 KiB)
10053 のフロッピーを消去するには、約 20 分かかる。
10054
10055 @example
10056 shred --verbose /dev/fd0
10057 @end example
10058
10059 同様に、ハードディスクの選択したパーティションからすべてのデータを消去するには、
10060 以下のコマンドを打ち込めばよい。
10061
10062 @example
10063 shred --verbose /dev/sda5
10064 @end example
10065
10066 最近のディスクでは、1 回の書き込みで十分なはずだ。
10067 それならば、書き込みを 3 回行うデフォルトの 3 分の 1 の時間ですむ。
10068
10069 @example
10070 # 擬似ランダムデータを 1 回書き込む。デフォルトより 3 倍速い。
10071 shred --verbose -n1 /dev/sda5
10072 @end example
10073
10074 念のため、少なくとも 1 回は擬似ランダムデータで上書きをした方がよい。
10075 言い換えると、つい使いたくなっても、@samp{-n0 --zero} を使ってはいけない。
10076 ディスク・コントローラの中には、すべてが 0 のブロックを書き込む際に、処理の最適化を行っているものがあり、
10077 そのため、ブロック中のバイトすべてがクリアされない恐れがあるからである。
10078 SSD の中には、まさにそういうことをするものがある。
10079
10080 @samp{-} という @var{file} は、標準出力を表している。
10081 これの使い道は、削除したテンポラリ・ファイルを shred することである。
10082 たとえば、次のようにだ。
10083
10084 @example
10085 i=$(mktemp)
10086 exec 3<>"$i"
10087 rm -- "$i"
10088 echo "Hello, world" >&3
10089 shred - >&3
10090 exec 3>&-
10091 @end example
10092
10093 しかしながら、@samp{shred - >file} というコマンドを使っても、ファイルの内容を
10094 shred することにはならない。なぜなら、シェルは @command{shred}
10095 を呼び出す前に、ファイルをサイズ 0 に短縮 (truncate) してしまうからである。
10096 @samp{shred file}、あるいは (Bourne 互換シェルをお使いなら) @samp{shred - 1<>file}
10097 というコマンドを、代わりに使った方がよい。
10098
10099 @exitstatus
10100
10101
10102 @node Special file types
10103 @chapter 特殊なファイル型
10104
10105 @cindex special file types
10106 @cindex file types, special
10107
10108 この章では、特殊なタイプのファイルを作成するコマンドの説明を行う (さらに @command{rmdir}
10109 の説明もするが、これはディレクトリという特殊なファイル型の一つを削除するコマンドである)。
10110
10111 @cindex special file types
10112 @cindex file types
10113 Unix 系統のオペレーティング・システムでは、ほかのオペレーティング・システムと比べて、
10114 特殊なファイル型というものが著しく少ないが、それでも普通のファイル
10115 (@dfn{normal files}) がそうであるような、のっぺらぼうなバイトストリームとして、
10116 何でもかんでも扱えさえすればよいというものではない。
10117 たとえば、ファイルを作成したり、削除したりするとき、
10118 システムはその情報を記録しなければならないが、それはディレクトリ (@dfn{directory})
10119 --- これも特殊なタイプのファイルである --- に書き込まれる。
10120 もし興味があれば、ディレクトリを普通のファイルのように読むこともできるが、
10121 システムがシステムとしての役割を果たすためには、
10122 ディレクトリはそのファイル内容であるバイトに、構造というか、何らかの秩序を持っていなければならない。
10123 そういう意味で、ディレクトリは、「特殊な」タイプのファイルなのである。
10124
10125 ディレクトリ以外の特殊なファイル型としては、名前付きパイプ (FIFO)、
10126 シンボリックリンク、ソケット、それに、いわゆるスペシャルファイル
10127 (@dfn{special files}) がある。
10128
10129 @menu
10130 * link invocation::     システムコール link を使って、ハードリンクを作成する
10131 * ln invocation::       ファイル間のリンクを作成する
10132 * mkdir invocation::    ディレクトリを作成する
10133 * mkfifo invocation::   FIFO (名前付きパイプ) を作成する
10134 * mknod invocation::    ブロック型やキャラクタ型のスペシャルファイルを作成する
10135 * readlink invocation:: シムリンクの値、または正規化されたファイル名を表示する
10136 * rmdir invocation::    空のディレクトリを削除する
10137 * unlink invocation::   システムコール unlink を使って、ファイルを削除する
10138
10139 @end menu
10140
10141
10142 @node link invocation
10143 @section @command{link}: システムコール link を使って、ハードリンクを作成する
10144
10145 @pindex link
10146 @cindex links, creating
10147 @cindex hard links, creating
10148 @cindex creating links (hard only)
10149
10150 @command{link} は、一度に 1 個のハードリンクを作成する。
10151 これは、システムが提供する @code{link} 関数への必要最小のインターフェースである。
10152 @xref{Hard Links, , , libc, The GNU C Library Reference Manual}.
10153 従って、より一般に使われる @command{ln} コマンドのような、様々な付加機能をあえて備えていない
10154 (@pxref{ln invocation})。
10155
10156 書式:
10157
10158 @example
10159 link @var{filename} @var{linkname}
10160 @end example
10161
10162 @var{filename} は、実在するファイルを指していなければならない。また、
10163 @var{linkname} は、実在するディレクトリ中の実在しないファイルを指していなければならない。
10164 @command{link} は、リンクを作成するために、@code{link (@var{filename}, @var{linkname})}
10165 をコールするだけである。
10166
10167 GNU のシステムでは、このコマンドは、@samp{ln --directory
10168 --no-target-directory @var{filename} @var{linkname}} と同様に振る舞う。
10169 しかし、@option{--directory} や @option{--no-target-directory} は、POSIX
10170 の規格にあるオプションではないので、@command{link} の方が、実用上より可搬性がある。
10171
10172 @var{filename} がシンボリックリンクの場合、
10173 @var{linkname} がシンボリックリンクへのハードリンクになるか、
10174 シンボリックリンクの参照先へのハードリンクになるかは、規定されていない。
10175 どちらの動作を望むかをはっきり指定したければ、@command{ln -P} や @command{ln -L}
10176 を使用するべきである。
10177
10178 @exitstatus
10179
10180
10181 @node ln invocation
10182 @section @command{ln}: ファイル間のリンクを作成する
10183
10184 @pindex ln
10185 @cindex links, creating
10186 @cindex hard links, creating
10187 @cindex symbolic (soft) links, creating
10188 @cindex creating links (hard or soft)
10189
10190 @cindex file systems and hard links
10191 @command{ln} はファイル間のリンクを作成する。デフォルトではハードリンクを作成するが、
10192 @option{-s} オプションを指定すると、シンボリックリンク (@dfn{soft} linkとも言う)
10193 を作ることになる。
10194
10195 書式:
10196
10197 @example
10198 ln [@var{option}]@dots{} [-T] @var{target} @var{linkname}
10199 ln [@var{option}]@dots{} @var{target}
10200 ln [@var{option}]@dots{} @var{target}@dots{} @var{directory}
10201 ln [@var{option}]@dots{} -t @var{directory} @var{target}@dots{}
10202 @end example
10203
10204 @itemize @bullet
10205
10206 @item
10207 ファイル名を二つ指定すると、@command{ln} は 1 番目に対するリンクを
10208 2 番目の名前で作成する。
10209
10210 @item
10211 @var{target} のみを指定すると、@command{ln} はそのファイルに対するリンクをカレントディレクトリに作成する。
10212
10213 @item
10214 @option{--target-directory} (@option{-t}) オプションを指定した場合や、
10215 あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
10216 @option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
10217 @command{ln} は各 @var{target} ファイルに対するリンクを、
10218 指定されたディレクトリに @var{target} の名前で作成する。
10219
10220 @end itemize
10221
10222 通常 @command{ln} は存在するファイルを削除しない。
10223 既存のファイルを無条件で削除するには、@option{--force} (@option{-f}) オプションを使う。
10224 また、ユーザに問い合わせた上で削除するには、@option{--interactive} (@option{-i})
10225 オプションを使う。既存のファイルを、名前を変更して残すには、@option{--backup}
10226 (@option{-b}) オプションを使用する。(訳注: ここで述べているのは、
10227 存在するファイルの名前をリンクファイル名として使う場合の話である。)
10228
10229 @cindex hard link, defined
10230 @cindex inode, and hard links
10231 ハードリンク (@dfn{hard link}) というのは、存在するファイルが持つ別の名前である。
10232 だから、リンクとオリジナルは、区別ができない。専門的な言い方をすると、両者は同じ
10233 inode を共有するものである。inode には、ファイルに関する情報がすべて含まれているので、
10234 全くのところ、inode こそファイルであると言っても、過言ではないほどだ。
10235 たいていのシステムでは、ディレクトリに対するハードリンクの作成は禁じられている。
10236 許可されているシステムでも、それができるのは、スーパーユーザだけである
10237 (その場合でも、ファイルシステムにループが生じると、
10238 ほかの様々なユーティリティ・プログラムで問題が起きるので、慎重に行わなければならない)。
10239 なお、ハードリンクは、ファイルシステムの境界を越えることができない。
10240 (もっとも、ハードリンクに対するこうした制限は、POSIX で規定されているわけではない。)
10241
10242 @cindex dereferencing symbolic links
10243 @cindex symbolic link, defined
10244 それに対して、シンボリックリンク (@dfn{symbolic link}、略称はシムリンク
10245 @dfn{symlink}) は、特殊なファイル型の一つである
10246 (すべてのカーネルがサポートしているわけではない。たとえば、System V release 3
10247 やそれ以前のシステムにはシムリンクが存在しない)。
10248 このファイル型では、リンクファイルは、実際には別のファイルを、名前を使って参照している。
10249 ほとんどのファイル操作では (ファイルのオープン、読み込み、書き出しなど)、
10250 シンボリックリンク・ファイルが渡されると、カーネルが自動的にリンクの参照を読み解いて
10251 (@dfn{dereference})、リンクの参照先を操作の対象にする。ただし、操作によっては
10252 (たとえば、ファイルの削除)、参照先ではなく、リンクファイルそのものを対象にするものもある。
10253 シムリンクの所有者やグループは、リンクを通して行われるファイルアクセスに対して意味を持たないが、
10254 削除制限ビットが立っているディレクトリからシンボリックリンクを削除する際には、かかわりを持ってくる。
10255 GNU のシステムでは、シムリンクのモードには意味がなく、変更することもできない。
10256 だが、BSD システムの中には、モードが変更でき、ファイル名の解決においてシムリンクをたどるかどうかに影響するものもある。
10257 @xref{Symbolic Links,,, libc, The GNU C Library Reference Manual}.
10258
10259 シンボリックリンクの中身には、どんな文字列が含まれていてもよい。
10260 シンボリックリンクに含まれる文字列が、実在するファイルの名前になっていないときは、
10261 リンク切れ (@dfn{dangling symlink}) が生ずる。
10262 リンク切れのシンボリックリンクを作成することは、禁止されているわけではない。
10263 シムリンクの作成に絶対パスを使うか、相対パスを使うかには、それぞれ一長一短がある。
10264 絶対パスのシムリンクは、リンクファイルの存在するディレクトリが移動しても、常に同じファイルを指す。
10265 もっとも、そのシムリンクが複数のマシンから見えるような場合には
10266 (たとえば、ネットワークでつながったファイルシステムにあるような場合には)、
10267 リンクが指しているファイルは、必ずしも同じではないかもしれない。
10268 相対パスのシンボリックリンクの方は、それが存在しているディレクトリからの相対パスで参照先が決まる。
10269 そこで、リンクファイルがネットワークでつながっているマシンからアクセスされることがある場合に、
10270 リンクと同じデバイス上に存在するファイルを、そのデバイスのマウントポイントが何という名前かを気にせずに指示することができて、
10271 便利であることが多い。
10272
10273 相対パスのシムリンクをカレントディレクトリ以外の場所に作成すると、
10274 そのシムリンクが実際に指しているファイルは、
10275 同じ文字列がカレントディレクトリを基点として指しているファイルとは別のものになる。
10276 そのため、ユーザの多くが、まずカレントディレクトリを変更して、
10277 相対パスのシムリンクを作成する場所へ移動することを好んでいる。
10278 そうすれば、タブ補完などのファイル名参照方法を用いて、
10279 シムリンクに格納する参照先の適切な相対パスを見つけることができるからである。
10280
10281 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10282
10283 @table @samp
10284
10285 @optBackup
10286
10287 @item -d
10288 @itemx -F
10289 @itemx --directory
10290 @opindex -d
10291 @opindex -F
10292 @opindex --directory
10293 @cindex hard links to directories
10294 ユーザが適切な権限を持っていれば、
10295 ディレクトリに対するハードリンクを作成しようとしても許可する。
10296 とは言え、たぶんシステムによって禁止されているので、
10297 たとえスパーユーザでも作成に失敗するだろう。
10298
10299 @item -f
10300 @itemx --force
10301 @opindex -f
10302 @opindex --force
10303 リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、それを削除する。
10304
10305 @item -i
10306 @itemx --interactive
10307 @opindex -i
10308 @opindex --interactive
10309 @cindex prompting, and @command{ln}
10310 リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、
10311 削除するかどうか、ユーザに問い合わせる。
10312
10313 @item -L
10314 @itemx --logical
10315 @opindex -L
10316 @opindex --logical
10317 @option{-s} オプションが有効になっていないとき、リンク対象として指定されたファイル
10318 (訳注: 上記書式の @var{target}) がシンボリックリンクならば、
10319 シンボリックリンクそのものではなく、シンボリックリンクが参照しているファイルへのハードリンクを作成する。
10320
10321 @item -n
10322 @itemx --no-dereference
10323 @opindex -n
10324 @opindex --no-dereference
10325 最後のオペランドがディレクトリに対するシンボリックリンクであるとき、それをディレクトリとして特別扱いしない
10326 (訳注: すなわち、ディレクトリ内に @var{target} と同名でリンクを作ることはしない)。
10327 むしろ、普通のファイルであるかのように扱う。
10328
10329 リンクの作成先として指定されたのが (ディレクトリに対するシムリンクではなく)
10330 本物のディレクトリならば、曖昧なところは全くない。
10331 そのディレクトリ内にリンクを作るだけの話だ。ところが、指定された作成先が、
10332 ディレクトリに対するシムリンクの場合は、ユーザの要求を処理するのに、二つの行き方がある。
10333 @command{ln} は、通常のディレクトリを扱う場合と全く同じように作成先を扱って、
10334 そこにリンクを作成することができる。
10335 あるいは、作成先をディレクトリではないもの、すなわち、他ならぬシムリンクと見なすことも可能だ。
10336 後者の場合、@command{ln} は、新しいリンクを作成する前に、
10337 そのシムリンクを消去するなり、バックアップするなりしなければならない。
10338 @command{ln} のデフォルトは、作成先がディレクトリに対するシムリンクであっても、
10339 ディレクトリと全く同様に扱うことである。
10340
10341 このオプションは、@option{--no-target-directory} (@option{-T})
10342 の弱いバージョンである。従って、両方のオプションを指定した場合、こちらは効果がない。
10343
10344 @item -P
10345 @itemx --physical
10346 @opindex -P
10347 @opindex --physical
10348 @option{-s} オプションが有効になっていないとき、リンク対象として指定されたファイル
10349 (訳注: 上記書式の @var{target}) がシンボリックリンクならば、
10350 シンボリックリンクそのものへのハードリンクを作成する。
10351 そういった動作をカーネルがサポートしていないプラットホームでは、このオプションを指定すると、
10352 リンク対象のシンボリックリンクと全く同じ内容を持つシンボリックリンクが作成される。
10353 このとき、シンボリックリンクの内容に手が加えられることは決してないので、
10354 どちらのシンボリックリンクを使って行われるファイル名の解決も、
10355 シンボリックリンクへのハードリンクが作成された場合と結局同じになる。
10356
10357 @item -r
10358 @itemx --relative
10359 @opindex -r
10360 @opindex --relative
10361 リンクファイルを置く場所を基点とする相対パスのシンボリックリンクを作成する。
10362
10363 用例:
10364
10365 @smallexample
10366 ln -srv /a/file /tmp
10367 '/tmp/file' -> '../a/file'
10368 @end smallexample
10369
10370 相対パスのシンボリックリンクは、
10371 それを置くディレクトリと参照先のファイル名を正規化した上で、それに基づいて作成される。
10372 すなわち、そうしたファイル名中にあるすべてのシンボリックリンクは、実体に還元されることになるわけだ。
10373 なお、@command{realpath} コマンドを使用すれば、
10374 以下の例に示すように、相対パスを生成する際にもっと融通が利く
10375 (訳注: たとえば、@command{realpath} を使うと、
10376 ファイル名中のシンボリックリンクをシンボリックリンクのままにしておくこともできる)。
10377 @xref{realpath invocation}.
10378
10379 @example
10380 @verbatim
10381 ln--relative() {
10382   test "$1" = --no-symlinks && { nosym=$1; shift; }
10383   target="$1";
10384   test -d "$2" && link="$2/." || link="$2"
10385   rtarget="$(realpath $nosym -m "$target" \
10386               --relative-to "$(dirname "$link")")"
10387   ln -s -v "$rtarget" "$link"
10388 }
10389 @end verbatim
10390 @end example
10391
10392 @item -s
10393 @itemx --symbolic
10394 @opindex -s
10395 @opindex --symbolic
10396 ハードリンクではなく、シンボリックリンクを作る。
10397 このオプションは、シンボリックリンクをサポートしていないシステムでは、
10398 エラー・メッセージを表示するだけである。
10399
10400 @optBackupSuffix
10401
10402 @optTargetDirectory
10403
10404 @optNoTargetDirectory
10405
10406 @item -v
10407 @itemx --verbose
10408 @opindex -v
10409 @opindex --verbose
10410 リンクの作成に成功した後で、各ファイルの名前を表示する。
10411
10412 @end table
10413
10414 @cindex hard links to symbolic links
10415 @cindex symbolic links and @command{ln}
10416 @option{-L} と @option{-P} の両方を指定すると、最後に指定したものが効果を持つ。
10417 さらに @option{-s} も指定した場合は、エラーや警告は出ないが、@option{-L} や
10418 @option{-P} は無視される。@option{-L} と @option{-P}
10419 のどちらのオプションも指定しない場合、@command{ln} のこの実装では、システムの
10420 @code{link} 関数がシンボリックリンクに対するハードリンクをサポートしていれば
10421 (たとえば、GNU のシステム)、デフォルトの動作は @option{-P} になる。
10422 @code{link} 関数がシンボリックリンクをたどるものならば
10423 (たとえば、BSD)、デフォルトの動作は @option{-L} である。
10424
10425 @exitstatus
10426
10427 用例:
10428
10429 @smallexample
10430 悪い例:
10431
10432 # カレントディレクトリにあるファイル a を指す ../a というリンクを
10433 # 作成する。実のところ役に立たない。../a が自分自身を指すリンクに
10434 # なってしまうからだ。
10435 ln -s a ..
10436
10437 よりよい例:
10438
10439 # 頭がこんがらかってしまわないように、シムリンクを作成する前に、
10440 # リンクを作るディレクトリに移動する。
10441 cd ..
10442 ln -s adir/a .
10443
10444 悪い例:
10445
10446 # 絶対パスによるリンク対象の指定は、リンク対象の位置が変わると、
10447 # 役に立たない。
10448 ln -s $(pwd)/a /some/dir/
10449
10450 よりよい例:
10451
10452 # 相対パスによるリンク対象の指定は、リンクやその対象を含む
10453 # ディレクトリが移動しても、両者の相対的な位置関係が変わらない
10454 # かぎり、問題がない。また、ネットワークでつながったファイル
10455 # システム間でも通用する。
10456 ln -s afile anotherfile
10457 ln -s ../adir/afile yetanotherfile
10458 @end smallexample
10459
10460
10461 @node mkdir invocation
10462 @section @command{mkdir}: ディレクトリを作成する
10463
10464 @pindex mkdir
10465 @cindex directories, creating
10466 @cindex creating directories
10467
10468 @command{mkdir} は、指定された名前でディレクトリを作成する。
10469
10470 書式:
10471
10472 @example
10473 mkdir [@var{option}]@dots{} @var{name}@dots{}
10474 @end example
10475
10476 @command{mkdir} は、@var{name} で指定された各ディレクトリを、指定された順番で作成する。
10477 @var{name} がすでに存在していると、エラーになり、その旨メッセージを出すが、
10478 @var{name} がすでに存在していても、@option{-p} オプションが指定され、@var{name}
10479 がディレクトリの場合は、エラーにならない。
10480
10481 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10482
10483 @table @samp
10484
10485 @item -m @var{mode}
10486 @itemx --mode=@var{mode}
10487 @opindex -m
10488 @opindex --mode
10489 @cindex modes of created directories, setting
10490 作成するディレクトリの許可属性ビットを @var{mode} に設定する。@var{mode} には
10491 @command{chmod} と同じ書式を使用し、@samp{a=rwx} (すべてのユーザに、読み、書き、
10492 実行を許可する) を基点とする。@xref{File permissions}. 
10493
10494 通常、ディレクトリには、作成された時点で、要求したとおりのファイル・モードビットが付く。
10495 GNU の拡張として、@var{mode} で特殊モードビットも指定できるが、
10496 その場合は、ディレクトリは存在しているが、特殊モードビットは要求どおりではないという、時間の隙間が生じるかもしれない。
10497 ディレクトリの set-user-ID ビットと set-group-ID ビットが、
10498 このオプションを使って変更しない場合にどのように継承されるかについては、
10499 次の節を参照していただきたい。@xref{Directory Setuid and Setgid}.
10500
10501 @item -p
10502 @itemx --parents
10503 @opindex -p
10504 @opindex --parents
10505 @cindex parent directories, creating
10506 各引数について、存在していない親ディレクトリがあれば、それを作成し、
10507 その許可属性ビットを umask を基にして @samp{u+wx} になるように設定する。
10508 親ディレクトリがすでに存在している場合は、このオプションは何もせず、
10509 その許可属性ビットを変更することもない。
10510
10511 新たに作成するいかなる親ディレクトリの許可属性ビットも、@samp{u+wx}
10512 を含むある一定の値に設定するには、@command{mkdir} を実行する前に、umask
10513 を設定すればよい。たとえば、@samp{(umask u=rwx,go=rx; mkdir -p P/Q)}
10514 というシェルコマンドで @file{P} という親ディレクトリを作れば、その許可属性ビットは
10515 @samp{u=rwx,go=rx} になる。また、親ディレクトリに特殊モードビットも設定するには、
10516 @command{chmod} を @command{mkdir} の後で実行すればよい。
10517 新たに作成される親ディレクトリの set-user-ID ビットと
10518 set-group-ID ビットがどのように継承されるかについては、
10519 次の節を参照していただきたい。 @xref{Directory Setuid and Setgid}.
10520
10521 @item -v
10522 @itemx --verbose
10523 @opindex -v
10524 @opindex --verbose
10525 ディレクトリを作成するごとに、メッセージを表示する。@option{--parents}
10526 と併せて使うと、大変便利である。
10527
10528 @optContext (@var{context} を省略できるのは、coreutils-8.22 から)
10529
10530 @end table
10531
10532 @exitstatus
10533
10534
10535 @node mkfifo invocation
10536 @section @command{mkfifo}: FIFO (名前付きパイプ) を作成する
10537
10538 @pindex mkfifo
10539 @cindex FIFOs, creating
10540 @cindex named pipes, creating
10541 @cindex creating FIFOs (named pipes)
10542
10543 @command{mkfifo} は、指定された名前で FIFO (名前付きパイプ @dfn{named pipes}
10544 とも言う) を作成する。
10545
10546 書式:
10547
10548 @example
10549 mkfifo [@var{option}] @var{name}@dots{}
10550 @end example
10551
10552 @dfn{FIFO} は特殊なファイル型の一つであり、
10553 これを利用すると、独立したプロセスの間でデータのやりとりが可能になる。
10554 片方のプロセスが FIFO を書き出し用にオープンし、もう一方のプロセスが読み込み用にオープンする。
10555 そうすると、シェルなどにある普通の名前のない (anonymous) パイプを使ったときのように、
10556 データを一方から他方へ流すことができるのである。
10557
10558 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10559
10560 @table @samp
10561
10562 @item -m @var{mode}
10563 @itemx --mode=@var{mode}
10564 @opindex -m
10565 @opindex --mode
10566 @cindex modes of created FIFOs, setting
10567 作成する FIFO の許可属性を @var{mode} にする。@var{mode} は @command{chmod}
10568 で使用するのと同じシンボル表記であり、@samp{a=rw} (すべてのユーザに、
10569 読み、書きを許可する) を基点として使う。@var{mode} で指定するのは、
10570 ファイルの許可属性ビットのみにするべきである。 @xref{File permissions}.
10571
10572 @optContext (@var{context} を省略できるのは、coreutils-8.22 から)
10573
10574 @end table
10575
10576 @exitstatus
10577
10578
10579 @node mknod invocation
10580 @section @command{mknod}: ブロック型やキャラクタ型のスペシャルファイルを作成する。
10581
10582 @pindex mknod
10583 @cindex block special files, creating
10584 @cindex character special files, creating
10585
10586 @command{mknod} は、指定された名前で FIFO、キャラクター・スペシャルファイル、
10587 ブロック・スペシャルファイルを作成する。
10588
10589 書式:
10590
10591 @example
10592 mknod [@var{option}]@dots{} @var{name} @var{type} [@var{major} @var{minor}]
10593 @end example
10594
10595 @cindex special files
10596 @cindex block special files
10597 @cindex character special files
10598 これまでに使ってきた「特殊なファイル型 (``special file type'')」という言い回しとは違って、
10599 「スペシャルファイル (@dfn{special file})」という用語には、Unix では技術的な意味が存在する。
10600 すなわち、それは、データを生成したり、受け取ったりできるもののことである。
10601 たいていの場合、それはハードウェアという物理的なものを指し、
10602 たとえば、プリンタやディスクがそれに当たる。(なお、そうしたスペシャルファイルは、
10603 通常、システムの設定時に作られる。) @command{mknod} は、
10604 このタイプのファイルを作成するコマンドである。そうしたデバイスには、そこから一度に
10605 1 文字 (a character) づつしか読むことのできないものもあれば、一度に 1 ブロックを
10606 (すなわち、たくさんの character を) 読み込むことのできるものもある。
10607 それ故、スペシャルファイルには、ブロック・スペシャルファイル
10608 (@dfn{block special} files) とキャラクタ・スペシャルファイル
10609 (@dfn{character special} files) があると言われるのである。
10610
10611 @c mknod is a shell built-in at least with OpenBSD's /bin/sh
10612 @mayConflictWithShellBuiltIn{mknod}
10613
10614 @var{name} に続く引数では、作成するファイルのタイプを指定する。
10615
10616 @table @samp
10617
10618 @item p
10619 @opindex p @r{for FIFO file}
10620 FIFO を作成する
10621
10622 @item b
10623 @opindex b @r{for block special file}
10624 ブロック・スペシャルファイルを作成する
10625
10626 @item c
10627 @c Don't document the 'u' option -- it's just a synonym for 'c'.
10628 @c Do *any* versions of mknod still use it?
10629 @c @itemx u
10630 @opindex c @r{for character special file}
10631 @c @opindex u @r{for character special file}
10632 キャラクタ・スペシャルファイルを作成する
10633
10634 @end table
10635
10636 ブロック型やキャラクタ型のスペシャルファイルを作成する際には、
10637 ファイルタイプに続いて、メージャー・デバイス番号とマイナー・デバイス番号を指定する必要がある。
10638 メージャーやマイナーのデバイス番号が @samp{0x} や @samp{0X} で始まっていれば、
10639 番号は 16 進数と見なされる。@samp{0} で始まっていれば 8 進数、それ以外の場合は
10640 10 進数である。
10641
10642 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10643
10644 @table @samp
10645
10646 @item -m @var{mode}
10647 @itemx --mode=@var{mode}
10648 @opindex -m
10649 @opindex --mode
10650 作成するファイルの許可属性を @var{mode} にする。@var{mode} は @command{chmod}
10651 で使用するのと同じシンボル表記であり、@samp{a=rw} を基点として使う。
10652 @var{mode} で指定するのは、ファイルの許可属性ビットのみにするべきである。
10653 @xref{File permissions}.
10654
10655 @optContext (@var{context} を省略できるのは、coreutils-8.22 から)
10656
10657 @end table
10658
10659 @exitstatus
10660
10661
10662 @node readlink invocation
10663 @section @command{readlink}: シムリンクの値、または正規化されたファイル名を表示する
10664
10665 @pindex readlink
10666 @cindex displaying value of a symbolic link
10667 @cindex canonical file name
10668 @cindex canonicalize a file name
10669 @findex realpath
10670
10671 @command{readlink} には、二つの動作モードがある。
10672
10673 @table @samp
10674
10675 @item Readlink モード
10676
10677 このモードでは、@command{readlink} は、指定されたシンボリックリンクの値を表示する。
10678 引数がシンボリックの名前以外だったときは、何も出力せず、0 以外の終了コードで終了する。
10679
10680 @item Canonicalize (正規化) モード
10681
10682 このモードでは、@command{readlink} は、指定されたファイルの絶対パスによる名前を表示する。
10683 その絶対パスには、@file{.} や @file{..} といった構成要素や重複するパスの区切り
10684 (@file{/})、シンボリックリンクは含まれない。
10685
10686 @end table
10687
10688 @example
10689 readlink [@var{option}]@dots{} @var{file}@dots{}
10690 @end example
10691
10692 デフォルトでは、@command{readlink} は readlink モードで動作する。
10693
10694 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10695
10696 @table @samp
10697
10698 @item -f
10699 @itemx --canonicalize
10700 @opindex -f
10701 @opindex --canonicalize
10702 canonicalize モードで動かす。ファイル名を構成する要素のうち、
10703 最後の要素以外のどれかが、存在しなかったり、利用できなかったりすると、
10704 @command{readlink} は何も出力せず、0 以外の終了コードで終了する。
10705 引数の末尾のスラッシュは無視される。
10706
10707 @item -e
10708 @itemx --canonicalize-existing
10709 @opindex -e
10710 @opindex --canonicalize-existing
10711 canonicalize モードで動かす。ファイル名を構成する要素に、
10712 存在しなかったり、利用できなかったりするものがあれば、@command{readlink}
10713 は何も出力せず、 0 以外の終了コードで終了する。
10714 ファイル名のの末尾にスラッシュを付けると、その名前はディレクトリであるという指定になる。
10715
10716 @item -m
10717 @itemx --canonicalize-missing
10718 @opindex -m
10719 @opindex --canonicalize-missing
10720 canonicalize モードで動かす。ファイル名を構成する要素に、
10721 存在しなかったり、利用できなかったりするものがあれば、@command{readlink}
10722 はそれをディレクトリと見なす。
10723
10724 @item -n
10725 @itemx --no-newline
10726 @opindex -n
10727 @opindex --no-newline
10728 @var{file} が 1 個しか指定されなかったときは、出力の区切り文字
10729 (訳注: 通常は改行) を表示しない。複数の @var{file}
10730 とともに、このオプションが指定されたときは、警告メッセージを出す。
10731
10732 @item -s
10733 @itemx -q
10734 @itemx --silent
10735 @itemx --quiet
10736 @opindex -s
10737 @opindex -q
10738 @opindex --silent
10739 @opindex --quiet
10740 ほとんどのエラーメッセージを出さないようにする。デフォルトで ON になっている。
10741
10742 @item -v
10743 @itemx --verbose
10744 @opindex -v
10745 @opindex --verbose
10746 エラーメッセージを表示する。
10747
10748 @optZero
10749
10750 @end table
10751
10752 @command{readlink} ユーティリティが初めて登場したのは、OpenBSD 2.1 だった。
10753
10754 @command{realpath} コマンドをオプションなしで使うと、canonicalize モードの
10755 @command{readlink} と同じ動作をする。
10756
10757 @exitstatus
10758
10759
10760 @node rmdir invocation
10761 @section @command{rmdir}: 空のディレクトリを削除する
10762
10763 @pindex rmdir
10764 @cindex removing empty directories
10765 @cindex directories, removing empty
10766
10767 @command{rmdir} は、空のディレクトリを削除する。
10768
10769 書式:
10770
10771 @example
10772 rmdir [@var{option}]@dots{} @var{directory}@dots{}
10773 @end example
10774
10775 引数 @var{directory} が実在する空のディレクトリを指していない場合、エラーになる。
10776
10777 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10778
10779 @table @samp
10780
10781 @item --ignore-fail-on-non-empty
10782 @opindex --ignore-fail-on-non-empty
10783 @cindex directory deletion, ignoring failures
10784 ディレクトリの削除に失敗しても、その理由が単にディレクトリが空ではないせいならば、
10785 その失敗を無視する。
10786
10787 @item -p
10788 @itemx --parents
10789 @opindex -p
10790 @opindex --parents
10791 @cindex parent directories, removing
10792 @var{directory} を削除するとき、@var{directory} を構成する各要素の削除を試みる。
10793 そこで、たとえば、@samp{rmdir -p a/b/c} は、@samp{rmdir a/b/c a/b a} と同じになる。
10794 従って、そうしたディレクトリのどれかが空ではないことが判明すると、動作に失敗する。
10795 動作に失敗しても、エラーメッセージを出して失敗のステータスで終了しないようにするには、
10796 @option{--ignore-fail-on-non-empty} オプションを使えばよい。
10797
10798 @item -v
10799 @itemx --verbose
10800 @opindex -v
10801 @opindex --verbose
10802 @cindex directory deletion, reporting
10803 @var{directory} の削除に成功するごとに、その旨メッセージを出す。
10804
10805 @end table
10806
10807 空ではないディレクトリを (再帰的に) 削除する方法については、@command{rm}
10808 コマンドの説明を参照していただきたい。@xref{rm invocation}. 
10809
10810 @exitstatus
10811
10812
10813 @node unlink invocation
10814 @section @command{unlink}: システムコール unlink を使って、ファイルを削除する
10815
10816 @pindex unlink
10817 @cindex removing files or directories (via the unlink syscall)
10818
10819 @command{unlink} は、指定された 1 個のファイル名の削除を行う。
10820 これは、システムが提供する @code{unlink} 関数への必要最小のインターフェースである。
10821 @xref{Deleting Files, , , libc, The GNU C Library Reference Manual}.
10822 従って、より一般に使われる @command{rm} コマンドのような、様々な付加機能をあえて備えていない
10823 (@pxref{rm invocation})。
10824
10825 書式:
10826
10827 @example
10828 unlink @var{filename}
10829 @end example
10830
10831 システムによっては、@code{unlink} を使って、ディレクトリの名前を削除できるものもある。
10832 また、それができるのは、特権を持ったユーザだけであるシステムもある。
10833 GNU のシステムでは、@code{unlink} は、ディレクトリの名前を全く削除できない。
10834
10835 @command{unlink} コマンドは、@option{--help} と @option{--version} オプションを認識する。
10836 名前が @samp{-} で始まるファイルを削除するには、名前の前に @samp{./} を付ければよい。
10837 たとえば、@samp{unlink ./--help} のようにだ。
10838
10839 @exitstatus
10840
10841
10842 @node Changing file attributes
10843 @chapter ファイルの属性変更
10844
10845 @cindex changing file attributes
10846 @cindex file attributes, changing
10847 @cindex attributes, file
10848
10849 ファイルについては、内容と名前とファイル型 (@pxref{Special file types})
10850 で、すべてが尽くされるわけではない。ファイルには、他の情報も存在する。
10851 たとえば、所有者 (ユーザ ID)、グループ (グループ ID)、アクセス権
10852 (そのファイルに対して、所有者、グループに属するユーザ、それ以外の一般ユーザは、
10853 それぞれ何ができるのか)、様々なタイムスタンプ、といった情報も存在するのである。
10854 そうしたものは、一まとめにして、ファイルの属性 (@dfn{attributes}) と呼ばれている。
10855
10856 以下のコマンドは、ファイルの属性を変更する。
10857
10858 @menu
10859 * chown invocation::         ファイルの所有者やグループを変更する。
10860 * chgrp invocation::         ファイルのグループを変更する。
10861 * chmod invocation::         アクセス権を変更する。
10862 * touch invocation::         ファイルのタイムスタンプを変更する。
10863 @end menu
10864
10865
10866 @node chown invocation
10867 @section @command{chown}: ファイルの所有者やグループを変更する
10868
10869 @pindex chown
10870 @cindex file ownership, changing
10871 @cindex group ownership, changing
10872 @cindex changing file ownership
10873 @cindex changing group ownership
10874
10875 @command{chown} は、指定された各 @var{file} の所有者や所有グループを
10876 @var{new-owner} に変更する。所有者とグループを、存在する参照用ファイル
10877 (reference file) のそれと同じものに変更することもできる。
10878
10879 書式:
10880
10881 @example
10882 chown [@var{option}]@dots{} @{@var{new-owner} | --reference=@var{ref_file}@}@c
10883  @var{file}@dots{}
10884 @end example
10885
10886 @var{new-owner} では、新しい所有者やグループを以下のような形で指定する
10887 (@samp{:} の前後に空白を入れてはいけない)。
10888
10889 @example
10890 [@var{owner}] [ : [@var{group}] ]
10891 @end example
10892
10893 細かく説明しよう。
10894
10895 @table @var
10896 @item owner
10897 @var{owner} (ユーザ名、またはユーザ ID 番号) だけが指定されている場合は、
10898 そのユーザが指定された各ファイルの所有者になる。ファイルのグループは変化しない。
10899
10900 @item owner@samp{:}group
10901 @var{owner} の後に、コロンと @var{group} (グループ名、またはグループ ID 番号)
10902 が、間に空白をはさまずに続く場合は、ファイルの所有グループも
10903 (@var{group} に) 変更される。
10904
10905 @item owner@samp{:}
10906 @var{owner} の後ろにコロンがあるのみで、グループ名が続かない場合は、
10907 そのユーザがファイルの所有者になり、ファイルのグループは、@var{owner}
10908 のログイン・グループに変更される。
10909
10910 @item @samp{:}group
10911 コロンとそれに続く @var{group} のみが指定され、所有者が省略されている場合は、
10912 ファイルのグループだけが変更される。この場合、@command{chown}
10913 は、@command{chgrp} と同じ動作をするわけだ。
10914
10915 @item @samp{:}
10916 コロンのみが指定されている場合や、@var{new-owner} に何も指定されていない場合は、
10917 所有者もグループも変更されない。
10918
10919 @end table
10920
10921 @var{owner} や @var{group} にユーザ ID 番号やグループ ID 番号を使用する場合は、
10922 番号の頭に @samp{+} を付ければ、ID 番号だと明示することができる。
10923 @xref{Disambiguating names and IDs}.
10924
10925 古めのスクリプトの中には、区切りの印として @samp{:} ではなく、@samp{.}
10926 を今だに使っているものがあるかもしれない。POSIX 1003.1-2001 (@pxref{Standards conformance})
10927 では、これに対するサポートを要求していないが、
10928 後方互換のために、GNU の @command{chown} では、曖昧さが生じないかぎり、@samp{.}
10929 の使用をサポートしている。とは言え、新しく書くスクリプトでは、@samp{.}
10930 の使用を避けるべきである。他のシステムでも使えるとはかぎらないし、
10931 また、@var{owner@samp{.}group} という全体が、名前に @samp{.}
10932 を含むユーザを指していたりすると、不都合が生じるからだ。
10933
10934 @macro chownGroupRestrictions
10935 ユーザがグループを任意のものに変更できるか、それとも、
10936 グループの設定はユーザがその一員であるグループにのみ制限されるという、
10937 より可搬性のある動作になっているかは、システム次第である。
10938 @end macro
10939 @chownGroupRestrictions
10940
10941 @command{chown} コマンドを実行すると、set-user-ID ビットや set-group-ID
10942 ビットが消えてしまうことがある。そうしたことが起きるかどうかは、
10943 裏で動いている @code{chown} システムコールのポリシーや機能次第であり、
10944 従って、システムによるファイルモードの変更が、@command{chown}
10945 コマンドのコントロール外になることがあるのだ。
10946 しかるべき特権を持ったユーザが実行した場合や、問題のビットが実行権とは関係のない何か別の機能
10947 (たとえば、強制ロック) を表している場合などでは、@command{chown}
10948 コマンドを実行しても、そうしたビットが変わらないかもしれない。
10949 どうなるかよくわからない場合は、裏で動いているシステムの動作を調べるとよい。
10950
10951 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
10952
10953 @table @samp
10954
10955 @item -c
10956 @itemx --changes
10957 @opindex -c
10958 @opindex --changes
10959 @cindex changed owners, verbosely describing
10960 所有者の変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。
10961
10962 @item -f
10963 @itemx --silent
10964 @itemx --quiet
10965 @opindex -f
10966 @opindex --silent
10967 @opindex --quiet
10968 @cindex error messages, omitting
10969 所有者を変更できないファイルがあっても、エラーメッセージを出さない。
10970
10971 @item --from=@var{old-owner}
10972 @opindex --from
10973 @cindex symbolic links, changing owner
10974 @var{file} が @var{old-owner} で指定された属性を現在持っているときにのみ、
10975 その所有者を変更する。@var{old-owner} の書式は、上記の @var{new-owner} と同じである。
10976 このオプションは、ファイルの不正使用が可能になる時間を大幅に狭めるという点で、
10977 主としてセキュリティの見地から役に立つ。
10978 一例を挙げると、この種のオプションを使わない場合、ユーザの ID
10979 番号の変更を、そのユーザのファイルに反映させるために、@code{root}
10980 は次のようなコマンドを実行するかもしれない。
10981
10982 @smallexample
10983 find / -user OLDUSER -print0 | xargs -0 chown -h NEWUSER
10984 @end smallexample
10985
10986 しかし、これは危険なことである。なぜなら、@command{find}
10987 が存在するファイルの所有者を検査するときと、@command{chown}
10988 が実際に実行されるときとの間に時間差があり、それはかなり大きいかもしれないからだ。
10989 この時間差を小さくする方法の一つは、ファイルが見つかるごとに、@command{chown}
10990 を実行することだろう。
10991
10992 @example
10993 find / -user OLDUSER -exec chown -h NEWUSER @{@} \;
10994 @end example
10995
10996 しかし、動作の対象になるファイルがたくさんあると、この方法は非常に時間がかかる。
10997 @option{--from=@var{old-owner}} オプションを使う方が、
10998 万全とまでは言えないにしても、より安全である (時間差がさらに小さくなるので)。
10999
11000 @example
11001 chown -h -R --from=OLDUSER NEWUSER /
11002 @end example
11003
11004 @item --dereference
11005 @opindex --dereference
11006 @cindex symbolic links, changing owner
11007 @findex lchown
11008 シンボリックリンクそのものを動作の対象とせず、リンクが指しているものを動作の対象にする。
11009 これがデフォルトである。
11010
11011 @item -h
11012 @itemx --no-dereference
11013 @opindex -h
11014 @opindex --no-dereference
11015 @cindex symbolic links, changing owner
11016 @findex lchown
11017 シンボリックリンクが指しているものではなく、シンボリックリンクそのものを動作の対象にする。
11018 このモードは、システムコール @code{lchown} に依存している。
11019 システムコール @code{lchown} を提供していないシステムでは、
11020 コマンドラインで指定されたファイルがシンボリックリンクだと、@command{chown} は実行に失敗する。
11021 なお、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会っても、
11022 デフォルトでは診断メッセージを表示しない。ただし、@option{--verbose}
11023 を指定している場合は別なので、そちらの説明も参照していただきたい。
11024
11025 @item --preserve-root
11026 @opindex --preserve-root
11027 @cindex root directory, disallow recursive modification
11028 ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
11029 @option{--recursive} オプションを指定していない場合、このオプションは効果がない。
11030 @xref{Treating / specially}.
11031
11032 @item --no-preserve-root
11033 @opindex --no-preserve-root
11034 @cindex root directory, allow recursive modification
11035 @option{--preserve-root} オプションが前にあれば、その効果を無効にする。
11036 @xref{Treating / specially}.
11037
11038 @item --reference=@var{ref_file}
11039 @opindex --reference
11040 各 @var{file} の所有者とグループを @var{ref_file} のそれと同じものに変更する。
11041 @var{ref_file} がシンボリックリンクの場合は、シンボリックリンクの所有者とグループではなく、
11042 リンクが指しているファイルの所有者とグループを使用する。
11043
11044 @item -v
11045 @itemx --verbose
11046 @opindex -v
11047 @opindex --verbose
11048 処理したすべてのファイルについてメッセージを表示する。システムコール @code{lchown}
11049 を持っていないシステムで、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会った場合、
11050 @option{--no-dereference} が有効になっていれば、
11051 「シンボリックリンクもその参照先も変更しない」というメッセージを出す。
11052
11053 @item -R
11054 @itemx --recursive
11055 @opindex -R
11056 @opindex --recursive
11057 @cindex recursively changing file ownership
11058 ディレクトリとその中身の所有者を再帰的に変更する。
11059
11060 @choptH @xref{Traversing symlinks}.
11061
11062 @choptL @xref{Traversing symlinks}.
11063
11064 @choptP @xref{Traversing symlinks}.
11065
11066 @end table
11067
11068 @exitstatus
11069
11070 用例:
11071
11072 @smallexample
11073 # /u の所有者を "root" に変更する。
11074 chown root /u
11075
11076 # 同様だが、グループも "staff" に変更する。
11077 chown root:staff /u
11078
11079 # /u 及び、それ以下にあるファイルの所有者を "root" に変更する。
11080 chown -hR root /u
11081 @end smallexample
11082
11083
11084 @node chgrp invocation
11085 @section @command{chgrp}: ファイルの所有グループを変更する
11086
11087 @pindex chgrp
11088 @cindex group ownership, changing
11089 @cindex changing group ownership
11090
11091 @command{chgrp} は、指定された各 @var{file} の所有グループを @var{group}
11092 に変更する (@var{group} は、グループ名でもグループ ID 番号でもよい)。
11093 所有グループを、存在する参照用ファイル (reference file)
11094 のグループと同じものに変更することもできる。 @xref{chown invocation}.
11095
11096 書式:
11097
11098 @example
11099 chgrp [@var{option}]@dots{} @{@var{group} | --reference=@var{ref_file}@}@c
11100  @var{file}@dots{}
11101 @end example
11102
11103 @var{group} にグループ ID 番号を使用する場合は、番号の頭に @samp{+} を付ければ、
11104 ID 番号だと明示することができる。 @xref{Disambiguating names and IDs}.
11105
11106 @chownGroupRestrictions
11107
11108 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
11109
11110 @table @samp
11111
11112 @item -c
11113 @itemx --changes
11114 @opindex -c
11115 @opindex --changes
11116 @cindex changed files, verbosely describing
11117 グループの変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。
11118
11119 @item -f
11120 @itemx --silent
11121 @itemx --quiet
11122 @opindex -f
11123 @opindex --silent
11124 @opindex --quiet
11125 @cindex error messages, omitting
11126 グループを変更できないファイルがあっても、エラーメッセージを出さない。
11127
11128 @item --dereference
11129 @opindex --dereference
11130 @cindex symbolic links, changing owner
11131 @findex lchown
11132 シンボリックリンクそのものを動作の対象とせず、リンクが指しているものを動作の対象にする。
11133 これがデフォルトである。
11134
11135 @item -h
11136 @itemx --no-dereference
11137 @opindex -h
11138 @opindex --no-dereference
11139 @cindex symbolic links, changing group
11140 @findex lchown
11141 シンボリックリンクが指しているものではなく、シンボリックリンクそのものを動作の対象にする。
11142 このモードは、システムコール @code{lchown} に依存している。
11143 システムコール @code{lchown} を提供していないシステムでは、
11144 コマンドラインで指定されたファイルがシンボリックリンクだと、@command{chgrp} は実行に失敗する。
11145 なお、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会っても、
11146 デフォルトでは診断メッセージを表示しない。ただし、@option{--verbose}
11147 を指定している場合は別なので、そちらの説明も参照していただきたい。
11148
11149 @item --preserve-root
11150 @opindex --preserve-root
11151 @cindex root directory, disallow recursive modification
11152 ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
11153 @option{--recursive} オプションを指定していない場合、このオプションは効果がない。
11154 @xref{Treating / specially}.
11155
11156 @item --no-preserve-root
11157 @opindex --no-preserve-root
11158 @cindex root directory, allow recursive modification
11159 @option{--preserve-root} オプションが前にあれば、その効果を無効にする。
11160 @xref{Treating / specially}.
11161
11162 @item --reference=@var{ref_file}
11163 @opindex --reference
11164 各 @var{file} のグループを @var{ref_file} のグループと同じものに変更する。
11165 @var{ref_file} がシンボリックリンクの場合は、
11166 シンボリックリンクのグループではなく、リンクが指しているファイルのグループを使用する。
11167
11168 @item -v
11169 @itemx --verbose
11170 @opindex -v
11171 @opindex --verbose
11172 処理したすべてのファイルについてメッセージを表示する。システムコール @code{lchown}
11173 を持っていないシステムで、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会った場合、
11174 @option{--no-dereference} が有効になっていれば、
11175 「シンボリックリンクもその参照先も変更しない」というメッセージを出す。
11176
11177 @item -R
11178 @itemx --recursive
11179 @opindex -R
11180 @opindex --recursive
11181 @cindex recursively changing group ownership
11182 ディレクトリとその中身の所有グループを再帰的に変更する。
11183
11184 @choptH @xref{Traversing symlinks}.
11185
11186 @choptL @xref{Traversing symlinks}.
11187
11188 @choptP @xref{Traversing symlinks}.
11189
11190 @end table
11191
11192 @exitstatus
11193
11194 用例:
11195
11196 @smallexample
11197 # /u のグループを "staff" に変更する。
11198 chgrp staff /u
11199
11200 # /u 及び、それ以下にあるファイルのグループを "staff" に変更する。
11201 chgrp -hR staff /u
11202 @end smallexample
11203
11204
11205 @node chmod invocation
11206 @section @command{chmod}: アクセス権を変更する
11207
11208 @pindex chmod
11209 @cindex changing access permissions
11210 @cindex access permissions, changing
11211 @cindex permissions, changing access
11212
11213 @command{chmod} は、名前を指定したファイルのアクセス権を変更する。
11214
11215 書式:
11216
11217 @example
11218 chmod [@var{option}]@dots{} @{@var{mode} | --reference=@var{ref_file}@}@c
11219  @var{file}@dots{}
11220 @end example
11221
11222 @cindex symbolic links, permissions of
11223 @command{chmod} コマンドがシンボリックリンクのアクセス権を変更することはない。
11224 @command{chmod} システムコールがシンボリックリンクのアクセス権を変更できないからである。
11225 シンボリックリンクのアクセス権が利用されることは全くないので、この制限は問題にならない。
11226 とは言え、コマンドラインで指定された @var{file}
11227 が、シンボリックリンクだということはあるだろうが、そうした場合、@command{chmod}
11228 は、指定された各シンボリックリンクが参照しているファイルのアクセス権を変更する。
11229 それに対して、ディレクトリを再帰的にたどっている最中にシンボリックリンクに出会った場合は、
11230 @command{chmod} はそれを無視することになる。
11231
11232 @command{chmod} の実行に成功したとき、通常ファイルの set-group-ID ビットが消えることがあるが、
11233 それは、ファイルのグループ ID が、@command{chmod} を実行したユーザの実効グループ ID
11234 や、補助グループ ID の一つに一致しなかった場合である。
11235 もっとも、そのユーザがしかるべき特権を持っている場合には、
11236 set-group-ID ビットが消えることはない。また、制限事項が他にも存在して、
11237 指定した @var{mode} 中や @var{ref_file} の、set-user-ID ビットや set-group-ID
11238 ビットが無視されることもある。そうした動作は、裏で動いている @code{chmod}
11239 システムコールのポリシーや機能次第なのだ。どうなるかよくわからない場合には、
11240 裏で動いているシステムの動作を調べればよい。
11241
11242 @var{mode} には、ファイルの新しいモードビット (訳注: すなわち、アクセス権)
11243 を指定する。詳細については、「ファイルの許可属性」の章を参照していただきたい
11244 (@pxref{File permissions})。@var{mode} を指定するとき、@var{mode}
11245 をどうしても @samp{-} で始めたいのなら、前に @option{--} を置いた方がよい。
11246 たとえば、@samp{chmod -- -w file} のようにだ。
11247 とは言え、たいていの場合、@samp{chmod a-w file} の方が望ましい。
11248 なお、@command{chmod -w file} (@option{--} がない) が
11249 @samp{chmod a-w file} と別の動作になる場合には、警告が出る。
11250
11251 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
11252
11253 @table @samp
11254
11255 @item -c
11256 @itemx --changes
11257 @opindex -c
11258 @opindex --changes
11259 アクセス権の変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。
11260
11261 @item -f
11262 @itemx --silent
11263 @itemx --quiet
11264 @opindex -f
11265 @opindex --silent
11266 @opindex --quiet
11267 @cindex error messages, omitting
11268 アクセス権が変更できないファイルがあっても、エラーメッセージを出さない。
11269
11270 @item --preserve-root
11271 @opindex --preserve-root
11272 @cindex root directory, disallow recursive modification
11273 ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
11274 @option{--recursive} オプションを指定していない場合、このオプションは効果がない。
11275 @xref{Treating / specially}.
11276
11277 @item --no-preserve-root
11278 @opindex --no-preserve-root
11279 @cindex root directory, allow recursive modification
11280 @option{--preserve-root} オプションが前にあれば、その効果を無効にする。
11281 @xref{Treating / specially}.
11282
11283 @item -v
11284 @itemx --verbose
11285 @opindex -v
11286 @opindex --verbose
11287 すべての @var{file} について、何を実行し、何を実行しなかったかを詳しく
11288 表示する。
11289
11290 @item --reference=@var{ref_file}
11291 @opindex --reference
11292 各 @var{file} のモードを @var{ref_file} のそれと同じものに変更する。
11293 @xref{File permissions}.  @var{ref_file} がシンボリックリンクの場合は、
11294 シンボリックリンクのモードではなく、リンクが参照しているファイルのモードを使用する。
11295
11296 @item -R
11297 @itemx --recursive
11298 @opindex -R
11299 @opindex --recursive
11300 @cindex recursively changing access permissions
11301 ディレクトリとその中身のアクセス権を再帰的に変更する。
11302
11303 @end table
11304
11305 @exitstatus
11306
11307
11308 @node touch invocation
11309 @section @command{touch}: ファイルのタイムスタンプを変更する
11310
11311 @pindex touch
11312 @cindex changing file timestamps
11313 @cindex file timestamps, changing
11314 @cindex timestamps, changing file
11315
11316 @command{touch} は指定されたファイルのアクセス日時 (access time) や更新日時
11317 (modification time) を変更する。
11318
11319 書式:
11320
11321 @example
11322 touch [@var{option}]@dots{} @var{file}@dots{}
11323 @end example
11324
11325 @cindex empty files, creating
11326 引数 @var{file} に存在しないファイルを指定すると、空のファイルが作成される。
11327 ただし、@option{--no-create} (@option{-c}) や @option{--no-dereference}
11328 (@option{-h}) が有効な場合は、ファイルは作成されない。
11329
11330 引数 @var{file} が @samp{-} という文字列の場合は、特別な扱いをする。@command{touch}
11331 は、標準出力に結びついているファイルの日時を変更するのである。
11332
11333 @cindex clock skew
11334 @command{touch} は、デフォルトではファイルのタイムスタンプを現在の日時にセットする。
11335 @command{touch} はオペランドを左から右へと順番に処理するので、
11336 生成されたタイムスタンプが、前後のオペランドで一致しないこともある。
11337 また、「現在」とはいつかを決めるのは、プラットフォーム次第である。
11338 ネットワーク・ファイルシステムを使用しているプラットフォームでは、
11339 オペレーティング・システムとファイルシステムとで別のクロックを使用していることも珍しくない。
11340 @command{touch} は通常、デフォルトではファイルシステムのクロックを使用するので、
11341 クロックのずれのために、生成されたファイルのタイムスタンプが、
11342 あるプログラムにとっては「未来」に見えたり、「過去」に見えたりすることがある。
11343
11344 @cindex file timestamp resolution
11345 @command{touch} コマンドは、ファイルのタイムスタンプを、
11346 ユーザが指定した日時よりも精度が高くならない範囲で、表現できる最も精密な値にセットする。
11347 この値がユーザが指定した日時と違うことがあるが、それにはいくつかの理由がある。
11348 第一に、ユーザが指定した日時が、サポートされている精度を越えていることがある。
11349 第二に、ファイルシステムが、日時のタイプによって別の精度を使っていることがある。
11350 第三に、ファイルのタイムスタンプが、オペレーティング・システムのタイムスタンプとは別の精度を使っていることがある。
11351 第四に、オペレーティング・システムでタイムスタンプの更新に使用される基本データ型が、
11352 さらに違う精度を採用していることがある。そんなわけで、理屈の上では、
11353 たとえば、ファイルシステムでは、アクセス日時には 10 マイクロ秒の精度を、更新日時には
11354 100 ナノ秒の精度を使用し、オペレーティング・システムの方では、現在の時刻にはナノ秒の精度を、
11355 @command{touch} がファイルのタイムスタンプを任意の値に設定するために使う基本データ型には、
11356 マイクロ秒の精度を使用している、そういうこともありえるのである。
11357
11358 @cindex permissions, for changing file timestamps
11359 タイムスタンプを現在の時刻にセットする場合には、
11360 ユーザが所有していないファイルでも、書き込み権限さえ持っていれば、@command{touch}
11361 はそのタイムスタンプを変更することができる。
11362 しかし、現在の時刻以外にセットするには、ユーザはそのファイルを所有していなければならない。
11363 古いシステムの中には、制限がさらに厳しいものもある。
11364 たとえば、アクセス日時と更新日時の両方を現在の時刻にセットするとき以外、
11365 対象となるファイルを所有していなければならないといった具合だ。
11366
11367 @command{touch} が提供するオプションを使えば、ファイルの 2 種類の日時 ---
11368 最終アクセス日時と最終更新日時 --- を変更することができるが、
11369 標準の日時には、実はそのほかに 3 番目のものがある。すなわち、inode の変更日時
11370 (inode change time) だ。これは、ファイルの @code{ctime} と呼ばれることが多い。
11371 inode の変更日時は、ファイルのメタ情報が最後に変更された日時を表している。
11372 メタ情報の変更のよくある例の一つは、ファイルのアクセス権の変更である。
11373 アクセス権の変更では、ファイルにアクセスするわけではないので、atime (アクセス日時)
11374 は変化しないし、またファイルの内容を変更するわけでもないので、mtime (更新日時)
11375 も変化しない。しかし、ファイルそのものに関する何ものかが変化しているわけであり、
11376 それはどこかに記録されなければならない。まさにそれが、inode の ctime フィールドの役割なのだ。
11377 たとえば、バックアップ・プログラムが、ファイルのアクセス権に変更があった場合も含めて、
11378 ファイルのコピーを最新に保つことができるようにするには、ctime が不可欠である。
11379 ファイルの ctime は変更するが、他の日時には影響を及ぼさない別の操作には、ファイル名の変更がある。
11380 なお、いかなる場合であれ、通常の操作では、ユーザが ctime
11381 フィールドを自分で指定する値に変更することはできない。
11382 オペレーティングシステムやファイルシステムの中には、4 番目の日時をサポートしているものもある。
11383 すなわち、作成日時 (birth time) であり、ファイルが最初に作られた日時だ。
11384 名前からして当然だが、このタイムスタンプが変更されることはない。
11385
11386 @vindex TZ
11387 タイムスタンプは、タイムゾーンのルールに従うが、そのルールを指定しているのは、環境変数 @env{TZ} である。
11388 @env{TZ} が設定されていない場合は、システムのデフォルトのルールに従う。
11389 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ},
11390 libc, The GNU C Library Reference Manual}.
11391 なお、UTC のタイムスタンプを使えば、夏 (冬) 時間への移行時の曖昧さを避けることができる。
11392
11393 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
11394
11395 @table @samp
11396
11397 @item -a
11398 @itemx --time=atime
11399 @itemx --time=access
11400 @itemx --time=use
11401 @opindex -a
11402 @opindex --time
11403 @opindex atime@r{, changing}
11404 @opindex access @r{time, changing}
11405 @opindex use @r{time, changing}
11406 アクセス日時のみ変更する。
11407
11408 @item -c
11409 @itemx --no-create
11410 @opindex -c
11411 @opindex --no-create
11412 存在しないファイルについて警告を出さず、ファイルの作成もしない。
11413
11414 @item -d @var{time}
11415 @itemx --date=@var{time}
11416 @opindex -d
11417 @opindex --date
11418 @opindex time
11419 現在の日時の代わりに @var{time} を使用する。@var{time} には、月の名前、
11420 タイムゾーン、@samp{am} や @samp{pm}、@samp{yesterday} なども使うことができる。
11421 たとえば、@option{--date="2004-02-27 14:19:13.489392193 +0530"} とすると、
11422 UTC より 5 時間 30 分東のタイムゾーンで、2004 年 2 月 27 日 午後
11423 2 時 19 分 13 秒 から 489,392,193 ナノ秒経過した瞬間を指定することになる。
11424 @xref{Date input formats}.  精度の高いタイムスタンプをサポートしていないファイルシステムでは、
11425 精度の超過分は単に無視される。
11426
11427 @item -f
11428 @opindex -f
11429 @cindex BSD @command{touch} compatibility
11430 何もしない。BSD 版の @command{touch} との互換性のためにある。
11431
11432 @item -h
11433 @itemx --no-dereference
11434 @opindex -h
11435 @opindex --no-dereference
11436 @cindex symbolic links, changing time
11437 @findex lutimes
11438 シンボリックリンクが参照しているファイルではなく、シンボリックリンクのタイムスタンプの変更を試みる。
11439 このオプションを使用した場合、空のファイルは作成されないが、
11440 ファイルが存在しないという警告まで出ないようにするには、@option{-c} オプションも併せて使用する必要がある。
11441 すべてのシステムが、シンボリックリンクのタイムスタンプの変更をサポートしているわけではない。
11442 なぜならば、POSIX 2008 までは、下層で動いているシステムに対して、
11443 そうした動作のサポートを要求していなかったからだ。
11444 また、システムによっては、シンボリックリンクは、調べるだけでアクセス日時が変わってしまうので、
11445 変更の結果が後々まで残って観察できるのは、更新日時だけだというものもある。
11446 なお、このオプションを @option{-r} オプションと一緒に使用すると、
11447 参照するタイムスタンプが、リンクが指しているファイルからではなく、
11448 シンボリックリンクから取得される。
11449
11450 @item -m
11451 @itemx --time=mtime
11452 @itemx --time=modify
11453 @opindex -m
11454 @opindex --time
11455 @opindex mtime@r{, changing}
11456 @opindex modify @r{time, changing}
11457 更新日時 (modification time) のみ変更する。
11458
11459 @item -r @var{file}
11460 @itemx --reference=@var{file}
11461 @opindex -r
11462 @opindex --reference
11463 現在の日時の代わりに、参照ファイル @var{file} の日時を使用する。
11464 このオプションを @option{--date=@var{time}} (@option{-d @var{time}})
11465 オプションと組み合わせて使うと、@var{time} が相対時間で指定されている場合は、参照ファイル
11466 @var{file} の日時がその基点となるが、それ以外の場合は、@var{file} の日時は無視される。
11467 たとえば、@samp{-r foo -d '-5 seconds'} は、@file{foo} のタイムスタンプより
11468 5 秒前のタイムスタンプを指定している。
11469 @var{file} がシンボリックリンクの場合は、@option{-h} が同時に有効になっていないかぎり、
11470 参照するタイムスタンプは、シンボリックリンクの参照先から取得される。
11471
11472 @item -t [[@var{cc}]@var{yy}]@var{mmddhhmm}[.@var{ss}]
11473 @cindex leap seconds
11474 現在の日時の代わりに、@option{-t} オプションの引数を使用する
11475 (引数の構成は、4 桁または 2 桁の年 (省略可)、月、日、時、分、秒 (秒も省略可)
11476 である)。年が 2 桁のみ指定された場合、0 @dots{} 68 の範囲の年ならば、
11477 @var{cc} は 20 であり、69 @dots{} 99 の範囲の年では、@var{cc} は 19 である。
11478 年が全く指定されない場合は、引数は今年の日付だと解釈される。
11479 閏秒に対応している例外的なシステムでは、@var{ss} が @samp{60} のこともありえる。
11480
11481 @end table
11482
11483 @vindex _POSIX2_VERSION
11484 POSIX 1003.1-2001 以前のシステムでは、@command{touch}
11485 は次のような旧式の書式をサポートしている。すなわち、@option{-d}, @option{-r},
11486 @option{-t} オプションのいづれによってもタイムスタンプが指定されていず、しかも、2 個以上の
11487 @var{file} が指定されていて、最初の @var{file} が
11488 @samp{@var{mmddhhmm}[@var{yy}]} の形を持ち、それが
11489 (@var{yy} が存在するなら、それを先頭に移せば) @option{-t}
11490 オプションに対する有効な引数と見なすことができる場合に、その引数の表している年度が
11491 1969--1999 の範囲にあるならば、その引数をファイル名ではなく、
11492 他のファイルに適用する日時と解釈する、というものである。
11493 この旧式の動作は、環境変数 @env{_POSIX2_VERSION} によってコントロールすることができるが
11494 (@pxref{Standards conformance})、移植を考慮したスクリプトでは、
11495 動作がこの環境変数に依存するコマンドの使用は避けるべきである。
11496 たとえば、二通りの解釈ができる @samp{touch 12312359 main.c}
11497 を使うより、@samp{touch ./12312359 main.c} や @samp{touch -t 12312359 main.c}
11498 を使用した方がよい。
11499
11500 @exitstatus
11501
11502
11503 @node Disk usage
11504 @chapter ディスク使用量
11505
11506 @cindex disk usage
11507
11508 データをいくらでも無限に入れることのできるディスクはない。
11509 この章で説明するコマンドには、使用しているディスク容量や利用可能なディスク容量を報告するもの、
11510 それ以外のファイル情報やファイルステータス情報を報告するもの、
11511 それに、バッファの内容をディスクに書き込むものがある。
11512
11513 @menu
11514 * df invocation::            ファイルシステムのディスク使用量を報告する。
11515 * du invocation::            ファイルのディスク使用量を概算する。
11516 * stat invocation::          ファイルやファイルシステムのステータスを報告する。
11517 * sync invocation::          キャッシュされた書き込みを永続的な記憶装置に同期する。
11518 * truncate invocation::      ファイルサイズの短縮・伸長を行う。
11519 @end menu
11520
11521
11522 @node df invocation
11523 @section @command{df}: ファイルシステムのディスク使用状態を報告する
11524
11525 @pindex df
11526 @cindex file system disk usage
11527 @cindex disk usage by file system
11528
11529 @command{df} は、ファイルシステムごとに、使用されているディスク容量と利用可能なディスクス容量を報告する。
11530
11531 書式:
11532
11533 @example
11534 df [@var{option}]@dots{} [@var{file}]@dots{}
11535 @end example
11536
11537 引数を指定しないと、@command{df} は、現在マウントされているすべてのファイルシステム
11538 (ファイルシステムのタイプを問わない) について、使用されているディスク容量と、利用可能なディスク容量を報告する。
11539 引数が指定されている場合は、引数として指定された各 @var{file} が存在するファイルシステムについて報告する。
11540
11541 通常、ディスク容量は 1024 バイトを 1 単位として表示するが、この動作は変更することができる
11542 (@pxref{Block size})。なお、小数点以下は切り上げて整数にする。
11543
11544 bind マウントについては、引数が指定されていない場合に @command{df} が表示するのは、
11545 そのデバイスに関する統計情報のうち、ファイルシステムのリスト中で
11546 (すなわち、@var{mtab} 中で) マウントポイントの名前が最も短いものに関する情報のみである。
11547 すなわち、@option{-a} オプションが指定されていないときは、情報が重複するエントリは表示しない。
11548
11549 同じ理屈で、ダミーの擬似デバイスについては、
11550 そのマウントポイントに対する別のマウントエントリが存在し、
11551 それが実在のブロックデバイスのものであり、しかもデバイス番号が同じ場合、
11552 @command{df} は擬似デバイスのマウントエントリの方は省略する。
11553 たとえば、ブート初期に作成される擬似ファイルシステムの @samp{rootfs} は、
11554 実際のルートデバイスがすでにマウントされていれば、デフォルトでは表示されない。
11555
11556 @cindex disk device file
11557 @cindex device file, disk
11558 引数 @var{file} がスペシャルファイルに還元され、
11559 そのスペシャルファイル上に存在するファイルシステムが現在マウントされている場合、
11560 @command{df} が表示するのは、そのファイルシステムの利用可能な容量であって、
11561 デバイス・ノードが存在するファイルシステムの利用可能な容量ではない。また、GNU の
11562 @command{df} は、マウントされていないファイルシステムのディスク使用量を測定しようとはしない。
11563 なぜなら、ほとんどのファイルシステムにおいて、そういうことを行うには、
11564 ファイルシステムの構造について他と全く共通性のない詳しい情報が必要だからである。
11565
11566 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
11567
11568 @table @samp
11569
11570 @item -a
11571 @itemx --all
11572 @opindex -a
11573 @opindex --all
11574 @cindex ignore file systems
11575 一覧表示に、ダミーのファイルシステム、重複するファイルシステム、アクセスできないファイルシステムも含める。
11576 そうしたものは、デフォルトでは省略されるのである。
11577 ダミーのファイルシステムというのは、@samp{/proc} のような特殊用途の擬似ファイルシステムがその典型であり、
11578 ストレージと結びついていないものだ。
11579 重複するファイルシステムとは、ローカルやリモートのファイルシステムで、
11580 ローカルのファイル階層の別の場所にもマウントされているものや、bind マウントされたものである。
11581 アクセスできないファイルシステムとは、マウントされているが、
11582 その後そのマウントポイントに他のファイルシステムが二重にマウントされたものや、
11583 あるいは、マウントポイントのパーミッションなど、他の理由でアクセスできなくなっているものを言う。
11584
11585 @item -B @var{size}
11586 @itemx --block-size=@var{size}
11587 @opindex -B
11588 @opindex --block-size
11589 @cindex file system sizes
11590 @var{size} によって単位の大きさを変更してから、サイズを表示する (@pxref{Block size})。
11591 たとえば、@option{-BG} と指定すれば、1,073,741,824 バイトを 1 単位として、サイズを表示する。
11592
11593 @optHumanReadable
11594
11595 @item -H
11596 @opindex -H
11597 @option{--si} オプションと同じである。
11598
11599 @item -i
11600 @itemx --inodes
11601 @opindex -i
11602 @opindex --inodes
11603 @cindex inode usage
11604 ブロックの使用量ではなく、inode の使用情報を一覧表示する。
11605 inode (index node の略称) には、ファイルの所有者、許可属性、タイムスタンプ、
11606 ディスク上の位置といった、ファイルに関する情報が含まれている。
11607
11608 @item -k
11609 @opindex -k
11610 @cindex kibibytes for file system sizes
11611 デフォルトのブロックサイズがどうなっていようと、1 ブロック 1024
11612 バイトでサイズを表示する (@pxref{Block size})。このオプションは
11613 @option{--block-size=1K} に等しい。
11614
11615 @item -l
11616 @itemx --local
11617 @opindex -l
11618 @opindex --local
11619 @cindex file system types, limiting output to certain
11620 一覧表示するのをローカルのファイルシステムに限定する。
11621 デフォルトでは、リモートのファイルシステムも表示される。
11622
11623 @item --no-sync
11624 @opindex --no-sync
11625 @cindex file system space, retrieving old data more quickly
11626 使用量に関するデータを取得する前に @code{sync} システムコールを実行しない。
11627 そのため、多数のディスクを搭載しているシステムでは、@command{df}
11628 の実行速度が目に見えて向上するが、システムによっては
11629 (特に SunOS では)、出力結果がほんの少し古いものになるかもしれない。
11630 これがデフォルトの動作である。
11631
11632 @item --output
11633 @itemx --output[=@var{field_list}]
11634 @opindex --output
11635 @var{field_list} で定義した出力フォーマットを使用する。@var{field_list}
11636 を省略した場合は、すべてのフィールドを表示する。
11637 後者の場合、列の順序は、以下に挙げているフィールドの説明の順序と同じである。
11638
11639 @option{--output} オプションは、@option{-i}, @option{-P}, @option{-T}
11640 のどのオプションとも一緒に使うことができない。
11641
11642 @var{field_list} は、@command{df} の出力に含まれることになる、コンマで区切った列のリストであり、
11643 このリストによって出力する列の順序を制御することができる。
11644 従って、各フィールドは任意の場所に置くことができるが、一度しか使うことができない。
11645
11646 @var{field_list} で使える有効なフィールドの名前は、次のものである。
11647 @table @samp
11648 @item source
11649 マウントポイントにマウントする対象。たいていはデバイス。
11650 @item fstype
11651 ファイルシステムのタイプ。
11652
11653 @item itotal
11654 inode の総数。
11655 @item iused
11656 使用 inode 数。
11657 @item iavail
11658 使用可能な inode 数。
11659 @item ipcent
11660 @var{iused} を @var{itotal} で割ったパーセント表示。
11661
11662 @item size
11663 ブロックの総数。
11664 @item used
11665 使用ブロック数。
11666 @item avail
11667 使用可能なブロック数。
11668 @item pcent
11669 @var{used} を @var{size} で割ったパーセント表示。
11670
11671 @item file
11672 ファイル名をコマンドラインで指定した場合、そのファイル名。
11673 @item target
11674 マウントポイント。
11675 @end table
11676
11677 ブロックや inode の統計情報を表すフィールドは、他の場合と同じく、
11678 @option{-h} のような数値の大きさを調整するオプションの影響を受ける。
11679
11680 @var{field_list} の定義は、複数の @option{--output}
11681 オプションを使用して、分割しても構わない。
11682
11683 @example
11684 #!/bin/sh
11685 # TARGET (すなわち、マウントポイント) に続けて、そのブロックや 
11686 # inode の使用状態をパーセントで表示する。
11687 df --out=target --output=pcent,ipcent
11688
11689 # 表示できるすべてのフィールドを表示する。
11690 df --o
11691 @end example
11692
11693
11694 @item -P
11695 @itemx --portability
11696 @opindex -P
11697 @opindex --portability
11698 @cindex one-line output format
11699 @cindex POSIX output format
11700 @cindex portable output format
11701 @cindex output format, portable
11702 POSIX の出力形式を使用する。デフォルトの形式に似ているが、次の点で異なっている。
11703
11704 @enumerate
11705 @item
11706 各ファイルシステムついての情報が、常にぴったり 1 行で表示され、
11707 マウントされるデバイスが、それのみで 1 行を占めることがない。
11708 そのため、マウントされるデバイスの名前の長さが 20 字を越えると
11709 (たとえば、ネットワーク・マウントの場合にそういうことがありそうだ)、
11710 各項目の列がずれることになる。
11711
11712 @item
11713 ヘッダ行の項目名が、POSIX に準拠したものになる。
11714
11715 @item
11716 デフォルトのブロックサイズや出力の書式が、環境変数
11717 @env{DF_BLOCK_SIZE}, @env{BLOCK_SIZE}, @env{BLOCKSIZE} の影響を受けなくなる。
11718 とは言え、デフォルトのブロックサイズについては、
11719 @env{POSIXLY_CORRECT} の影響だけは、やはり受ける。すなわち、
11720 @env{POSIXLY_CORRECT} が設定されていれば、ブロックサイズは
11721 512 バイトであり、さもなければ 1024 バイトである。 @xref{Block size}.
11722 @end enumerate
11723
11724 @optSi
11725
11726 @item --sync
11727 @opindex --sync
11728 @cindex file system space, retrieving current data more slowly
11729 使用量に関するデータを取得する前に `sync' システムコールを実行する。
11730 システムによっては (特に SunOS では)、そうすることでより最近の結果が得られるが、
11731 一般的に言って、このオプションを使用すると、@command{df} の実行速度がかなり低下する。
11732 ファイルシステムをたくさんマウントしている場合や、
11733 作業が頻繁に行われているファイルシステムでは、とりわけ遅くなる。
11734
11735 @item --total
11736 @opindex --total
11737 @cindex grand total of disk size, usage and available space
11738 すべての引数を処理した後で、全引数についての総計を表示する。
11739 このオプションを使用すれば、ディスクの容量、使用した量、使用可能な量について、
11740 リストされているすべてのデバイスを合わせた合計を知ることができる。
11741 引数が一つも指定されていない場合は、@command{df}
11742 は使用可能な容量の合計に無関係なファイルシステムを除外しようとして、できるだけのことをする。
11743 重複するリモート・ファイルシステムを計算に入れないといったことをするのである。
11744
11745 総計の行において @command{df} は @var{source} の列に @samp{"total"} と表示し、
11746 @var{target} の列に @samp{"-"} という文字を表示する (訳注: @var{source},
11747 @var{target} などの列については、@option{--output} の説明を参照していただきたい)。
11748 @var{source} の列が存在しない場合は、@var{target} の列が存在すれば、
11749 @command{df} は @var{target} の列に @samp{"total"} と表示する。
11750
11751 @item -t @var{fstype}
11752 @itemx --type=@var{fstype}
11753 @opindex -t
11754 @opindex --type
11755 @cindex file system types, limiting output to certain
11756 一覧表示するファイルシステムを @var{fstype} というタイプに限定する。
11757 @option{-t} オプションを複数回使うことによって、複数のタイプのファイルシステムを指定することができる。
11758 デフォルトでは、いかなるタイプのファイルシステムも除外しない。
11759
11760 @item -T
11761 @itemx --print-type
11762 @opindex -T
11763 @opindex --print-type
11764 @cindex file system types, printing
11765 各ファイルシステムのタイプを表示する。このとき表示されるタイプは、
11766 @option{-t} や @option{-x} オプションを使って、一覧表示に含めたり、
11767 一覧表示から除外したりできるタイプと同じものである。
11768 すなわち、表示されるタイプは何であれ、システムによってサポートされているということだ。
11769 以下に、よく見受けられるタイプの名前をいくつか挙げておく
11770 (当然ながら、ここに挙げるものがすべてではない)。
11771
11772 @table @samp
11773
11774 @item nfs
11775 @cindex NFS file system type
11776 NFS ファイルシステム。すなわち、ネットワーク越しにほかのマシンからマウントしているファイルシステム。
11777 このタイプ名は、あらゆるシステムで共通して使われているようである。
11778
11779 @item ext2@r{, }ext3@r{, }ext4@r{, }xfs@r{, }btrfs@dots{}
11780 @cindex Linux file system types
11781 @cindex local file system types
11782 @opindex ext2 @r{file system type}
11783 @opindex ext3 @r{file system type}
11784 @opindex ext4 @r{file system type}
11785 @opindex xfs @r{file system type}
11786 @opindex btrfs @r{file system type}
11787 ローカルでマウントしているハードディスクのファイルシステム。
11788 (ローカルのマウントでは、システムが複数のタイプをサポートしていることもある。
11789 たとえば、Linux がそうだ。)
11790
11791 @item iso9660@r{, }cdfs
11792 @cindex CD-ROM file system type
11793 @cindex DVD file system type
11794 @cindex ISO9660 file system type
11795 @opindex iso9660 @r{file system type}
11796 @opindex cdfs @r{file system type}
11797 CD や DVD ドライブのファイルシステム。HP-UX は @samp{cdfs} を使用し、
11798 ほかのシステムのほとんどは @samp{iso9660} を使用している。
11799
11800 @item ntfs@r{,}fat
11801 @cindex NTFS file system
11802 @cindex DOS file system
11803 @cindex MS-DOS file system
11804 @cindex MS-Windows file system
11805 @opindex ntfs @r{file system file}
11806 @opindex fat @r{file system file}
11807 MS-Windows や MS-DOS で使用されるファイルシステム。
11808
11809 @end table
11810
11811 @item -x @var{fstype}
11812 @itemx --exclude-type=@var{fstype}
11813 @opindex -x
11814 @opindex --exclude-type
11815 一覧表示するファイルシステムを @var{fstype} というタイプ以外のものに限定する。
11816 @option{-x} オプションを複数回使うことによって、複数のタイプのファイルシステムを除外することができる。
11817 デフォルトでは、いかなるタイプのファイルシステムも除外しない。
11818
11819 @item -v
11820 無視される。System V 版の @command{df} との互換のためにある。
11821
11822 @end table
11823
11824 @command{df} がインストールされるのは、利用可能なマウントテーブルを持つシステムだけである。
11825 従って、移植を考慮したスクリプトは、その存在を当てにしない方がよい。
11826
11827 @exitstatus 実行に失敗しても、全く何も出力されないこともある。
11828 そういうときに、たとえば、ディレクトリ @var{dir} が @samp{ext3} や
11829 @samp{reiserfs} というタイプのファイルシステム上にあるかどうかを調べるには、
11830 @samp{df -t ext3 -t reiserfs @var{dir}} といったコマンドを実行して、
11831 終了ステータスを検査すればよい。
11832
11833 ファイルシステムのタイプを判断するには、ファイルシステムのリスト
11834 (@var{mtab}) が必要になる。従って、実行の失敗には、
11835 ファイルシステムのリストを読み込むことができないときに、ファイル名を示す引数とともに
11836 @option{-a}, @option{-l}, @option{-t}, @option{-x}
11837 といったオプションが一つ以上使われた場合が含まれる。
11838
11839
11840 @node du invocation
11841 @section @command{du}: ファイルのディスク使用量を概算する
11842
11843 @pindex du
11844 @cindex file space usage
11845 @cindex disk usage for files
11846
11847 @command{du} は、指定した一連のファイルのディスク使用量を報告する。
11848 引数がディレクトリの場合は、サブディレクトリごとのディスク使用量も報告する。
11849
11850 書式:
11851
11852 @example
11853 du [@var{option}]@dots{} [@var{file}]@dots{}
11854 @end example
11855
11856 引数を指定しないと、@command{du} は、カレントディレクトリのディスク使用量を報告する。
11857 通常、ディスク使用量は 1024 バイトを 1 単位として表示するが、
11858 この動作は変更することができる (@pxref{Block size})。
11859 なお、小数点以下は、切り上げて整数にする。
11860
11861 2 個以上のハードリンクが同一のファイルを指している場合は、そのうちの
11862 1 個のみが計算の対象になる。引数 @var{file} の順番によって、どのリンクが計算の対象になるかが変わってくるので、
11863 引数の順番を変更すると、@command{du} が出力する数値や項目が変化するかもしれない。
11864
11865 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
11866
11867 @table @samp
11868
11869 @optNull
11870
11871 @item -a
11872 @itemx --all
11873 @opindex -a
11874 @opindex --all
11875 ディレクトリだけでなく、すべてのファイルについて使用量を表示する。
11876
11877 @item --apparent-size
11878 @opindex --apparent-size
11879 ディスクの使用量ではなく、見かけのサイズを表示する。
11880 ファイルの見かけのサイズとは、通常ファイルに対して @code{wc -c}、
11881 あるいは、もっと普通に @code{ls -l --block-size=1} や @code{stat --format=%s}
11882 を実行したときに返されるバイト数である。
11883 たとえば、@samp{zoo} という単語を改行を付けずに書き込んだファイルなら、
11884 当然ながら、見かけのサイズは 3 になる。
11885 だが、そうした小さなファイルも、そのファイルが存在するファイルシステムのタイプと設定次第で、
11886 0 から 16 KiB、あるいは、それ以上のディスクスペースを占有するかもしれないのだ。
11887 もっとも、穴空きファイル (sparse file) の場合は事情が別である。たとえば、
11888
11889 @example
11890 dd bs=1 seek=2GiB if=/dev/null of=big
11891 @end example
11892
11893 @noindent
11894 上記のコマンドで作成した穴空きファイルは、見かけのサイズこそ 2 GiB
11895 だが、最近のほとんどのシステムでは、実際に使用するディスクスペースは、
11896 ほとんど 0 である。
11897
11898 @item -B @var{size}
11899 @itemx --block-size=@var{size}
11900 @opindex -B
11901 @opindex --block-size
11902 @cindex file sizes
11903 @var{size} によって単位の大きさを変更してから、サイズを表示する (@pxref{Block size})。
11904 たとえば、@option{-BG} と指定すれば、1,073,741,824 バイトを 1 単位として、サイズを表示する。
11905
11906 @item -b
11907 @itemx --bytes
11908 @opindex -b
11909 @opindex --bytes
11910 @code{--apparent-size --block-size=1} と同じ。
11911
11912 @item -c
11913 @itemx --total
11914 @opindex -c
11915 @opindex --total
11916 @cindex grand total of disk space
11917 すべての引数を処理した後で、全引数からなる総計を表示する。
11918 このオプションを使用すれば、指定したファイルやディレクトリについてディスク使用量の合計を知ることができる。
11919
11920 @item -D
11921 @itemx --dereference-args
11922 @opindex -D
11923 @opindex --dereference-args
11924 コマンドラインで引数に指定されたシンボリックリンクの参照を行う。
11925 コマンドライン引数以外のシンボリックリンクには影響がない。
11926 このオプションは、@file{/usr/tmp} のような、
11927 シンボリックリンクであることが多いディレクトリのディスク使用量を調べるときに、重宝である。
11928
11929 @item -d @var{depth}
11930 @itemx --max-depth=@var{depth}
11931 @opindex -d @var{depth}
11932 @opindex --max-depth=@var{depth}
11933 @cindex limiting output of @command{du}
11934 ディレクトリ階層の基点 (訳注: 要するに、コマンドラインで指定されたディレクトリ)
11935 から最大 @var{DEPTH} 段階下がったところまでにある各ディレクトリについて、
11936 ディスク使用量の合計を表示する (@option{--all}
11937 オプションが付いているときは、ファイルについても表示する)。
11938 基点自体は段階 0 なので、@code{du --max-depth=0} は @code{du -s}
11939 と同じことになる。
11940
11941 @c --files0-from=FILE
11942 @filesZeroFromOption{du,, @ @option{--total} (@option{-c}) オプションを使用した結果}
11943
11944 @item -H
11945 @opindex -H
11946 @option{--dereference-args} (@option{-D}) と同じである。
11947
11948 @optHumanReadable
11949
11950 @item --inodes
11951 @opindex --inodes
11952 @cindex inode usage, dereferencing in @command{du}
11953 ブロックの使用状態ではなく、inode の使用状態をリストする。
11954 このオプションが役に立つのは、多くのファイルを収納しているために、
11955 ファイルシステムの inode スペースを大量に消費しているディレクトリを探すときである
11956 (@command{df} の @option{--inodes} オプションも参照すること)。
11957 このオプションは、@option{-a}, @option{-c}, @option{-h}, @option{-l},
11958 @option{-s}, @option{-S}, @option{-t}, @option{-x}
11959 といったオプションと組み合わせて使ってもよい。
11960 しかし、ブロックサイズ関係の他のオプション、たとえば、@option{-b}, @option{-m},
11961 @option{--apparent-size} などを渡しても、無視される。
11962
11963 @item -k
11964 @opindex -k
11965 @cindex kibibytes for file sizes
11966 デフォルトのブロックサイズがどうなっていようと、1 ブロック 1024
11967 バイトでサイズを表示する (@pxref{Block size})。このオプションは
11968 @option{--block-size=1K} に等しい。
11969
11970 @item -L
11971 @itemx --dereference
11972 @opindex -L
11973 @opindex --dereference
11974 @cindex symbolic links, dereferencing in @command{du}
11975 シンボリックリンクの参照を行う (リンク自体のディスク使用量ではなく、
11976 リンクが指しているファイルやディレクトリの使用量を表示する)。
11977
11978 @item -l
11979 @itemx --count-links
11980 @opindex -l
11981 @opindex --count-links
11982 @cindex hard links, counting in @command{du}
11983 すべてのファイルを計算に入れる。
11984 すなわち、(ハードリンクとして) 前に現れたことがあっても、計算に入れる。
11985
11986 @item -m
11987 @opindex -m
11988 @cindex mebibytes for file sizes
11989 デフォルトのブロックサイズを変更し、1 ブロック 1,048,576
11990 バイトのブロック数でサイズを表示する (@pxref{Block size})。
11991 このオプションは、@option{--block-size=1M} と同じである。
11992
11993 @item -P
11994 @itemx --no-dereference
11995 @opindex -P
11996 @opindex --no-dereference
11997 @cindex symbolic links, dereferencing in @command{du}
11998 @command{du} が出会った各シンボリックリンクについて、シンボリック自体の使用ディスクスペースを計算する。
11999
12000 @item -S
12001 @itemx --separate-dirs
12002 @opindex -S
12003 @opindex --separate-dirs
12004 通常、(@option{--summarize} オプションを使用しない場合の)
12005 @command{du} の出力において、@var{d} というディレクトリ名の隣に表示されるサイズは、
12006 @var{d} 以下にあるすべてのエントリのサイズの合計に、
12007 @var{d} 自体のサイズを加えたものである。それに対して、@option{--separate-dirs}
12008 オプションを指定すると、@var{d} というディレクトリ名に対して報告されるサイズは、
12009 いかなるサブディレクトリのサイズも含まないものになる。
12010
12011 @optSi
12012
12013 @item -s
12014 @itemx --summarize
12015 @opindex -s
12016 @opindex --summarize
12017 各引数についてその合計ディスク使用量のみを表示する (訳注: すなわち、
12018 引数がディレクトリの場合、そのサブディレクトリごとの情報まで表示しない)。
12019
12020 @item -t @var{size}
12021 @itemx --threshold=@var{size}
12022 @opindex -t
12023 @opindex --threshold
12024 指定された @var{size} を目安にして、表示する対象を取捨する。@var{size} は、
12025 通常モードではディスク使用量を指し (@pxref{Block size})、@option{--inodes}
12026 オプションと組み合わせた場合は inode 使用数を指す。
12027 (訳注: ディスク使用量の目安として使う場合、@var{size} の単位は、デフォルトではバイトである。
12028 もちろん、K, M, G などの接尾辞を付けることもできる。)
12029
12030 @var{size} が正の数ならば、@command{du} はサイズがそれ以上である対象のみを表示する。
12031
12032 @var{size} が負の数ならば、@command{du} はサイズがそれ以下である対象のみを表示する。
12033
12034 GNU の @command{find} を使えば、特定のサイズのファイルを見つけることができる。
12035 それに対して、@command{du} の @option{--threshold} を使うと、
12036 ディレクトリも指定サイズに基づいて篩い分けることができるのである。
12037
12038 @option{--threshold} オプションは、@option{--apparent-size}
12039 オプションと組み合わせることができるのに留意していただきたい。
12040 その場合は、見かけのサイズに基づいて表示対象を絞り込むことになる。
12041
12042 @option{--threshold} オプションは、@option{--inodes} オプションと組み合わせることもできる。
12043 その場合は、inode 数に基づいて表示対象を絞り込むことになる。
12044
12045 200 メガバイト以上のサイズを持つディレクトリを捜すには、
12046 @option{--threshold} オプションを次のように使えばよいだろう。
12047
12048 @example
12049 du --threshold=200MB
12050 @end example
12051
12052 見かけのサイズが 500 バイト以下のディレクトリやファイルを捜すには
12053 (@option{-a} を使っていることに注意)、@option{--threshold} を次のように使えばよい。
12054
12055 @example
12056 du -a -t -500 --apparent-size
12057 @end example
12058
12059 ルートファイルシステム上にあるディレクトリで、20000 以上の inode
12060 を使用しているものを、/ 以下のディレクトリ階層で捜すには、
12061 @option{--threshold} を次のように使えばよい。
12062
12063 @example
12064 du --inodes -x --threshold=20000 /
12065 @end example
12066
12067
12068 @item --time
12069 @opindex --time
12070 @cindex last modified dates, displaying in @command{du}
12071 ディレクトリやそのサブディレクトリに存在するファイルについて表示する際に、
12072 その最終更新日時 (modification time) も表示する。
12073
12074 (訳注: 一つ留意していただきたいことがある。ディレクトリのタイムスタンプについては、
12075 そのディレクトリ以下にあるファイルのうち (そのディレクトリ直下のファイルとはかぎらない)、
12076 最終更新日時がもっとも新しいファイルのタイムスタンプと同一のものが表示される。
12077 すなわち、ディレクトリのタイムスタンプは、@samp{ls -l} で表示されるものとは違うことがあるわけだ。
12078 このオプションや、そのバリエーションである次の二つのオプションは、
12079 あるディレクトリ以下を最後に使用したのはいつかを知るのに便利である。)
12080
12081 @item --time=ctime
12082 @itemx --time=status
12083 @itemx --time=use
12084 @opindex --time
12085 @opindex ctime@r{, show the most recent}
12086 @opindex status time@r{, show the most recent}
12087 @opindex use time@r{, show the most recent}
12088 ディレクトリ以下にあるファイルについて表示する際に、最終更新日時ではなく、
12089 最終ステータス変更日時 (inode 中の @samp{ctime}) を表示する。
12090
12091 (訳注: 原文でもこの三つのオプションを等価なものとして並べているが、
12092 訳者としては、@option{--time=use} と等価なのは、@option{--time=ctime} ではなく、
12093 @option{--time=atime} ではないかと思う。ご自分で確かめていただきたい。)
12094
12095 @item --time=atime
12096 @itemx --time=access
12097 @opindex --time
12098 @opindex atime@r{, show the most recent}
12099 @opindex access time@r{, show the most recent}
12100 ディレクトリ以下にあるファイルについて表示する際に、最終更新日時ではなく、
12101 最終アクセス日時 (inode 中の @samp{atime}) を表示する。
12102
12103 @item --time-style=@var{style}
12104 @opindex --time-style
12105 @cindex time style
12106 タイムスタンプを @var{style} 形式で表示する。このオプションは、@option{--time}
12107 オプションと併せて指定したときにのみ効果がある。@var{style} は以下の一つでなければならない。
12108
12109 @table @samp
12110 @item +@var{format}
12111 @vindex LC_TIME
12112 @var{format} を使って、タイムスタンプを表示する。その場合、@var{format}
12113 は、@command{date} コマンドの書式引数と同じように解釈される (@pxref{date invocation})。
12114 たとえば、@option{--time-style="+%Y-%m-%d %H:%M:%S"} と指定すると、
12115 @command{du} の表示するタイムスタンプは、
12116 @samp{2002-03-30 23:45:56} のようになる。@command{date} の場合と同様、
12117 @var{format} の解釈は、@env{LC_TIME} ロケール・カテゴリの影響を受ける。
12118
12119 @item full-iso
12120 タイムスタンプを省略なしで表示する。
12121 すなわち、ISO 8601 の日付、時刻、タイムゾーンという構成要素を
12122 nanosecond (10 億分の 1 秒) の精度で使用するわけだ。
12123 一例を挙げると、@samp{2002-03-30 23:45:56.477817180 -0700}
12124 といった表示になる。この形式は、@samp{+%Y-%m-%d %H:%M:%S.%N %z} と同じである。
12125
12126 @item long-iso
12127 ISO 8601 の日付と時刻の構成要素を分の単位まで表示する。たとえば、
12128 @samp{2002-03-30 23:45}。このタイムスタンプは、@samp{full-iso} タイム
12129 スタンプより短く、日常作業にはたいてい十分である。この形式は
12130 @samp{+%Y-%m-%d %H:%M} と同じである。
12131
12132 @item iso
12133 タイムスタンプに ISO 8601 書式の日付を表示する。たとえば、
12134 @samp{2002-03-30} といった具合である。この形式は、@samp{+%Y-%m-%d} と同じである。
12135 @end table
12136
12137 @vindex TIME_STYLE
12138 @option{--time-style} オプションのデフォルト値は、
12139 環境変数 @env{TIME_STYLE} を使って指定することができる。
12140 @env{TIME_STYLE} が設定されていない場合、デフォルトの形式は @samp{long-iso} である。
12141 @command{ls} と共通の @env{TIME_STYLE} を使えるようにするため、
12142 @samp{+} で始まる @env{TIME_STYLE} の値が、改行を含んでいる場合は、
12143 改行以後の文字は無視されることになる。
12144 また、@env{TIME_STYLE} の値が @samp{posix-} で始まる場合、@samp{posix-} は無視される。
12145 さらに、@env{TIME_STYLE} の値が @samp{locale} の場合、@env{TIME_STYLE} は無視される。
12146
12147 @item -X @var{file}
12148 @itemx --exclude-from=@var{file}
12149 @opindex -X @var{file}
12150 @opindex --exclude-from=@var{file}
12151 @cindex excluding files from @command{du}
12152 @option{--exclude} に似ているが、除外するパターンを @var{file} から 1 行につき
12153 1 パターン読み込む点が違う。@var{file} が @samp{-} なら、パターンを標準入力から読み込む。
12154
12155 @item --exclude=@var{pattern}
12156 @opindex --exclude=@var{pattern}
12157 @cindex excluding files from @command{du}
12158 再帰的な処理を行っているとき、@var{pattern} にマッチするサブディレクトリやファイルをスキップする。
12159 たとえば、@code{du --exclude='*.o'} と指定すると、名前が @samp{.o}
12160 で終わるファイルを除外することになる。
12161
12162 @item -x
12163 @itemx --one-file-system
12164 @opindex -x
12165 @opindex --one-file-system
12166 @cindex one file system, restricting @command{du} to
12167 処理される引数が存在するファイルシステムとは別のファイルシステムにあるディレクトリをスキップする。
12168
12169 @end table
12170
12171 @cindex NFS mounts from BSD to HP-UX
12172 BSD システムでは、HP-UX システムから NFS マウントしているファイルについて、
12173 @command{du} は正確な値の半分のサイズを報告する。逆に、HP-UX システムでは、
12174 BSD システムから NFS マウントしているファイルについて、@command{du}
12175 は正確な値の 2 倍のサイズを報告する。これは HP-UX にある欠陥のせいであり、
12176 HP-UX の @command{du} プログラムも、そのとばっちりを受けているのである。
12177
12178 @exitstatus
12179
12180
12181 @node stat invocation
12182 @section @command{stat}: ファイルやファイルシステムの状態を報告する
12183
12184 @pindex stat
12185 @cindex file status
12186 @cindex file system status
12187
12188 @command{stat} は指定されたファイルに関する情報を表示する。
12189
12190 書式:
12191
12192 @example
12193 stat [@var{option}]@dots{} [@var{file}]@dots{}
12194 @end example
12195
12196 オプションなしで実行すると、@command{stat}
12197 は指定されたファイルについてすべての情報を報告する。また、@command{stat}
12198 を使って、指定されたファイルが存在しているファイルシステムの情報を報告させることもできる。
12199 ファイルがリンクの場合は、リンクが指しているファイルについて情報を提供させることも可能だ。
12200
12201 @mayConflictWithShellBuiltIn{stat}
12202
12203 @table @samp
12204
12205 @item -L
12206 @itemx --dereference
12207 @opindex -L
12208 @opindex --dereference
12209 @cindex symbolic links, dereferencing in @command{stat}
12210 @command{stat} がシンボリックリンクを処理する方法を変更する。
12211 このオプションを付けると、@command{stat} は、引数中の各シンボリックリンクが参照しているファイルを操作の対象にする。
12212 このオプションがないと、@command{stat} が対象にするのは、引数のシンボリックリンクそのものになる。
12213
12214 @item -f
12215 @itemx --file-system
12216 @opindex -f
12217 @opindex --file-system
12218 @cindex file systems
12219 指定されたファイルそのものについての情報ではなく、
12220 そのファイルが存在しているファイルシステムについての情報を報告する。
12221 このオプションを指定すると、自動的に @option{-L} オプションも指定される。
12222
12223 @item -c
12224 @itemx --format=@var{format}
12225 @opindex -c
12226 @opindex --format=@var{format}
12227 @cindex output format
12228 デフォルトの書式の代わりに、@var{format} を使用する。
12229 @var{format} の末尾には自動的に改行が付けられるので、
12230 下記のようなコマンドを 2 個以上の @var{file} オペランドに対して実行すると、
12231 各オペランドあたり 1 行の出力を生じることになる。
12232 @example
12233 $ stat --format=%d:%i / /usr
12234 2050:2
12235 2057:2
12236 @end example
12237
12238 @item --printf=@var{format}
12239 @opindex --printf=@var{format}
12240 @cindex output format
12241 デフォルトの書式の代わりに、@var{format} を使用する。@option{--format}
12242 に似ているが、バックスラッシュ・エスケープを解釈して変換する。
12243 また、行末に自動的に改行を付けることもしない。そこで、改行がしたければ、
12244 @var{format} 中で @samp{\n} を指定する必要がある。
12245 @option{--printf} を使って @file{/} と @file{/usr} のデバイス番号と
12246 inode 番号を表示するには、こんなふうにする。
12247 @example
12248 $ stat --printf='%d:%i\n' / /usr
12249 2050:2
12250 2057:2
12251 @end example
12252
12253 @item -t
12254 @itemx --terse
12255 @opindex -t
12256 @opindex --terse
12257 @cindex terse output
12258 情報を簡潔な形式で表示する。他のプログラムで解析するときに都合がよい。
12259
12260 下記の二つのコマンドの出力は全く同じである。また、下記の @option{--format}
12261 は、デフォルトの出力書式が (もっと詳細な形で) 表示する項目とほぼ同じものを指定している。
12262 もっとも、SELinux セキュリティ・コンテキストが有効になっている場合には、
12263 このフォーマット文字列の末尾に、もう一つ @samp{%C} を付け加えることになるだろうが。
12264 @example
12265 $ stat --format="%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %W %o" ...
12266 $ stat --terse ...
12267 @end example
12268
12269 @option{--file-system} モードのときの簡潔形式の出力を上と同じように説明的に表現すると、
12270 @example
12271 $ stat -f --format="%n %i %l %t %s %S %b %f %a %c %d" ...
12272 $ stat -f --terse ...
12273 @end example
12274 @end table
12275
12276 @option{--format} や @option{--printf} の @var{format} 中で、
12277 ファイルに対して使用できる書式指定子には以下のものがある。
12278
12279 @itemize @bullet
12280 @item %a - 8 進数で表現したアクセス権 (printf のフラグ @samp{#} と @samp{0} に留意)
12281 @item %A - 人間にわかりやすい形式で表現したアクセス権
12282 @item %b - 割り当てられているブロック数 (@samp{%B} を参照)
12283 @item %B - @samp{%b} の報告で使われる 1 ブロックのバイト数
12284 @item %C - ファイルの SELinux セキュリティ・コンテキスト (取得できる場合)
12285 @item %d - 10 進数で表現したデバイス番号
12286 @item %D - 16 進数で表現したデバイス番号
12287 @item %f - 16 進数で表現した Raw モード
12288 @item %F - ファイルの種類
12289 @item %g - 所有グループの ID 番号
12290 @item %G - 所有グループ名
12291 @item %h - ハードリンク数
12292 @item %i - Inode 番号
12293 @item %m - マウントポイント (下記の説明を参照)
12294 @item %n - ファイル名
12295 @item %N - 引用符で囲んだファイル名。シンボリックリンクなら、参照先も表示 (下記参照)
12296 @item %o - I/O 転送サイズの最適値の提案
12297 @item %s - ファイル全体の大きさ。サイズはバイト数
12298 @item %t - 16 進数で表現したメジャー・デバイス番号 (下記参照)
12299 @item %T - 16 進数で表現したマイナー・デバイス番号 (下記参照)
12300 @item %u - 所有者のユーザ ID 番号
12301 @item %U - 所有者のユーザ名
12302 @item %w - ファイルの作成日時 (the birth time)。不明の場合は @samp{-} を表示
12303 @item %W - Unix 紀元からの秒数で表したファイルの作成日時、または @samp{0}
12304 @item %x - 最終アクセス日時 (atime)
12305 @item %X - Unix 紀元からの秒数で表した最終アクセス日時
12306 @item %y - 最終データ更新日時 (mtime)
12307 @item %Y - Unix 紀元からの秒数で表した最終データ更新日時
12308 @item %z - 最終ステータス変更日時 (ctime)
12309 @item %Z - Unix 紀元からの秒数で表した最終ステータス変更日時
12310 @end itemize
12311
12312 @samp{%a} という書式はファイルのモードを 8 進数で表示するので、
12313 printf の @samp{#} と @samp{0} フラグを使って、出力の先頭のゼロ埋めをコントロールするとよい。
12314 たとえば、先頭を 0 で埋めて、表示を少なくとも 3 桁にし、それより大きい数値も、
12315 8 進数であることをはっきりさせるには、@samp{%#03a} を使えばよい。
12316
12317 @samp{%N} の書式は、環境変数 @env{QUOTING_STYLE} によって設定することができる。
12318 その環境変数が設定されていない場合、デフォルトの値は、@samp{shell-escape}
12319 である。使用できるクォーティングスタイルには、以下のものがある。
12320 @quotingStyles
12321
12322 @samp{%t} や @samp{%T} という書式指定子は、stat(2) 構造体の st_rdev メンバ
12323 に対応するものであり、従って、キャラクタ・スペシャルファイルや
12324 ブロック・スペシャルファイルに対してしか動作が定義されていない。
12325 システムやファイルタイプによっては、st_rdev が他のものを表現する
12326 ために使われていることもありえる。
12327
12328 @samp{%W}, @samp{%X}, @samp{%Y}, @samp{%Z} では、ピリオドに続けて精度を書くことで、
12329 小数点以下何桁まで表示するかを指定することができる。たとえば、@samp{%.3X}
12330 と指定すると、最終アクセス日時がミリ秒の精度で出力される。ピリオド
12331 だけ指定して、精度を省略すると、@command{stat} は 9 桁を使用する。従って、
12332 @samp{%.X} は @samp{%.9X} と同じことになるわけだ。なお、余分な精度を捨てる際、
12333 タイムスタンプは負の無限大方向に切り下げられる (訳注: 平たく言うと、
12334 タイムスタンプのような正の数値の場合、指定された桁数より下の部分は切り捨てられるということ。
12335 以下の例を参照)。
12336
12337 @example
12338 0 で埋める:
12339   $ stat -c '[%015Y]' /usr
12340   [000001288929712]
12341 スペースで位置を揃える:
12342   $ stat -c '[%15Y]' /usr
12343   [     1288929712]
12344   $ stat -c '[%-15Y]' /usr
12345   [1288929712     ]
12346 精度指定:
12347   $ stat -c '[%.3Y]' /usr
12348   [1288929712.114]
12349   $ stat -c '[%.Y]' /usr
12350   [1288929712.114951834]
12351 @end example
12352
12353 @samp{%m} によって表示されるマウントポイントは、@command{df}
12354 によるマウントポイントの出力とほぼ同じである。ただし、以下の点で異なっている。
12355 @itemize @bullet
12356 @item
12357 stat はデフォルトでは、シムリンクの参照を行わない
12358 (そのためには、@option{-L} を指定する必要がある)。
12359 @item
12360 引数としてデバイスノードが指定された場合、
12361 stat はファイルシステムのリスト中にそのノードを捜し求めたりはせず、
12362 デバイスノードそのものを動作の対象にする
12363 (訳注: すなわち、そのデバイス上に存在するファイルシステムのマウントポイントではなく、
12364 デバイスノードそのもののマウントポイントを表示する)。
12365 @item
12366 @cindex bind mount
12367 bind マウントされているファイルについては、
12368 stat はそのファイルが載っているデバイスの最初のマウントポイントではなく、
12369 bind マウントで指定された別名 (訳注: 原文は alias。@samp{mount --bind olddir newdir}
12370 における newdir のことか) の方を出力する。出力に変化がなくなるまで、
12371 再帰的に stat を呼び出せば、現在ベースになっているマウントポイントを知ることができる。
12372
12373 (訳注: 訳者には意味不明。「現在ベースになっているマウントポイント
12374 (the current base mount point)」が、上記訳注の newdir のことなら、
12375 stat を再帰的に呼び出すまでもない。@samp{stat -c "%m" newdir/@var{FILE}} は、
12376 newdir を表示する。また the current base mount point が「根底にある
12377 (すなわち、デバイスを最初にマウントした) マウントポイント」のことなら、
12378 stat を再帰的に呼び出しても、それを突き止めることはできない。
12379 ひょっとすると、書式指定子に @samp{%m} が追加された coreutils-8.6 から
12380 coreutils-8.20 あたりまでの stat を
12381 linux-2.6 時代の古いカーネルと組み合わせて使ったときの動作を言っているのかもしれない。
12382 その場合は、@samp{stat -c "%m" newdir/@var{FILE}} は上記の olddir を出力するようだ。
12383 従って、そうした組み合わせでは、stat を再帰的に実行することで、
12384 最初にデバイスをマウントしたときのマウントポイントを知ることができる。)
12385 @end itemize
12386
12387 ファイルシステムの情報をリストする際には (すなわち、@option{--file-system}
12388 (@option{-f}) 使用時には)、書式指定子の別の一群を使わなければならない。
12389
12390 @itemize @bullet
12391 @item %a - スーパーユーザ以外にも利用できる未使用ブロック数
12392 @item %b - ファイルシステムの総データブロック数。
12393 @item %c - ファイルシステムの総 inode 数
12394 @item %d - ファイルシステムの未使用 inode 数
12395 @item %f - ファイルシステムの未使用ブロック数
12396 @item %i - 16 進数で表現したファイルシステム ID
12397 @item %l - ファイル名の最大長
12398 @item %n - ファイル名
12399 @item %s - ブロックサイズ (高速転送用)
12400 @item %S - 基本ブロックサイズ (ブロック計算用)
12401 @item %t - 16 進数で表現したファイルシステムのタイプ
12402 @item %T - 人間にわかりやすい形式で表現したファイルシステムのタイプ
12403 @end itemize
12404
12405 @vindex TZ
12406 タイムスタンプは、タイムゾーンのルールに従って表示されるが、
12407 そのルールを指定しているのは、環境変数 @env{TZ} である。
12408 @env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
12409 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
12410 The GNU C Library Reference Manual}.
12411
12412 @exitstatus
12413
12414
12415 @node sync invocation
12416 @section @command{sync}: キャッシュされた書き込みを永続的な記憶装置に同期する
12417
12418 @pindex sync
12419 @cindex synchronize disk and memory
12420 @cindex Synchronize cached writes to persistent storage
12421
12422 @command{sync} は、メモリ中のファイルやファイルシステムを永続的な記憶装置に同期する。
12423
12424 書式:
12425
12426 @example
12427 sync [@var{option}] [@var{file}]@dots{}
12428 @end example
12429
12430 @cindex superblock, writing
12431 @cindex inodes, written buffered
12432 @command{sync} は、メモリ中にバッファされているデータがあれば、それをディスクに書き出す。
12433 そうした書き出しには、スーパーブロックの変更、inode の変更、遅延読み書きを含むことができる (が、それだけに止まらない)。
12434 この機能はカーネルによって実装されていなければならない。@command{sync}
12435 プログラムは、システムコールの @code{sync}, @code{syncfs}, @code{fsync},
12436 @code{fdatasync} を実行する以外、何もしないのである。
12437
12438 @cindex crashes and corruption
12439 カーネルは、(比較的遅い) ディスクの読み書きをできるだけしないで済ますために、
12440 メモリにデータを保持している。このことによって、動作速度が向上するが、
12441 コンピュータがクラッシュした場合、データが失われたり、
12442 ファイルシステムが壊れたりという結果が生じかねない。@command{sync} コマンドは、
12443 カーネルに命じて、メモリ上にあるデータを永続的な記憶装置に書き出させるのである。
12444
12445 引数を指定すると、デフォルトでは指定されたファイルのみが
12446 fsync(2) システムコールを使って同期されることになる。
12447
12448 1 個以上のファイルを指定した場合は、以下のオプションを使って同期方法を変更することができる。
12449 使用できるオプションについては、次の章も参照していただきたい。
12450 @ref{Common options}.
12451
12452 @table @samp
12453 @item -d
12454 @itemx --data
12455 @opindex --data
12456 fdatasync(2) を使用して、ファイルのデータと、ファイルシステムの整合性を維持するのに必要なメタデータのみを同期する。
12457
12458 @item -f
12459 @itemx --file-system
12460 @opindex --file-system
12461 指定したファイルが存在するファイルシステムに対して I/O 待ちになっているすべてのデータを
12462 syncfs(2) システムコールを使用して、同期する。
12463 注意していただきたいが、たとえば @samp{/dev/sda} といったデバイスノードを引数として渡すときは、
12464 このオプションを普通は指定しないはずである。
12465 そんなことをすると、@samp{/dev/sda} で参照されるファイルシステムではなく、
12466 デバイスノードが存在するファイルシステムの同期が行われてしまうからだ。
12467 また、システムによっては、個々のデバイスノードやファイルを引数として渡すのと、全く引数を使用しないのとでは、
12468 同期のあり方が違うかもしれないことにも気をつけていただきたい。
12469 すなわち、fsync(2) に渡される引数がある場合は、書き込みバリア (write barrier)
12470 が使われることによって、引数を指定しなかったときに使用されるグローバルな sync(2) よりも、
12471 より確実な保証をもたらすかもしれないのである。
12472 @end table
12473
12474 @exitstatus
12475
12476
12477 @node truncate invocation
12478 @section @command{truncate}: ファイルサイズの短縮・伸長を行う
12479
12480 @pindex truncate
12481 @cindex truncating, file sizes
12482
12483 @command{truncate} は、各 @var{file} のサイズを指定したサイズにまで短縮したり、引き伸ばしたりする。
12484
12485 書式:
12486
12487 @example
12488 truncate @var{option}@dots{} @var{file}@dots{}
12489 @end example
12490
12491 @cindex files, creating
12492 @var{file} が存在していないときは、作成する。
12493
12494 @cindex sparse files, creating
12495 @cindex holes, creating files with
12496 @var{file} が指定したサイズより大きい場合は、データのサイズを越える部分は失われる。
12497 @var{file} が指定したサイズより小さい場合は、ファイルは引き伸ばされ、
12498 引き伸ばされた部分は、ゼロバイト (ASCII NUL) の連続に見えるようになる
12499 (引き伸ばされた部分は、穴空きファイル (sparse file) の穴になる)。
12500
12501 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
12502
12503 @table @samp
12504
12505 @item -c
12506 @itemx --no-create
12507 @opindex -c
12508 @opindex --no-create
12509 ファイルが存在しない場合は、作成しない。
12510
12511 @item -o
12512 @itemx --io-blocks
12513 @opindex -o
12514 @opindex --io-blocks
12515 @var{size} をバイト数ではなく、@var{file} を構成する I/O ブロック数と見なす。
12516
12517 @item -r @var{rfile}
12518 @itemx --reference=@var{rfile}
12519 @opindex -r
12520 @opindex --reference
12521 @var{rfile} のサイズを基準に、各 @var{file} のサイズを揃える。
12522
12523 @item -s @var{size}
12524 @itemx --size=@var{size}
12525 @opindex -s
12526 @opindex --size
12527 各 @var{file} のサイズを @var{size} にする。@option{--io-blocks}
12528 が指定されていない場合、@var{size} はバイト数である。
12529 @multiplierSuffixesNoBlocks{size}
12530
12531 @var{size} の前に以下の記号の一つを置くと、現在のサイズを元にして、各 @var{file}
12532 のサイズを調節することができる。
12533 @example
12534 @samp{+}  => @var{size} だけ増やす
12535 @samp{-}  => @var{size} だけ減らす
12536 @samp{<}  => 最大でも @var{size} までにする
12537 @samp{>}  => 最小でも @var{size} はあるようにする
12538 @samp{/}  => @var{size} の倍数に切り下げる
12539 @samp{%}  => @var{size} の倍数に切り上げる
12540 @end example
12541
12542 @end table
12543
12544 @exitstatus
12545
12546
12547 @node Printing text
12548 @chapter テキストの表示
12549
12550 @cindex printing text, commands for
12551 @cindex commands for printing text
12552
12553 この章では、テキスト文字列を表示するコマンドについて説明する。
12554
12555 @menu
12556 * echo invocation::          テキストを 1 行表示する。
12557 * printf invocation::        データを整形して表示する。
12558 * yes invocation::           中断されるまで文字列を表示する。
12559 @end menu
12560
12561
12562 @node echo invocation
12563 @section @command{echo}: テキストを 1 行表示する
12564
12565 @pindex echo
12566 @cindex displaying text
12567 @cindex printing text
12568 @cindex text, displaying
12569 @cindex arbitrary text, displaying
12570
12571 @command{echo} は、指定された @var{string} を標準出力に書き出す。その際、各 @var{string}
12572 の間に 1 個のスペースを置き、行末に改行を付け加える。
12573
12574 書式:
12575
12576 @example
12577 echo [@var{option}]@dots{} [@var{string}]@dots{}
12578 @end example
12579
12580 @mayConflictWithShellBuiltIn{echo}
12581
12582 このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.
12583 オプションはオペランドの前に置かなければならない。
12584 また、通常は特別な引数として使われる @samp{--} は、特別な意味を持たず、
12585 他のいかなる @var{string} とも同じように扱われる。
12586
12587 @table @samp
12588 @item -n
12589 @opindex -n
12590 出力の末尾に改行を付けない。
12591
12592 @item -e
12593 @opindex -e
12594 @cindex backslash escapes
12595 各 "@var{string} の中に以下に挙げるバックスラッシュでエスケープした文字があると、
12596 それを解釈して変換する。
12597
12598 @table @samp
12599 @item \a
12600 警告 (ベル)
12601 @item \b
12602 バックスペース
12603 @item \c
12604 この位置より後を出力しない
12605 @item \e
12606 エスケープ
12607 @item \f
12608 フォームフィード (form feed)
12609 @item \n
12610 改行 (newline)
12611 @item \r
12612 復帰 (carriage return)
12613 @item \t
12614 水平タブ
12615 @item \v
12616 垂直タブ
12617 @item \\
12618 バックスラッシュ
12619 @item \0@var{nnn}
12620 8 進数 @var{nnn} (0 桁から 3 桁までの 8 進数) で表される
12621 8 ビットの値に対応する文字。@var{nnn} が 9 ビットの値だと、9 ビット目
12622 (最上位ビット) は無視される。
12623 @item \@var{nnn}
12624 8 進数 @var{nnn} (1 桁から 3 桁までの 8 進数) で表される
12625 8 ビットの値に対応する文字。@var{nnn} が 9 ビットの値だと、9 ビット目
12626 (最上位ビット) は無視される。
12627 @item \x@var{hh}
12628 16 進数 @var{hh} (1 または 2 桁の 16 進数) で表される 8 ビットの値に対応する文字。
12629 @end table
12630
12631 @item -E
12632 @opindex -E
12633 @cindex backslash escapes
12634 各 @var{string} の中にあるバックスラッシュ・エスケープの解釈をしない。
12635 これがデフォルトである。@option{-e} と @option{-E}
12636 の両方が指定されている場合は、後で指定した方が効果を持つ。
12637
12638 @end table
12639
12640 @vindex POSIXLY_CORRECT
12641 環境変数 @env{POSIXLY_CORRECT} が指定されている場合に、@command{echo}
12642 の最初の引数が (単独の) @option{-n} 以外だと、@command{echo}
12643 はそうした引数をオプションとして扱わずに、形がオプションに似た引数として出力する。
12644 たとえば、@code{echo -ne hello} は、単なる @samp{hello}
12645 ではなく、@samp{-ne hello} を出力する。
12646
12647 POSIX では、いかなるオプションのサポートも要求していない。また、
12648 POSIX では、@var{string} がバックスラッシュを含む場合や、最初の引数が @option{-n}
12649 の場合に、@command{echo} がどう振る舞うかは、実装側で決めることになっている。
12650 従って、他のシステムで使うことも考慮したプログラムで、行末の改行を省略したり、
12651 制御文字やバックスラッシュ・エスケープを出力したりする必要があるのならば、
12652 @command{echo} の代わりに @command{printf} コマンドを使用することを考えてもよい。
12653 @xref{printf invocation}.
12654
12655 @exitstatus
12656
12657
12658 @node printf invocation
12659 @section @command{printf}: データを整形して表示する
12660
12661 @pindex printf
12662 @command{printf} は、テキストを整形して表示する。
12663
12664 書式:
12665
12666 @example
12667 printf @var{format} [@var{argument}]@dots{}
12668 @end example
12669
12670 @command{printf} は、文字列 @var{format} を表示する。
12671 その際、C の @samp{printf} 関数とほとんど同じやり方で、@samp{%} 書式指定子と
12672 @samp{\} エスケープシーケンスを解釈して、数値や文字列の引数
12673 (上記書式の @var{argument}) を整形する。詳細については、次の項目を参照すること。
12674 @xref{Output Conversion Syntax,, @command{printf} format directives,
12675 libc, The GNU C Library Reference Manual}.
12676 C の関数との相違点については、以下の箇条書きのとおりである。
12677
12678 @mayConflictWithShellBuiltIn{printf}
12679
12680 @itemize @bullet
12681
12682 @item
12683 @var{format} 引数は、指定された @var{argument} のすべてを変換するのに必要なだけ、繰り返し使用される。
12684 たとえば、@samp{printf %s a b} というコマンドは、@samp{ab} を出力する。
12685
12686 @item
12687 @var{argument} の指定がない場合は、文脈が文字列と数値のどちらを期待しているかによって、
12688 空文字列、または 0 を指定したものと見なされる。
12689 たとえば、@samp{printf %sx%d} というコマンドは、@samp{x0} を表示する。
12690
12691 @item
12692 @kindex \c
12693 @samp{\c} というエスケープシーケンスが追加されている。@samp{\c} より後の部分を、
12694 @command{printf} は出力しない。たとえば、@samp{printf 'A%sC\cD%sF' B E}
12695 というコマンドは、@samp{ABC} を表示する。
12696
12697 @item
12698 16 進数エスケープシーケンス @samp{\x@var{hh}} は、最大でも 2 桁である。
12699 桁数に制限のない C と、その点が違う。たとえば、@samp{printf '\x07e'}
12700 というコマンドは、2 バイトを表示するが (訳注: \x07 (ベル) と e)、
12701 C の @samp{printf ("\x07e")} という文の方は、1 バイトしか表示しない。
12702
12703 @item
12704 @kindex %b
12705 追加された書式指定子 @samp{%b} は、対応する引数文字列中に
12706 @samp{\} エスケープシーケンスがある場合、それを @var{format}
12707 文字列中にあるときと同じように解釈・変換して、引数文字列を表示する。
12708 ただし、引数中の 8 進数エスケープシーケンスは @samp{\0@var{ooo}} の形を取る。
12709 @var{ooo} は 0 から 3 桁の 8 進数である。@samp{\@var{ooo}} が
12710 9 ビットの値ならば、9 ビット目 (訳注: すなわち最上位ビット) は無視される。
12711 @samp{%b} に精度も指定すると、変換した文字列の先頭から何バイトを表示するかが、それによって決まる。
12712
12713 @item
12714 @kindex %q
12715 追加された書式指定子 @samp{%q} は、対応する引数文字列を、
12716 たいていのシェルで入力として再利用できる形で表示する。
12717 非表示文字は POSIX が提唱している @samp{$''} の書式でエスケープされ、
12718 シェルのメタ文字は適切にクォートされる。これは、@command{ls --quoting=shell-escape}
12719 の出力と同じ書式である。
12720
12721 @item
12722 数値の引数は、単独の C の定数でなければならない。前に @samp{+} や @samp{-}
12723 が付いていてもよい。たとえば、@samp{printf %.4d -3} は、@samp{-0003} を出力する。
12724
12725 @item
12726 @vindex POSIXLY_CORRECT
12727 数値が期待される引数の先頭文字が @samp{"} や @samp{'} である場合、
12728 その引数の値は、引用符の直後に来る文字の数値である
12729 (訳注: すなわち、一般には、その文字の ASCII コードが出力される)。
12730 その後にさらに文字が続く場合は、環境変数 @env{POSIXLY_CORRECT}
12731 が設定されていれば、ただ単に無視され、設定されていなければ、警告が出される。
12732 一例を挙げておくと、@samp{printf "%d" "'a"} は、ASCII
12733 文字セットを使用しているホストでは、@samp{97} を出力する。
12734 ASCII における @samp{a} の数値は、10 進数表記で 97 だからだ。
12735
12736 @end itemize
12737
12738 @vindex LC_NUMERIC
12739 引数が浮動小数点数の場合は、小数部の前にはピリオドを置かなければならない。
12740 ただし、表示は、現在のロケールの @env{LC_NUMERIC} カテゴリのルールに合わせたものになる。
12741 たとえば、小数点を表す文字がコンマのロケールでは、@samp{printf %g 3.14}
12742 というコマンドは、@samp{3,14} を出力するが、@samp{printf %g 3,14}
12743 というコマンドはエラーになる。 @xref{Floating point}.
12744
12745 @kindex \@var{ooo}
12746 @kindex \x@var{hh}
12747 @command{printf} は、@var{format} 中の @samp{\@var{ooo}} を
12748 (@var{ooo} が 1 から 3 桁の 8 進数ならば) 表示すべき 1 バイトを指定している
12749 8 進数と見なす。また、@samp{\x@var{hh}} を (@var{hh} が 1 から 2 桁の
12750 16 進数ならば) 表示すべき 1 文字を指定している 16 進数だと解釈する。
12751 ただし、注意していただきたいが、@samp{\@var{ooo}} が 255 より大きな
12752 10 進数に相当するときは、@command{printf} は 9 ビット目を無視する。
12753 従って、たとえば、@samp{printf '\400'} は @samp{printf '\0'} と同じである。
12754
12755 @kindex \uhhhh
12756 @kindex \Uhhhhhhhh
12757 @cindex Unicode
12758 @cindex ISO/IEC 10646
12759 @vindex LC_CTYPE
12760 @command{printf} は、ISO C 99 で導入された 2 種類のキャラクタ・シンタクス
12761 (訳注: ここでは、コードポイントによる文字の指定法) を解釈することができる。
12762 一つは、Unicode (ISO/IEC 10646) の文字を 16 ビットで表すための @samp{\u}
12763 であり、4 桁の 16 進数 @var{hhhh} で指定する。もう一つは、Unicode の文字を
12764 32 ビットで表すための @samp{\U} で、こちらは 8 桁の 16 進数 @var{hhhhhhhh}
12765 で指定する。@command{printf} は Unicode の文字を出力するに当たって、
12766 @env{LC_CTYPE} のロケールに従う。なお、U+0000@dots{}U+009F と
12767 U+D800@dots{}U+DFFF の範囲にある Unicode の文字は、U+0024 ($),
12768 U+0040 (@@), U+0060 (`) を除いて、このシンタクスでは指定することができない。
12769
12770 @samp{\u} や @samp{\U} を処理するには、フル装備の @code{iconv} の能力が必要である。
12771 glibc 2.2 以降を採用しているシステムでは、そうした能力は使えるようになっている。
12772 coreutils パッケージをインストールする前に、@code{libiconv}
12773 をインストールしている場合も同様だ。どちらにも当てはまらない場合は、@samp{\u}
12774 や @samp{\U} は、変換されずに、そのままの形で表示される。
12775
12776 オプションとして指定できるのは、単独の @option{--help} か @option{--version}
12777 だけである。 @xref{Common options}.  オプションはオペランドの前に置かなければならない。
12778
12779 Unicode のキャラクタ・シンタクスを使えば、
12780 ロケールに縛られないやり方で文字列が書けて、便利である。
12781 たとえば、次のようにすれば、
12782
12783 @example
12784 $ env printf '\u20AC 14.95'
12785 @end example
12786
12787 @noindent
12788 ユーロ通貨記号を含む文字列が、ユーロ記号をサポートするすべてのロケール
12789 (ISO-8859-15, UTF-8 など) で正しく出力されることになる。同様に、
12790
12791 @example
12792 $ env printf '\u4e2d\u6587'
12793 @end example
12794
12795 @noindent
12796 とすれば、漢字の文字列が、すべての中国語のロケール (GB2312, BIG5,
12797 UTF-8 など) で正しく表示される。
12798
12799 上記の例では、@command{printf} コマンドを @command{env}
12800 経由で呼び出していることに注目していただきたい。
12801 これは、シェルのエイリアスや組み込み関数ではなく、
12802 シェルのサーチパスを使って見つけたプログラムを、確実に実行するためである。
12803
12804 文字列がもっと長い場合でも、各文字に対応する 16 進数コードを一つ一つ捜す必要はない。
12805 ASCII 文字に \u エスケープ・シーケンスを混ぜる書き方は、JAVA
12806 のソースファイルで使用されるエンコーディング (JAVA source file encoding)
12807 としても知られているが、GNU の recode コマンド 3.5c
12808 以降を使用すれば、任意の文字列をこのエンコーディングに変換することができるのだ。
12809 以下に示すのは、1 個の短文を、ロケールの如何に縛られずにその短文を出力するシェルスクリプトに変換する方法である。
12810
12811 @smallexample
12812 $ LC_CTYPE=zh_TW.big5 /usr/local/bin/printf \
12813     '\u4e2d\u6587\n' > sample.txt
12814   #
12815   # 訳注: もちろん、漢字入力の可能な LANG=zh_TW.big5 (あるいは、
12816   #       ja_JP.eucJP や ja_JP.utf8) の環境なら、コマンドラインで
12817   #       直接 printf '中文\n' と打ち込んでもよい。その方が、
12818   #       「各文字に対応する 16 進数コードを一つ一つ捜す必要はない」
12819   #       という上記の説明に、例としてはふさわしいだろう。
12820   #       LANG=ja_JP.eucJP の場合、下のコマンドは、当然ながら、
12821   #       recode eucJP..JAVA になる。LANG=ja_JP.utf8 なら、
12822   #       recode UTF8..JAVA だ。
12823   #
12824 $ recode BIG5..JAVA < sample.txt \
12825     | sed -e "s|^|/usr/local/bin/printf '|" -e "s|$|\\\\n'|" \
12826     > sample.sh
12827 @end smallexample
12828
12829 @exitstatus
12830
12831
12832 @node yes invocation
12833 @section @command{yes}: 中断されるまで文字列を表示する
12834
12835 @pindex yes
12836 @cindex repeated output of a string
12837
12838 @command{yes} は、コマンドラインで指定された引数を、空白で区切り、
12839 末尾に改行を付けて、意図的に中断されるまで (訳注: たとえば @kbd{CTRL-C}
12840 で中断されるまで) 延々と表示する。引数が指定されていない場合は、@samp{y}
12841 の後ろに改行を付けて、中断されるまで延々と表示する。
12842
12843 書き込みエラーがあると、@command{yes} はステータス @samp{1} で終了する。
12844
12845 指定できるオプションは、単独の @option{--help} か @option{--version} だけである。
12846 @samp{-} で始まる引数を出力するには、その引数の前に @option{--} を置けばよい。
12847 たとえば、@samp{yes -- --help} というようにだ。@xref{Common options}.
12848
12849
12850 @node Conditions
12851 @chapter 条件
12852
12853 @cindex conditions
12854 @cindex commands for exit status
12855 @cindex exit status commands
12856
12857 この章で説明するのは、その出力よりも終了ステータスの方が主として役に立つコマンドである。
12858 従って、こうしたコマンドは、シェルの @code{if} 文の条件として、
12859 あるいは、パイプラインの最後のコマンドとして使用されることが多い。
12860
12861 @menu
12862 * false invocation::         何もせず、実行失敗のステータスを返す。
12863 * true invocation::          何もせず、正常終了する。
12864 * test invocation::          ファイルタイプのチェックや値の比較を行う。
12865 * expr invocation::          式を評価する。
12866 @end menu
12867
12868
12869 @node false invocation
12870 @section @command{false}: 何もせず、実行失敗のステータスを返す
12871
12872 @pindex false
12873 @cindex do nothing, unsuccessfully
12874 @cindex failure exit status
12875 @cindex exit status of @command{false}
12876
12877 @command{false} は、実行に失敗したこと (@dfn{failure})
12878 を示す終了ステータス 1 を返す以外、何もしない。
12879 従って、シェルスクリプト中の、実行に失敗するコマンドが必要な場所で、
12880 仮のコマンドとして使用することができる。
12881 最近のほとんどのシェルでは、@command{false} は組み込みコマンドになっているので、
12882 スクリプト中で @samp{false} を使う際に使用しているのは、ここで説明している
12883 @samp{false} ではなく、たぶん組み込みコマンドの方である。
12884
12885 @command{false} は、@option{--help} と @option{--version} オプションを認識する。
12886
12887 このバージョンの @command{false} は、C のプログラムとして実装されている。
12888 従って、シェルスクリプトによる実装より安全かつ高速であり、
12889 アカウントを無効化するための安全なダミー・シェルとして使用することができる。
12890
12891 注意していただきたいが、@command{false} は、@option{--help} や
12892 @option{--version} を付けて実行した場合でも
12893 (このマニュアルで説明している他のすべてのプログラムとは違って)、
12894 実行失敗のステータスで終了する。
12895
12896 移植を考慮したプログラムでは、@command{false} の終了ステータスを
12897 1 だと決めてかからない方がよい。GNU 以外のホストでは、終了ステータスが
12898 1 より大きいこともあるからだ。
12899
12900
12901 @node true invocation
12902 @section @command{true}: 何もせず、正常終了する
12903
12904 @pindex true
12905 @cindex do nothing, successfully
12906 @cindex no-op
12907 @cindex successful exit
12908 @cindex exit status of @command{true}
12909
12910 @command{true} は、実行に成功したこと (@dfn{success})
12911 を示す終了ステータス 0 を返す以外、何もしない。
12912 従って、シェルスクリプト中の、実行に成功するコマンドが必要な場所で、
12913 仮のコマンドとして使用することができる。とは言え、シェルの組み込みコマンド
12914 @code{:} (コロン) の方が、同じことをより高速に実行してくれるかもしれない。
12915 最近のほとんどのシェルでは、@command{true} は組み込みコマンドになっているので、
12916 スクリプト中で @samp{true} を使う際に使用しているのは、ここで説明している
12917 @samp{true} ではなく、たぶん組み込みコマンドの方である。
12918
12919 @command{true} は、@option{--help} と @option{--version} オプションを認識する。
12920
12921 もっとも、@command{true} を 0 以外のステータスで終了させることも可能だということも、
12922 心に留めておいていただきたい。@option{--help} や @option{--version}
12923 を使用したとき、標準出力がすでにクローズされていたり、
12924 I/O エラーを引き起こすようなファイルにリダイレクトしたりすると、そういうことが起きる。
12925 たとえば、Bourne 互換のシェルを使用して、次のようにするときだ。
12926
12927 @example
12928 $ ./true --version >&-
12929 ./true: write error: Bad file number
12930 $ ./true --version > /dev/full
12931 ./true: write error: No space left on device
12932 @end example
12933
12934 このバージョンの @command{true} は、C のプログラムとして実装されている。
12935 従って、シェルスクリプトによる実装より安全かつ高速であり、
12936 アカウントを無効化するための安全なダミー・シェルとして使用することができる。
12937
12938 @node test invocation
12939 @section @command{test}: ファイルタイプのチェックや値の比較を行う
12940
12941 @pindex test
12942 @cindex check file types
12943 @cindex compare values
12944 @cindex expression evaluation
12945
12946 @command{test} は、条件式 @var{expression} の評価次第で、0 (真) または 1 (偽)
12947 のステータスを返す。式を構成する各部分は、独立した引数でなければならない。
12948
12949 @command{test} は、ファイルのステータスを検査することができる。
12950 また、文字列を扱う演算子や、数値を比較するための演算子も備えている。
12951
12952 @command{test} には、@samp{test} で始める書式のほかに、一対の角カッコを使用するもう一つの書式がある。
12953 たとえば、@samp{test -d /} の代わりに、@samp{[ -d / ]}
12954 と書いてもよい。角カッコは、独立した引数でなければならない
12955 (訳注: すなわち、他の引数と空白で分離されていなければならない)。
12956 だから、たとえば、@samp{[-d /]} では、望みの結果を得られないことになる。
12957 @samp{test @var{expression}} と @samp{[ @var{expression} ]}
12958 は、同じ意味なので、以下では前者の書式についてのみ解説する。
12959
12960 書式:
12961
12962 @example
12963 test @var{expression}
12964 test
12965 [ @var{expression} ]
12966 [ ]
12967 [ @var{option}
12968 @end example
12969
12970 @mayConflictWithShellBuiltIn{test}
12971
12972 @var{expression} を省略した場合、@command{test} は、偽を返す。
12973 @var{expression} が引数 1 個だけだった場合、@command{test}
12974 は、その引数が空 (null) ならば、偽を返し、さもなければ、真を返す。
12975 引数には、@samp{-d}, @samp{-1}, @samp{--}, @samp{--help}, @samp{--version}
12976 といった、他のほとんどのプログラムでなら、オプションとして扱われるものも含めて、
12977 どんな文字列でも指定することができる。そこで、ヘルプやバージョン情報を取得するには、
12978 @samp{[ --help} や @samp{[ --version} という形でコマンドを実行する必要がある。
12979 この場合、いつもと違って、閉じカッコは付けない。 @xref{Common options}.
12980
12981 @cindex exit status of @command{test}
12982 終了ステータス:
12983
12984 @display
12985 0: 式が真の場合。
12986 1: 式が偽の場合。
12987 2: エラーが起きた場合。
12988 @end display
12989
12990 @menu
12991 * File type tests::          ファイルタイプのテスト (-[gkruwxOG])。
12992 * Access permission tests::  アクセス許可のテスト (-[gkruwxOG])。
12993 * File characteristic tests::  ファイル特性のテスト (-e -s -nt -ot -ef)。
12994 * String tests::             文字列のテスト (-z -n = == !=)。
12995 * Numeric tests::            数値のテスト (-eq -ne -lt -le -gt -ge)。
12996 * Connectives for test::     @command{test} の論理結合演算子 (! -a -o)。
12997 @end menu
12998
12999
13000 @node File type tests
13001 @subsection ファイルタイプのテスト
13002
13003 @cindex file type tests
13004
13005 以下のオプションは、ある特定のファイルタイプか否かの検査を行う。
13006 (Unix では、あらゆるものがファイルだ。だが、ファイルならみんな同じだというわけではない!)
13007
13008 @table @samp
13009
13010 @item -b @var{file}
13011 @opindex -b
13012 @cindex block special check
13013 @var{file} が存在し、ブロック・スペシャルデバイスならば、真。
13014
13015 @item -c @var{file}
13016 @opindex -c
13017 @cindex character special check
13018 @var{file} が存在し、キャラクタ・スペシャルデバイスならば、真。
13019
13020 @item -d @var{file}
13021 @opindex -d
13022 @cindex directory check
13023 @var{file} が存在し、ディレクトリならば、真。
13024
13025 @item -f @var{file}
13026 @opindex -f
13027 @cindex regular file check
13028 @var{file} が存在し、通常ファイルならば、真。
13029
13030 @item -h @var{file}
13031 @itemx -L @var{file}
13032 @opindex -L
13033 @opindex -h
13034 @cindex symbolic link check
13035 @var{file} が存在し、シンボリックリンクならば、真。
13036 ファイル関係の他のすべてのテストとは違って、このテストでは、@var{file}
13037 がシンボリックリンクの場合、リンクの参照を行わない。
13038
13039 @item -p @var{file}
13040 @opindex -p
13041 @cindex named pipe check
13042 @var{file} が存在し、名前付きパイプならば、真。
13043
13044 @item -S @var{file}
13045 @opindex -S
13046 @cindex socket check
13047 @var{file} が存在し、ソケットならば、真。
13048
13049 @item -t @var{fd}
13050 @opindex -t
13051 @cindex terminal check
13052 @var{fd} が端末と結びついているファイルディスクリプタならば、真。
13053
13054 @end table
13055
13056
13057 @node Access permission tests
13058 @subsection アクセス許可のテスト
13059
13060 @cindex access permission tests
13061 @cindex permission tests
13062
13063 以下のオプションは、特定のアクセス許可について検査をする。
13064
13065 @table @samp
13066
13067 @item -g @var{file}
13068 @opindex -g
13069 @cindex set-group-ID check
13070 @var{file} が存在し、set-group-ID ビットが立っていれば、真。
13071
13072 @item -k @var{file}
13073 @opindex -k
13074 @cindex sticky bit check
13075 @var{file} が存在し、@dfn{sticky} ビットが立っていれば、真
13076
13077 @item -r @var{file}
13078 @opindex -r
13079 @cindex readable file check
13080 @var{file} が存在し、読み出しが許可されていれば、真。
13081
13082 @item -u @var{file}
13083 @opindex -u
13084 @cindex set-user-ID check
13085 @var{file} が存在し、set-user-ID ビットが立っていれば、真。
13086
13087 @item -w @var{file}
13088 @opindex -w
13089 @cindex writable file check
13090 @var{file} が存在し、書き込みが許可されていれば、真。
13091
13092 @item -x @var{file}
13093 @opindex -x
13094 @cindex executable file check
13095 @var{file} が存在し、実行が許可されていれば (ディレクトリの場合は、検索が許可されていれば)、真。
13096
13097 @item -O @var{file}
13098 @opindex -O
13099 @cindex owned by effective user ID check
13100 @var{file} が存在し、その所有者が test コマンド実行者の実効ユーザ ID
13101 と同じならば、真。
13102
13103 @item -G @var{file}
13104 @opindex -G
13105 @cindex owned by effective group ID check
13106 @var{file} が存在し、そのグループが test コマンド実行者の実効グループ ID
13107 と同じならば、真。
13108
13109 @end table
13110
13111 @node File characteristic tests
13112 @subsection ファイル特性のテスト
13113
13114 @cindex file characteristic tests
13115
13116 以下のオプションは、ファイルの他の特性を検査する。
13117
13118 @table @samp
13119
13120 @item -e @var{file}
13121 @opindex -e
13122 @cindex existence-of-file check
13123 @var{file} が存在すれば、真。
13124
13125 @item -s @var{file}
13126 @opindex -s
13127 @cindex nonempty file check
13128 @var{file} が存在し、サイズが 0 よりも大きければ、真。
13129
13130 @item @var{file1} -nt @var{file2}
13131 @opindex -nt
13132 @cindex newer-than file check
13133 @var{file1} が @var{file2} より (更新日時 (modification date) で比較して)
13134 新しいか、あるいは、@var{file1} が存在して、@var{file2} が存在しなければ、真。
13135
13136 @item @var{file1} -ot @var{file2}
13137 @opindex -ot
13138 @cindex older-than file check
13139 @var{file1} が @var{file2} より (更新日時で比較して) 古いか、あるいは、@var{file2}
13140 が存在して、@var{file1} が存在しなければ、真。
13141
13142 @item @var{file1} -ef @var{file2}
13143 @opindex -ef
13144 @cindex same file check
13145 @cindex hard link check
13146 @var{file1} と @var{file2} が同じデバイス番号と同じ inode 番号を持っていれば、
13147 言い換えれば、両者が互いのハードリンクならば、真。
13148
13149 @end table
13150
13151
13152 @node String tests
13153 @subsection 文字列のテスト
13154
13155 @cindex string tests
13156
13157 以下のオプションは、文字列の特性を検査する。シェルに対して引数 @var{string}
13158 を引用符で保護する必要があるかもしれない。たとえば、こんなふうにだ。
13159
13160 @example
13161 test -n "$V"
13162 @end example
13163
13164 こうした引用符は、@samp{$V} が空だったり、特殊文字を含んでいたりする場合に、
13165 意図に反した引数が @command{test} に渡ることを防いでいる。
13166
13167 @table @samp
13168
13169 @item -z @var{string}
13170 @opindex -z
13171 @cindex zero-length string check
13172 @var{string} の長さが 0 ならば、真。
13173
13174 @item -n @var{string}
13175 @itemx @var{string}
13176 @opindex -n
13177 @cindex nonzero-length string check
13178 @var{string} の長さが 0 でなければ、真。
13179
13180 @item @var{string1} = @var{string2}
13181 @opindex =
13182 @cindex equal string check
13183 両文字列が等しければ、真。
13184
13185 @item @var{string1} == @var{string2}
13186 @opindex ==
13187 @cindex equal string check
13188 両文字列が等しければ、真 (= と同じ意味)。
13189
13190 @item @var{string1} != @var{string2}
13191 @opindex !=
13192 @cindex not-equal string check
13193 両文字列が等しくなければ、真。
13194
13195 @end table
13196
13197
13198 @node Numeric tests
13199 @subsection 数値のテスト
13200
13201 @cindex numeric tests
13202 @cindex arithmetic tests
13203
13204 数値間の関係を調べる演算子を挙げる。引数は、数字のみで表現される整数か
13205 (負数も使用できる)、@w{@code{-l @var{string}}} という特別な式でなければならない。
13206 後者は @var{string} の長さとして評価される。
13207
13208 (訳注: 要するに、普通は 10 進数の整数を引数として取るということ。
13209 @command{expr} コマンドとは違って、@command{test} では @samp{+2} といった表現も可能だ。)
13210
13211 @table @samp
13212
13213 @item @var{arg1} -eq @var{arg2}
13214 @itemx @var{arg1} -ne @var{arg2}
13215 @itemx @var{arg1} -lt @var{arg2}
13216 @itemx @var{arg1} -le @var{arg2}
13217 @itemx @var{arg1} -gt @var{arg2}
13218 @itemx @var{arg1} -ge @var{arg2}
13219 @opindex -eq
13220 @opindex -ne
13221 @opindex -lt
13222 @opindex -le
13223 @opindex -gt
13224 @opindex -ge
13225 こうした二項算術演算子は、それぞれ次の場合に真を返す。上から順に、
13226 @var{arg1} が @var{arg2} と比べて、等しい場合、等しくない場合、より小さい場合、
13227 より小さいか等しい場合、より大きい場合、より大きいか等しい場合。
13228
13229 @end table
13230
13231 例を挙げる。
13232
13233 @example
13234 test -1 -gt -2 && echo yes
13235 @result{} yes
13236 test -l abc -gt 1 && echo yes
13237 @result{} yes
13238 test 0x100 -eq 1
13239 @error{} test: integer expression expected before -eq
13240 @end example
13241
13242
13243 @node Connectives for test
13244 @subsection @command{test} の論理結合演算子
13245
13246 @cindex logical connectives
13247 @cindex connectives, logical
13248
13249 @command{test} 内蔵のこうした論理結合演算子より、
13250 シェルの論理基本演算子を使用した方がよいことに留意していただきたい。
13251 と言うのは、式が、パラメータの展開によっては、曖昧になることがあるからである。
13252
13253 たとえば、次の式は、@samp{$1} が @samp{'!'} であり、@samp{$2} が空文字列
13254 @samp{''} だと、曖昧になる (訳注: '!' が文字列か否定演算子か、曖昧だということだろう)。
13255
13256 @example
13257 test "$1" -a "$2"
13258 @end example
13259
13260 だから、以下のように書いた方がよい。
13261
13262 @example
13263 test "$1" && test "$2"
13264 @end example
13265
13266 シェルの論理基本演算子では、作業の簡略化による利益も得られる。
13267 それは、ファイルの属性のテストを何度もやる場合には、かなりのものになるかもしれない。
13268
13269 @table @samp
13270
13271 @item ! @var{expr}
13272 @opindex !
13273 @var{expr} が偽ならば、真。@samp{!} は @var{expr} のどの部分よりも優先順位が低い。
13274 @samp{!} は二項式の左に指定する必要があることに注意していただきたい。
13275 すなわち、@samp{1 '!' -gt 2} ではなく、@samp{'!' 1 -gt 2} である。
13276 なお、@samp{!} はシェルの特殊文字であることが多いので、クォートした方が間違いがない。
13277
13278
13279 @item @var{expr1} -a @var{expr2}
13280 @opindex -a
13281 @cindex logical and operator
13282 @cindex and operator
13283 @var{expr1} と @var{expr2} の両方が真ならば、真。
13284 @samp{-a} は左結合であり、@samp{-o} よりも優先順位が高い。
13285
13286 @item @var{expr1} -o @var{expr2}
13287 @opindex -o
13288 @cindex logical or operator
13289 @cindex or operator
13290 @var{expr1} と @var{expr2} のどちらかが真ならば、真。
13291 @samp{-o} は左結合である。
13292
13293 @end table
13294
13295
13296 @node expr invocation
13297 @section @command{expr}: 式を評価する
13298
13299 @pindex expr
13300 @cindex expression evaluation
13301 @cindex evaluation of expressions
13302
13303 @command{expr} は、式を評価して、結果を標準出力に書き出す。式の各構成要素
13304 (token) は、独立した引数でなければならない。
13305
13306 オペランド (演算対象) は、整数か文字列である。整数は、1 個以上の
13307 10 進数の数字から構成され、先頭に @samp{-} が付いていてもよい。@command{expr} は、
13308 オペランドの位置にあるものが何であれ、それを整数、または、文字列に変換する。
13309 どちらになるかは、それに対して行われる演算次第である。
13310
13311 @command{expr} そのものに対しては、文字列をクォートする必要がない。
13312 だが、シェルにとって特別な意味がある、たとえば空白のような文字を保護するためには、
13313 文字列を引用符で囲むなどの方法でクォートする必要があるかもしれない。
13314 とは言え、クォートされているかどうかに関わりなく、文字列のオペランドは、
13315 丸カッコ 1 個であってはならないし、@code{+} のような @command{expr}
13316 の演算子の一つであるべきでもない。すなわち、シェルに対してクォートするだけでは、
13317 エラーを引き起こすことなく、任意の文字列 @code{$str} を @command{expr}
13318 に渡すことはできないのだ。この問題を回避する方法の一つは、GNU の拡張である
13319 @code{+} 演算子 (訳注: この @code{+} は、算術演算子の @code{+}
13320 ではなく、直後に来る引数が文字列であることを示す文字列演算子である) を使用することだ
13321 (たとえば、@code{+ "$str" = foo} といった具合に)。もっと移植性のある方法は、
13322 @code{@w{" $str"}} という先頭に空白を入れた表現を使用し、
13323 式の残りの部分でもそれに合わせて、先頭のスペースを考慮に入れるようにすることである
13324 (たとえば、@code{@w{" $str" = " foo"}} のように)。
13325
13326 負の整数や、@samp{-} で始まる文字列を @command{expr} の
13327 1 番目の引数として渡すべきではない。オプションと間違われかねないからだ。
13328 それを避けるためには、カッコでくくればよい (訳注: たとえば、
13329 @code{expr \( -1 + 1 \)})。また、移植を考慮したスクリプトでは、
13330 文字列のオペランドに、形が整数と同じになってしまうものを使うべきではない。
13331 こちらは、先頭にスペースを入れる上記の方法で回避できる。
13332
13333 @cindex parentheses for grouping
13334 演算子には、記号としてオペランドとオペランドの間に置くものもあれば、
13335 キーワードとしてオペランドの前に付けるものもある。
13336 丸カッコは、おなじみのやり方で、グループ化に使用できる。
13337 ただし、丸カッコや、演算子の多くは、シェルによって評価されないように、
13338 クォートしなければならない。
13339
13340 GNU MP ライブラリ対応でビルドされた場合、@command{expr}
13341 は任意精度演算を使用する。そうでない場合は、ネイティブな算術型を使用するので、
13342 算術オーバーフローのために実行に失敗することがあるかもしれない。
13343
13344 指定できるオプションは、@option{--help} と @option{--version} だけである。
13345 @xref{Common options}.  オプションはオペランドの前に置かなければならない。
13346
13347 @cindex exit status of @command{expr}
13348 終了ステータス:
13349
13350 @display
13351 0: 式が null でも 0 でもない場合。
13352 1: 式が null または 0 の場合。
13353 2: 式が無効な場合。
13354 3: 内部エラーが起きた場合 (例: 算術オーバーフロー)。
13355 @end display
13356
13357 @menu
13358 * String expressions::       文字列式 (+ : match substr index length)。
13359 * Numeric expressions::      数式 (+ - * / %)。
13360 * Relations for expr::       論理結合と関係表現 (| & < <= = == != >= >)。
13361 * Examples of expr::         用例。
13362 @end menu
13363
13364
13365 @node String expressions
13366 @subsection 文字列式
13367
13368 @cindex string expressions
13369 @cindex expressions, string
13370
13371 @command{expr} は、パターンマッチなどの文字列演算子をサポートしている。
13372 文字列演算子の優先順位は、算術演算子や関係演算子よりも高い
13373 (算術/関係演算子については後述する)。
13374
13375 @table @samp
13376
13377 @item @var{string} : @var{regex}
13378 @cindex pattern matching
13379 @cindex regular expression matching
13380 @cindex matching patterns
13381 パターンマッチを行う。まず、左右の項を文字列に変換し、右項を、先頭に
13382 @code{^} が暗黙のうちに付いている正規表現と見なす (@code{grep}
13383 風の基本正規表現)。それから、その正規表現と左項がマッチするかどうかを調べる。
13384
13385 マッチが成功した場合、@var{regex} 中でカッコ (@samp{\(} と @samp{\)})
13386 を使用していれば、@code{:} 演算子は、そのカッコ内の部分表現にマッチした
13387 @var{string} 中の部分文字列を返す。カッコを使っていなければ、返すのはマッチした文字数である。
13388
13389 マッチに失敗した場合、@code{:} 演算子は、@var{regex} 中でカッコ (@samp{\(} と @samp{\)})
13390 を使用していれば、空文字列を、さもなければ、0 を返す。
13391
13392 @kindex \( @r{regexp operator}
13393 最初の @samp{\( @dots{} \)} のペアだけが、返り値に関係する。
13394 二番目以降のカッコのペアには、正規表現の演算子をグループ化する働きしかない。
13395
13396 @kindex \+ @r{regexp operator}
13397 @kindex \? @r{regexp operator}
13398 @kindex \| @r{regexp operator}
13399 正規表現では、@code{\+}, @code{\?}, @code{\|} は演算子であり、それぞれ、
13400 1 個以上にマッチする、あってもなくてもよい、候補のうちのどちらか、を意味している。
13401 ところが、SunOS などの @command{expr} では、こうした記号を通常の文字として扱っている
13402 (POSIX は、どちらの動作も認めている)。正規表現の文法については次のものが詳しい。
13403 @xref{Top, , Regular Expression Library, regex, Regex}.
13404 実例をいくつか、「@command{expr} の使用例」に挙げておいた。
13405 @ref{Examples of expr}.
13406
13407 @item match @var{string} @var{regex}
13408 @findex match
13409 パターンマッチを行う別の方法。これは、@w{@samp{@var{string} : @var{regex}}} と同じ
13410 である。
13411
13412 @item substr @var{string} @var{position} @var{length}
13413 @findex substr
13414 @var{string} の部分文字列を返す。部分文字列は、@var{position}
13415 の位置から始まり、最長でも @var{length} の長さである。@var{position} と
13416 @var{length} のどちらかが、負数や 0 だったり、数値以外だったりする場合は、空文字列を返す。
13417
13418 @item index @var{string} @var{charset}
13419 @findex index
13420 @var{charset} 中の文字が最初に見つかった @var{string} 中の位置を返す。
13421 @var{string} 中に @var{charset} 中のどの文字も見つからなかった場合は、0 を返す。
13422
13423 @item length @var{string}
13424 @findex length
13425 @var{string} の長さを返す。
13426
13427 @item + @var{token}
13428 @kindex +
13429 たとえ、@var{token} が @code{match} のようなキーワードや、 @code{/}
13430 のような演算子であっても、@var{token} を文字列として解釈する。
13431 これを使用すると、@code{expr length + "$x"} や @code{expr + "$x" : '.*/\(.\)'}
13432 を実行したとき、@code{$x} の値が (たとえば) たまたま @code{/} や
13433 @code{index} であっても、適切な動作をさせることができる。
13434 この演算子は、GNU の拡張である。移植を考慮したシェルスクリプトでは、
13435 @code{+ "$token"} ではなく、@code{@w{" $token"} : @w{' \(.*\)'}}
13436 を使うべきである。
13437
13438 @end table
13439
13440 @command{expr} にキーワードを文字列として解釈させるためには、クォート演算子
13441 (訳注: 上で述べている @code{+} 演算子) を使用しなければならない。
13442
13443
13444 @node Numeric expressions
13445 @subsection 数式
13446
13447 @cindex numeric expressions
13448 @cindex expressions, numeric
13449
13450 @command{expr} は、以下に挙げる通常の算術演算子を、昇順の優先順位で、サポートしている。
13451 こうした算術演算子は、前節で述べた文字列演算子より優先順位が低く、
13452 次節で述べる関係演算子より優先順位が高い。
13453
13454 @table @samp
13455
13456 @item + -
13457 @kindex +
13458 @kindex -
13459 @cindex addition
13460 @cindex subtraction
13461 加算と減算。左右の項は両方とも整数に変換される。整数に変換できない場合は、エラーになる。
13462
13463 @item * / %
13464 @kindex *
13465 @kindex /
13466 @kindex %
13467 @cindex multiplication
13468 @cindex division
13469 @cindex remainder
13470 乗算、除算、剰余演算。左右の項は両方とも整数に変換される。整数に変換できない場合は、エラーになる。
13471
13472 @end table
13473
13474
13475 @node Relations for expr
13476 @subsection @command{expr} の関係表現
13477
13478 @cindex connectives, logical
13479 @cindex logical connectives
13480 @cindex relations, numeric or string
13481
13482 @command{expr} は、通常の論理結合や関係表現をサポートしている。
13483 そうした演算子は、前の節で述べた文字列演算子や算術演算子より優先順位が低い。
13484 論理結合や関係表現の演算子を、優先順位の低いものから高いものへ順に並べておく。
13485
13486 @table @samp
13487
13488 @item |
13489 @kindex |
13490 @cindex logical or operator
13491 @cindex or operator
13492 左項が null でも 0 でもなければ、左項を返す。左項が null または
13493 0 の場合は、右項が null でも 0 でもなければ、右項を返す。両項とも
13494 null または 0 の場合は、0 を返す。左項が null でも 0 でもない場合、
13495 右項の評価は行われない。
13496
13497 @item &
13498 @kindex &
13499 @cindex logical and operator
13500 @cindex and operator
13501 両項とも null でも 0 でもなければ、左項を返し、それ以外の場合は、0
13502 を返す。左項が null または 0 の場合、右項の評価は行われない。
13503
13504 @item < <= = == != >= >
13505 @kindex <
13506 @kindex <=
13507 @kindex =
13508 @kindex ==
13509 @kindex >
13510 @kindex >=
13511 @cindex comparison operators
13512 @vindex LC_COLLATE
13513 両項を比較し、関係が真ならば、1 を返し、偽の場合は、0 を返す。
13514 @code{==} は @code{=} と同じ意味である。@command{expr} は、まず両項を整数に変換し、
13515 数値としての比較を試みる。左右どちらかの項の変換に失敗した場合は、
13516 @env{LC_COLLATE} のロケールで指定されている、文字の照合順を使用して、
13517 辞書的な比較を行う。
13518
13519 @end table
13520
13521
13522 @node Examples of expr
13523 @subsection @command{expr} の使用例
13524
13525 @cindex examples of @command{expr}
13526 シェルのメタ文字をクオートする例も含めて、用例をいくつか挙げておく。
13527
13528 Bourne 互換シェルで、シェル変数 @code{foo} に 1 を加える。
13529
13530 @example
13531 foo=$(expr $foo + 1)
13532 @end example
13533
13534 変数 @code{$fname} に格納されているファイル名から、ディレクトリではない部分を取り出して、表示する。
13535 @code{$fname} に @code{/} が含まれていなくてもよい。
13536
13537 @example
13538 expr $fname : '.*/\(.*\)' '|' $fname
13539 @end example
13540
13541 次の例で @code{\+} は演算子である (訳注: 細かいことを言うと、@command{grep}
13542 流の基本正規表現の演算子。ちなみに、最後の例の @code{+} は、@command{expr}
13543 の文字列演算子である)。
13544
13545 @example
13546 expr aaa : 'a\+'
13547 @result{} 3
13548 @end example
13549
13550 @example
13551 expr abc : 'a\(.\)c'
13552 @result{} b
13553 expr index abcdef cz
13554 @result{} 3
13555 expr index index a
13556 @error{} expr: syntax error
13557 expr index + index a
13558 @result{} 0
13559 @end example
13560
13561
13562 @node Redirection
13563 @chapter リダイレクション
13564
13565 @cindex redirection
13566 @cindex commands for redirection
13567
13568 Unix のシェルは、いくつかの形式のリダイレクション (@dfn{redirection})
13569 --- コマンドの入力元や出力先を変更する手段 --- をたいてい用意している。
13570 しかし、ある一つの便利なリダイレクションは、シェルではなく、独立したコマンドによって行われる。
13571 この章では、そのコマンドについて説明する。
13572
13573 @menu
13574 * tee invocation::           出力を複数のファイルやプロセスにリダイレクトする。
13575 @end menu
13576
13577
13578 @node tee invocation
13579 @section @command{tee}: 出力を複数のファイルやプロセスにリダイレクトする
13580
13581 @pindex tee
13582 @cindex pipe fitting
13583 @cindex destinations, multiple output
13584 @cindex read from stdin and write to stdout and files
13585
13586 @command{tee} コマンドは、標準入力を標準出力にコピーするとともに、
13587 引数として指定されたファイル (複数可) にもコピーする。
13588 これは、あるデータをパイプに送るだけでなく、同時にそのコピーを保存したい場合に、便利である。
13589
13590 書式:
13591
13592 @example
13593 tee [@var{option}]@dots{} [@var{file}]@dots{}
13594 @end example
13595
13596 書き出し先のファイルがまだ存在していなければ、作成する。
13597 書き出し先のファイルがすでに存在している場合は、@option{-a}
13598 オプションを使用しないかぎり、ファイルに前からあったデータは上書きされる。
13599
13600 GNU coreutils の従来のバージョンでは (v5.3.0 - v8.23)、
13601 @var{file} として @samp{-} を指定すると、@command{tee}
13602 は入力のコピーをもう一つ標準出力に書き出していた。
13603 しかし、二重になった出力は、あまり役に立つものではなかったので、
13604 現在では POSIX の規格に従い、そこではっきりと規定されているように、
13605 @samp{-} をそういう名前のファイルとして取り扱うようになっている。
13606
13607 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
13608
13609 @table @samp
13610 @item -a
13611 @itemx --append
13612 @opindex -a
13613 @opindex --append
13614 指定されたファイルの末尾に標準入力を追加する。すなわち、ファイルを上書きしない。
13615
13616 @item -i
13617 @itemx --ignore-interrupts
13618 @opindex -i
13619 @opindex --ignore-interrupts
13620 割り込みシグナルを無視する。
13621
13622 @item -p
13623 @itemx --output-error[=@var{mode}]
13624 @opindex -p
13625 @opindex --output-error
13626 出力にエラーがあったときの動作を調整する。
13627 長い形式のオプションを使えば、下記の @var{mode} から動作を選択することができる。
13628
13629 @table @samp
13630 @item warn
13631 パイプを含めて、出力のオープンや書き出しでエラーが起きると、警告メッセージを出す。
13632 エラー発生後もまだオープンされているファイルやパイプがあれば、それに対する書き込みは続行される。
13633 出力のいづれかにエラーがあれば、終了ステータスは失敗を示す。
13634
13635 @item warn-nopipe
13636 これが、@var{mode} が指定されないときや、短い形式の @option{-p}
13637 が使用されたときのデフォルトの @var{mode} である。
13638 パイプ以外について、出力のオープンや書き出しでエラーが起きると、警告メッセージを出す。
13639 エラー発生後もまだオープンされているファイルやパイプがあれば、それに対する書き込みは続行される。
13640 パイプ以外の出力にエラーがあれば、終了ステータスは失敗を示す。
13641
13642 @item exit
13643 パイプを含めて、出力のオープンや書き出しでエラーが起きると、終了する。
13644
13645 @item exit-nopipe
13646 パイプ以外について、出力のオープンや書き出しでエラーが起きると、終了する。
13647 @end table
13648
13649 @end table
13650
13651 大量のデータの転送を行いながら、同時にそのデータのサマライズも行いたい、
13652 改めてデータを読み直すようなことはしたくない。@command{tee} は、そういうときに便利である。
13653 たとえば、DVD イメージをダウンロードしているとき、
13654 その場ですぐ、署名やチェックサムを確認したくなることがよくある。
13655 単に次のようにするのは、効率が悪い。
13656
13657 @example
13658 wget http://example.com/some.iso && sha1sum some.iso
13659 @end example
13660
13661 上記コマンドの問題点の一つは、ただでさえ時間のかかる SHA1 の計算に取りかかる前に、
13662 ダウンロードが完了するのを待たなければならないことだ。
13663 たぶん、さらに問題なのは、上記のやり方では、
13664 DVD イメージを改めて読み直さなければならないことだろう
13665 (一度目の読み込みは、ネットワークから)。
13666
13667 こうした作業を行う効率的な方法は、ダウンロードと SHA1 の計算を同時に、
13668 交互に実行することである。そうすれば、プロセス全体が平行してスムーズに進むので、
13669 無駄な時間を使わずに、チェックサムが手に入る。
13670
13671 @example
13672 # ちょっと凝った方法。プロセス置換の実例をご覧に入れるため。
13673 wget -O - http://example.com/dvd.iso \
13674   | tee >(sha1sum > dvd.sha1) > dvd.iso
13675 @end example
13676
13677 こうすれば、@command{tee} は、出力を目当てのファイルに書き出すだけでなく、パイプにも書き出す。
13678 そして、後者では、@command{sha1sum} を実行し、最終的なチェックサムを
13679 @file{dvd.sha1} という名前のファイルに保存することになる。
13680
13681 しかし、気をつけていただきたい。上記の例は、プロセス置換 (@dfn{process substitution})
13682 と呼ばれる最近のシェルの機能を当てにしている (上記の@samp{>(command)}
13683 という構文のことである。@xref{Process Substitution,,
13684 Process Substitution, bash, The Bash Reference Manual}.)。
13685 そのため、@command{zsh}, @command{bash}, @command{ksh}
13686 ではうまく動作するが、@command{/bin/sh} では動作しない。
13687 従って、こうしたコードをシェルスクリプトで使用するときは、スクリプトの先頭に
13688 @samp{#!/bin/bash} などと書くことを忘れてはいけない。
13689
13690 次のことにも気をつけていただきたい。プロセス置換のいづれかが
13691 (あるいは、パイプに渡された標準出力が)、
13692 データをすべて処理し尽くす前に終了してしまうことがあるかもしれない。
13693 そうした場合に、@command{tee} が入力の処理を続行して、
13694 それを残っている出力先に渡すことができるようにするには、
13695 @option{-p} オプションが必要になる。
13696
13697 上記の例は、書き出しを 1 個のファイルと 1 個のプロセスに行っているだけだ。
13698 その程度なら、もっと普通の、もっと移植性のある使い方をした方がずっとよい。
13699
13700 @example
13701 wget -O - http://example.com/dvd.iso \
13702   | tee dvd.iso | sha1sum > dvd.sha1
13703 @end example
13704
13705 @command{tee} が二つのプロセスに書き込むように、この例を拡張して、MD5 と
13706 SHA1 のチェックサムを平行して計算させることもできる。
13707 その場合は、プロセス置換が必要になる。
13708
13709 @example
13710 wget -O - http://example.com/dvd.iso \
13711   | tee >(sha1sum > dvd.sha1) \
13712         >(md5sum > dvd.md5) \
13713   > dvd.iso
13714 @end example
13715
13716 このテクニックは、パイプから入ってくるデータの圧縮したコピーを作りたいときにも、役に立つ。
13717 @samp{du -ak} の出力するディスク使用量のデータを要約して、
13718 グラフィカルに表示するツールを考えていただきたい。
13719 ディレクトリ階層が膨大だと、@samp{du -ak} は実行に長い時間がかかるだろうし、
13720 いともたやすくテラバイトのデータを作成してくれるだろう。
13721 そこで、@samp{du} コマンドをむやみに再実行することはやりたくない。
13722 また、圧縮されていない出力を保存しておきたくもない。
13723
13724 これを効率の悪い方法でやると、@command{du} の出力全部の圧縮を済ませるまで、
13725 GUI ツールを起動することすらできない。
13726
13727 @example
13728 du -ak | gzip -9 > /tmp/du.gz
13729 gzip -dc /tmp/du.gz | xdiskusage -a
13730 @end example
13731
13732 @command{tee} とプロセス置換を使えば、GUI ツールを直ちに起動できるし、
13733 圧縮ファイルの展開も全くやらないですむ。
13734
13735 @example
13736 du -ak | tee >(gzip -9 > /tmp/du.gz) | xdiskusage -a
13737 @end example
13738
13739 最後にもう一つ。常に 2 種類以上の圧縮した tar アーカイブ (tarball)
13740 を一度に作ることにしている場合は、より効率のよいやり方ができるかもしれない。
13741 たとえば、@code{make dist} が @command{gzip} と @command{bzip2} の両方で圧縮した
13742 tar アーカイブを作成するような場合だ。@command{automake} が生成する @file{Makefile}
13743 のルールは、たいてい、こんなふうにコマンドを連続して実行することで、
13744 圧縮した tar アーカイブを二つ作成している (少し単純化してある)。
13745
13746 @example
13747 tardir=your-pkg-M.N
13748 tar chof - "$tardir" | gzip  -9 -c > your-pkg-M.N.tar.gz
13749 tar chof - "$tardir" | bzip2 -9 -c > your-pkg-M.N.tar.bz2
13750 @end example
13751
13752 しかしながら、アーカイブの作成・圧縮の対象になっているディレクトリ階層が、
13753 数メガバイトより大きい場合は --- 使用しているシステムがマルチプロセッサを搭載し、
13754 メモリがふんだんにある場合はなおさらそうだが --- ディレクトリの中身を 1 回だけ読み込み、
13755 圧縮プログラムを平行して走らせることで、ずっと効率のよい仕事ができる。
13756
13757 @example
13758 tardir=your-pkg-M.N
13759 tar chof - "$tardir" \
13760   | tee >(gzip -9 -c > your-pkg-M.N.tar.gz) \
13761   | bzip2 -9 -c > your-pkg-M.N.tar.bz2
13762 @end example
13763
13764 プロセス置換が表示する出力をさらに処理したいとしよう。
13765 もし、そうしたプロセスがアトミックな書き出しをしているならば
13766 (すなわち、一度の書き出しが、システムの PIPE_BUF サイズよりも小さければ)、
13767 そういうことも次のような構文で可能である。
13768
13769 @example
13770 tardir=your-pkg-M.N
13771 tar chof - "$tardir" \
13772   | tee >(md5sum --tag) > >(sha256sum --tag) \
13773   | sort | gpg --clearsign > your-pkg-M.N.tar.sig
13774 @end example
13775
13776 @exitstatus
13777
13778
13779 @node File name manipulation
13780 @chapter ファイル名操作
13781
13782 @cindex file name manipulation
13783 @cindex manipulation of file names
13784 @cindex commands for file name manipulation
13785
13786 この章では、ファイル名操作に使うコマンドについて説明する。
13787
13788 @menu
13789 * basename invocation::      ファイル名からディレクトリと接尾辞を取り除く。
13790 * dirname invocation::       ファイル名から最後の要素を取り除く。
13791 * pathchk invocation::       ファイル名の有効性や可搬性を検査する。
13792 * mktemp invocation::        テンポラリファイルやディレクトリを作成する。
13793 * realpath invocation::      ファイル名を展開して表示する。
13794 @end menu
13795
13796
13797 @node basename invocation
13798 @section @command{basename}: ファイル名からディレクトリと接尾辞を取り除く
13799
13800 @pindex basename
13801 @cindex strip directory and suffix from file names
13802 @cindex directory, stripping from file names
13803 @cindex suffix, stripping from file names
13804 @cindex file names, stripping directory and suffix
13805 @cindex leading directory components, stripping
13806
13807 @command{basename} は、@var{name} の先頭にディレクトリ部分があれば、それを取り除く。
13808
13809 書式:
13810
13811 @example
13812 basename @var{name} [@var{suffix}]
13813 basename @var{option}@dots{} @var{name}@dots{}
13814 @end example
13815
13816 @var{suffix} が指定されていて、それが @var{name} の末尾と同一ならば、
13817 @var{suffix} の部分も @var{name} から取り除かれる。
13818 気をつけていただきたいが、ファイル名の末尾のスラッシュは、接尾辞のマッチングに先立って除去されるので、
13819 @var{suffix} にスラッシュが含まれていると、指定に効果がないことになる。
13820 @command{basename} は、結果を標準出力に表示する。
13821
13822 @c This test is used both here and in the section on dirname.
13823 @macro basenameAndDirname
13824 @command{basename} と @command{dirname} は合わせて設計されており、もし @samp{ls "$name"}
13825 が成功するならば、@samp{cd "$(dirname "$name")"; ls "$(basename "$name")"}
13826 というコマンドの連続も成功するようになっている。
13827 これは、ファイル名の末尾に改行が付いている場合を除いて、あらゆる場合にうまく行く。
13828 @end macro
13829 @basenameAndDirname
13830
13831 POSIX によれば、@var{name} が空の場合や @samp{//} の場合に、結果がどうなるかは、
13832 実装側で決めてよいことになっている。前者の場合、GNU の @command{basename} は、空文字列を返す。
13833 後者の場合、@var{//} と @var{/} とが別のものであるプラットフォームでは、結果は
13834 @samp{//} になり、全く区別しないプラットフォームでは、結果は @samp{/} になる。
13835
13836 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
13837 オプションはオペランドの前に置かなければならない。
13838
13839 @table @samp
13840
13841 @item -a
13842 @itemx --multiple
13843 @opindex -a
13844 @opindex --multiple
13845 複数の引数を受け付ける。すべての引数は @var{name} として処理される。
13846 このオプションを使用する場合、@var{suffix} を指定するならば、@option{-s}
13847 オプションを使わなければならない。
13848
13849 @item -s @var{suffix}
13850 @itemx --suffix=@var{suffix}
13851 @opindex -s
13852 @opindex --suffix
13853 末尾にある @var{suffix} を除去する。このオプションを指定すると
13854 @option{-a} オプションも指定したことになる。
13855
13856 @optZero
13857
13858 @end table
13859
13860 @exitstatus
13861
13862 用例:
13863
13864 @smallexample
13865 # "sort" を出力する。
13866 basename /usr/bin/sort
13867
13868 # "stdio" を出力する。
13869 basename include/stdio.h .h
13870
13871 # "stdio" を出力する。
13872 basename -s .h include/stdio.h
13873
13874 # "stdio", "stdlib" の順に出力する。
13875 basename -a -s .h include/stdio.h include/stdlib.h
13876 @end smallexample
13877
13878
13879 @node dirname invocation
13880 @section @command{dirname}: ファイル名から最後の要素を取り除く
13881
13882 @pindex dirname
13883 @cindex directory components, printing
13884 @cindex stripping non-directory suffix
13885 @cindex non-directory suffix, stripping
13886
13887 @command{dirname} は、各 @var{name} からスラッシュで区切られた最後の要素を取り除いて、
13888 残りのすべてを表示する。その際、最後の要素の左右どちらにあるスラッシュも除去される。
13889 @var{name} を構成する文字列にスラッシュが一つも含まれない場合、
13890 @command{dirname} は (カレントディレクトリを意味する) @samp{.} を表示する。
13891
13892 書式:
13893
13894 @example
13895 dirname [@var{option}] @var{name}@dots{}
13896 @end example
13897
13898 @var{name} は実在するファイル名でなくても構わないが、実在するファイル名ならば、
13899 この操作によって、最後の要素それ自体がディレクトリである場合も含めて、
13900 最後の要素が存在するディレクトリが、利用できる形で表示される。
13901
13902 @basenameAndDirname
13903
13904 POSIX によれば、@var{name} が @samp{//} の場合に、結果がどうなるかは、
13905 実装側で決めてよいことになっている。
13906 GNU の @command{dirname} について言うと、@var{//} と @var{/}
13907 とが別のものであるプラットフォームでは、結果は @samp{//} になり、
13908 全く区別しないプラットフォームでは、結果は @samp{/} になる。
13909
13910 このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.
13911
13912 @table @samp
13913
13914 @optZero
13915
13916 @end table
13917
13918 @exitstatus
13919
13920 用例:
13921
13922 @smallexample
13923 # "/usr/bin" を出力する。
13924 dirname /usr/bin/sort
13925 dirname /usr/bin//.//
13926
13927 # "dir1", "dir2" の順に出力する。
13928 dirname dir1/str dir2/str
13929
13930 # "." を出力する。
13931 dirname stdio.h
13932 @end smallexample
13933
13934
13935 @node pathchk invocation
13936 @section @command{pathchk}: ファイル名の有効性や可搬性を検査する
13937
13938 @pindex pathchk
13939 @cindex file names, checking validity and portability
13940 @cindex valid file names, checking for
13941 @cindex portable file names, checking for
13942
13943 @command{pathchk} は、ファイル名が有効かどうか、可搬性があるかどうかを検査する。
13944
13945 書式:
13946
13947 @example
13948 pathchk [@var{option}]@dots{} @var{name}@dots{}
13949 @end example
13950
13951 @command{pathchk} は各 @var{name} に対して、以下の条件のどれかが真ならば、
13952 エラーメッセージを出す。
13953
13954 @enumerate
13955 @item
13956 @var{name} 中の実在するディレクトリの一つが、検索 (実行) 許可を持っていない。
13957 @item
13958 @var{name} の長さが、オペレーティング・システムによってサポートされている最大長を越えている。
13959 @item
13960 @var{name} の構成要素の一つの長さが、
13961 それが存在することになるファイルシステムによってサポートされている最大長を越えている。
13962 @end enumerate
13963
13964 実在しないファイル名を指定しても、エラーにはならない。
13965 その名前のファイルが、上記の条件内で作成可能であればよい。
13966
13967 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
13968 オプションはオペランドの前に置かなければならない。
13969
13970 @table @samp
13971
13972 @item -p
13973 @opindex -p
13974 実際に使用しているファイルシステムに基づいて検査を行うのではなく、
13975 以下の条件を調べて、そのどれかが真ならば、エラーメッセージを出す。
13976
13977 @enumerate
13978 @item
13979 ファイル名が空である。
13980
13981 @item
13982 ファイル名に、どのシステムでもファイル名に使用できる文字として
13983 POSIX が規定している文字セット以外の文字が含まれている。
13984 すなわち、ASCII 英数字、@samp{.}、@samp{_}、@samp{-}、@samp{/}
13985 以外の文字が使用されている。
13986
13987 @item
13988 ファイル名の長さや、その構成要素の一つの長さが、
13989 POSIX の規格で可搬性のために最小限サポートしなければならないとされている長さを越えている。
13990 @end enumerate
13991
13992 @item -P
13993 @opindex -P
13994 ファイル名が空だったり、@samp{-} で始まる構成要素を含んでいたりすると、エラーメッセージを出す。
13995
13996 @item --portability
13997 @opindex --portability
13998 ファイル名が POSIX に準拠しているすべてのホストで使えるものでなければ、エラーメッセージを出す。
13999 このオプションは、@samp{-p -P} と同じことである。
14000
14001 @end table
14002
14003 @cindex exit status of @command{pathchk}
14004 終了ステータス:
14005
14006 @display
14007 0: 指定されたすべてのファイル名が検査のすべてにパスした場合。
14008 1: それ以外。
14009 @end display
14010
14011 @node mktemp invocation
14012 @section @command{mktemp}: テンポラリファイルやディレクトリを作成する
14013
14014 @pindex mktemp
14015 @cindex file names, creating temporary
14016 @cindex directory, creating temporary
14017 @cindex temporary files and directories
14018
14019 @command{mktemp} は、テンポラリファイルやテンポラリディレクトリの作成を行う。
14020
14021 書式:
14022
14023 @example
14024 mktemp [@var{option}]@dots{} [@var{template}]
14025 @end example
14026
14027 @command{mktemp} は、@var{template} を基にして、
14028 安全なテンポラリファイルやディレクトリを作成し、その名前を表示する。
14029 @var{template} を指定する場合、その最後の構成部分に少なくとも
14030 3 個の連続する @samp{X} が含まれていなければならない。@var{template}
14031 を省略した場合は、@samp{tmp.XXXXXXXXXX} というテンプレートが使用され、
14032 @option{--tmpdir} オプションが暗黙のうちに指定されることになる。
14033 @var{template} 中の @samp{X} が連続する最後の部分は、英数字で置き換えられる。
14034 従って、大文字小文字を区別するファイルシステムなら、テンプレートに連続する
14035 @var{n} 個の @samp{X} が含まれていると、作成されるファイル名には、
14036 62 の @var{n} 乗とおりの可能性があることになる。
14037
14038 昔のスクリプトでは、テンポラリファイルを作成する際、そのプログラム名にプロセス ID
14039 (@samp{$$}) を拡張子として付けで済ますのが習慣だった。
14040 しかし、この命名法は、名前の推測が容易であり、従って、競合状態を起こしやすいという弱点がある。
14041 攻撃者としては、テンポラリファイルに使われそうな名前でシンボリックリンクを作っておけばよい。
14042 そうすれば、スクリプトが未使用のファイルだと考えて、テンポラリファイルのファイルハンドルを開いたとき、
14043 実際にはすでに存在しているファイルの更新をしているということになる。
14044 同じ命名法を使ってディレクトリを作成するのは、もう少し安全である。
14045 作成しようとするディレクトリがすでに存在していると、@command{mkdir}
14046 は実行に失敗するからだ。とは言え、こちらもサービス不能化攻撃
14047 (denial of service attacks) を可能にしてしまうわけで、やはり良策とは言えない。
14048 それ故、新しいスクリプトでは @command{mktemp} コマンドを使用するべきである。
14049 そうすれば、生成されるファイル名が確実に予測不可能になるので、
14050 実行中のスクリプトがテンポラリファイルの名前を知っているというまさにその事実が、
14051 ファイルを作成したのはそのスクリプトであり、他のユーザによってそのファイルが変更されることはありえないと、間違いなく示すことになる。
14052
14053 ファイルを作成する場合、作成されるファイルには現在のユーザに対する読み込みと書き出しの許可が付くが、
14054 グループやその他のユーザに対しては、いかなる許可も付かない。
14055 現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。
14056
14057 用例をいくつか挙げてみる (ただし、注意していただきたいが、
14058 お手元でこの通り実行しても、おそらくファイル名は違ったものになるはずだ)。
14059
14060 @itemize @bullet
14061
14062 @item
14063 カレントディレクトリにテンポラリファイルを作成する。
14064 @example
14065 $ mktemp file.XXXX
14066 file.H47c
14067 @end example
14068
14069 @item
14070 一般的な拡張子を付けて、テンポラリファイルを作成する。
14071 @example
14072 $ mktemp --suffix=.txt file-XXXX
14073 file-H08W.txt
14074 $ mktemp file-XXXX-XXXX.txt
14075 file-XXXX-eI9L.txt
14076 @end example
14077
14078 @item
14079 ユーザが環境変数 @env{TMPDIR} で指定しているディレクトリを基点として、
14080 その下に安全な FIFO を作成する。@env{TMPDIR} が設定されていない場合は、
14081 @file{/tmp} ではなく、カレントディレクトリを基点として使用する。
14082 肝腎な点は、@command{mktemp} は FIFO を作成しないが、FIFO
14083 を置くことができる安全なディレクトリなら作成できるということである。
14084 ディレクトリや FIFO を作成することができなかったときは、シェルを終了する。
14085 @example
14086 $ dir=$(mktemp -p "$@{TMPDIR:-.@}" -d dir-XXXX) || exit 1
14087 $ fifo=$dir/fifo
14088 $ mkfifo "$fifo" || @{ rmdir "$dir"; exit 1; @}
14089 @end example
14090
14091 @item
14092 可能ならば、テンポラリファイルを作成して使用するが、作成に失敗しても、
14093 エラーメッセージを出さない。ファイルは、環境変数 @env{TMPDIR}
14094 が設定されていれば、そこで指名されているディレクトリに作られるが、
14095 設定されていなければ、@file{/tmp} に作られる。
14096 @example
14097 $ file=$(mktemp -q) && @{
14098 >   # $file をこのブロックの内側でのみ使用することにすれば、
14099 >   # 安全である。$file を引用符で囲んでいるのは、$TMPDIR が、
14100 >   # 従って、$file が、ホワイトスペースを含んでいるかも
14101 >   # しれないからだ。
14102 >   echo ... > "$file"
14103 >   rm "$file"
14104 > @}
14105 @end example
14106
14107 @item
14108 擬似ランダム文字発生装置として動作する
14109 (カレントディレクトリの内容によって影響を受けるので、完全にランダムではない)。
14110 セキュリティホールを避けたいならば、生成された名前を使って、ファイルを作ってはいけない。
14111 @example
14112 $ mktemp -u XXX
14113 Gb9
14114 $ mktemp -u XXX
14115 nzC
14116 @end example
14117
14118 @end itemize
14119
14120 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
14121
14122 @table @samp
14123
14124 @item -d
14125 @itemx --directory
14126 @opindex -d
14127 @opindex --directory
14128 ファイルではなく、ディレクトリを作成する。
14129 作成されるディレクトリには現在のユーザに対して、読み、書き、検索の許可が付くが、
14130 グループやその他のユーザに対しては、いかなる許可も付かない。
14131 現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。
14132
14133 @item -q
14134 @itemx --quiet
14135 @opindex -q
14136 @opindex --quiet
14137 ファイルやディレクトリの作成に失敗しても、エラーメッセージを出さない。
14138 終了ステータスは、ファイルが作成されたかどうかをやはり反映する。
14139
14140 @item -u
14141 @itemx --dry-run
14142 @opindex -u
14143 @opindex --dry-run
14144 既存のファイルの名前と重ならないテンポラリファイル用の名前を生成するが、
14145 ファイルシステムの内容を変更することはない (訳注: 要するに、
14146 テンポラリファイル名を生成表示するだけで、実際にファイルを作成することはないということ)。
14147 このコマンドの出力を使って、新しいファイルを作るのは、本質的に安全ではない。
14148 名前の生成とその使用との間には、時間差があり、
14149 その間に他のプロセスが同じ名前でオブジェクトを作成することもありえるからである。
14150
14151 @item -p @var{dir}
14152 @itemx --tmpdir[=@var{dir}]
14153 @opindex -p
14154 @opindex --tmpdir
14155 @var{template} をディレクトリ @var{dir} を基点とする相対パスとして扱う。
14156 @var{dir} が指定されていない場合や (ロングオプションの @option{--tmpdir}
14157 でのみ可能)、空文字列の場合は、環境変数 @env{TMPDIR} が設定されていれば、
14158 その値を使用し、設定されていなければ、@samp{/tmp} を使用する。
14159 このオプションを指定する場合、 @var{template} は絶対パスであってはならない。
14160 とは言え、@var{template} にスラッシュが含まれていても構わないが、
14161 その場合、途中にあるディレクトリはすでに存在していなければならない。
14162
14163 @item --suffix=@var{suffix}
14164 @opindex --suffix
14165 @var{template} の末尾に @var{suffix} を追加する。@var{suffix}
14166 はスラッシュを含んでいてはならない。@option{--suffix} を指定する場合、
14167 @var{template} は @samp{X} で終わっていなければならない。
14168 @option{--suffix} が指定されていない場合は、@var{template}
14169 中の最後の @samp{X} の位置を調べることで、@var{suffix} としてふさわしいものを推測する。
14170 このオプションが存在するのは、デフォルトの @var{template} を使用しているとき、
14171 @samp{X} で始まる @var{suffix} を付けられるようにするためである。
14172
14173 @item -t
14174 @opindex -t
14175 @var{template} を、環境変数 @env{TMPDIR} が設定されていれば、
14176 その値であるディレクトリ直下の 1 個のファイルとして扱う。
14177 @env{TMPDIR} が設定されていなければ、@option{-p} で指定されるディレクトリ直下、
14178 それ以外の場合は、@samp{/tmp} 直下になる。なお、@var{template}
14179 にスラッシュが含まれていてはならない。このオプションは非推奨である。
14180 @option{-t} なしで @option{-p} を使う方が (@env{TMPDIR}
14181 よりコマンドラインの指定を優先するという点で) デフォルトの動作として優れているし、
14182 (途中のディレクトリも指定できるという点で) 柔軟性も上だからである。
14183
14184 @end table
14185
14186 @cindex exit status of @command{mktemp}
14187 終了ステータス:
14188
14189 @display
14190 0: ファイルが作成された場合。
14191 1: それ以外。
14192 @end display
14193
14194
14195 @node realpath invocation
14196 @section @command{realpath}: ファイル名を展開して表示する
14197
14198 @pindex realpath
14199 @cindex file names, canonicalization
14200 @cindex symlinks, resolution
14201 @cindex canonical file name
14202 @cindex canonicalize a file name
14203 @pindex realpath
14204 @findex realpath
14205
14206 @command{realpath} は、すべてのシンボリックリンクを展開し、
14207 @samp{/./} や @samp{/../} に対する参照を解決する。
14208 さらに、余分な @samp{/} 文字の削除も行う。デフォルトでは、
14209 指定したファイル名のうち、最後の要素以外のすべての要素が実在していなければならない。
14210
14211 書式:
14212
14213 @example
14214 realpath [@var{option}]@dots{} @var{file}@dots{}
14215 @end example
14216
14217 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
14218
14219 @table @samp
14220
14221 @item -e
14222 @itemx --canonicalize-existing
14223 @opindex -e
14224 @opindex --canonicalize-existing
14225 指定されたファイル名中のすべての構成要素が実在することを確認する。
14226 存在しなかったり、利用できなかったりする要素があると、@option{-q}
14227 オプションが指定されていないかぎり、@command{realpath}
14228 はエラーメッセージを出し、0 以外の終了コードで終了する。
14229 ファイル名の末尾にスラッシュを付けると、その名前はディレクトリであるという指定になる。
14230
14231 @item -m
14232 @itemx --canonicalize-missing
14233 @opindex -m
14234 @opindex --canonicalize-missing
14235 指定されたファイル名中に存在しなかったり、使用できなかったりする構成要素があれば、
14236 それをディレクトリとして処理する。
14237
14238 @item -L
14239 @itemx --logical
14240 @opindex -L
14241 @opindex --logical
14242 指定されたファイル名中にあるシンボリックリンクの展開を行うが、
14243 シンボリックリンクに @samp{..} という要素が後続している場合は、
14244 シンボリックリンクを展開するより前に、そちらを先に処理する。
14245 (訳注: 例を挙げた方が、わかりやすいだろう。@samp{symlink-directory/../..}
14246 といったファイル名が与えられた場合、symlink-directory
14247 というシンボリックリンクそのものの親ディレクトリの親ディレクトリに展開するということ。
14248 次項の注と比較していただきたい。)
14249
14250 @item -P
14251 @itemx --physical
14252 @opindex -P
14253 @opindex --physical
14254 指定されたファイル名中にあるシンボリックリンの展開を行う際、
14255 シンボリックリンクに @samp{..} という要素が後続している場合も、
14256 シンボリックリンクを展開してから、@samp{..} の処理を行う。
14257 こちらがデフォルトの動作モードである。(訳注: すなわち、
14258 @samp{symlink-directory/../..} といったファイル名が与えられた場合、
14259 シンボリックリンクの参照先の親ディレクトリの親ディレクトリに展開する。)
14260
14261 @item -q
14262 @itemx --quiet
14263 @opindex -q
14264 @opindex --quiet
14265 指定されたファイル名についてエラーメッセージを出力しない。
14266
14267 @item --relative-to=@var{file}
14268 @opindex --relative-to
14269 @cindex relpath
14270 オプション引数に指定したファイルを基点とする相対パスとして、
14271 ファイル名を展開する。このオプションは、ファイルの存在に関して
14272 @option{-m} や @option{-e} オプションを認識することに注意していただきたい。
14273
14274 @item --relative-base=@var{base}
14275 @opindex --relative-base
14276 このオプションは @option{--relative-to} と一緒に使うこともでき、
14277 その場合は、操作対象の @var{file} が @var{base} 以下のディレクトリに存在するときにのみ、
14278 相対パス名を表示するように、@option{--relative-to} の出力に制限を課す。
14279 @var{file} が @var{base} 以下のディレクトリに存在しないときは、
14280 出力は絶対パスのファイル名になる。@option{--relative-to} を指定しなかった場合、
14281 @var{base} 以下のディレクトリに存在するファイルは、@var{base}
14282 を基点とする相対パスで表示される。@option{--relative-to} も指定するなら、
14283 そのディレクトリは @var{base} の下位ディレクトリでなければならず、
14284 さもないと、このオプションは効果を持たない。このオプションは、ファイルの存在に関して
14285 @option{-m} や @option{-e} オプションを認識することに注意していただきたい。
14286 例を挙げよう。
14287
14288 @example
14289 realpath --relative-to=/usr /tmp /usr/bin
14290 @result{} ../tmp
14291 @result{} bin
14292 realpath --relative-base=/usr /tmp /usr/bin
14293 @result{} /tmp
14294 @result{} bin
14295 @end example
14296
14297 @item -s
14298 @itemx --strip
14299 @itemx --no-symlinks
14300 @opindex -s
14301 @opindex --strip
14302 @opindex --no-symlinks
14303 シンボリックリンクの展開を行わない。すなわち、@samp{/./} や @samp{/../}
14304 の参照の解決と、余分な @samp{/} 文字の削除だけを行う。
14305 @option{-m} オプションと組み合わせた場合、@command{realpath}
14306 は与えられたファイル名に対して操作を行うだけであり、
14307 その各要素が存在しているかどうか、実在のファイルに当たってみることはない。
14308
14309 @optZero
14310
14311 @end table
14312
14313 @cindex exit status of @command{realpath}
14314 終了ステータス:
14315
14316 @display
14317 0: すべてのファイル名が問題なく表示できた場合。
14318 1: それ以外。
14319 @end display
14320
14321
14322 @node Working context
14323 @chapter 作業環境
14324
14325 @cindex working context
14326 @cindex commands for printing the working context
14327
14328 この章では、現在作業中の環境を表示したり、変更したりするコマンドを説明する。
14329 ここで環境というのは、カレントディレクトリ、端末の設定などである。
14330 次章で取り上げるユーザ関係のコマンドも参照していただきたい。
14331
14332 @menu
14333 * pwd invocation::           現在作業中のディレクトリを表示する。
14334 * stty invocation::          端末の諸特性を表示・変更する。
14335 * printenv invocation::      環境変数を表示する。
14336 * tty invocation::           標準入力に接続している端末のファイル名を表示する。
14337 @end menu
14338
14339
14340 @node pwd invocation
14341 @section @command{pwd}: 現在作業中のディレクトリを表示する
14342
14343 @pindex pwd
14344 @cindex print name of current directory
14345 @cindex current working directory, printing
14346 @cindex working directory, printing
14347
14348
14349 @command{pwd} は、カレントディレクトリの名前を表示する。
14350
14351 書式:
14352
14353 @example
14354 pwd [@var{option}]@dots{}
14355 @end example
14356
14357 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
14358
14359 @table @samp
14360 @item -L
14361 @itemx --logical
14362 @opindex -L
14363 @opindex --logical
14364 環境変数 @env{PWD} の値が、@samp{.} や @samp{..}
14365 を含まないカレントディレクトリの絶対パス名であっても、
14366 シンボリックリンクは含んでいるかもしれない。
14367 その場合は、その値をそのまま出力する。それ以外の場合は、デフォルトの
14368 @option{-P} オプションと同じ処理を行う。
14369
14370 @item -P
14371 @itemx --physical
14372 @opindex -P
14373 @opindex --physical
14374 カレントディレクトリについて、参照を完全に解決した名前を表示する。
14375 すなわち、表示される名前のすべての要素が、本物のディレクトリの名前になり、
14376 シンボリックリンクは一つも含まれない。
14377 @end table
14378
14379 @cindex symbolic links and @command{pwd}
14380 @option{-L} と @option{-P} のオプションが両方とも指定されている場合は、
14381 最後に指定された方が優先される。どちらのオプションも指定されない場合は、
14382 環境変数  @env{POSIXLY_CORRECT} が設定されていないかぎり、この実装では、
14383 @option{-P} がデフォルトとして使用される。
14384
14385 @mayConflictWithShellBuiltIn{pwd}
14386
14387 @exitstatus
14388
14389
14390 @node stty invocation
14391 @section @command{stty}: 端末の諸特性を表示・変更する
14392
14393 @pindex stty
14394 @cindex change or print terminal settings
14395 @cindex terminal settings
14396 @cindex line settings of terminal
14397
14398 @command{stty} は、たとえばボーレート (baud rate) のような、端末の諸特性を表示、
14399 または変更する。
14400
14401 書式:
14402
14403 @example
14404 stty [@var{option}] [@var{setting}]@dots{}
14405 stty [@var{option}]
14406 @end example
14407
14408 tty ラインの設定 (訳注: 上記書式の @var{setting}) を一つも指定しない場合、
14409 @command{stty} は、ボーレートと (それをサポートしているシステムでは)
14410 ライン制御規則番号 (line discipline number)、それに、ライン設定のうち
14411 @samp{stty sane} によって設定される値から変更のあるものを表示する。
14412 デフォルトでは、モードの取得や設定は、標準入力に結びついている tty ラインに対して行うが、
14413 これは @option{--file} オプションによって変更することができる。
14414
14415 @command{stty} では、以下で述べるように、オプションではないたくさんの引数が使える。
14416 そうした引数は、端末ライン運用の様々な面を変更する。
14417
14418 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
14419
14420 @table @samp
14421 @item -a
14422 @itemx --all
14423 @opindex -a
14424 @opindex --all
14425 現在のすべての設定を人間に読みやすい形で表示する。
14426 このオプションを指定したときには、ラインの設定はできない。
14427
14428 @item -F @var{device}
14429 @itemx --file=@var{device}
14430 @opindex -F
14431 @opindex --file
14432 標準入力に結びついている tty ラインを操作の対象にする代わりに、
14433 @var{device} で指定されたファイル名を使ってオープンするラインを操作の対象にする。
14434 このオプションが必要なのは、POSIX 準拠の tty をオープンするには、
14435 @code{O_NONDELAY} フラグを使う必要があるからだ。
14436 そうしないと、POSIX 準拠の tty は、@code{clocal} フラグがセットされていない場合に、
14437 キャリア検出線 (carrier detect line) が活発化するまで、ブロッキングを起こす。
14438 そんなわけで、デバイスのオープンは、いつも通りのやり方で
14439 (訳注: たとえば、@samp{stty < /dev/ttyS1} といった形で)
14440 シェルにやらせておけばよい、というわけには必ずしも行かないのである。
14441
14442 @item -g
14443 @itemx --save
14444 @opindex -g
14445 @opindex --save
14446 @cindex machine-readable @command{stty} output
14447 現在の設定を別の @command{stty} コマンドを使って再現する際に、
14448 その引数として使えるような形で、現在のすべての設定を表示する。
14449 このオプションを指定したときには、ラインの設定はできない。
14450
14451 @end table
14452
14453 設定の多くは、前に @samp{-} を付けることで OFF にすることができる。
14454 以下では、そうした引数については、説明中に「無効化できる」と記しておいた。
14455 説明そのものは、有効にする場合について、すなわち、@samp{-} で OFF にしない場合について述べている
14456 (「無効にした場合」とはっきりことわっている場合は、もちろん別である)。
14457
14458 設定の中には、すべての POSIX 準拠システムで利用できるとはかぎらないものもある。
14459 そうしたものは、拡張機能を使用しているからだ。
14460 以下では、そうした引数については、説明中に「非 POSIX」と記しておいた。
14461 非 POSIX のシステムであっても、そうした設定が使えないことがあるかもしれないが、
14462 あらゆる場合について書いておくことは、不可能である。とりあえず、試してみていただきたい。
14463
14464 @command{stty} がインストールされるのは、POSIX ターミナルインターフェースを備えたシステムだけである。
14465 従って、移植を考慮したスクリプトでは、非 POSIX システムに @command{stty}
14466 コマンドが存在することを当てにしない方がよい。
14467
14468 @exitstatus
14469
14470 @menu
14471 * Control::                  制御関係の設定
14472 * Input::                    入力に関する設定
14473 * Output::                   出力に関する設定
14474 * Local::                    ローカル設定
14475 * Combination::              組み合わせ設定
14476 * Characters::               特殊文字
14477 * Special::                  特殊設定
14478 @end menu
14479
14480
14481 @node Control
14482 @subsection 制御関係の設定
14483
14484 @cindex control settings
14485 制御関係の設定:
14486
14487 @table @samp
14488 @item parenb
14489 @opindex parenb
14490 @cindex two-way parity
14491 出力にパリティビットを生成し、入力にもパリティビットがあるものと期待する。
14492 無効化できる。
14493
14494 @item parodd
14495 @opindex parodd
14496 @cindex odd parity
14497 @cindex even parity
14498 パリティを奇数に設定する。無効化できる (この設定の場合、@samp{-}
14499 の前置は偶数パリティを意味する)。
14500
14501 @item cmspar
14502 @opindex cmspar
14503 @cindex constant parity
14504 @cindex stick parity
14505 @cindex mark parity
14506 @cindex space parity
14507 "stick" (mark/space) パリティを使用する。
14508 parodd が設定されている場合、このパリティビットは常に 1 である。
14509 parodd が設定されていない場合、このパリティビットは常に 0 だ。
14510 非 POSIX。無効化できる。
14511
14512 @item cs5
14513 @itemx cs6
14514 @itemx cs7
14515 @itemx cs8
14516 @opindex cs@var{n}
14517 @cindex character size
14518 @cindex eight-bit characters
14519 キャラクタ・サイズを 5, 6, 7, 8 ビットにする。
14520
14521 @item hup
14522 @itemx hupcl
14523 @opindex hup[cl]
14524 最後のプロセスが tty をクローズするとき、ハングアップ・シグナルを送る。
14525 無効化できる。
14526
14527 @item cstopb
14528 @opindex cstopb
14529 @cindex stop bits
14530 1 キャラクタにつき 2 個のストップビットを使用する。無効化できる
14531 (この設定の場合、@samp{-} の前置は 1 個のストップビット使用を意味する)。
14532
14533 @item cread
14534 @opindex cread
14535 入力の受信を許可する。無効化できる。
14536
14537 @item clocal
14538 @opindex clocal
14539 @cindex modem control
14540 モデムのコントロール・シグナルを無効にする。無効化できる。
14541
14542 @item crtscts
14543 @opindex crtscts
14544 @cindex hardware flow control
14545 @cindex flow control, hardware
14546 @cindex RTS/CTS flow control
14547 RTS/CTS フロー制御を有効にする。非 POSIX。無効化できる。
14548
14549 @item cdtrdsr
14550 @opindex cdtrdsr
14551 @cindex hardware flow control
14552 @cindex flow control, hardware
14553 @cindex DTR/DSR flow control
14554 DTR/DSR フロー制御を有効にする。非 POSIX。無効化できる。
14555 @end table
14556
14557
14558 @node Input
14559 @subsection 入力に関する設定
14560
14561 @cindex input settings
14562 以下の設定は、端末から受け取るデータに対する操作を制御する。
14563
14564 @table @samp
14565 @item ignbrk
14566 @opindex ignbrk
14567 @cindex breaks, ignoring
14568 ブレーク (break) 文字を無視する。無効化できる。
14569
14570 @item brkint
14571 @opindex brkint
14572 @cindex breaks, cause interrupts
14573 ブレークが割り込みシグナルを発生するようにする。無効化できる。
14574
14575 @item ignpar
14576 @opindex ignpar
14577 @cindex parity, ignoring
14578 パリティエラーのある文字を無視する。無効化できる。
14579
14580 @item parmrk
14581 @opindex parmrk
14582 @cindex parity errors, marking
14583 パリティエラーをマークする (その印として 255, 0 (0xFF, 0x00) という
14584 2 文字の連続を使う)。無効化できる。
14585
14586 @item inpck
14587 @opindex inpck
14588 入力のパリティチェックを有効にする。無効化できる。
14589
14590 @item istrip
14591 @opindex istrip
14592 @cindex eight-bit input
14593 入力文字の高位ビット (8 番目のビット) をクリアする。無効化できる。
14594
14595 @item inlcr
14596 @opindex inlcr
14597 @cindex newline, translating to return
14598 改行文字 (newline) を復帰文字 (carriage return) に変換する。無効化できる。
14599
14600 @item igncr
14601 @opindex igncr
14602 @cindex return, ignoring
14603 復帰文字を無視する。無効化できる。
14604
14605 @item icrnl
14606 @opindex icrnl
14607 @cindex return, translating to newline
14608 復帰文字を改行文字に変換する。無効化できる。
14609
14610 @item iutf8
14611 @opindex iutf8
14612 @cindex input encoding, UTF-8
14613 入力文字が UTF-8 で符号化されていると見なす。無効化できる。
14614
14615 @item ixon
14616 @opindex ixon
14617 @kindex C-s/C-q flow control
14618 @cindex XON/XOFF flow control
14619 XON/XOFF フロー制御を有効にする (すなわち、@kbd{Ctrl-S}/@kbd{Ctrl-Q}
14620 を有効にする)。無効化できる。
14621
14622 @item ixoff
14623 @itemx tandem
14624 @opindex ixoff
14625 @opindex tandem
14626 @cindex software flow control
14627 @cindex flow control, software
14628 システムの入力バッファが一杯になりかけたら、@code{stop} 文字を送り、
14629 バッファがほぼ空に戻ったら、@code{start} 文字を送るようにする。
14630 無効化できる。
14631
14632 @item iuclc
14633 @opindex iuclc
14634 @cindex uppercase, translating to lowercase
14635 大文字を小文字に変換する。非 POSIX。無効化できる。
14636 ilcuc は実装されていないことに注意していただきたい。
14637 そんなものを有効にしたら、ほとんどの (小文字である) Unix のコマンドが、
14638 打ち込めなくなってしまうからだ。
14639
14640 @item ixany
14641 @opindex ixany
14642 どんな文字でも出力を再開できるようにする (これを無効にすると、start
14643 文字のみが出力を再開する)。非 POSIX。無効化できる。
14644
14645 @item imaxbel
14646 @opindex imaxbel
14647 @cindex beeping at input buffer full
14648 入力バッファが一杯のとき、文字を受け取ると、入力バッファをフラッシュせずに、
14649 ビープ音を鳴らすようにする。非 POSIX。無効化できる。
14650 @end table
14651
14652
14653 @node Output
14654 @subsection 出力に関する設定
14655
14656 @cindex output settings
14657 以下の設定は、端末に送るデータに対する操作を制御する。
14658
14659 @table @samp
14660 @item opost
14661 @opindex opost
14662 出力に対して後処理 (postprocess) を行う
14663 (訳注: すなわち、以下に列挙するようなことをする)。無効化できる。
14664
14665 @item olcuc
14666 @opindex olcuc
14667 @cindex lowercase, translating to output
14668 小文字を大文字に変換する。非 POSIX。無効化できる。
14669 (ouclc は現在のところ、実装されていないことに注意。)
14670
14671 @item ocrnl
14672 @opindex ocrnl
14673 @cindex return, translating to newline
14674 復帰文字 (carriage return) を改行文字 (newline) に変換する。
14675 非 POSIX。無効化できる。
14676
14677 @item onlcr
14678 @opindex onlcr
14679 @cindex newline, translating to crlf
14680 改行文字を復帰文字 + 改行文字に変換する。非 POSIX。無効化できる。
14681
14682 @item onocr
14683 @opindex onocr
14684 行頭に復帰文字を出力しない。非 POSIX。無効化できる。
14685
14686 @item onlret
14687 @opindex onlret
14688 改行が復帰として動作する。非 POSIX。無効化できる。
14689
14690 @item ofill
14691 @opindex ofill
14692 @cindex pad instead of timing for delaying
14693 時間で間合いを計る代りに、充填文字 (埋め草文字) を何字か送ることで、遅延を行う。
14694 非 POSIX。無効化できる。(訳注: 遅延というのは、端末側の処理が済むまで、データの送出を遅らせること)。
14695
14696 @item ofdel
14697 @opindex ofdel
14698 @cindex pad character
14699 充填文字として ASCII NUL 文字ではなく、ASCII DEL 文字を使う。
14700 非 POSIX。無効化できる。
14701
14702 @item nl1
14703 @itemx nl0
14704 @opindex nl@var{n}
14705 改行 (newline) 用の遅延方式。非 POSIX。
14706
14707 @item cr3
14708 @itemx cr2
14709 @itemx cr1
14710 @itemx cr0
14711 @opindex cr@var{n}
14712 復帰 (carriage return) 用の遅延方式。非 POSIX。
14713
14714 @item tab3
14715 @itemx tab2
14716 @itemx tab1
14717 @itemx tab0
14718 @opindex tab@var{n}
14719 水平タブ用の遅延方式。非 POSIX。
14720
14721 @item bs1
14722 @itemx bs0
14723 @opindex bs@var{n}
14724 バックスペース用の遅延方式。非 POSIX。
14725
14726 @item vt1
14727 @itemx vt0
14728 @opindex vt@var{n}
14729 垂直タブ用の遅延方式。非 POSIX。
14730
14731 @item ff1
14732 @itemx ff0
14733 @opindex ff@var{n}
14734 改ページ (form feed) 用の遅延方式。非 POSIX。
14735 @end table
14736
14737
14738 @node Local
14739 @subsection ローカル設定
14740
14741 @cindex local settings
14742
14743 @table @samp
14744 @item isig
14745 @opindex isig
14746 特殊文字 @code{interrupt}, @code{quit}, @code{suspend} を有効にする。無効化できる。
14747
14748 @item icanon
14749 @opindex icanon
14750 特殊文字 @code{erase}, @code{kill}, @code{werase}, @code{rprnt}
14751 を有効にする。無効化できる。
14752
14753 @item iexten
14754 @opindex iexten
14755 POSIX にない特殊文字を有効にする。無効化できる。
14756
14757 @item echo
14758 @opindex echo
14759 入力した文字をエコーする。無効化できる。
14760
14761 @item echoe
14762 @itemx crterase
14763 @opindex echoe
14764 @opindex crterase
14765 @code{erase} 文字を「バックスペース、スペース、バックスペース」としてエコーする。無効化できる。
14766
14767 @item echok
14768 @opindex echok
14769 @cindex newline echoing after @code{kill}
14770 @code{kill} 文字に続けて、改行文字をエコーする。無効化できる。
14771
14772 @item echonl
14773 @opindex echonl
14774 @cindex newline, echoing
14775 他の文字のエコーを行わないない場合でも、改行文字はエコーする。
14776 無効化できる。
14777
14778 @item noflsh
14779 @opindex noflsh
14780 @cindex flushing, disabling
14781 特殊文字 @code{interrupt} や @code{quit} の後で、フラッシュを行わない。無効化できる。
14782
14783 @item xcase
14784 @opindex xcase
14785 @cindex case translation
14786 @code{icanon} が設定されているとき、小文字を表す文字の頭に
14787 @samp{\} を付けることで、大文字の入出力を可能にする。非 POSIX。無効化できる。
14788 (訳注: たとえば、大文字しか使えない端末で、ただの @samp{A} なら小文字の
14789 a を意味し、@samp{\A} なら大文字の A を意味するようにすること。
14790 次節「組み合わせ設定」の lcase と termios(3) の XCASE の説明を参照。)
14791
14792 @item tostop
14793 @opindex tostop
14794 @cindex background jobs, stopping at terminal write
14795 端末に書き込もうとしているバックグラウンドジョブを止める。
14796 非 POSIX。無効化できる。
14797
14798 @item echoprt
14799 @itemx prterase
14800 @opindex echoprt
14801 @opindex prterase
14802 削除した文字を @samp{\} と @samp{/} で囲んで、逆順にエコーする。非 POSIX。
14803 無効化できる。(訳注: プリンタ端末で使用する設定らしい。)
14804
14805 @item echoctl
14806 @itemx ctlecho
14807 @opindex echoctl
14808 @opindex ctlecho
14809 @cindex control characters, using @samp{^@var{c}}
14810 @cindex hat notation for control characters
14811 制御文字をそのまま表示するのではなく、ハット記法 (@samp{^@var{c}}) でエコーする。
14812 非 POSIX。無効化できる。
14813
14814 @item echoke
14815 @itemx crtkill
14816 @opindex echoke
14817 @opindex crtkill
14818 行上の各文字を削除することで、特殊文字 @code{kill} のエコーを行う際、
14819 @code{echoctl} や @code{echok} の設定ではなく、@code{echoprt} や
14820 @code{echoe} の設定が指示するところに従う。非 POSIX。無効化できる。
14821
14822 @item extproc
14823 @opindex extproc
14824 @samp{LINEMODE} を有効にする。@samp{LINEMODE}
14825 を使用すれば、各文字のエコーを遅延の大きいリンクを通して行わないで済む。
14826 @uref{ftp://ftp.rfc-editor.org/in-notes/rfc1116.txt, Internet RFC 1116}
14827 も参照していただきたい。非 POSIX。無効化できる。
14828
14829 @item flusho
14830 @opindex flusho
14831 出力を破棄する。この設定は、現在のところ GNU/Linux システムでは無視されることに注意。
14832 非 POSIX。無効にできる。
14833 @end table
14834
14835
14836 @node Combination
14837 @subsection 組み合わせ設定
14838
14839 @cindex combination settings
14840 組み合わせ設定:
14841
14842 @table @samp
14843 @item evenp
14844 @opindex evenp
14845 @itemx parity
14846 @opindex parity
14847 @code{parenb -parodd cs7} に相当する。無効化できる。無効化した場合、
14848 @code{-parenb cs8} と同じになる。
14849
14850 @item oddp
14851 @opindex oddp
14852 @code{parenb parodd cs7} に相当する。無効化できる。無効化した場合、
14853 @code{-parenb cs8} と同じになる。
14854
14855 @item nl
14856 @opindex nl
14857 @code{-icrnl -onlcr} に相当する。無効化できる。無効化した場合、@code{icrnl
14858 -inlcr -igncr onlcr -ocrnl -onlret} と同じになる。
14859
14860 @item ek
14861 @opindex ek
14862 特殊文字 @code{erase} と @code{kill} をデフォルトの値に戻す。
14863
14864 @item sane
14865 @opindex sane
14866 以下の設定に相当する。
14867
14868 @c This is too long to write inline.
14869 @example
14870 cread -ignbrk brkint -inlcr -igncr icrnl
14871 icanon iexten echo echoe echok -echonl -noflsh
14872 -ixoff -iutf8 -iuclc -ixany imaxbel -xcase -olcuc -ocrnl
14873 opost -ofill onlcr -onocr -onlret nl0 cr0 tab0 bs0 vt0 ff0
14874 isig -tostop -ofdel -echoprt echoctl echoke -extproc
14875 @end example
14876
14877 @noindent
14878 さらに、すべての特殊文字をそのデフォルトの値に設定する。
14879
14880 @item cooked
14881 @opindex cooked
14882 @code{brkint ignpar istrip icrnl ixon opost isig icanon} に相当する。
14883 さらに、特殊文字 @code{eof} と @code{eol} が @code{min} 及び @code{time}
14884 と同じ文字になっていれば、@code{eof} と @code{eol} をデフォルトの値に設定する。
14885 無効化できる。無効化した場合は、@code{raw} と同じになる。
14886
14887 @item raw
14888 @opindex raw
14889 以下の設定に相当する。
14890
14891 @example
14892 -ignbrk -brkint -ignpar -parmrk -inpck -istrip
14893 -inlcr -igncr -icrnl -ixon -ixoff -icanon -opost
14894 -isig -iuclc -ixany -imaxbel -xcase min 1 time 0
14895 @end example
14896
14897 @noindent
14898 無効化できる。無効化した場合は、@code{cooked} と同じになる。
14899
14900 @item cbreak
14901 @opindex cbreak
14902 @option{-icanon} と同じである。無効化できる。
14903 無効化した場合は、@code{icanon} と同じになる。
14904
14905 @item pass8
14906 @opindex pass8
14907 @cindex eight-bit characters
14908 @code{-parenb -istrip cs8} に相当する。無効化できる。無効化した場合は、
14909 @code{parenb istrip cs7} と同じになる。
14910
14911 @item litout
14912 @opindex litout
14913 @option{-parenb -istrip -opost cs8} に相当する。無効化できる。
14914 無効化した場合は、@code{parenb istrip opost cs7} と同じになる。
14915
14916 @item decctlq
14917 @opindex decctlq
14918 @option{-ixany} と同じである。非 POSIX。無効化できる。
14919
14920 @item tabs
14921 @opindex tabs
14922 @code{tab0} と同じである。非 POSIX。無効化できる。無効化した場合は、
14923 @code{tab3} と同じになる。
14924
14925 @item lcase
14926 @itemx LCASE
14927 @opindex lcase
14928 @opindex LCASE
14929 @code{xcase iuclc olcuc} に相当する。非 POSIX。無効化できる。
14930 (この設定は、大文字しか扱えない端末で使用する。)
14931
14932 @item crt
14933 @opindex crt
14934 @code{echoe echoctl echoke} に相当する。
14935
14936 @item dec
14937 @opindex dec
14938 @code{echoe echoctl echoke -ixany intr ^C erase ^? kill ^U} に相当する。
14939 @end table
14940
14941
14942 @node Characters
14943 @subsection 特殊文字
14944
14945 @cindex special characters
14946 @cindex characters, special
14947
14948 特殊文字のデフォルトの値は、システムによって様々である。
14949 特殊文字を設定するには、@samp{name value} という書式を用いる。
14950 この name に何が指定できるかは、以下に列挙するが、value には、文字そのもの、
14951 ハット記法 (@samp{^@var{c}})、整数のいづれかを指定することができる。
14952 整数は、@samp{0x} で始まっていれば 16 進数、@samp{0} で始まっていれば
14953 8 進数、それ以外の数字なら 10 進数と見なされる。
14954
14955 @cindex disabling special characters
14956 @kindex u@r{, and disabling special characters}
14957 GNU の stty では、値に @code{^-} や @code{undef} を指定すると、
14958 その特殊文字を無効にする。(これは、Ultrix の @command{stty}
14959 と互換性がない。そこでは、特殊文字を無効にするには @samp{u}
14960 という値が使用されるのだ。GNU の @command{stty} は、@samp{u}
14961 という値を特別扱いしない。すなわち、その特殊文字として @key{U}
14962 を設定するだけである。)
14963
14964 @table @samp
14965
14966 @item intr
14967 @opindex intr
14968 割り込み (interrupt) シグナルを送る。
14969
14970 @item quit
14971 @opindex quit
14972 中止 (quit) シグナルを送る。
14973
14974 @item erase
14975 @opindex erase
14976 直前にタイプした文字を削除する。
14977
14978 @item kill
14979 @opindex kill
14980 現在行を削除する。
14981
14982 @item eof
14983 @opindex eof
14984 ファイル終端 (end of file) 文字を送る (入力を終了する)。
14985
14986 @item eol
14987 @opindex eol
14988 行を終端する。
14989
14990 @item eol2
14991 @opindex eol2
14992 行を終端する別の文字。非 POSIX。
14993
14994 @item discard
14995 @opindex discard
14996 @opindex flush
14997 出力を廃棄するか否かをトグルで切り替える文字。非 POSIX。
14998
14999 @item swtch
15000 @opindex swtch
15001 シェルの別の層 (a different shell layer) に切り換える。非 POSIX。
15002
15003 @item status
15004 @opindex status
15005 info シグナルを送る。現在のところ Linux ではサポートされていない。非 POSIX。
15006
15007 @item start
15008 @opindex start
15009 停止している出力を再開する。
15010
15011 @item stop
15012 @opindex stop
15013 出力を停止する。
15014
15015 @item susp
15016 @opindex susp
15017 端末からの停止シグナル (terminal stop signal, SIGTSTP) を送る。
15018
15019 @item dsusp
15020 @opindex dsusp
15021 入力をフラッシュしてから、端末からの停止シグナルを送る。非 POSIX。
15022
15023 @item rprnt
15024 @opindex rprnt
15025 現在行を表示し直す。非 POSIX。
15026
15027 @item werase
15028 @opindex werase
15029 直前にタイプした単語 (word) を削除する。非 POSIX。
15030
15031 @item lnext
15032 @opindex lnext
15033 次にタイプする文字が特殊文字であっても、タイプしたとおりの文字として入力する。
15034 非 POSIX。(訳注: たとえば、lnext が ^V の場合、^V^D
15035 と続けてタイプすると、^D を入力終了の印としてではなく、^D
15036 という文字そのものとして入力できるということ。)
15037 @end table
15038
15039
15040 @node Special
15041 @subsection 特殊設定
15042
15043 @cindex special settings
15044
15045 @table @samp
15046 @item min @var{n}
15047 @opindex min
15048 @option{-icanon} が設定されている際、time の値として指定されている時間が経過するまでの間に、
15049 1 回分の読み込みの条件を満たす最少限の文字数を設定する。
15050
15051 @item time @var{n}
15052 @opindex time
15053 @option{-icanon} が設定されている際、最小限の文字数が読み込まれなかった場合に、
15054 読み込みが時間切れになるまでの時間を 10 分の 1 秒単位で設定する。
15055
15056 @item ispeed @var{n}
15057 @opindex ispeed
15058 入力速度を @var{n} に設定する。
15059
15060 @item ospeed @var{n}
15061 @opindex ospeed
15062 出力速度を @var{n} に設定する。
15063
15064 @item rows @var{n}
15065 @opindex rows
15066 端末の行数は @var{n} 行だと、tty カーネルドライバに伝える。非 POSIX。
15067
15068 @item cols @var{n}
15069 @itemx columns @var{n}
15070 @opindex cols
15071 @opindex columns
15072 端末の横幅は @var{n} 桁だと、カーネルに伝える。非 POSIX。
15073
15074 @item drain
15075 @opindex drain
15076 @cindex nonblocking @command{stty} setting
15077 保留になっている出力が送出されるのを待ち、その後で設定を適用する。
15078 GNU の @command{stty} では、デフォルトで有効になっている。
15079 システムが、シリアルな伝送ができない状態になっているかもしれない場合には、
15080 このオプションを無効にするとよい。
15081 たとえば、@code{ixon} (ソフトウェアによるフロー制御)
15082 が有効になっている場合に、システムが @samp{DC3} 文字を受け取っていたりすると
15083 (訳注: @samp{DC3} は device control 3、すなわち ASCII 0x13、@samp{^S})、
15084 @code{-drain} の指定なしでは、@command{stty} はブロッキングを起こすだろう。
15085 無効化できる。非 POSIX。
15086
15087 @item size
15088 @opindex size
15089 @vindex LINES
15090 @vindex COLUMNS
15091 端末の行数と桁数を表示する。これは、端末が持っていると、カーネルが考えている行数と桁数である。
15092 (カーネルで行数や桁数をサポートしていないシステムでは、通常その代わりに、環境変数
15093 @env{LINES} や @env{COLUMNS} が使用される。
15094 それに対して、GNU の @command{stty} は、そうした環境変数について何も知らない。)
15095 非 POSIX。
15096
15097 @item line @var{n}
15098 @opindex line
15099 ライン制御規則 (line discipline) @var{n} を使用する。非 POSIX。
15100
15101 @item speed
15102 @opindex speed
15103 端末速度を表示する。
15104
15105 @item @var{n}
15106 @cindex baud rate, setting
15107 入出力の速度を @var{n} に設定する。@var{n} には次の一つが使える。0 50 75 110
15108 134 134.5 150 200 300 600 1200 1800 2400 4800 9600 19200 38400
15109 @code{exta} @code{extb}。@code{exta} は 19200 と同じであり、@code{extb} は 38400
15110 と同じである。GNU/Linux を含む多くのシステムが、もっと早い速度をサポートしている。
15111 @command{stty} は、システムがサポートしているならという条件で、次の速度もサポートしている。
15112 57600 115200 230400 460800 500000 576000 921600 1000000 1152000
15113 1500000 2000000 2500000 3000000 3500000 4000000。
15114 なお、0 は、@option{-clocal} が設定されている場合に、ラインを切断する。
15115 @end table
15116
15117
15118 @node printenv invocation
15119 @section @command{printenv}: 環境変数のすべて、あるいは一部を表示する
15120
15121 @pindex printenv
15122 @cindex printing all or some environment variables
15123 @cindex environment variables, printing
15124
15125 @command{printenv} は、環境変数の値を表示する。
15126
15127 書式:
15128
15129 @example
15130 printenv [@var{option}] [@var{variable}]@dots{}
15131 @end example
15132
15133 @var{variable} が一つも指定されていない場合、@command{printenv}
15134 はすべての環境変数の値を表示する。@var{variable} が指定されている場合は、
15135 その変数それぞれについて、設定されていれば値を表示し、設定されていなければ何も表示しない。
15136
15137 このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.
15138
15139 @table @samp
15140
15141 @optNull
15142
15143 @end table
15144
15145 @cindex exit status of @command{printenv}
15146 終了ステータス:
15147
15148 @display
15149 0: 指定されているすべての変数が見つかった。
15150 1: 指定されている変数のうちに、見つからなかったものがある。
15151 2: 書き込みエラーが生じた。
15152 @end display
15153
15154
15155 @node tty invocation
15156 @section @command{tty}: 標準入力に接続している端末のファイル名を表示する
15157
15158 @pindex tty
15159 @cindex print terminal file name
15160 @cindex terminal file name, printing
15161
15162 @command{tty} は、自分の標準入力に接続している端末のファイル名を表示する。
15163 標準入力が端末ではない場合は、@samp{not a tty} というメッセージを出す。
15164
15165 書式:
15166
15167 @example
15168 tty [@var{option}]@dots{}
15169 @end example
15170
15171 このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.
15172
15173 @table @samp
15174
15175 @item -s
15176 @itemx --silent
15177 @itemx --quiet
15178 @opindex -s
15179 @opindex --silent
15180 @opindex --quiet
15181 何も表示しない。終了ステータスを返すだけ。
15182
15183 @end table
15184
15185 @cindex exit status of @command{tty}
15186 終了ステータス:
15187
15188 @display
15189 0: 標準入力が端末である。
15190 1: 標準入力が端末ではない。
15191 2: 指定した引数が正しくない。
15192 3: 書き込みエラーが生じた。
15193 @end display
15194
15195
15196 @node User information
15197 @chapter ユーザ情報
15198
15199 @cindex user information, commands for
15200 @cindex commands for printing user information
15201
15202 この章では、ユーザ関係の情報を表示するコマンドの説明をする。
15203 誰がログインしているか、どんなグループに所属しているか、などである。
15204
15205 @menu
15206 * id invocation::        ユーザの ID を表示する。
15207 * logname invocation::   現在のログイン名を表示する。
15208 * whoami invocation::    実効ユーザ ID を表示する。
15209 * groups invocation::    ユーザが所属しているグループ名を表示する。
15210 * users invocation::     現在ログインしている全ユーザのログイン名を表示する。
15211 * who invocation::       現在誰がログインしているかを表示する。
15212
15213
15214 @end menu
15215
15216
15217 @node id invocation
15218 @section @command{id}: ユーザの ID を表示する
15219
15220 @pindex id
15221 @cindex real user and group IDs, printing
15222 @cindex effective user and group IDs, printing
15223 @cindex printing real and effective user and group IDs
15224
15225 @command{id} は、指定されたユーザについて情報を表示する。
15226 ユーザが指定されていない場合は、@command{id} を実行しているプロセスについて情報を表示する。
15227
15228 書式:
15229
15230 @example
15231 id [@var{option}]@dots{} [@var{user}]
15232 @end example
15233
15234 @var{user} にはユーザ ID (番号) とユーザ名のどちらも使えるが、ID が頭に
15235 @samp{+} を付けて指定されていないかぎり、まずユーザ名として検索が行われる。
15236 @xref{Disambiguating names and IDs}.
15237
15238 @vindex POSIXLY_CORRECT
15239 デフォルトで表示するのは、実ユーザ ID、実グループ ID、実効ユーザ ID
15240 (実ユーザ ID と違う場合)、実効グループ ID (実グループID と違う場合)、
15241 それに、補助 (supplemental) グループ ID である。
15242 さらに、SELinux が有効になっていて、環境変数 @env{POSIXLY_CORRECT}
15243 が設定されていない場合は、@samp{context=@var{c}} も表示する。
15244 この @var{c} はセキュリティ・コンテキストである。
15245
15246 表示される各数値には、それが何であるかを示す文字列が前に付き、
15247 対応するユーザ名やグループ名がカッコで囲まれて後ろに続く。
15248
15249 オプションを指定すると、@command{id} は上で述べた情報のうち、一部のみを表示する。
15250 参照: @ref{Common options}.
15251
15252 @table @samp
15253 @item -g
15254 @itemx --group
15255 @opindex -g
15256 @opindex --group
15257 グループ ID のみ表示する。
15258
15259 @item -G
15260 @itemx --groups
15261 @opindex -G
15262 @opindex --groups
15263 グループ ID と補助グループ ID のみ表示する。
15264
15265 @item -n
15266 @itemx --name
15267 @opindex -n
15268 @opindex --name
15269 ID 番号の代りに、ユーザ名やグループ名を表示する。@option{-u}, @option{-g}, @option{-G}
15270 の一つを指定する必要がある。
15271
15272 @item -r
15273 @itemx --real
15274 @opindex -r
15275 @opindex --real
15276 実効ユーザや実効グループの ID ではなく、実ユーザや実グループの ID を表示する。
15277 @option{-u}, @option{-g}, @option{-G} のどれか一つを指定する必要がある。
15278
15279 @item -u
15280 @itemx --user
15281 @opindex -u
15282 @opindex --user
15283 ユーザ ID のみ表示する。
15284
15285 @item -Z
15286 @itemx --context
15287 @opindex -Z
15288 @opindex --context
15289 @cindex SELinux
15290 @cindex security context
15291 現プロセスのセキュリティ・コンテキストのみを表示する。
15292 たいていの場合、それは、親プロセスから継承したユーザのセキュリティ・コンテキストである。
15293 SELinux と SMACK のどちらも有効になっていない場合は、
15294 警告メッセージを出し、終了ステータスを 1 にする。
15295
15296 @item -z
15297 @itemx --zero
15298 @opindex -z
15299 @opindex --zero
15300 出力する項目を NUL 文字で区切る。
15301 このオプションは、デフォルトのフォーマットを使用しているときは、使うことができない。
15302
15303 用例:
15304 @example
15305 $ id -Gn --zero
15306 users <NUL> devs <NUL>
15307 @end example
15308
15309 @end table
15310
15311 @macro primaryAndSupplementaryGroups{cmd,arg}
15312 プロセスの基本 (primary) グループや 補助 (supplementary) グループは、
15313 通常その親プロセスから継承され、ログイン後ずっと変わらないのが普通だ。
15314 従って、ログイン後にグループ・データベースを変更しても、
15315 現在のログインセッションが続いている間は、@command{\cmd\} コマンドはその変更を反映しない。
15316 しかし、\arg\を指定して @command{\cmd\} を実行した場合は、
15317 ユーザ・データベースやグループ・データベースの参照が改めて行われるので、
15318 変更した結果が表示されることになる。
15319 @end macro
15320 @primaryAndSupplementaryGroups{id,引数にユーザの名前}
15321
15322 @exitstatus
15323
15324 @node logname invocation
15325 @section @command{logname}: 現在のログイン名を表示する
15326
15327 @pindex logname
15328 @cindex printing user's login name
15329 @cindex login name, printing
15330 @cindex user name, printing
15331
15332 @flindex utmp
15333 @command{logname} は、自分を呼び出しているユーザの名前を、システムが管理しているファイル
15334 (たいていは @file{/var/run/utmp} か @file{/etc/utmp})
15335 で調べて表示し、ステータス 0 で終了する。
15336 自分を呼び出しているプロセスのエントリが存在しない場合は、
15337 エラーメッセージを出し、ステータス 1 で終了する。
15338
15339 オプションは、@option{--help} と @option{--version} だけである。
15340 @xref{Common options}.
15341
15342 @exitstatus
15343
15344
15345 @node whoami invocation
15346 @section @command{whoami}: 実効ユーザ ID を表示する
15347
15348 @pindex whoami
15349 @cindex effective user ID, printing
15350 @cindex printing the effective user ID
15351
15352 @command{whoami} は、現在の実効ユーザ ID に対応するユーザ名を表示する。
15353 @samp{id -un} コマンドと同じことである。
15354
15355 オプションは、@option{--help} と @option{--version} だけである。
15356 @xref{Common options}.
15357
15358 @exitstatus
15359
15360
15361 @node groups invocation
15362 @section @command{groups}: ユーザが所属しているグループ名を表示する
15363
15364 @pindex groups
15365 @cindex printing groups a user is in
15366 @cindex supplementary groups, printing
15367
15368 @command{groups} は、@var{username} が指定されていれば、指定された各ユーザの基本
15369 (primary) グループ名と補助 (supplementary) グループ名を表示し、
15370 ユーザ名が指定されていなければ、現在のプロセスの基本グループ名と補助グループ名を表示する。
15371 複数の名前が指定されている場合は、
15372 各ユーザの名前がグループのリストの前に置かれ、両者の間はコロンで区切られる。
15373
15374 書式:
15375
15376 @example
15377 groups [@var{username}]@dots{}
15378 @end example
15379
15380 グループのリストは、@samp{id -Gn} コマンドの出力と同じである。
15381
15382 オプションは、@option{--help} と @option{--version} だけである。
15383 @xref{Common options}.
15384
15385 @primaryAndSupplementaryGroups{groups,ユーザのリスト}
15386
15387 @exitstatus
15388
15389 @node users invocation
15390 @section @command{users}: 現在ログインしている全ユーザのログイン名を表示する
15391
15392 @pindex users
15393 @cindex printing current usernames
15394 @cindex usernames, printing current
15395
15396 @cindex login sessions, printing users with
15397 @command{users} は、目下使用しているホストに現在ログインしている全ユーザのユーザ名のリストを、
15398 空白で区切って 1 行に表示する。
15399 ユーザ名はログインセッションごとに表示されるので、
15400 あるユーザが複数のログインセッションを行っていれば、
15401 そのユーザの名前はログインセッションの数だけ出力に現れることになる。
15402
15403 書式:
15404
15405 @example
15406 users [@var{file}]
15407 @end example
15408
15409 @flindex utmp
15410 @flindex wtmp
15411 引数 @var{file} の指定がない場合、@command{users} はシステムが管理するファイル
15412 (たいていは @file{/var/run/utmp} か @file{/etc/utmp})
15413 からログインしているユーザの情報を引き出す。引数 @var{file}
15414 が指定されている場合は、代りにそのファイルを使用する。@file{/var/log/wtmp}
15415 が使われることが多い。
15416
15417 オプションは、@option{--help} と @option{--version} だけである。
15418 @xref{Common options}.
15419
15420 @command{users} コマンドがインストールされるのは、POSIX 準拠の @code{<utmpx.h>}
15421 インクルードファイル、またはそれに相当するものが存在するプラットフォームだけである。
15422 従って、移植を考慮したスクリプトでは、非 POSIX
15423 のプラットフォームにも @command{users} コマンドが存在することを当てにしない方がよい。
15424
15425 @exitstatus
15426
15427
15428 @node who invocation
15429 @section @command{who}: 現在誰がログインしているかを表示する
15430
15431 @pindex who
15432 @cindex printing current user information
15433 @cindex information, about current users
15434
15435 @command{who} は、現在ログインしているユーザについての情報を表示する。
15436
15437 書式:
15438
15439 @example
15440 @command{who} [@var{option}] [@var{file}] [am i]
15441 @end example
15442
15443 @cindex terminal lines, currently used
15444 @cindex login time
15445 @cindex remote hostname
15446 オプション以外の引数が一つもない場合、@command{who}
15447 は現在ログインしている各ユーザについて、次の情報を表示する。
15448 ログイン名、端末ライン、ログイン日時、それにリモート・ホスト名か X ディスプレー名。
15449
15450 @flindex utmp
15451 @flindex wtmp
15452 オプション以外の引数を一つだけ指定すると、@command{who}
15453 はそれを、ログインしたユーザを記録しているファイルの名前として、
15454 システムが管理しているデフォルトのファイル (たいていは @file{/var/run/utmp} か
15455 @file{/etc/utmp}) の代りに使用する。@command{who} に引数として @file{/var/log/wtmp}
15456 を渡して、これまでに誰がログインしたかを調べるのはよくあることである。
15457
15458 @opindex am i
15459 @opindex who am i
15460 オプション以外の引数を二つ指定すると、@command{who}は、
15461 自分を実行しているユーザの情報のみを (自分が接続している標準入力からユーザの見当を付けて)、
15462 ホスト名を前に付けて表示する。渡される二つの引数は、全体として
15463 @samp{who am i} になるように、@samp{am i} とするのが慣例である。 
15464
15465 @vindex TZ
15466 タイムスタンプは、タイムゾーンのルールに従って表示されるが、
15467 そのルールを指定しているのは、環境変数 @env{TZ} である。
15468 @env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
15469 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
15470 The GNU C Library Reference Manual}.
15471
15472 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
15473
15474 @table @samp
15475
15476 @item -a
15477 @itemx --all
15478 @opindex -a
15479 @opindex --all
15480 @samp{-b -d --login -p -r -t -T -u} と同じである。
15481
15482 @item -b
15483 @itemx --boot
15484 @opindex -b
15485 @opindex --boot
15486 システムをブートした直近の日時を表示する。
15487
15488 @item -d
15489 @itemx --dead
15490 @opindex -d
15491 @opindex --dead
15492 終了したプロセスに関する情報を表示する。
15493
15494 @item -H
15495 @itemx --heading
15496 @opindex -H
15497 @opindex --heading
15498 最初の行に各列の見出しを表示する。
15499
15500 @item -l
15501 @itemx --login
15502 @opindex -l
15503 @opindex --login
15504 現在システムがログインの窓口としてユーザを待ち受けているプロセスに関する情報のみを表示する。
15505 ユーザ名は常に @samp{LOGIN} である。
15506
15507 @item --lookup
15508 @opindex --lookup
15509 utmp で見つかったホスト名について DNS を検索して正規名を得ようとする。
15510 これがデフォルトになっていないのは、インターネットに自動ダイアルアップで接続しているシステムでは、
15511 深刻な遅滞を招きかねないからである。
15512
15513 @item -m
15514 @opindex -m
15515 @samp{who am i} と同じである。
15516
15517 @item -p
15518 @itemx --process
15519 @opindex -p
15520 @opindex --process
15521 init によって生み出されたプロセスのうち、現在活動中のものをリストする。
15522
15523 @item -q
15524 @itemx --count
15525 @opindex -q
15526 @opindex --count
15527 ログインしているユーザのログイン名と人数のみを表示する。他のすべてのオプションを無効にする。
15528
15529 @item -r
15530 @itemx --runlevel
15531 @opindex -r
15532 @opindex --runlevel
15533 init プロセスの現在のランレベルを表示する (たぶん、直前のランレベルも)。
15534
15535 @item -s
15536 @opindex -s
15537 無視する。他の版の @command{who} との互換性のためにある。
15538
15539 @item -t
15540 @itemx --time
15541 @opindex -t
15542 @opindex --time
15543 システムクロックを最後に変更した日時を表示する。
15544
15545 @item -u
15546 @opindex -u
15547 @cindex idle time
15548 ログイン日時の後ろに、ユーザが何時間何分端末を使用していないかを (idle 状態かを) 表示する。
15549 @samp{.} は、ユーザがここ 1 分以内に端末操作をしたことを意味する。
15550 @samp{old} は、ユーザが 24 時間以上端末を使用していないということである。
15551
15552 @item -w
15553 @itemx -T
15554 @itemx --mesg
15555 @itemx --message
15556 @itemx --writable
15557 @opindex -w
15558 @opindex -T
15559 @opindex --mesg
15560 @opindex --message
15561 @opindex --writable
15562 @cindex message status
15563 @pindex write@r{, allowed}
15564 ログイン名の後ろに、ユーザのメッセージ受け入れ状態を示す 1 文字を表示する。
15565
15566 @display
15567 @samp{+} @code{write} によるメッセージを受け入れる。
15568 @samp{-} @code{write} によるメッセージを拒否する。
15569 @samp{?} 端末デバイスが見つからない。
15570 @end display
15571
15572 @end table
15573
15574 @command{who} コマンドがインストールされるのは、POSIX 準拠の @code{<utmpx.h>}
15575 インクルードファイル、またはそれに相当するものが存在するプラットフォームだけである。
15576 従って、移植を考慮したスクリプトでは、非 POSIX
15577 のプラットフォームにも @command{who} コマンドが存在することを当てにしない方がよい。
15578
15579 @exitstatus
15580
15581
15582 @node System context
15583 @chapter システム関連
15584
15585 @cindex system context
15586 @cindex context, system
15587 @cindex commands for system context
15588
15589 この章では、システム全体に関わる情報を表示したり、変更したりするコマンドを説明する。
15590
15591 @menu
15592 * date invocation::          システムの日付や時刻を表示、設定する。
15593 * arch invocation::          マシンのハードウェア名を表示する。
15594 * nproc invocation::         プロセッサの数を表示する。
15595 * uname invocation::         システムについて情報を表示する。
15596 * hostname invocation::      システム名を表示、設定する。
15597 * hostid invocation::        数値によるホストの識別名を表示する。
15598 * uptime invocation::        システムの連続稼働時間と負荷を表示する。
15599 @end menu
15600
15601 @node date invocation
15602 @section @command{date}: システムの日付や時刻を表示、設定する
15603
15604 @pindex date
15605 @cindex time, printing or setting
15606 @cindex printing the current time
15607
15608 書式:
15609
15610 @example
15611 date [@var{option}]@dots{} [+@var{format}]
15612 date [-u|--utc|--universal] @c this avoids a newline in the output
15613 [ MMDDhhmm[[CC]YY][.ss] ]
15614 @end example
15615
15616 @vindex LC_TIME
15617 @command{date} を @var{format} 引数なしで起動すると、
15618 デフォルトの書式を指定して起動するのと同じことになる。
15619 デフォルトの書式は、@env{LC_TIME} ロケール・カテゴリによって様々である。
15620 デフォルトの C ロケールの場合、その書式は @samp{'+%a %b %e %H:%M:%S %Z %Y'}
15621 なので、出力は @samp{Thu Mar @ 3 13:47:51 PST 2005} のような形になる。
15622
15623 @vindex TZ
15624 通常 @command{date} は、環境変数 @env{TZ} が指示しているタイムゾーンのルールを使用し、
15625 @env{TZ} が設定されていないときは、システムのデフォルトのルールを使用する。
15626 @xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
15627 The GNU C Library Reference Manual}.
15628
15629 @findex strftime @r{and @command{date}}
15630 @cindex time formats
15631 @cindex formatting times
15632 @samp{+} で始まる引数を指定すると、@command{date} は現在の日付と時刻を
15633 (あるいは、後述する @option{--date} オプションで指定した日付と時刻を)、
15634 その引数によって定義された書式で表示する。書式を指定するこの引数は、@code{strftime}
15635 関数のそれとほぼ同じである。なお、@samp{%} で始まる変換指定子を除いて、
15636 書式文字列中の文字は、変更されずにそのまま表示される。
15637 変換指定子については、次節以降で説明する。
15638
15639 @exitstatus
15640
15641 @menu
15642 * Time conversion specifiers:: 時刻関係の変換指定子 %[HIklMNpPrRsSTXzZ]。
15643 * Date conversion specifiers:: 日付関係の変換指定子 %[aAbBcCdDeFgGhjmuUVwWxyY]。
15644 * Literal conversion specifiers:: 文字変換指定子 %[%nt]。
15645 * Padding and other flags::    0 や空白による空き埋め、その他。
15646 * Setting the time::           システムクロックの変更。
15647 * Options for date::           現在の日時以外の指定など。
15648 @detailmenu
15649 * Date input formats::         日付文字列の指定法。
15650 @end detailmenu
15651 * Examples of date::           用例。
15652 @end menu
15653
15654 @node Time conversion specifiers
15655 @subsection 時刻関係の変換指定子
15656
15657 @cindex time conversion specifiers
15658 @cindex conversion specifiers, time
15659
15660 @command{date} の時刻関係の変換指定子
15661
15662 @table @samp
15663 @item %H
15664 時 (@samp{00}@dots{}@samp{23})
15665 @item %I
15666 時 (@samp{01}@dots{}@samp{12})
15667 @item %k
15668 時。一桁のときは、0 ではなく、空白で埋める (@samp{ 0}@dots{}@samp{23})。
15669 @samp{%_H} と同じ。これは GNU の拡張である。
15670 @item %l
15671 時。一桁のときは、0 ではなく、空白で埋める (@samp{ 1}@dots{}@samp{12})。
15672 @samp{%_I} と同じ。これは GNU の拡張である。
15673 @item %M
15674 分 (@samp{00}@dots{}@samp{59})
15675 @item %N
15676 ナノ秒 (@samp{000000000}@dots{}@samp{999999999})。これは GNU の拡張である。
15677 @item %p
15678 現在のロケールで @samp{AM} や @samp{PM} に相当するもの。空白になるロケールも多い。
15679 正午は @samp{PM} として、真夜中は @samp{AM} として扱う。
15680 @item %P
15681 @samp{%p} と同様だが、小文字を使う。これは GNU の拡張である。
15682 @item %r
15683 現在のロケールによる 12 時間表記の時刻 (例: @samp{11:11:04 PM})
15684 @item %R
15685 24 時間表記の時と分。@samp{%H:%M} と同じ。
15686 @item %s
15687 @cindex epoch, seconds since
15688 @cindex seconds since the epoch
15689 @cindex beginning of time
15690 @cindex leap seconds
15691 ジ・エポック (the epoch、Unix 紀元)、すなわち 1970-01-01 00:00:00 UTC
15692 からの経過秒数。閏秒のサポートを利用できない場合、閏秒は計算に入れない。
15693 用例については、「@command{date} の用例」を見ること。
15694 @xref{%s-examples}. これは GNU の拡張である。
15695 @item %S
15696 @cindex leap seconds
15697 秒 (@samp{00}@dots{}@samp{60})。閏秒がサポートされている場合、@samp{60}
15698 になることがある。
15699 @item %T
15700 24 時間表記の時、分、秒。@samp{%H:%M:%S} と同じ。
15701 @item %X
15702 現在のロケールによる時刻表示 (例: @samp{23:13:48})
15703 @item %z
15704 @w{RFC 2822/ISO 8601} 形式の数値によるタイムゾーン (たとえば、@samp{-0600} や
15705 @samp{+0530})。タイムゾーンが特定できない場合は、空になる。
15706 この値は、環境変数 @env{TZ} によって指定されたタイムゾーンのルールを使用することで、
15707 現在の日時に対応した、数値によるタイムゾーンを正しく反映する
15708 (訳注: 要するに、夏時間、冬時間が存在する地帯では、それを反映するということ)。
15709 操作の対象となる日時は (もしそうしたければ、その日時におけるタイムゾーンのルールも)、
15710 @option{--date} オプションによって変更することができる。
15711 @item %:z
15712 @w{RFC 3339/ISO 8601} 形式の、@samp{:} を使用する数値によるタイムゾーン
15713 (たとえば、@samp{-06:00} や @samp{+05:30})。
15714 タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
15715 @item %::z
15716 @samp{:} を使用する数値によるタイムゾーンで、もっとも近い秒まで表示する
15717 (たとえば、@samp{-06:00:00} や @samp{+05:30:00})。
15718 タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
15719 @item %:::z
15720 @samp{:} を使用する数値によるタイムゾーンで、時間の精度を必要最小限で済ます
15721 (たとえば、@samp{-06}, @samp{+05:30}, @samp{-04:56:02})。
15722 タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
15723 @item %Z
15724 アルファベットによるタイムゾーンの略称 (たとえば、@samp{EDT})。
15725 タイムゾーンが特定できない場合は、空になる。タイムゾーンがどのようにして特定されるか
15726 (訳注: たとえば、アメリカ東部なら、EST (冬時間) と EDT (夏時間)
15727 のどちらが選ばれるか) については、@samp{%z} を参照すること。
15728 @end table
15729
15730
15731 @node Date conversion specifiers
15732 @subsection 日付関係の変換指定子
15733
15734 @cindex date conversion specifiers
15735 @cindex conversion specifiers, date
15736
15737 @command{date} の日付関係の変換指定子。
15738
15739 @table @samp
15740 @item %a
15741 現在のロケールによる曜日の省略形 (例: @samp{Sun})
15742 @item %A
15743 現在のロケールによる曜日の省略しない表現。長さは不定 (例: @samp{Sunday})
15744 @item %b
15745 現在のロケールによる月名の省略形 (例: @samp{Jan})
15746 @item %B
15747 現在のロケールによる月名の省略しない表現。長さは不定 (例: @samp{January})
15748 @item %c
15749 現在のロケールによる日付と時刻 (例: @samp{Thu Mar @ 3 23:05:25 2005})
15750 @item %C
15751 世紀。@samp{%Y} に似ているが、下二桁を省略している。たとえば、@samp{%Y} が
15752 @samp{2000} ならば、@samp{%C} は @samp{20}、@samp{%Y} が @samp{-001} ならば、@samp{%C}
15753 は @samp{-0}
15754 である。通例、少なくとも 2 個の文字からなるが、2 個以上のこともありえる。
15755 @item %d
15756 その月の何日目か (例: @samp{01})
15757 @item %D
15758 日付。@samp{%m/%d/%y} と同じ
15759 @item %e
15760 その月の何日目か。一桁のときは、0 ではなく、空白で埋める。@samp{%_d}
15761 と同じ。
15762 @item %F
15763 ISO 8601 形式の完全な日付。@samp{%Y-%m-%d} と同じ。
15764 日付の形式にこれを選ぶのは、好判断である。標準的な形式だし、年度が 0000@dots{}9999
15765 の範囲にある通常の場合に、ソートしやすい。
15766 @item %g
15767 ISO 週番号に対応する年度表示だが、世紀の部分を省略している
15768 (その結果、@samp{00} から @samp{99} の範囲になる)。
15769 これは普通 @samp{%y} と同じ形式、同じ値になるが、ISO 週番号 (@samp{%V} 参照)
15770 が前年、または翌年に属する場合は、そちらの年度が代りに使用される点が異なる。
15771 @item %G
15772 ISO 週番号に対応する年度表示。これは普通 @samp{%Y} と同じ形式、同じ値になるが、
15773 ISO 週番号 (@samp{%V} 参照) が前年、または翌年に属する場合は、
15774 そちらの年度が代りに使用される点が異なる。通常、これが役に立つのは、
15775 @samp{%V} も一緒に使用するときだけである。たとえば、@samp{%G-%m-%d}
15776 という書式は、ISO 週番号による年度と普段使用する月や日を組み合わせているので、
15777 たぶん指定の仕方を間違えている。
15778 @item %h
15779 @samp{%b} と同じ。
15780 @item %j
15781 その年の何日目か (@samp{001}@dots{}@samp{366})
15782 @item %m
15783 月 (@samp{01}@dots{}@samp{12})
15784 @item %q
15785 四半期 (@samp{1}@dots{}@samp{4})
15786 @item %u
15787 その週の何日目か (@samp{1}@dots{}@samp{7})。@samp{1} は月曜日に当たる。
15788 @item %U
15789 日曜日を週の最初の日とする、その年の週番号 (@samp{00}@dots{}@samp{53})。
15790 新しい年の最初の日曜日より前の日々は、第 0 週に属する。
15791 @item %V
15792 ISO 週番号。すなわち、月曜日を週の最初の日とする、その年の週番号
15793 (@samp{01}@dots{}@samp{53})。1 月 1 日を含む週が、新しい年の日々を
15794 4 日以上含む場合は、その週が第 1 週であると見なされる。
15795 そうでない場合は、その週は前年の第 53 週であり、翌週が第 1 週になる。
15796 (ISO 8601 の規格を参照。)
15797 @item %w
15798 その週の何日目か (@samp{0}@dots{}@samp{6})。0 は日曜日に当たる。
15799 @item %W
15800 月曜日を週の最初の日とする、その年の週番号 (@samp{00}@dots{}@samp{53})。
15801 最初の月曜日より前の新しい年の日々は、第 0 週に属する。
15802 @item %x
15803 現在のロケールによる日付の表示 (例: @samp{12/31/99})
15804 @item %y
15805 年度の下二桁 (@samp{00}@dots{}@samp{99})
15806 @item %Y
15807 年度。通例、少なくとも 4 文字だが、もっと多いこともある。@samp{0000} 年は
15808 @samp{0001} の前年であり、@samp{-001} 年は @samp{0000} の前年である。
15809 @end table
15810
15811
15812 @node Literal conversion specifiers
15813 @subsection 文字変換指定子
15814
15815 @cindex literal conversion specifiers
15816 @cindex conversion specifiers, literal
15817
15818 日付や時刻以外の @command{date} の変換指定子。
15819
15820 @table @samp
15821 @item %%
15822 1 個の % という文字
15823 @item %n
15824 改行
15825 @item %t
15826 水平タブ
15827 @end table
15828
15829
15830 @node Padding and other flags
15831 @subsection 空き埋めなどのフラグ
15832
15833 @cindex numeric field padding
15834 @cindex padding of numeric fields
15835 @cindex fields, padding numeric
15836
15837 特に指定がないかぎり、@command{date} は通常、数値の入るフィールドの空きを
15838 0 で埋める。従って、たとえば、数値による月名は常に二桁の数字として出力される。
15839 しかし、ジ・エポック (Unix 紀元) 以来の経過秒数では、空きを埋めることはしない。
15840 この秒数には決まった長さがないからである。
15841
15842 GNU の拡張として、以下に挙げるフラグの一つを @samp{%} の後ろに置くことができる
15843 (指定するしないは自由)。
15844
15845 @table @samp
15846 @item -
15847 (ハイフン) フィールドの空き埋めをしない。出力が人間に見せるためのものである場合に、役に立つ。
15848 @item _
15849 (アンダースコア、下線) 空白で空き埋めをする。
15850 出力を一定の文字数にする必要があるが、0 で埋めたのでは見にくいという場合に、役に立つ。
15851 @item 0
15852 (ゼロ) 変換指定子が普通なら空白で埋める場合にも、ゼロで空き埋めをする。
15853 @item ^
15854 可能なら、大文字を使う。
15855 @item #
15856 可能なら、反対の文字を使う。通常大文字のフィールドは小文字になり、
15857 小文字のフィールドは大文字になる。
15858 @end table
15859
15860 @noindent
15861 空き埋めの例をいくつか挙げておく。
15862
15863 @example
15864 date +%d/%m -d "Feb 1"
15865 @result{} 01/02
15866 date +%-d/%-m -d "Feb 1"
15867 @result{} 1/2
15868 date +%_d/%_m -d "Feb 1"
15869 @result{}  1/ 2
15870 @end example
15871
15872 これも GNU の拡張だが、フィールドの幅を 10 進数で指定することができる
15873 (数字は、上記のフラグがあれば、その後ろに置く)。
15874 そのフィールドの出力の加工前の長さが、幅として指定した文字数より短い場合は、
15875 右詰めにして、指定サイズにまで空き埋めした結果が書き出される。たとえば、@samp{%9B}
15876 は、右詰めにした月の名前を 9 文字分のフィールドに表示する。
15877
15878 上記のフラグやフィールド幅の指定の後ろに、修飾子 (modifier) を付けることもできる
15879 (指定するしないは自由)。修飾子には、次のものがある。
15880
15881 @table @samp
15882 @item E
15883 現在のロケールが持つもう一つの日時表記を使用する。この修飾子は、@samp{%c},
15884 @samp{%C}, @samp{%x}, @samp{%X}, @samp{%y}, @samp{%Y} に対して使用できる。
15885 たとえば、日本語ロケールで @samp{%Ex} とすれば、元号による日付を表示するだろう。
15886
15887 @item O
15888 現在のロケールが持つもう一つの数字表記を使用する。
15889 この修飾子は、数値を表す変換指定子にしか使用できない。
15890 @end table
15891
15892 書式が修飾子をサポートしていても、もう一つの表記が利用できない場合、
15893 修飾子は無視される。
15894
15895
15896 @node Setting the time
15897 @subsection システムクロックの設定
15898
15899 @cindex setting the time
15900 @cindex time setting
15901 @cindex appropriate privileges
15902
15903 @samp{+} で始まらない引数を指定すると、@command{date} は、(以下で述べるように)
15904 その引数で指定した日時にシステムクロックを設定する。
15905 システムクロックを設定するには、しかるべき権限が必要である。リブート後も変更を維持するには、
15906 システムクロックに合わせてハードウェアクロックも更新する必要があるかもしれないことに注意していただきたい。
15907 ご使用のシステムでは、ハードウェアクロックの更新は、自動的に行われないかもしれないからだ。
15908
15909 引き数の構成要素は、すべて数字でなければならない。それは以下の意味を持っている。
15910
15911 (訳注: 念のため、この章の冒頭にあるシステムクロック設定用の書式を再掲しておく。
15912 date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ])
15913
15914 @table @samp
15915 @item MM
15916 何月
15917 @item DD
15918 (何月の) 何日
15919 @item hh
15920 何時
15921 @item mm
15922 何分
15923 @item CC
15924 年度の上二桁 (省略可)
15925 @item YY
15926 年度の下二桁 (省略可)
15927 @item ss
15928 何秒 (省略可)
15929 @end table
15930
15931 注意していただきたいが、@option{--date} や @option{--set} オプションは、
15932 ここで述べている書式の引数と組み合わせて使うことができない。
15933 @option{--universal} オプションは、ここで述べている書式の引数と一緒に使うことができるが、
15934 その場合は、指定されている日時が現在地のタイムゾーンではなく、協定世界時
15935 (UTC) に準じているのを示すことになる。
15936
15937
15938 @node Options for date
15939 @subsection @command{date} のオプション
15940
15941 @cindex @command{date} options
15942 @cindex options for @command{date}
15943
15944 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
15945
15946 @table @samp
15947
15948 @item -d @var{datestr}
15949 @itemx --date=@var{datestr}
15950 @opindex -d
15951 @opindex --date
15952 @cindex parsing date strings
15953 @cindex date strings, parsing
15954 @cindex arbitrary date strings, parsing
15955 @opindex yesterday
15956 @opindex tomorrow
15957 @opindex next @var{day}
15958 @opindex last @var{day}
15959 現在の日時の代りに、日付文字列 @var{datestr} で指定した日時を表示する。
15960 @var{datestr} には、よく使われる書式なら、ほとんどどんな書式でも使うことができる。
15961 月の名前、タイムゾーン、@samp{am} や @samp{pm}、@samp{yesterday}
15962 といった単語、などを含んでいてもよい。たとえば、@option{--date="2004-02-27
15963 14:19:13.489392193 +0530"} は、UTC よりも東 5 時間 30 分のタイムゾーンで
15964 2004 年 2 月 27 日 午後 2 時 19 分 13 秒から 489,392,193
15965 ナノ秒経過した瞬間を指定している。@*
15966 注意: 現在のところ、入力は、ロケールに依存しない書式でなければならない。
15967 たとえば、以下の例の LC_TIME=C は、多くのロケールで正しい日時を再表示させるために必要である。
15968 @example
15969 date -d "$(LC_TIME=C date)"
15970 @end example
15971 参照: @xref{Date input formats}.
15972
15973 @item --debug
15974 @opindex --debug
15975 @cindex debugging date strings
15976 @cindex date strings, debugging
15977 @cindex arbitrary date strings, debugging
15978 解析した日時について説明し、現在のタイムゾーンを表示し、
15979 間違えた使い方をしている疑いがあれば、警告を出す。
15980
15981 @item -f @var{datefile}
15982 @itemx --file=@var{datefile}
15983 @opindex -f
15984 @opindex --file
15985 ファイル @var{datefile} の各行を @option{-d}
15986 の場合と同じように解析して、生成された日付と時刻を表示する。
15987 @var{datefile} が @samp{-} ならば、標準入力を使用する。
15988 処理する日付がたくさんある場合に、このオプションは重宝である。
15989 何故ならば、@command{date} コマンドを何度も起動するときのシステムのオーバーヘッドは、
15990 馬鹿にならないことがあるからだ。
15991
15992 @item -I[@var{timespec}]
15993 @itemx --iso-8601[=@var{timespec}]
15994 @opindex -I[@var{timespec}]
15995 @opindex --iso-8601[=@var{timespec}]
15996 ISO 8601 の書式、@samp{%Y-%m-%d} を使って、日付を表示する。
15997
15998 引数 @var{timespec} では、日付の後ろに時刻をどの単位まで追加するかを指定する。
15999 以下の一つを指定することができる。
16000 @table @samp
16001 @item date
16002 日付のみを表示する。@var{timespec} を省略した場合のデフォルト。
16003
16004 @item hours
16005 日付にその日の何時かを追加する。
16006
16007 @item minutes
16008 何時何分まで追加する。
16009
16010 @item seconds
16011 何時何分何秒まで追加する。
16012
16013 @item ns
16014 何時何分何秒何ナノ秒まで追加する。
16015 @end table
16016
16017 時刻の部分まで表示するときは、@samp{%:z} の書式でタイムゾーンも付ける。
16018 @macro dateParseNote
16019 この書式は、使用しているロケールが何であるかを問わず、@option{--date} (@option{-d})
16020 や @option{--file} (@option{-f}) オプションに対する入力として、常に適切である。
16021 @end macro
16022 @dateParseNote
16023
16024 @item -r @var{file}
16025 @itemx --reference=@var{file}
16026 @opindex -r
16027 @opindex --reference
16028 現在の日付と時刻の代りに、@var{file} の内容を最後に更新した (the last
16029 modification) 日付と時刻を表示する。
16030
16031 @item -R
16032 @itemx --rfc-822
16033 @itemx --rfc-2822
16034 @opindex -R
16035 @opindex --rfc-822
16036 @opindex --rfc-2822
16037 日付と時刻を @samp{%a, %d %b %Y %H:%M:%S %z} という書式を使用し、
16038 C ロケールで評価して表示する。従って、月や曜日の省略形は常に英語になる。
16039 一例を挙げると、こんな表示である。
16040
16041 @example
16042 Fri, 09 Sep 2005 13:51:39 -0700
16043 @end example
16044
16045 この書式は、@uref{ftp://ftp.rfc-editor.org/in-notes/rfc2822.txt, Internet RFC
16046 2822}
16047 と @uref{ftp://ftp.rfc-editor.org/in-notes/rfc822.txt, RFC 822} に従っている。
16048 インターネットの E メールに関する現在と以前の規格である。
16049
16050 @item --rfc-3339=@var{timespec}
16051 @opindex --rfc-3339=@var{timespec}
16052 @uref{ftp://ftp.rfc-editor.org/in-notes/rfc3339.txt, Internet RFC 3339}
16053 が規定している書式を使用して、日付を表示する。この書式は、ISO 8601
16054 の書式のサブセットだが、日付と時刻を区切るのに、@samp{T}
16055 という文字ではなく、空白を使うことをアプリケーションに許しているという相違点がある。
16056 @dateParseNote
16057
16058 引数 @var{timespec} では、時刻をどこまで表示するかを指定する。
16059 以下の一つを指定することができる。
16060
16061 @table @samp
16062 @item date
16063 年から始まる日付だけを表示する。たとえば、@samp{2005-09-14}。
16064 これは、@samp{%Y-%m-%d} という書式と等価である。
16065
16066 @item seconds
16067 年から始まる日付と秒までの時刻を表示し、両者の間は空白で区切る。
16068 一例を挙げると、@samp{2005-09-14 00:56:06+05:30}。出力の末尾には、
16069 協定世界時からの時差が付く。例の場合、@samp{+05:30} は、地方時が
16070 UTC より 5 時間 30 分進んでいることを意味している。
16071 これは、@samp{%Y-%m-%d %H:%M:%S%:z} という書式と等価である。
16072
16073 @item ns
16074 @samp{seconds} と似ているが、ナノ秒まで表示する。
16075 一例を挙げると、@samp{2005-09-14 00:56:06.998458565+05:30}。
16076 これは、@samp{%Y-%m-%d %H:%M:%S.%N%:z} という書式と等価である。
16077
16078 @end table
16079
16080 @item -s @var{datestr}
16081 @itemx --set=@var{datestr}
16082 @opindex -s
16083 @opindex --set
16084 日付と時刻を @var{datestr} に設定する。上記の @option{-d} を参照。
16085 前節「システムクロックの設定」 も参照すること。@ref{Setting the time}.
16086
16087 @item -u
16088 @itemx --utc
16089 @itemx --universal
16090 @opindex -u
16091 @opindex --utc
16092 @opindex --universal
16093 @cindex Coordinated Universal Time
16094 @cindex UTC
16095 @cindex Greenwich Mean Time
16096 @cindex GMT
16097 @cindex leap seconds
16098 @vindex TZ
16099 環境変数 @env{TZ} が、文字列 @samp{UTC0} に設定されているかのように、
16100 処理に協定世界時 (UTC, Coordinated Universal Time) を使用する。
16101 協定世界時は、歴史的な理由から「グリニッジ標準時 (GMT)」と呼ばれることもよくある。
16102 一般にシステムは閏秒を無視するので、日時は正真の UTC ではなく、UTC の近似値になる。
16103 @end table
16104
16105
16106 @node Examples of date
16107 @subsection @command{date} の使用例
16108
16109 @cindex examples of @command{date}
16110
16111 用例をいくつか挙げてみる。前節の @option{-d} オプションの説明も参照していただきたい。
16112
16113 @itemize @bullet
16114
16115 @item
16116 一昨日の日付を表示する。
16117
16118 @example
16119 date --date='2 days ago'
16120 @end example
16121
16122 @item
16123 今から 3 ヶ月と 1 日後の日付けを表示する。
16124
16125 @example
16126 date --date='3 months 1 day'
16127 @end example
16128
16129 @item
16130 今年のクリスマスは年の初めから何日目かを表示する。
16131
16132 @example
16133 date --date='25 Dec' +%j
16134 @end example
16135
16136 @item
16137 今日が何月何日かを、省略しない月の名前で表示する。
16138
16139 @example
16140 date '+%B %d'
16141 @end example
16142
16143 しかし、月の最初の 9 日間では、@samp{%d} は空きを 0 で埋めた
16144 2 桁のフィールドに展開されるので、この結果はご希望のものとは違うかもしれない。
16145 たとえば、@samp{date -d 1may '+%B %d'} の出力は、@samp{May 01} になるのだ。
16146
16147 @item
16148 月のうちの 1 桁の日々に対して、先頭に 0 を付けずに日付を表示したいのなら、
16149 (GNU の拡張である) @samp{-} フラグを使用すれば、空き埋めを全くしないようにすることができる。
16150
16151 @example
16152 date -d 1may '+%B %-d'
16153 @end example
16154
16155 @item
16156 現在の日付と時刻を、non-GNU 版の @command{date}
16157 の多くでシステムクロックを設定するときに要求される書式で表示する。
16158
16159 @example
16160 date +%m%d%H%M%Y.%S
16161 @end example
16162
16163 @item
16164 システムクロックを 2 分進める。
16165
16166 @example
16167 date --set='+2 minutes'
16168 @end example
16169
16170 @item
16171 日付を RFC 2822 の書式で表示するためには、@samp{date --rfc-2822}
16172 を使用する。ここに示すのは、出力の一例である。
16173
16174 @example
16175 Fri, 09 Sep 2005 13:51:39 -0700
16176 @end example
16177
16178 @anchor{%s-examples}
16179 @item
16180 日付を表す文字列をジ・エポック (the epoch、Unix 紀元、すなわち、
16181 1970-01-01 00:00:00 UTC) からの経過秒数に変換するには、@option{--date}
16182 オプションを @samp{%s} 書式と組み合わせて使用する。
16183 これは、データを日付によってソートしたり、グラフ化したり、比較したりする際に、便利である。
16184 次のコマンドは、ジ・エポックから 2 分経ったときの、ジ・エポックからの経過秒数を出力する。
16185
16186 @example
16187 date --date='1970-01-01 00:02:00 +0000' +%s
16188 120
16189 @end example
16190
16191 日付を表す文字列でタイムゾーン情報を指定しない場合、@command{date}
16192 は、コンピュータが認識しているタイムゾーンを使用して、その文字列を解釈する。
16193 たとえば、使用しているコンピュータのタイムゾーンが、マサチューセッツ州のケンブリッジのものならば、
16194 それは UTC より 5 時間遅れているので、次のようになる。
16195
16196 @example
16197 # 現在地のタイムゾーンを使用
16198 date --date='1970-01-01 00:02:00' +%s
16199 18120
16200 @end example
16201
16202 @item
16203 日付の付いたデータをソートしたり、グラフ化したりしているとしよう。
16204 その日付の加工前の値は、ジ・エポックからの経過秒数で表されているかもしれない。
16205 だが、@samp{946684800} といった日付を見て、
16206 「ああ、イギリスのグリニッジの 2000 年の最初の 0 秒だね」と、
16207 さりげなく言える人は、めったにいない。
16208
16209 @example
16210 date --date='2000-01-01 UTC' +%s
16211 946684800
16212 @end example
16213
16214 なお、上と同じ結果は、@option{--utc} (@option{-u}) オプションを使っても得られ、
16215 その場合は、日付を表す文字列で @samp{UTC} を省略することができる。
16216 とは言え、@option{--utc} を使う方法は、@samp{%s} を始め、多くの書式文字列では、
16217 日付文字列で @samp{UTC} を使うのと同じ結果をもたらすものの、
16218 協定世界時からの時差が 0 ではないタイムゾーンでは、
16219 @samp{%z} のようなタイムゾーンによって値が変わってくる書式文字列に対しては、
16220 異なる結果をもたらすことになるだろう。
16221
16222 @example
16223 date -u --date=2000-01-01 +%s
16224 946684800
16225 @end example
16226
16227 こうした秒数という扱いにくいデータをもっと読みやすい形に変換し直すには、
16228 次のようなコマンドを使う。
16229
16230 @smallexample
16231 # 現在地のタイムゾーンを使用
16232 date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z"
16233 1999-12-31 19:00:00 -0500
16234 @end smallexample
16235
16236 coreutils 5.3.0 以来使用できるようになった @samp{@@}
16237 という表記に頼っても構わないなら、上記のコマンドを短くすることができる
16238 (参照: @ref{Seconds since the Epoch})。
16239
16240 @smallexample
16241 date -d @@946684800 +"%F %T %z"
16242 1999-12-31 19:00:00 -0500
16243 @end smallexample
16244
16245 UTC の日付や時刻を出力した方がよいことも多い。
16246
16247 @smallexample
16248 date -u -d '1970-01-01 946684800 seconds' +"%Y-%m-%d %T %z"
16249 2000-01-01 00:00:00 +0000
16250 @end smallexample
16251
16252 @item
16253 @cindex leap seconds
16254 閏秒は秒数計算に入れないのが一般的だが、例外的なシステムもある。
16255 閏秒は予測できないものなので、閏秒を計算に入れる例外的なシステムでは、
16256 秒数による計算と未来の日時との対応は信頼性に欠ける。
16257
16258 一般的なシステムと例外的なシステムの両者が、2012-06-30 23:59:60 UTC
16259 の閏秒をどのように処理しているかを以下に示す。
16260
16261 @example
16262 # 一般的なシステムは閏秒を無視する:
16263 date --date='2012-06-30 23:59:59 +0000' +%s
16264 1341100799
16265 date --date='2012-06-30 23:59:60 +0000' +%s
16266 date: invalid date '2012-06-30 23:59:60 +0000'
16267 date --date='2012-07-01 00:00:00 +0000' +%s
16268 1341100800
16269 @end example
16270
16271 @example
16272 # 例外的なシステムは閏秒をカウントする:
16273 date --date='2012-06-30 23:59:59 +0000' +%s
16274 1341100823
16275 date --date='2012-06-30 23:59:60 +0000' +%s
16276 1341100824
16277 date --date='2012-07-01 00:00:00 +0000' +%s
16278 1341100825
16279 @end example
16280
16281 @end itemize
16282
16283
16284 @node arch invocation
16285 @section @command{arch}: マシンのハードウェア名を表示する
16286
16287 @pindex arch
16288 @cindex print machine hardware name
16289 @cindex system information, printing
16290
16291 @command{arch} は、マシンのハードウェア名を表示する。@samp{uname -m} と同じことである。
16292
16293 書式:
16294
16295 @example
16296 arch [@var{option}]
16297 @end example
16298
16299 このプログラムでは、共通オプションしか使用できない。@ref{Common options}.
16300
16301 @command{arch} は、デフォルトではインストールされない。
16302 従って、移植を考慮したスクリプトでは、@command{arch} コマンドが存在することを当てにしない方がよい。
16303
16304 @exitstatus
16305
16306
16307 @node nproc invocation
16308 @section @command{nproc}: 利用できるプロセッサの個数を表示する
16309
16310 @pindex nproc
16311 @cindex Print the number of processors
16312 @cindex system information, printing
16313
16314 カレントプロセスが利用できるプロセシング・ユニットの個数を表示する。
16315 それは、稼働しているプロセッサの数より少ないかもしれない。
16316 そうした情報が取得できない場合は、搭載されているプロセッサの数を表示する。
16317 環境変数 @env{OMP_NUM_THREADS} が設定されている場合は、
16318 その変数が、返される値を決めることになる。なお、結果は必ず 0 より大きくなる。
16319
16320 書式:
16321
16322 @example
16323 nproc [@var{option}]
16324 @end example
16325
16326 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
16327
16328 @table @samp
16329
16330 @item --all
16331 @opindex --all
16332 システムに搭載されているプロセッサの数を表示する。
16333 それは、稼働しているプロセッサや、カレントプロセスが利用できるプロセッサの数より多いかもしれない。
16334 このオプションを付けた場合、環境変数 @env{OMP_NUM_THREADS} は考慮されない。
16335
16336 @item --ignore=@var{number}
16337 @opindex --ignore
16338 可能ならば、@var{number} 個のプロセシング・ユニットを除外する。
16339
16340 @end table
16341
16342 @exitstatus
16343
16344
16345 @node uname invocation
16346 @section @command{uname}: システムについて情報を表示する
16347
16348 @pindex uname
16349 @cindex print system information
16350 @cindex system information, printing
16351
16352 @command{uname} は、自分がその上で実行されているマシンとオペレーティング・システムについて情報を表示する。
16353 オプションが一つも指定されない場合は、@option{-s} オプションが指定されたかのように振る舞う。
16354
16355 書式:
16356
16357 @example
16358 uname [@var{option}]@dots{}
16359 @end example
16360
16361 複数のオプションや @option{-a} オプションが指定された場合、選択された情報は次の順番で表示される。
16362
16363 @example
16364 @var{kernel-name} @var{nodename} @var{kernel-release} @var{kernel-version}
16365 @var{machine} @var{processor} @var{hardware-platform} @var{operating-system}
16366 @end example
16367
16368 個々の情報が空白を含んでいることがある。そうした場合、出力のどこからどこまでが、
16369 ある情報に当たるかを判断することは難しい。以下の例で @var{release}
16370 に当たるのは、@samp{2.2.18 #4 SMP Tue Jun 5 11:24:08 PDT 2001} の部分である。
16371
16372 (訳注: @var{release} が @var{kernel-release} のことならば、それに相当するのは
16373 @samp{2.2.18} だけである。#4 から 2001 までは @var{kernel-version}。
16374 原文は両者を合わせて、@var{release} と言っているのかもしれない。
16375 なお、以下の例はちょっと古い。最近の @command{uname -a} では、@option{-a}
16376 オプションの説明にあるように、unknown の部分は表示されないはずである。)
16377
16378 @smallexample
16379 uname -a
16380 @result{} Linux dumdum 2.2.18 #4 SMP Tue Jun 5 11:24:08 PDT 2001 i686@c
16381  unknown unknown GNU/Linux
16382 @end smallexample
16383
16384
16385 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
16386
16387 @table @samp
16388
16389 @item -a
16390 @itemx --all
16391 @opindex -a
16392 @opindex --all
16393 以下の情報をすべて表示する。ただし、プロセッサ・タイプとハードウェア・プラットホームは、unknown ならば省略する。
16394
16395 @item -i
16396 @itemx --hardware-platform
16397 @opindex -i
16398 @opindex --hardware-platform
16399 @cindex implementation, hardware
16400 @cindex hardware platform
16401 @cindex platform, hardware
16402 ハードウェア・プラットホームの名前を表示する (ハードウェア実装と呼ばれることもある)。
16403 その情報が取得できない場合は、@samp{unknown} と表示する。
16404 このオプションは、(GNU/Linux ディストリビューション同士の間ですら)
16405 可搬性がない。
16406
16407 @item -m
16408 @itemx --machine
16409 @opindex -m
16410 @opindex --machine
16411 @cindex machine type
16412 @cindex hardware class
16413 @cindex hardware type
16414 マシンのハードウェア名を表示する (ハードウェア・クラスとかハードウェア・タイプと呼ばれることもある)。
16415
16416 @item -n
16417 @itemx --nodename
16418 @opindex -n
16419 @opindex --nodename
16420 @cindex hostname
16421 @cindex node name
16422 @cindex network node name
16423 ネットワークノードのホスト名を表示する。
16424
16425 @item -p
16426 @itemx --processor
16427 @opindex -p
16428 @opindex --processor
16429 @cindex host processor type
16430 プロセッサ・タイプを表示する (命令セット体系、the instruction
16431 set architecture、ISA などと呼ばれることもある)。
16432 その情報が取得できない場合は、@samp{unknown} と表示する。
16433 このオプションは、(GNU/Linux ディストリビューション同士の間ですら)
16434 可搬性がない。
16435
16436 @item -o
16437 @itemx --operating-system
16438 @opindex -o
16439 @opindex --operating-system
16440 @cindex operating system name
16441 オペレーティング・システムの名前を表示する。
16442
16443 @item -r
16444 @itemx --kernel-release
16445 @opindex -r
16446 @opindex --kernel-release
16447 @cindex kernel release
16448 @cindex release of kernel
16449 カーネルのリリース名を表示する。
16450
16451 @item -s
16452 @itemx --kernel-name
16453 @opindex -s
16454 @opindex --kernel-name
16455 @cindex kernel name
16456 @cindex name of kernel
16457 カーネル名を表示する。POSIX 1003.1-2001 では (@pxref{Standards
16458 conformance})、これを「オペレーティング・システムの実装」と呼んでいる。
16459 POSIX の仕様には、カーネルという概念がないからである。
16460 カーネル名は、@option{-o} や  @option{--operating-system}
16461 オプションで表示されるオペレーティング・システム名と同じかもしれないし、
16462 違うかもしれない。オペレーティング・システムによって、
16463 基盤となっているカーネルと名前が同じものもあれば (FreeBSD, HP-UX など)、
16464 違うものもある (GNU/Linux, Solaris など) からである。
16465
16466 @item -v
16467 @itemx --kernel-version
16468 @opindex -v
16469 @opindex --kernel-version
16470 @cindex kernel version
16471 @cindex version of kernel
16472 カーネルのバージョンを表示する。
16473
16474 @end table
16475
16476 @exitstatus
16477
16478
16479 @node hostname invocation
16480 @section @command{hostname}: システムの名前を表示、または設定する
16481
16482 @pindex hostname
16483 @cindex setting the hostname
16484 @cindex printing the hostname
16485 @cindex system name, printing
16486 @cindex appropriate privileges
16487
16488 @command{hostname} は、引数なしで実行すると、使用しているホストシステムの名前を表示する。
16489 引数を一つ付けて実行すると、指定した文字列を使用しているホストの名前として設定する。
16490 ホストの名前を設定するには、しかるべき権限が必要である。
16491
16492 書式:
16493
16494 @example
16495 hostname [@var{name}]
16496 @end example
16497
16498 オプションは、@option{--help} と @option{--version} だけである。
16499 @xref{Common options}.
16500
16501 @command{hostname} は、デフォルトではインストールされない。
16502 また、coreutils 以外のパッケージにも @command{hostname} コマンドを提供するものがある。
16503 従って、移植を考慮したスクリプトでは、@command{hostname}
16504 コマンドが存在することや、上記通りの動作をすることを当てにしない方がよい。
16505
16506 @exitstatus
16507
16508
16509 @node hostid invocation
16510 @section @command{hostid}: 数値によるホストの識別名を表示する
16511
16512 @pindex hostid
16513 @cindex printing the host identifier
16514
16515 @command{hostid} は、使用しているホストの数値による識別名を 16 進数で表示する。
16516 このコマンドは引数を取らない。使用できるオプションは、@option{--help} と
16517 @option{--version} だけである。@xref{Common options}.
16518
16519 たとえば、筆者が使っているシステムの一つでは、次のように表示される。
16520
16521 @example
16522 $ hostid
16523 1bac013d
16524 @end example
16525
16526 たまたまこのシステムでは、識別名の 32 ビットの数値が、システムのインターネット・アドレスと密接な関係を持っているが、
16527 いつでもそうとはかぎらない。
16528
16529 @command{hostid} がインストールされるのは、@code{gethostid} 関数が存在するシステムだけである。
16530 従って、移植を考慮したスクリプトでは、@command{hostid} の存在を当てにしない方がよい。
16531
16532 @exitstatus
16533
16534 @node uptime invocation
16535 @section @command{uptime}: システムの連続稼働時間と負荷を表示する
16536
16537 @pindex uptime
16538 @cindex printing the system uptime and load
16539
16540 @command{uptime} は、現在の時刻、システムの連続稼働時間、ログインしているユーザの数、
16541 それに現在の平均負荷 (load average) を表示する。
16542
16543 引数を指定すると、ユーザが何人ログインしているかを知るために読み込むファイルとして、その引数が使用される。
16544 引数を指定しない場合は、システムのデフォルトが使用される
16545 (@command{uptime --help} を実行すれば、デフォルトの設定がわかる)。
16546
16547 オプションは、@option{--help} と @option{--version} だけである。
16548 @xref{Common options}.
16549
16550 たとえば、以下の例は、筆者が使っているシステムの一つで、ちょうど今表示されたものだ。
16551
16552 @example
16553 $ uptime
16554  14:07  up   3:35,  3 users,  load average: 1.39, 1.15, 1.04
16555 @end example
16556
16557 細かいことを言うと、平均負荷の計算方法は、システムによっていくらか異なっている。
16558 あるシステムでは、ここ 1 分間、5 分間、15 分間の、実行可能状態のプロセスの平均数として計算されるが、
16559 別のシステムでは、割り込み不可能なスリープ状態のプロセスも含めている
16560 (すなわち、ディスク I/O を待っているプロセスだ)。
16561 Linux のカーネルは、割り込み不可能なプロセスを含める方である。
16562
16563 @command{uptime} がインストールされるのは、
16564 ブート日時を取得するための下部構造を備えているプラットフォームだけである。
16565 また、coreutils 以外のパッケージにも、@command{uptime} コマンドを提供しているものがある。
16566 従って、移植を考慮したスクリプトでは、@command{uptime} コマンドが存在することや、
16567 上記通りの動作をすることを当てにしない方がよい。
16568
16569 @exitstatus
16570
16571 @node SELinux context
16572 @chapter SELinux コンテキスト
16573
16574 @cindex SELinux context
16575 @cindex SELinux, context
16576 @cindex commands for SELinux context
16577
16578 この章では、SELinux コンテキスト関係の操作を行うコマンドを説明する。
16579
16580 @menu
16581 * chcon invocation::     ファイルの SELinux コンテキストを変更する
16582 * runcon invocation::    指定された SELinux コンテキストでコマンドを実行する
16583 @end menu
16584
16585 @node chcon invocation
16586 @section @command{chcon}: ファイルの SELinux コンテキストを変更する
16587
16588 @pindex chcon
16589 @cindex changing security context
16590 @cindex change SELinux context
16591
16592 @command{chcon} は、指定されたファイルの SELinux セキュリティ・コンテキストを変更する。
16593
16594 書式:
16595
16596 @smallexample
16597 chcon [@var{option}]@dots{} @var{context} @var{file}@dots{}
16598 chcon [@var{option}]@dots{} [-u @var{user}] [-r @var{role}] [-l @var{range}]@c
16599  [-t @var{type}] @var{file}@dots{}
16600 chcon [@var{option}]@dots{} --reference=@var{rfile} @var{file}@dots{}
16601 @end smallexample
16602
16603 各 @var{file} の SELinux セキュリティ・コンテキストを @var{context} に変更する。
16604 @option{--reference} オプションを使用した場合は、
16605 各 @var{file} のセキュリティ・コンテキストを @var{rfile} のそれに変更する。
16606
16607 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
16608
16609 @table @samp
16610
16611 @item --dereference
16612 @opindex --dereference
16613 シンボリックリンクそのものではなく、リンクが指しているものを操作の対象にする。
16614 これがデフォルトである。
16615
16616 @item -h
16617 @itemx --no-dereference
16618 @opindex -h
16619 @opindex --no-dereference
16620 @cindex no dereference
16621 参照先のファイルではなく、シンボリックリンクそのものを操作の対象にする。
16622
16623 @item --reference=@var{rfile}
16624 @opindex --reference
16625 @cindex reference file
16626 @var{context} の値を直接指定する代わりに、@var{rfile} のセキュリティ・コンテキストを使用する。
16627
16628 @item -R
16629 @itemx --recursive
16630 @opindex -R
16631 @opindex --recursive
16632 ファイルやディレクトリに対して再帰的に動作する。
16633
16634 @item --preserve-root
16635 @opindex --preserve-root
16636 @option{--recursive} オプションと一緒に使ったとき、ルートディレクトリ (@file{/})
16637 に対して再帰的に動作することを拒否する。 @xref{Treating / specially}.
16638
16639 @item --no-preserve-root
16640 @opindex --no-preserve-root
16641 @option{--recursive} オプションと一緒に使ったとき、ルートディレクトリ (@file{/})
16642 を特別扱いしない。こちらがデフォルトの動作である。 @xref{Treating / specially}.
16643
16644 @choptH @xref{Traversing symlinks}.
16645
16646 @choptL @xref{Traversing symlinks}.
16647
16648 @choptP @xref{Traversing symlinks}.
16649
16650 @item -v
16651 @itemx --verbose
16652 @opindex -v
16653 @opindex --verbose
16654 @cindex diagnostic
16655 処理したすべてのファイルについてメッセージを表示する。
16656
16657 @item -u @var{user}
16658 @itemx --user=@var{user}
16659 @opindex -u
16660 @opindex --user
16661 操作対象のセキュリティ・コンテキストのユーザを @var{user} にする。
16662
16663 @item -r @var{role}
16664 @itemx --role=@var{role}
16665 @opindex -r
16666 @opindex --role
16667 操作対象のセキュリティ・コンテキストのロールを @var{role} にする。
16668
16669 @item -t @var{type}
16670 @itemx --type=@var{type}
16671 @opindex -t
16672 @opindex --type
16673 操作対象のセキュリティ・コンテキストのタイプを @var{type} にする。
16674
16675 @item -l @var{range}
16676 @itemx --range=@var{range}
16677 @opindex -l
16678 @opindex --range
16679 操作対象のセキュリティ・コンテキストのセキュリティ・レベルの範囲を @var{range} にする。
16680
16681 @end table
16682
16683 @exitstatus
16684
16685 @node runcon invocation
16686 @section @command{runcon}: 指定された SELinux コンテキストでコマンドを実行する。
16687
16688 @pindex runcon
16689 @cindex run with security context
16690
16691
16692 @command{runcon} は、指定された SELinux セキュリティ・コンテキストでファイルを実行する。
16693
16694 書式:
16695 @smallexample
16696 runcon @var{context} @var{command} [@var{args}]
16697 runcon [ -c ] [-u @var{user}] [-r @var{role}] [-t @var{type}]@c
16698  [-l @var{range}] @var{command} [@var{args}]
16699 @end smallexample
16700
16701 セキュリティ・コンテキストのすべてを @var{context} で指定して、@var{command}
16702 を実行する。あるいは、現在の、または遷移後のセキュリティ・コンテキストのうち、
16703 ユーザ、ロール、タイプ、レベルの一つ以上を変更して、@var{command} を実行する。
16704
16705 @option{-c}, @option{-u}, @option{-r}, @option{-t}, @option{-l}
16706 のどのオプションも指定されていない場合は、最初の引数が完全なコンテキストとして使用される。
16707 @var{command} の後ろに続く引数があれば、それはそのコマンドに対する引数と見なされる。
16708
16709 @var{context} と @var{command} のどちらも指定されていない場合は、
16710 現在のセキュリティ・コンテキストを表示する。
16711
16712 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
16713
16714 @table @samp
16715
16716 @item -c
16717 @itemx --compute
16718 @opindex -c
16719 @opindex --compute
16720 セキュリティ・コンテキストの変更を行う前に、プロセスの遷移によるコンテキストを求める。
16721
16722 @item -u @var{user}
16723 @itemx --user=@var{user}
16724 @opindex -u
16725 @opindex --user
16726 操作対象のセキュリティ・コンテキストのユーザを @var{user} にする。
16727
16728 @item -r @var{role}
16729 @itemx --role=@var{role}
16730 @opindex -r
16731 @opindex --role
16732 操作対象のセキュリティ・コンテキストのロールを @var{role} にする。
16733
16734 @item -t @var{type}
16735 @itemx --type=@var{type}
16736 @opindex -t
16737 @opindex --type
16738 操作対象のセキュリティ・コンテキストのタイプを @var{type} にする。
16739
16740 @item -l @var{range}
16741 @itemx --range=@var{range}
16742 @opindex -l
16743 @opindex --range
16744 操作対象のセキュリティ・コンテキストのセキュリティ・レベルの範囲を @var{range} にする。
16745
16746 @end table
16747
16748 @cindex exit status of @command{runcon}
16749 終了ステータス:
16750
16751 @display
16752 126: @var{command} が見つかったが、起動できなかった。
16753 127: @command{runcon} そのものの実行に失敗した。あるいは、@var{command} が
16754      見つからなかった。
16755 それ以外は、@var{command} の終了ステータス。
16756 @end display
16757
16758 @node Modified command invocation
16759 @chapter コマンド実行条件の変更
16760
16761 @cindex modified command invocation
16762 @cindex invocation of commands, modified
16763 @cindex commands for invoking other commands
16764
16765 この章で説明するコマンドは、他のコマンドを現在の条件とは違った条件で実行するものである。
16766 たとえば、環境を変更して実行する、別のユーザとして実行するといったコマンドだ。
16767
16768 (訳注: 「別のユーザとして実行する」というのは、@command{chroot}
16769 の @option{--userspec} オプションを指していると考えられなくもないが、
16770 元々は @command{su} コマンドのことを言っていたのだと思う。
16771 @command{su} も以前はこの章で説明されていたが、現在では coreutils
16772 に収録されていない。)
16773
16774 @menu
16775 * chroot invocation::        ルート・ディレクトリを変更する。
16776 * env invocation::           環境変数を変更する。
16777 * nice invocation::          niceness を変更する。
16778 * nohup invocation::         ハングアップ・シグナルで終了しない。
16779 * stdbuf invocation::        標準ストリームのバッファリングを変更する。
16780 * timeout invocation::       タイムリミット付きで実行する。
16781 @end menu
16782
16783
16784 @node chroot invocation
16785 @section @command{chroot}: ルートディレクトリを変更して、コマンドを実行する
16786
16787 @pindex chroot
16788 @cindex running a program in a specified root directory
16789 @cindex root directory, running a program in a specified
16790
16791 @command{chroot} は、指定されたディレクトリをルートディレクトリにして、コマンドを実行する。
16792 多くのシステムでは、この操作を行うことができるのはスーパーユーザだけである。
16793 @footnote{もっとも、システムによっては (たとえば、FreeBSD がそうだが)、
16794 特定の一般ユーザが @code{chroot} システムコールを使用できるように設定できるものもある。
16795 従って、そうしたユーザは @command{chroot} コマンドを実行できるわけだ。
16796 また、Cygwin では、どんなユーザでも @command{chroot} コマンドを実行できる。
16797 MS-Windows が chroot 関数をサポートしていないため、
16798 内部で使用する関数が特権とは無関係だからである。
16799 なお、@var{newroot} が元の @file{/} ディレクトリと同じ場合、@command{chroot}
16800 コマンドは @code{chroot} システムコールを使わないで済まそうとする。
16801 これは、非特権ユーザにもそうしたことが許されているシステムとの一貫性を保つためである。}
16802
16803 書式:
16804
16805 @example
16806 chroot @var{option} @var{newroot} [@var{command} [@var{args}]@dots{}]
16807 chroot @var{option}
16808 @end example
16809
16810 通常、ファイル名の検索は、ディレクトリ構造の根 (ルート、root)、すなわち
16811 @file{/} を起点として行われる。@command{chroot} はこのルートを @var{newroot}
16812 ディレクトリ (実在するディレクトリでなければならない) に変更し、
16813 さらに、作業ディレクトリを @file{/} に変更して、最後に @var{command}
16814 を、@var{args} の指定があれば @var{args} を付けて実行する。
16815 @var{command} が指定されていない場合、デフォルトのコマンドは、環境変数
16816 @env{SHELL} の値か、@env{SHELL} が設定されていなければ、@command{/bin/sh} であり、
16817 それが @option{-i} オプションを付けて、呼び出される。
16818 @var{command} は シェルの組み込みコマンドであってはならない
16819 (@pxref{Special built-in utilities})。
16820
16821 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
16822 オプションはオペランドの前に置かなければならない。
16823
16824 @table @samp
16825
16826 @item --groups=@var{groups}
16827 @opindex --groups
16828 このオプションを使えば、新しいプロセスが使用する補助 @var{groups}
16829 を変更することができる。グループのリストの各項目 (名前でも ID 番号でもよい)
16830 は、コンマで区切られていなければならない。
16831 @option{--userspec} オプションで自動的に行われる補助グループの照合をしないようにするには、
16832 @samp{--groups=''} を使用すればよい。
16833
16834 @item --userspec=@var{user}[:@var{group}]
16835 @opindex --userspec
16836 デフォルトでは、@var{command} は呼び出し側のプロセスと同じ資格情報を使って実行されるが、
16837 このオプションを使えば、@var{command} を別の @var{user}
16838 の資格で実行することができる。別の基本 @var{group} を指定することも可能だ。
16839 @var{user} が指定された場合、補助グループは、そのユーザについてシステムが設定しているリストと同じものになる。
16840 ただし、@option{--groups} オプションによって置き換えられる場合は別だ。
16841
16842 @item --skip-chdir
16843 @opindex --skip-chdir
16844 ルートディレクトリを @var{newroot} に変更した後で
16845 (すなわち chroot 環境中で)、作業ディレクトリを @file{/}
16846 に変更したくなかったら、このオプションを使えばよい。
16847 このオプションが使用できるのは、@var{newroot} が元の @file{/}
16848 ディレクトリと同じときだけであり、従って、役に立つのは、
16849 @option{--groups} や "@option{--userspec} と一緒に使い、
16850 元の作業ディレクトリに留まっていたい場合がほとんどである。
16851
16852 @end table
16853
16854 @option{--userspec} や @option{--groups} オプションによって行われるユーザ名やグループ名の照合は、
16855 chroot 環境の外側と内側の両方で行われるが、chroot 環境の内側で成功した照合が優先される。
16856 ユーザやグループの指定で ID 番号を使うつもりならば、数字の前に @samp{+}
16857 を付ければ、名前を ID 番号に還元するステップが行われないで済む。
16858 @xref{Disambiguating names and IDs}.
16859
16860 chroot を使う上でよくある問題を避けることができるように、
16861 ちょっとした情報をいくつか挙げておく。まず簡単なことから言うと、@var{command}
16862 は、静的にリンクしたバイナリを指すようにした方がよい。
16863 もし、動的にリンクした実行ファイルを使用するのならば、
16864 共有ライブラリが新しいルートディレクトリ以下の適切な場所に存在するように、
16865 前もって準備しておく必要があるだろう。
16866
16867 たとえば、静的にリンクした @command{ls} の実行ファイルを作成して、
16868 @file{/tmp/empty} に置けば、root ユーザとして次のようなコマンドを実行することができる。
16869
16870 @example
16871 $ chroot /tmp/empty /ls -Rl /
16872 @end example
16873
16874 出力はこんなふうになるだろう。
16875
16876 @example
16877 /:
16878 total 1023
16879 -rwxr-xr-x 1 0 0 1041745 Aug 16 11:17 ls
16880 @end example
16881
16882 もし、動的にリンクした実行ファイル、たとえば @command{bash} を使いたいならば、
16883 まず @samp{ldd bash} を実行して、どんな共有オブジェクトファイルが必要かを調べることだ。
16884 それから、@command{bash} 自体のバイナリをコピーするだけでなく、@samp{ldd bash}
16885 でリストされたファイルも、新しいルートディレクトリになるディレクトリ以下のしかるべき場所にコピーしておく。
16886 さらに、実行ファイルが何か他のファイルも必要としているなら
16887 (たとえば、データファイル、ステータスファイル、デバイスファイルなど)、
16888 それも適切な場所にコピーする。
16889
16890 @command{chroot} がインストールされるのは、@code{chroot} 関数を持つシステムだけである。
16891 従って、移植を考慮したスクリプトでは、@command{chroot} が存在することを当てにしない方がよい。
16892
16893 @cindex exit status of @command{chroot}
16894 終了ステータス:
16895
16896 @display
16897 125: @command{chroot} そのものの実行に失敗した。
16898 126: @var{command} は見つかったが、起動できなかった。
16899 127: @var{command} が見つからなかった。
16900 それ以外は、@var{command} の終了ステータス。
16901 @end display
16902
16903
16904 @node env invocation
16905 @section @command{env}: 変更した環境でコマンドを実行する
16906
16907 @pindex env
16908 @cindex environment, running a program in a modified
16909 @cindex modified environment, running a program in a
16910 @cindex running a program in a modified environment
16911
16912 @command{env} は、環境を変更して、コマンドを実行する。
16913
16914 書式:
16915
16916 @example
16917 env [@var{option}]@dots{} [@var{name}=@var{value}]@dots{} @c
16918 [@var{command} [@var{args}]@dots{}]
16919 env
16920 @end example
16921
16922 @samp{@var{variable}=@var{value}} という形のオペランドは、環境変数 @var{variable} の値を
16923 @var{value} に設定する。@var{value} は空っぽでも構わない (@samp{@var{variable}=})。
16924 変数の値を空に設定 (set) するのは、変数を破棄 (unset) するのとは別のことである。
16925 こうしたオペランドは、左から右へ評価されるので、二つのオペランドが同じ変数を対象にしている場合、前のものは無視される。
16926
16927 環境変数名は、空でもよいし、@samp{=} と ASCII NUL 以外なら、どんな文字を含んでいても構わない。
16928 とは言え、変数名は、アンダースコア、数字、ASCII 文字のみから構成し、
16929 数字以外の文字で始めるようにした方が、賢明である。
16930 それ以外の名前だと、シェルなどのアプリケーションがうまく動作しないからだ。
16931
16932 @vindex PATH
16933 @samp{=} という文字を含まない最初のオペランドが、起動するプログラムであり、
16934 環境変数 @env{PATH} に従って、どこにあるかが検索される。
16935 残っている引数があれば、すべてそのプログラムに引数として渡される。
16936 起動するプログラムは、シェルの組み込みコマンドであってはならない
16937 (@pxref{Special built-in utilities})。
16938
16939 @env{PATH} に対する変更は、@var{command} のありかを検索する前に有効になる。
16940 そこで、@env{PATH} を短縮するときには、気をつけなければならない。
16941 @env{PATH} を未定義にしたり、@file{/bin}
16942 のような重要なディレクトリを外したりすると、変更前と同じ動作にならないかもしれないからだ。
16943
16944 めったにないことだが、プログラムの名前に @samp{=} という文字が含まれている場合、
16945 それを変数の指定と区別する唯一の方法は、@var{command} として仲介的なコマンドを使用し、
16946 その @var{args} として問題のあるプログラム名を渡すことである。
16947 たとえば、@file{./prog=} が現在の @env{PATH} 中に存在する実行ファイルだとしよう。
16948
16949 @example
16950 env prog= true 
16951   # 環境変数 prog を空に設定して 'true' を実行する。
16952 env ./prog= true 
16953   # 環境変数 ./prog を空に設定して 'true' を実行する。
16954 env -- prog= true 
16955   # 環境変数 prog を空に設定して 'true' を実行する。
16956 env sh -c '\prog= true' 
16957   # 'true' を引数にして 'prog=' を実行する。
16958 env sh -c 'exec "$@@"' sh prog= true 
16959   # これも 'prog=' を実行する。
16960 @end example
16961
16962 @cindex environment, printing
16963
16964 環境変数の設定の後にコマンド名が指定されていない場合は、生成された環境が表示される。
16965 これは、@var{command} に @command{printenv} を指定するのと同じことである。
16966
16967 以下に例をいくつか挙げる。@command{env} に渡される環境は、@samp{LOGNAME=rms},
16968 @samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks} からなっているものとする。
16969
16970 @itemize @bullet
16971
16972 @item
16973 現在の環境を出力する。
16974 @example
16975 $ env | LC_ALL=C sort
16976 EDITOR=emacs
16977 LOGNAME=rms
16978 PATH=.:/gnubin:/hacks
16979 @end example
16980
16981 @item
16982 環境を削減して、@command{foo} を実行する。@command{foo} が見つからないといけないので、
16983 @env{PATH} だけは元のまま残している。
16984 @example
16985 env - PATH="$PATH" foo
16986 @end example
16987
16988 @item
16989 @samp{LOGNAME=rms}, @samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks}
16990 からなる環境で @command{foo} を実行する。
16991 @command{foo} には、シェルの組み込みコマンドではなく、
16992 ファイルシステム中で見つかった実行ファイルが必ず使用される。
16993 @example
16994 env foo
16995 @end example
16996
16997 @item
16998 @samp{LOGNAME=foo}, @samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks},
16999 @samp{DISPLAY=gnu:0}
17000 からなる環境で、@command{nemacs} を実行する。
17001 @example
17002 env DISPLAY=gnu:0 LOGNAME=foo nemacs
17003 @end example
17004
17005 @item
17006 プログラム @command{/energy/--} の実行を試みる (パスの検索でそれしか出てこないようにしている)。
17007 @command{--} というコマンドが存在する場合、環境は、@samp{LOGNAME=rms} と
17008 @samp{PATH=/energy} だけになり、引数には、@samp{e=mc2},
17009 @samp{bar}, @samp{baz} が使われる。
17010 @example
17011 env -u EDITOR PATH=/energy -- e=mc2 bar baz
17012 @end example
17013
17014 @end itemize
17015
17016
17017 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
17018 オプションはオペランドの前に置かなければならない。
17019
17020 @table @samp
17021
17022 @optNull
17023
17024 @item -u @var{name}
17025 @itemx --unset=@var{name}
17026 @opindex -u
17027 @opindex --unset
17028 変数 @var{name} が環境中にあれば、それを環境から削除する。
17029
17030 @item -
17031 @itemx -i
17032 @itemx --ignore-environment
17033 @opindex -
17034 @opindex -i
17035 @opindex --ignore-environment
17036 継承した環境を無視し、空っぽの環境から始める。
17037
17038 @end table
17039
17040 @cindex exit status of @command{env}
17041 終了ステータス:
17042
17043 @display
17044 0:   @var{command} が指定されなかったので、環境を出力した。
17045 125: @command{env} そのものの実行に失敗した。
17046 126: @var{command} は見つかったが、起動できなかった。
17047 127: @var{command} が見つからなかった。
17048 それ以外は、@var{command} の終了ステータス。
17049 @end display
17050
17051
17052 @node nice invocation
17053 @section @command{nice}: niceness を変更して、コマンドを実行する
17054
17055 @pindex nice
17056 @cindex niceness
17057 @cindex scheduling, affecting
17058 @cindex appropriate privileges
17059
17060 @command{nice} はプロセスの @dfn{niceness} を表示したり、niceness を変更してコマンドを実行したりする。
17061 @dfn{niceness} は、プロセスがシステム中でどの程度優先的にスケジュールされるかに影響を及ぼす。
17062 (訳注: niceness を「スケジューリング優先度」と訳さない理由については、
17063 三つほど下のパラグラフを御覧いただきたい。)
17064
17065 書式:
17066
17067 @example
17068 nice [@var{option}]@dots{} [@var{command} [@var{arg}]@dots{}]
17069 @end example
17070
17071 引数を指定しないと、@command{nice} は現在の niceness を表示する。引数に
17072 @var{command} を指定した場合は、niceness を調整して、その @var{command} を実行する。
17073 デフォルトでは、niceness が 10 増加する。
17074
17075 niceness の値は、最小が @minus{}20 で、最大が 19 である
17076 (値が小さければ、プロセスの優先度が高くなり、使えるリソースも多くなるが、
17077 その分、他のプロセスの動作が遅くなる。また、値が大きければ、プロセスの優先度が低くなり、
17078 自分自身の動作は遅くなるが、実行中の他のプロセスの速度に与える影響は小さくなる)。
17079 システムによっては、niceness の値の範囲がもっと広いものもあるし、
17080 反対に、上下限の制限がもっときついものもある。サポートされている範囲を越えた niceness を指定すると、
17081 サポートされている値の最小、または最大を使用しようとしているものと見なされる。
17082
17083 niceness をスケジューリング優先度 (scheduling priority) と混同してはならない。
17084 後者は、様々なスレッドをどういう序列で実行するかの予定を組む際に、
17085 その序列をアプリケーション側に決めさせるものである。
17086 優先度とは違って、niceness はスケジューラに対する単なるアドバイスにすぎず、
17087 スケジューラはそれを無視することができるのだ。また、用語について言うと、
17088 POSIX は @command{nice} の動作を @dfn{nice value} という用語で定義している。
17089 この nice value は、ある niceness と 最小の niceness との間の負ではない差である。
17090 @command{nice} コマンドは POSIX に準拠しているものの、
17091 この文書やエラーメッセージでは、従来の習慣との親和性を考慮して、
17092 ``niceness'' という言葉を使っている。
17093
17094 @var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
17095 built-in utilities})。
17096
17097 @mayConflictWithShellBuiltIn{nice}
17098
17099 注意: 現在動作中のプロセスの @dfn{niceness} を変更するには、@command{renice}
17100 コマンドを使う必要がある。
17101
17102 このプログラムでは、以下のオプションが使用できる。参照: @ref{Common options}.
17103 オプションはオペランドの前に置かなければならない。
17104
17105 @table @samp
17106 @item -n @var{adjustment}
17107 @itemx --adjustment=@var{adjustment}
17108 @opindex -n
17109 @opindex --adjustment
17110 コマンドの niceness を 10 ではなく、@var{adjustment} 増加する。
17111 @var{adjustment} が負の数の場合、ユーザがしかるべき特権を持っていなければ、
17112 @command{nice} は警告を発する。とは言え、警告を出すだけで、@var{adjustment}
17113 として 0 が指定されたかのように振る舞う。
17114
17115 互換性を考慮して、@command{nice} は @option{-@var{adjustment}}
17116 というオプションの古い書式もサポートしている。
17117 だが、新しいスクリプトでは、@option{-n @var{adjustment}} の方を使うべきである。
17118
17119 @end table
17120
17121 @command{nice} がインストールされるのは、
17122 POSIX の @code{setpriority} 関数を持っているシステムだけである。
17123 従って、移植を考慮したシステムでは、非 POSIX のプラットフォームに
17124 @command{nice} コマンドがあることを当てにしない方がよい。
17125
17126 @cindex exit status of @command{nice}
17127 終了ステータス:
17128
17129 @display
17130 0:   @var{command} が指定されなかったので、niceness を出力した。
17131 125: @command{nice} そのものの実行に失敗した。
17132 126: @var{command} が見つかったが、起動できなかった。
17133 127: @var{command} が見つからなかった。
17134 それ以外は、@var{command} の終了ステータス。
17135 @end display
17136
17137 対話的ではないプログラムは、niceness を落として (訳注: すなわち、
17138 niceness の値を増やして) 実行すると、都合のよいことがある。
17139
17140 @example
17141 $ nice factor 4611686018427387903
17142 @end example
17143
17144 @command{nice} は、現在の niceness を表示するので、@command{nice} を通して @command{nice}
17145 を起動すれば、それがどんな動作をするか、目の当たりに見ることができる。
17146
17147 デフォルトの動作は、niceness を @samp{10} 増加することである。
17148
17149 @example
17150 $ nice
17151 0
17152 $ nice nice
17153 10
17154 $ nice -n 10 nice
17155 10
17156 @end example
17157
17158 @var{adjustment} は、現在の niceness からいくら増減するかということである。
17159 次の例では、最初の @command{nice} が、二番目の @command{nice} を
17160 niceness 10 で実行し、二番目の @command{nice} は、niceness
17161 をさらに 3 増やして、三番目の @command{nice} を実行している。
17162
17163 @example
17164 $ nice nice -n 3 nice
17165 13
17166 @end example
17167
17168 サポートされている範囲より大きい niceness を指定するのは、
17169 サポートされている最大値を指定するのと同じことである。
17170
17171 @example
17172 $ nice -n 10000000000 nice
17173 19
17174 @end example
17175
17176 特権ユーザだけが niceness の値を下げて、プロセスを実行できる。
17177
17178 @example
17179 $ nice -n -1 nice
17180 nice: cannot set niceness: Permission denied
17181 0
17182 $ sudo nice -n -1 nice
17183 -1
17184 @end example
17185
17186
17187 @node nohup invocation
17188 @section @command{nohup}: ハングアップ・シグナルで終了しないコマンドを実行する
17189
17190 @pindex nohup
17191 @cindex hangups, immunity to
17192 @cindex immunity to hangups
17193 @cindex logging out and continuing to run
17194
17195 @flindex nohup.out
17196 @command{nohup} を使って、@var{command} を実行すると、
17197 指定されたコマンドがハングアップ・シグナルを無視するようになる。
17198 従って、そのコマンドは、ユーザがログアウトした後でも、バックグラウンドで実行を継続することができる。
17199
17200 書式:
17201
17202 @example
17203 nohup @var{command} [@var{arg}]@dots{}
17204 @end example
17205
17206 標準入力が端末の場合は、@command{nohup}
17207 から実行されているコマンドが端末を使用していると、端末で行われるセッションが誤解しないように、
17208 標準入力をリダイレクトする。
17209 さらに、標準入力の代わりになるファイルのファイル・ディスクリプタを読み込み不可にする。
17210 @command{nohup} から実行されているコマンドが、誤って標準入力から読み込を行おうとした場合に、
17211 エラーメッセージを出すことができるようにするためである。
17212 このリダイレクションは GNU の拡張である。
17213 GNU 以外のホストでも使うことを考えているプログラムでは、GNU の拡張を当てにせず、
17214 @samp{nohup @var{command} [@var{arg}]@dots{} 0>/dev/null} を使えばよい。
17215
17216 @flindex nohup.out
17217 標準出力が端末の場合、コマンドの標準出力は、(訳注: カレントディレクトリの)
17218 @file{nohup.out} というファイルに追加されて行く。
17219 そのファイルに書き込めない場合は、@file{$HOME/nohup.out}
17220 に追記されることになる。そのファイルにも書き込めない場合は、コマンドの実行が行われない。
17221 @command{nohup} によって作成されるのが @file{nohup.out} であれ、
17222 @file{$HOME/nohup.out} であれ、それは、ファイルの所有者にのみ読み書き可能なものになる。
17223 現在の umask の設定の影響は受けない。
17224
17225 標準エラーが端末の場合、コマンドの標準エラー出力は、基本的には標準出力
17226 (リダイレクトされているかもしれない) と同じファイル・ディスクリプタにリダイレクトされる。
17227 ただし、標準出力がクローズされている場合には、標準エラーの端末への出力は、
17228 リダイレクトされることなく、直接 @file{nohup.out} や @file{$HOME/nohup.out}
17229 というファイルに追加される。どちらのファイルが使用されるかは、上述のとおりである。
17230
17231 コマンドの出力を @file{nohup.out} 以外のファイルに書き込みたければ、
17232 リダイレクトすればよい。たとえば、@command{make} の出力を @file{make.log}
17233 に書き込みたかったら、次のようにする。
17234
17235 @example
17236 nohup make > make.log
17237 @end example
17238
17239 @command{nohup} は、実行するコマンドを自動的にバックグラウンドに送ることをしない。
17240 そこで、ユーザは、コマンドラインの末尾に @samp{&} を付けることで、
17241 明示的にそれを行わなければならない。また、@command{nohup} は、@var{command}
17242 の niceness を変更しない。niceness を変更したかったら、@command{nice}
17243 を使って、@samp{nohup nice @var{command}} のように実行すればよい。
17244
17245 @var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
17246 built-in utilities})。
17247
17248 指定できるオプションは、@option{--help} と @option{--version} だけである。
17249 @xref{Common options}.  オプションはオペランドの前に置かなければならない。
17250
17251 @cindex exit status of @command{nohup}
17252 終了ステータス:
17253
17254 @display
17255 125: @env{POSIXLY_CORRECT} が設定されていない場合に、@command{nohup} そのものの
17256       実行に失敗した。
17257 126: @var{command} は見つかったが、起動できなかった。
17258 127: @var{command} が見つからなかった。 
17259 それ以外の場合は、@var{command} の終了ステータス。
17260 @end display
17261
17262 @env{POSIXLY_CORRECT} が設定されている場合は、@command{nohup}
17263 そのものが実行に失敗したときの終了ステータスは、125 ではなく 127 になる。
17264
17265
17266 @node stdbuf invocation
17267 @section @command{stdbuf}: 入出力ストリームのバッファリングを変更して、コマンドを実行する
17268
17269 @pindex stdbuf
17270 @cindex standard streams, buffering
17271 @cindex line buffered
17272
17273 @command{stdbuf} を使用すると、プログラムと結びついている
17274 3 種類の標準入出力ストリームに対して、そのバッファリング動作を変更することができる。
17275
17276 書式:
17277
17278 @example
17279 stdbuf @var{option}@dots{} @var{command}
17280 @end example
17281
17282 @var{command} は、次の条件を満たすプログラムの名前で始まっていなければならない。
17283 @enumerate
17284 @item
17285 入出力に ISO C @code{FILE} ストリームを使用している (注意: プログラム @command{dd} や
17286 @command{cat} は、これを使用していない)。
17287
17288 @item
17289 自分で標準ストリームのバッファリングを調整していない
17290 (注意: プログラム @command{tee} は、この部類に入らない)。
17291 @end enumerate
17292
17293 後に続く引数があれば、@var{command} に引数として渡される。
17294
17295 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
17296
17297 @table @samp
17298
17299 @item -i @var{mode}
17300 @itemx --input=@var{mode}
17301 @opindex -i
17302 @opindex --input
17303 標準入力ストリームのバッファリングを調整する。
17304
17305 @item -o @var{mode}
17306 @itemx --output=@var{mode}
17307 @opindex -o
17308 @opindex --output
17309 標準出力ストリームのバッファリングを調整する。
17310
17311 @item -e @var{mode}
17312 @itemx --error=@var{mode}
17313 @opindex -e
17314 @opindex --error
17315 標準エラーストリームのバッファリングを調整する。
17316
17317 @end table
17318
17319 @var{mode} には、以下のものを指定できる。
17320
17321 @table @samp
17322
17323 @item L
17324 ストリームを行単位のバッファ・モードにする。このモードでは、改行が出力されることになるか、
17325 あるいは、端末デバイスに結びついているストリームから入力が読み込まれるまで、データを溜めておく。
17326 このオプションは、標準入力に対しては無効である。
17327
17328 @item 0
17329 選択したストリームのバッファリングを無効にする。
17330 このモードでは、データは即座に出力される。また、要求された量のデータしか入力から読み込まない。
17331 入力と出力で動作が違うことに気をつけていただきたい。
17332 なお、入力のバッファリングを無効にしても、ストリーム入力関数の応答性やブロッキング動作に影響することはない。
17333 たとえば、@code{fread} は、要求した量より少ないデータを、下層で動いている
17334 @code{read} が返してきても、@code{EOF} が来るか、エラーが起きるまで、
17335 やはりブロッキングを行うのである。
17336
17337 @item @var{size}
17338 バッファ一杯モード (fully buffered mode) で使用するバッファのサイズを指定する。
17339 @multiplierSuffixesNoBlocks{size}
17340
17341 @end table
17342
17343 @command{stdbuf} がインストールされるのは、Executable and Linkable Format (ELF)
17344 を使用し、@code{constructor} アトリビュートをサポートしているプラットフォームだけである。
17345 従って、移植を考慮したスクリプトでは、@command{stdbuf}
17346 が存在することを当てにしない方がよい。
17347
17348 @cindex exit status of @command{stdbuf}
17349 終了ステータス:
17350
17351 @display
17352 125: @command{stdbuf} そのものの実行に失敗した。
17353 126: @var{command} は見つかったが、起動できなかった。
17354 127: @var{command} が見つからなかった。
17355 それ以外は、@var{command} の終了ステータス。
17356 @end display
17357
17358
17359 @node timeout invocation
17360 @section @command{timeout}: タイムリミット付きでコマンドを実行する
17361
17362 @pindex timeout
17363 @cindex time limit
17364 @cindex run commands with bounded time
17365
17366 @command{timeout} は渡されたコマンドを実行し、
17367 指定された時間が経過してもまだ実行が続いていたら、そのコマンドを終了させる。
17368
17369 書式:
17370
17371 @example
17372 timeout [@var{option}] @var{duration} @var{command} [@var{arg}]@dots{}
17373 @end example
17374
17375 @var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
17376 built-in utilities})。
17377
17378 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
17379 オプションはオペランドの前に置かなければならない。
17380
17381 @table @samp
17382 @item --preserve-status
17383 @opindex --preserve-status
17384 タイムアウトしたときに、タイムアウトであることを示す @command{timeout}
17385 コマンドの終了ステータスではなく、@command{timeout} が管理している
17386 @var{command} の終了ステータスを返す。このオプションは、管理される
17387 @var{command} が無期限の続行時間をサポートしている場合に役に立つ。
17388
17389 @item --foreground
17390 @opindex --foreground
17391 独立したバックグラウンドのプログラム・グループを作成しない。
17392 その結果、@command{timeout} に管理される @var{command} が、フォアグラウンドの
17393 TTY を通常どおり使用できるようになる。
17394 対話的シェルから直接実行されないコマンドの時間制限をきちんと行うには
17395 (訳注: 言い換えれば、@command{timeout} コマンドをシェルスクリプト中で使用する場合には)、
17396 この動作が必要になることがあり、次の二つの場合がそれに当たる。
17397 @enumerate
17398 @item
17399 @var{command} が対話的であり、たとえば端末からの読み込みが必要な場合。
17400 @item
17401 端末から直接 @var{command} にシグナルを送ることができるようにしたい場合。
17402 (たとえば、Ctrl-C を送るとか)。
17403 @end enumerate
17404
17405 気をつけていただきたいが、この動作モードでは、@var{command}
17406 の子プロセスは、いかなるものもタイムアウトすることがない。
17407 また、SIGCONT シグナルが @var{command} に送られることもない。
17408 フォアグラウンドプロセスでは、そういったことは普通必要がないからであり、
17409 また、(たとえば、GDB のような) それ自身が他のプログラムを監視するモニターであるプログラムでは、
17410 断続的なシグナル送出を起こしかねないからである。
17411
17412 @item -k @var{duration}
17413 @itemx --kill-after=@var{duration}
17414 @opindex -k
17415 @opindex --kill-after
17416 ここで指定した @var{duration} の経過後に、改めて @samp{KILL} シグナルを送り付けて、
17417 監視対象の @var{command} を確実に終了させる。
17418 このオプションを付けないと、選択したシグナルに @var{command}
17419 を終了させる力がなかった場合に、@command{timeout} は @var{command} を殺すことができない。
17420
17421 @item -s @var{signal}
17422 @itemx --signal=@var{signal}
17423 @opindex -s
17424 @opindex --signal
17425 制限時間が来たとき、デフォルトの @samp{TERM} シグナルではなく、指定した
17426 @var{signal} を @var{command} に送る。@var{signal} は @samp{HUP}
17427 のような名前でもよく、番号でもよい。@xref{Signal specifications}.
17428 @end table
17429
17430 @cindex time units
17431 @var{duration} は浮動小数点数であり、後ろに単位を付けることもできる。
17432 @display
17433 @samp{s} 何秒 (デフォルト)
17434 @samp{m} 何分
17435 @samp{h} 何時間
17436 @samp{d} 何日
17437 @end display
17438 @var{duration} が 0 だと、対象となるコマンドが時間切れなしになる。
17439 実際の制限時間は、システムの制約を受けることに注意していただきたい。
17440 秒以下の制限時間を指定するときは、とりわけそれを考慮に入れるべきである。
17441
17442 @cindex exit status of @command{timeout}
17443 終了ステータス:
17444
17445 @display
17446 124: @var{command} がタイムアウトした。
17447 125: @command{timeout} そのものの実行に失敗した。 
17448 126: @var{command} は見つかったが、起動できなかった。
17449 127: @var{command} が見つからなかった。
17450 137: @var{command} に KILL(9) シグナルを送った (128+9)
17451 それ以外は、@var{command} の終了ステータス。
17452 @end display
17453
17454
17455 @node Process control
17456 @chapter プロセス制御
17457
17458 @cindex processes, commands for controlling
17459 @cindex commands for controlling processes
17460
17461 @menu
17462 * kill invocation::          プロセスにシグナルを送る。
17463 @end menu
17464
17465
17466 @node kill invocation
17467 @section @command{kill}: プロセスにシグナルを送る
17468
17469 @pindex kill
17470 @cindex send a signal to processes
17471
17472 @command{kill} コマンドは、プロセスにシグナルを送る。
17473 シグナルを送られたプロセスは、終了するか、
17474 あるいは、シグナルを受け取った時点で他の何らかの形で反応する。
17475 また、@command{kill} は、シグナルに関する情報を一覧表示する。
17476
17477 書式:
17478
17479 @example
17480 kill [-s @var{signal} | --signal @var{signal} | -@var{signal}] @var{pid}@dots{}
17481 kill [-l | --list | -t | --table] [@var{signal}]@dots{}
17482 @end example
17483
17484 @mayConflictWithShellBuiltIn{kill}
17485
17486 @command{kill} コマンドの最初の書式では、すべての @var{pid} 引数に対してシグナルが送られる。
17487 シグナルが指定されていない場合に送られるデフォルトのシグナルは、@samp{TERM} である。
17488 @samp{0} という特別なシグナル番号は、有効なシグナルを表していないが、
17489 引数 @var{pid} が指しているプロセスに対してシグナルを送ることが可能かどうかを、調べるために使うことができる。
17490
17491 @var{pid} が正の数なら、シグナルはプロセス ID が @var{pid} のプロセスに送られる。
17492 @var{pid} が 0 なら、シグナルはカレントプロセスのプロセスグループに属するすべてのプロセスに送られる。
17493 @var{pid} が @minus{}1 の場合、シグナルが送られるのは、
17494 ユーザがシグナルを送る権限を持っているすべてのプロセスである。
17495 @var{pid} が @minus{}1 より小さい場合は、@var{pid}
17496 の絶対値に等しいプロセスグループに属するすべてのプロセスにシグナルが送られる。
17497
17498 @var{pid} が正の数ではない場合、システムプロセスに属するプロセス
17499 (システムによって様々である) は、シグナルが送られるプロセスのリストから除外される。
17500
17501 最初の @var{pid} 引数として負の @var{pid} を使用したい場合は、その前に
17502 @option{--} オプションを置くべきである。
17503 とは言え、@samp{kill -@var{signal} -@var{pid}} という書式を使う場合は、
17504 @option{--} は必要がない。これは、POSIX に対する一般的な拡張である。
17505 そこで、次に挙げるコマンドは等価になる。
17506
17507 @example
17508 kill -15 -1
17509 kill -TERM -1
17510 kill -s TERM -- -1
17511 kill -- -1
17512 @end example
17513
17514 最初の書式の @command{kill} コマンドは、すべての @var{pid} 引数が、
17515 シグナルが送られたプロセスをそれぞれ少なくとも一つは指している場合に、
17516 成功のステータスで終了する。
17517
17518 @command{kill} コマンドの二番目の書式では、シグナルに関する情報が表示される。
17519 @option{-l} または @option{--list}、あるいは、@option{-t} または @option{--table}
17520 オプションの指定は必須である。引数 @var{signal} を一つも指定しないと、
17521 サポートされているすべてのシグナルがリストされる。@option{-l} や @option{--list}
17522 の出力は、シグナル名のリストであり、1 行に一つづつ表示される。
17523 ただし、引数 @var{signal} がすでにシグナル名である場合は、名前ではなく、シグナル番号の表示になる。
17524 @option{-t} や @option{--table} の出力は、シグナル番号、シグナル名、その説明からなる表である。
17525 この書式の @command{kill} コマンドは、引数として指定されたすべての
17526 @var{signal} が有効なものであり、出力エラーがなかったとき、成功のステータスで終了する。
17527
17528 @command{kill} コマンドでは、@option{--help} や @option{--version} オプションも使用できる。
17529 @xref{Common options}.
17530
17531 @var{signal} の指定には、@samp{HUP} のようなシグナル名や、@samp{1}のようなシグナル番号、
17532 それに、シグナルによって終了させられるときのプロセスの終了ステータスを使うことができる
17533 (訳注: 最後のものは、GNU coreutils の @command{kill}
17534 コマンドでは使用できるが、シェルの組み込みコマンドのような、他の系統の
17535 @command{kill} では使えないかもしれない)。
17536 シグナル名は、標準的な形式でも、頭に @samp{SIG} を付けた形式でも構わない。
17537 大文字小文字はどちらを使ってもよいが、@option{-@var{signal}}
17538 という形式のオプションの場合は例外で、大文字を使わなければならない。
17539 小文字を使うと、他のオプションとまぎらわしいからである。
17540 サポートしているシグナル名とシグナル番号については、「2.5 シグナルの指定」を参照していただきたい。
17541 @xref{Signal specifications}.
17542
17543 @node Delaying
17544 @chapter 一時停止
17545
17546 @cindex delaying commands
17547 @cindex commands for delaying
17548
17549 @c Perhaps @command{wait} or other commands should be described here also?
17550
17551 @menu
17552 * sleep invocation::         指定された時間、停止する。
17553 @end menu
17554
17555
17556 @node sleep invocation
17557 @section @command{sleep}: 指定された時間、停止する
17558
17559 @pindex sleep
17560 @cindex delay for a specified time
17561
17562 @command{sleep} は、コマンドラインで引数として指定された値を合計した時間だけ停止する。
17563
17564 書式:
17565
17566 @example
17567 sleep @var{number}[smhd]@dots{}
17568 @end example
17569
17570 @cindex time units
17571 各引数は数値であり、後ろに単位を付けてもよい。デフォルトの単位は秒である。
17572 単位には、以下のものが指定できる。
17573
17574 @table @samp
17575 @item s
17576
17577 @item m
17578
17579 @item h
17580
17581 @item d
17582
17583 @end table
17584
17585 @command{sleep} の従来の実装では、@var{number} は整数でなければならず、
17586 引数は接尾辞なしのものが 1 個しか認められていなかった。それに対して GNU の
17587 @command{sleep} では、任意の浮動小数点数を複数個指定できる。 @xref{Floating point}.
17588
17589 オプションは、@option{--help} と @option{--version} だけである。
17590 @xref{Common options}.
17591
17592 @c sleep is a shell built-in at least with Solaris 11's /bin/sh
17593 @mayConflictWithShellBuiltIn{sleep}
17594
17595 @exitstatus
17596
17597
17598 @node Numeric operations
17599 @chapter 数値の操作
17600
17601 @cindex numeric operations
17602 以下のプログラムは、数に関係した作業をする。
17603
17604 @menu
17605 * factor invocation::        素因数を表示する。
17606 * numfmt invocation::        数値を整形し直す。
17607 * seq invocation::           連続する数を表示する。
17608 @end menu
17609
17610
17611 @node factor invocation
17612 @section @command{factor}: 素因数を表示する
17613
17614 @pindex factor
17615 @cindex prime factors
17616
17617 @command{factor} は、素因数を表示する。
17618
17619 書式:
17620
17621 @example
17622 factor [@var{number}]@dots{}
17623 factor @var{option}
17624 @end example
17625
17626 @var{number} がコマンドラインで指定されていない場合、@command{factor}
17627 は標準入力から数値を読み込む。
17628 このとき、改行、タブ、空白で区切って複数の数値を入力することができる。
17629
17630 @command{factor} コマンドで使えるオプションは、いくつもない。
17631
17632 @table @samp
17633 @item --help
17634 簡単なヘルプメッセージを標準出力に表示し、それ以上の処理をせずに終了する。
17635
17636 @item --version
17637 プログラムのバージョンを標準出力に表示し、それ以上の処理をせずに終了する。
17638 @end table
17639
17640 メルセンヌ素数の 8 番目と 9 番目の積を素因数に分解するには、2.2 GHz
17641 Athlon のシステムで、30 ミリセコンドの CPU 時間を要する。
17642
17643 @example
17644 M8=$(echo 2^31-1|bc)
17645 M9=$(echo 2^61-1|bc)
17646 n=$(echo "$M8 * $M9" | bc)
17647 /usr/bin/time -f %U factor $n
17648 4951760154835678088235319297: 2147483647 2305843009213693951
17649 0.03
17650 @end example
17651
17652 同様に、8 番目のフェルマー数、@math{2^{256}+1} では、同じマシンで約 20 秒かかる。
17653
17654 大きな数の素因数分解は、そもそも大変な作業である。@command{factor} が使用している
17655 Pollard-Brent rho アルゴリズムは、比較的小さな因数を持つ数値に対してとりわけ効率がよい。
17656 もし、小さな因数を持たない大きな数値 (たとえば、二つの大きな素数の積からなる数値)
17657 の素因数分解をなさりたいのなら、他の方法の方がずっとすぐれている。
17658
17659 @command{factor} が GNU MP を使用せずにビルドされている場合は、
17660 単精度の算術しか利用できない。従って、大きな数値 (一般には @math{2^{128}} 以上)
17661 には対応していない。単精度用のコードが使用しているアルゴリズムは、
17662 比較的小さな数値を素因数に分解するためのものなのである。
17663
17664 @exitstatus
17665
17666
17667 @node numfmt invocation
17668 @section @command{numfmt}: 数値を整形し直す
17669
17670 @pindex numfmt
17671
17672 @command{numfmt} はさまざまな表記の数値を読み込んで、それを要求された形に整形し直す。
17673 一番よく使うのは、数値を人間が読みやすい形に変換する場合や、
17674 その逆を行う場合である (たとえば、@samp{4G} @expansion{} @samp{4,000,000,000})。
17675
17676 @example
17677 numfmt [@var{option}]@dots{} [@var{number}]
17678 @end example
17679
17680 @command{numfmt} は、コマンドラインで与えられた各 @var{number} を、
17681 指定されたオプション (以下の節を参照) に従って変換する。
17682 @var{number} の指定がない場合は、標準入力から数値を読み込む。
17683 また、@command{numfmt} は、入力行中の特定のフィールドから数値を取り出すこともできる。
17684 その場合、列が揃うようにパディング (訳注: フィールドの空き埋め) が行われていれば、
17685 それも適切に維持する。
17686
17687 @exitstatus
17688
17689 終了ステータスについては追加情報がある。@option{--invalid} をご覧になっていただきたい。
17690
17691 @menu
17692 * General options in numfmt::  一般オプション
17693 * Possible UNITs::             使用できる UNIT
17694 * Examples of using numfmt::   numfmt の使用例
17695 @end menu
17696
17697 @node General options in numfmt
17698 @subsection 一般オプション
17699
17700 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
17701
17702 @table @samp
17703
17704 @item --debug
17705 @opindex --debug
17706 間違えた使い方をしている疑いがあるとき、それについて警告メッセージを
17707 (標準エラーに) 表示する。
17708
17709 @item -d @var{d}
17710 @itemx --delimiter=@var{d}
17711 @opindex -d
17712 @opindex --delimiter
17713 文字 @var{d} を入力フィールドの区切りとして使用する (デフォルトはホワイトスペース)。
17714 区切りにデフォルト以外の文字を使うと、自動的なパディングが行われなくなるのに注意していただきたい。
17715
17716 @item --field=@var{fields}
17717 @opindex --field
17718 @var{field} 番目の入力フィールドの数値を変換する (@var{field} のデフォルトは 1)。
17719 @var{fields} では、@command{cut} と同じような範囲指定が使える。
17720
17721 @example
17722 N    N 番目のフィールド、1 から数える
17723 N-   N 番目のフィールドから行末まで
17724 N-M  N 番目から M 番目のフィールドまで (両端を含む)
17725 -M   行頭から M 番目のフィールドまで (両端を含む)
17726 -    すべてのフィールド
17727 @end example
17728
17729
17730 @item --format=@var{format}
17731 @opindex --format
17732 浮動小数点数を表す printf 形式の @var{format} 文字列を出力の整形に使用する。
17733 文字列 @var{format} には、1 個の @samp{%f} 変換指定子が含まれていなければならない。
17734 なお、そうしたければ、@samp{'}, @samp{-}, @samp{0} といった修飾子や、
17735 フィールド幅修飾子 (訳注: 数値)、精度修飾子を @samp{%f} に付けることもできる。
17736 @samp{'} 修飾子は @option{--grouping} オプションを有効にし、@samp{-} 修飾子は
17737 @option{--padding} オプションを左詰めで有効に、フィールド幅修飾子は
17738 @option{--padding} オプションを右詰めで有効にする (訳注: @samp{-} 修飾子は、
17739 数値であるフィールド幅修飾子と併せて用いなければならない)。
17740 @samp{0} フィールド幅修飾子を使うと (@samp{-} も同時に指定されていなければ)、
17741 指定された幅になるまで数値の前に 0 を付けることになる。
17742 @samp{%.1f} のような精度指定は、入力データから引き出される精度や、@option{--to}
17743 オプションを使用したときの、数値の大きさや桁数の自動調整 (auto-scaling)
17744 によって決められた精度を上書きする。
17745
17746 @item --from=@var{unit}
17747 @opindex --from
17748 入力された数値の大きさや桁数を @var{unit} に従って自動調整 (auto-scaling)
17749 する (訳注: 一例を挙げると、入力数値が @samp{1K} だったとき、@samp{--from=si}
17750 が指定されていれば 1000 に変換し、@samp{--from=iec} が指定されていれば
17751 1024 に変換する)。@var{unit} については、次節「使用できる UNIT」を参照していただきたい。
17752 デフォルトでは数値の大きさや桁数の調節を行わない。
17753 それはまた、入力数値に接尾辞 (たとえば、@samp{M}, @samp{G} など)
17754 が付いていると、エラーになるということでもある。
17755
17756 @item --from-unit=@var{n}
17757 @opindex --from-unit
17758 入力の 1 単位の大きさを (すなわち、デフォルトの 1 に代えて使う大きさを)
17759 指定する。入力する数値の 1 単位の大きさが、デフォルトの
17760 1 以外の場合に、このオプションを使用するわけだ (たとえば、入力する数値の
17761 @samp{10} が、1 単位 512 バイトの 10 単位を表している場合には、
17762 @samp{--from-unit=512} を使用する)。
17763 単位となる数値に接尾辞を付けると、@samp{--from=auto} の場合と同様に処理される。
17764
17765 @item --grouping
17766 @opindex --grouping
17767 現在のロケールの桁区切りルールに従って、出力する数値を数桁ごとに区切る
17768 (たとえば、3 桁ごとの区切り記号は、たいてい @samp{.} (ドット) か
17769 @samp{,} (コンマ) である)。ロケールが @samp{POSIX/C} の場合は、このオプションに効果はない。
17770
17771 @item --header[=@var{n}]
17772 @opindex --header
17773 @opindex --header=N
17774 最初の @var{n} (デフォルトは 1) 行を、いかなる変換もせずに出力する。
17775
17776 @item --invalid=@var{mode}
17777 @opindex --invalid
17778 入力エラーに出会ったときのデフォルトの動作は、ステータスコード 2 で即座に終了することである。
17779 @option{--invalid=@samp{abort}} は、このデフォルトの動作を明示的に指定することになる。
17780 @var{mode} に @samp{fail} を指定すると、
17781 変換エラーがあるごとに警告メッセージを表示して、ステータス 2 で終了する。
17782 @var{mode} が @samp{warn} の場合は、変換エラーがあっても、ステータス 0
17783 で終了する。@var{mode} が @samp{ignore} の場合は、ステータス 0
17784 で終了するだけでなく、診断メッセージを出すことすらしない。
17785
17786 @item --padding=@var{n}
17787 @opindex --padding
17788 出力する数値が @var{n} 字分を占めるように、スペースを加えることでパディングを行う。
17789 @var{n} が正の数の場合は、数値が右詰めになり、負の数の場合は、数値が左詰めになる。
17790 デフォルトでは、数値は、入力行の幅に基づいて
17791 (訳注: 詳しく言うと、入力各行の変換する数値のあるフィールドが固定幅の場合、
17792 その幅を使用して) 自動的に揃えられる
17793 (ただし、それが行われるのは、フィールドの区切り文字がデフォルトの場合だけである)。
17794
17795 @item --round=@var{method}
17796 @opindex --round
17797 @opindex --round=up
17798 @opindex --round=down
17799 @opindex --round=from-zero
17800 @opindex --round=towards-zero
17801 @opindex --round=nearest
17802 数値の表現を変換するときに、@var{method} に従って、数値を丸める。@var{method}
17803 には、@samp{up}, @samp{down}, @samp{from-zero} (デフォルト), @samp{towards-zero},
17804 @samp{nearest} が使用できる。(訳注: @samp{up} は切り上げ、@samp{down} は切り下げ、
17805 @samp{from-zero} はゼロから離れる方向へ、@samp{towards-zero} はゼロに近づく方向へ、
17806 @samp{nearest} は四捨五入である。)
17807
17808 @item --suffix=@var{suffix}
17809 @opindex --suffix
17810 出力する数値に @samp{SUFFIX} を付ける。また、入力する数値に @samp{SUFFIX}
17811 が付いていても、エラーにしない。
17812
17813 @item --to=@var{unit}
17814 @opindex --to
17815 出力する数値の大きさや桁数を @var{unit} に従って自動調整する。
17816 @var{unit} については、次節「使用できる UNIT」を参照していただきたい。
17817 デフォルトでは、数値の大きさや桁数の調節をしないので、
17818 数値を構成するすべての数字が表示されることになる。
17819
17820 @item --to-unit=@var{n}
17821 @opindex --to-unit
17822 出力の 1 単位の大きさを (すなわち、デフォルトの 1 に代えて使う大きさを)
17823 指定する。出力する数値の 1 単位の大きさが、デフォルトの
17824 1 以外の場合に、このオプションを使用するわけだ (たとえば、1
17825 ブロック 1KB のブロック数で @samp{4,000,000} バイトを表現するには、
17826 @samp{--to=si --to-unit=1000} が使用できる)。
17827 単位となる数値に接尾辞を付けると、@samp{--from=auto} の場合と同様に処理される。
17828
17829 @optZeroTerminated @newlineFieldSeparator
17830
17831 @end table
17832
17833 @node Possible UNITs
17834 @subsection 使用できる @var{unit}
17835
17836 @option{--from=UNIT} や @option{--to=UNIT} で指定する @var{unit} には、
17837 次のものを選択することができる。(訳注: @var{unit} の名前は、大文字ではなく、si, iec
17838 などの小文字で指定すること。)
17839
17840 @table @var
17841
17842 @item none
17843 数値の大きさや桁数の調整を行わない。入力する数値には、いかなる接尾辞も付けることができない。
17844 従って、数値の直後に文字が続くとエラーになる。
17845 出力する数値については、その数値を構成するすべての数字を表示する。
17846
17847 @item si
17848 国際単位系 (International System of Units (SI)) の規格に従って、数値の大きさや桁数を自動調整する。
17849 入力する数値には、以下の接尾辞の一つが使用できる。
17850 出力する数値については、1000 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。
17851
17852 @example
17853 @samp{K}  =>  @math{1000^1 = 10^3} (Kilo)
17854 @samp{M}  =>  @math{1000^2 = 10^6} (Mega)
17855 @samp{G}  =>  @math{1000^3 = 10^9} (Giga)
17856 @samp{T}  =>  @math{1000^4 = 10^{12}} (Tera)
17857 @samp{P}  =>  @math{1000^5 = 10^{15}} (Peta)
17858 @samp{E}  =>  @math{1000^6 = 10^{18}} (Exa)
17859 @samp{Z}  =>  @math{1000^7 = 10^{21}} (Zetta)
17860 @samp{Y}  =>  @math{1000^8 = 10^{24}} (Yotta)
17861 @end example
17862
17863 @item iec
17864 International Electrotechnical Commission (IEC) の規格に従って、数値の大きさや桁数を自動調整する。
17865 入力する数値では、以下の接尾辞の一つが使用できる。
17866 出力する数値については、1024 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。
17867
17868 @example
17869 @samp{K}  =>  @math{1024^1 = 2^{10}} (Kibi)
17870 @samp{M}  =>  @math{1024^2 = 2^{20}} (Mebi)
17871 @samp{G}  =>  @math{1024^3 = 2^{30}} (Gibi)
17872 @samp{T}  =>  @math{1024^4 = 2^{40}} (Tebi)
17873 @samp{P}  =>  @math{1024^5 = 2^{50}} (Pebi)
17874 @samp{E}  =>  @math{1024^6 = 2^{60}} (Exbi)
17875 @samp{Z}  =>  @math{1024^7 = 2^{70}} (Zebi)
17876 @samp{Y}  =>  @math{1024^8 = 2^{80}} (Yobi)
17877 @end example
17878
17879 @option{iec} を選択すると、接尾辞に (@samp{G} など)
17880 1 文字の記号が使用されることになるが、これは規格に完全にかなってるとは言えない。
17881 IEC の規格では (@samp{Gi} など) 2 字の記号を推奨しているからだ。
17882 しかし、実際の使用では、1 文字の表記法が普通に使われている。
17883 @option{iec-i} を指定した場合と比較していただきたい。
17884
17885 @item iec-i
17886 International Electrotechnical Commission (IEC) の規格に従って、数値の大きさや桁数を自動調整する。
17887 入力する数値では、以下の接尾辞の一つが使用できる。
17888 出力する数値については、1024 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。
17889
17890 @example
17891 @samp{Ki}  =>  @math{1024^1 = 2^{10}} (Kibi)
17892 @samp{Mi}  =>  @math{1024^2 = 2^{20}} (Mebi)
17893 @samp{Gi}  =>  @math{1024^3 = 2^{30}} (Gibi)
17894 @samp{Ti}  =>  @math{1024^4 = 2^{40}} (Tebi)
17895 @samp{Pi}  =>  @math{1024^5 = 2^{50}} (Pebi)
17896 @samp{Ei}  =>  @math{1024^6 = 2^{60}} (Exbi)
17897 @samp{Zi}  =>  @math{1024^7 = 2^{70}} (Zebi)
17898 @samp{Yi}  =>  @math{1024^8 = 2^{80}} (Yobi)
17899 @end example
17900
17901 @option{iec-i} を選択すると、接尾辞に (@samp{Gi} など)
17902 2 文字の記号が使用されることになる。これは、IEC の規格が推奨しているとおりだが、
17903 実際の使用では、必ずしもよく使われているわけではない。@option{iec}
17904 を指定した場合と、比較していただきたい。
17905
17906 @item auto
17907 @samp{auto} は @option{--from} でしか使えない。これを選んだ場合、@samp{K},@samp{M},@samp{G},
17908 @samp{T},@samp{P},@samp{E},@samp{Z},@samp{Y} といった接尾辞が付いていれば、
17909 数値は SI の値と見なされる。接尾辞が
17910 @samp{Ki},@samp{Mi},@samp{Gi},@samp{Ti},@samp{Pi},@samp{Ei},@samp{Zi},@samp{Yi}
17911 などの場合は、
17912 数値は IEC の値と見なされることになる。
17913
17914 @end table
17915
17916 @node Examples of using numfmt
17917 @subsection @command{nunfmt} の使用例
17918
17919 1 個の数値を人間に読みやすい形に変換する (あるいは、その逆を行う)。
17920 @example
17921 $ numfmt --to=si 500000
17922 500K
17923
17924 $ numfmt --to=iec 500000
17925 489K
17926
17927 $ numfmt --to=iec-i 500000
17928 489Ki
17929
17930 $ numfmt --from=si 1M
17931 1000000
17932
17933 $ numfmt --from=iec 1M
17934 1048576
17935
17936 # '--from=auto' を使用する。M=Mega, Mi=Mebi
17937 $ numfmt --from=auto 1M
17938 1000000
17939 $ numfmt --from=auto 1Mi
17940 1048576
17941 @end example
17942
17943 @samp{SI} 表記を @samp{IEC} 表記に換算する (たとえば、ハードディスクの容量が、
17944 メーカー表示では @samp{1TB} となっているが、実際に容量をチェックすると、
17945 それより少ない場合)。
17946
17947 @example
17948 $ numfmt --from=si --to=iec 1T
17949 932G
17950 @end example
17951
17952
17953 ファイルやパイプから読み込んだ入力行にある、ある一つのフィールドを変換する
17954 (ここに示す数例は、あくまでも説明のために作ったものである。実際には、@command{ls}
17955 と @command{df} のどちらにも、人間に読みやすい形式でサイズを表示するための
17956 @option{--human-readable} オプションが存在している)。
17957
17958 @example
17959 # 3 番目のフィールド (ファイルサイズ) を SI 表記で表示する
17960 $ ls -log | numfmt --field 3 --header --to=si | head -n4
17961 -rw-r--r--  1     94K Aug 23  2011 ABOUT-NLS
17962 -rw-r--r--  1    3.7K Jan  7 16:15 AUTHORS
17963 -rw-r--r--  1     36K Jun  1  2011 COPYING
17964 -rw-r--r--  1       0 Jan  7 15:15 ChangeLog
17965 (訳注: 実際には、この一番下の行は表示されず、一番上に「total @dots{} 
17966 といった行が現れるはずである。)
17967
17968 # 二番目のフィールド (サイズ) を IEC 表記で表示する
17969 $ df --block-size=1 | numfmt --field 2 --header --to=iec | head -n4
17970 File system   1B-blocks        Used  Available Use% Mounted on
17971 rootfs             132G   104741408   26554036  80% /
17972 tmpfs              794M        7580     804960   1% /run/shm
17973 /dev/sdb1          694G   651424756   46074696  94% /home
17974 @end example
17975
17976
17977 出力は @option{--padding} や @option{--format} オプションを使って加工することができる。
17978
17979 @example
17980 # フィールド幅が 10 字になるまで空白で埋める。右詰め表示。
17981 $ du -s * | numfmt --to=si --padding=10
17982       2.5K config.log
17983        108 config.status
17984       1.7K configure
17985         20 configure.ac
17986
17987 # フィールド幅が 10 字になるまで空白で埋める。左詰め表示。
17988 $ du -s * | numfmt --to=si --padding=-10
17989 2.5K       config.log
17990 108        config.status
17991 1.7K       configure
17992 20         configure.ac
17993
17994 # @option{--format} オプションを使用して、フィールド幅が 10 文字になるまで
17995 # 空白で埋める。右詰め表示。
17996 $ du -s * | numfmt --to=si --format="%10f"
17997       2.5K config.log
17998        108 config.status
17999       1.7K configure
18000         20 configure.ac
18001
18002 # @option{--format} オプションを使用して、フィールド幅が 10 文字になるまで
18003 # 空白で埋める。左詰め表示。
18004 $ du -s * | numfmt --to=si --padding="%-10f"
18005 2.5K       config.log
18006 108        config.status
18007 1.7K       configure
18008 20         configure.ac
18009 @end example
18010
18011 桁区切りをサポートしているロケールでは、@option{--grouping} や @option{--format}
18012 オプションを使って、数値を数桁ごとに区切ることができる。ロケールが
18013 @samp{POSIX} や @samp{C} の場合は、桁区切りを指定しても、単に無視される。
18014
18015 @example
18016 $ LC_ALL=C numfmt --from=iec --grouping 2G
18017 2147483648
18018
18019 $ LC_ALL=en_US.utf8 numfmt --from=iec --grouping 2G
18020 2,147,483,648
18021
18022 $ LC_ALL=ta_IN numfmt --from=iec --grouping 2G
18023 2,14,74,83,648
18024
18025 $ LC_ALL=C numfmt --from=iec --format="==%'15f==" 2G
18026 ==     2147483648==
18027
18028 $ LC_ALL=en_US.utf8 numfmt --from=iec --format="==%'15f==" 2G
18029 ==  2,147,483,648==
18030
18031 $ LC_ALL=en_US.utf8 numfmt --from=iec --format="==%'-15f==" 2G
18032 ==2,147,483,648  ==
18033
18034 $ LC_ALL=ta_IN numfmt --from=iec --format="==%'15f==" 2G
18035 == 2,14,74,83,648==
18036 @end example
18037
18038
18039 @node seq invocation
18040 @section @command{seq}: 数列を表示する
18041
18042 @pindex seq
18043 @cindex numeric sequences
18044 @cindex sequence of numbers
18045
18046 @command{seq} は、数列を標準出力に表示する。
18047
18048 書式:
18049
18050 @example
18051 seq [@var{option}]@dots{} @var{last}
18052 seq [@var{option}]@dots{} @var{first} @var{last}
18053 seq [@var{option}]@dots{} @var{first} @var{increment} @var{last}
18054 @end example
18055
18056 @command{seq} は、@var{first} から @var{last} までの数を @var{increment} おきに表示する。
18057 デフォルトでは、それぞれの数は 1 行に 1 個づつ表示される。
18058 @var{increment} が指定されていない場合は、@var{first} が @var{last}
18059 より大きい場合でも、デフォルトの @samp{1} が @var{increment} として使用される。
18060 @var{first} のデフォルトもまた @samp{1} である。
18061 従って、@code{seq 1} は @samp{1} を表示するが、@code{seq 0} や @code{seq 10 5}
18062 は、何も出力しない。数列が終了するのは、現在の数値に @var{increment} を加えたら
18063 @var{last} より大きくなってしまう時点である。だから、@code{seq 1 10 10}
18064 は、@samp{1} しか表示しない。@var{increment} の値には @samp{0} を指定できない。
18065 同じ数を繰り返し出力したかったら、@command{yes} コマンドを使うべきである。
18066 また、@var{first}, @var{increment}, @var{last} の値は、@code{NaN}
18067 (訳注: Not a Number) であってはならない。数値には浮動小数点数を指定することもできる。
18068 @xref{Floating point}.
18069
18070 このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
18071 オプションはオペランドの前に置かなければならない。
18072
18073 @table @samp
18074 @item -f @var{format}
18075 @itemx --format=@var{format}
18076 @opindex -f
18077 @opindex --format
18078 @cindex formatting of numbers in @command{seq}
18079 すべての数を @var{format} を使用して表示する。@var{format} は、 @samp{printf}
18080 形式の浮動小数点数の変換指定をただ一つ含むものでなければならない。
18081 すなわち、@samp{%a}, @samp{%e}, @samp{%f}, @samp{%g}, @samp{%A},
18082 @samp{%E}, @samp{%F}, @samp{%G} のいづれかである。
18083 @samp{%} の後ろには 0 個以上のフラグを、@samp{-+#0 '} のうちから選んで置くことができる。
18084 また、それに続けて、1 個以上の数字からなるフィールド幅を指定することもできるし、
18085 さらにその後ろに、@samp{.} とそれに続く 0 個以上の数字からなる精度を指定することもできる。
18086 @var{format} には、任意の数の @samp{%%} 変換指定が含まれていてもよい。
18087 変換指定はすべて、@samp{printf} の場合と同じ意味を持っている。
18088
18089 デフォルトの表示形式は、@var{first}, @var{increment}, @var{last}
18090 がどういう表記を使用しているかよって決まる。そのすべてが固定小数点の
18091 10 進数表記を使用しているならば、デフォルトの表示形式は @samp{%.@var{p}f} になる。
18092 この @var{p} には、出力する数値を過不足なく表現できる最小の精度が来る。
18093 それ以外の場合、デフォルトの表示形式は @samp{%g} になる。
18094
18095 @item -s @var{string}
18096 @itemx --separator=@var{string}
18097 @opindex -s
18098 @opindex --separator
18099 @cindex separator for numbers in @command{seq}
18100 数の区切りに @var{string} を使う。デフォルトは改行である。出力の最後には、必ず改行が付く。
18101
18102 @item -w
18103 @itemx --equal-width
18104 @opindex -w
18105 @opindex --equal-width
18106 すべての数を同じ桁数で表示する。先頭の空きは 0 で埋める。@var{first},
18107 @var{increment}, @var{last} は、すべて固定小数点の 10 進数表記でなければならない
18108 (他のやり方で先頭を埋めたければ、@option{--format} を使うこと)。
18109
18110 @end table
18111
18112 @option{-f} オプションを使えば、出力をもっときめ細かく制御することができる。
18113
18114 @example
18115 $ seq -f '(%9.2E)' -9e5 1.1e6 1.3e6
18116 (-9.00E+05)
18117 ( 2.00E+05)
18118 ( 1.30E+06)
18119 @end example
18120
18121 出力を 16 進数の整数にしたかったら、@command{printf} を使って変換すればよい。
18122
18123 @example
18124 $ printf '%x\n' $(seq 1048575 1024 1050623)
18125 fffff
18126 1003ff
18127 1007ff
18128 @end example
18129
18130 数のリストが非常に長くなる場合は、@command{xargs}
18131 を使用すると、引数リストの長さに対するシステムの制限を回避することができる。
18132
18133 @example
18134 $ seq 1000000 | xargs printf '%x\n' | tail -n 3
18135 f423e
18136 f423f
18137 f4240
18138 @end example
18139
18140 8 進数の出力を生成するには、printf に対して @code{%x} の代わりに、@code{%o}
18141 フォーマットを使用すればよい。
18142
18143 ほとんどのシステムで @command{seq} は、少なくとも @math{2^{53}}
18144 までの数値に対して整数の出力を生成することができる。それより大きい整数に対しては概算になる。
18145 細かい点は、ご使用のシステムの浮動小数点の実装によって異なっている。
18146 @xref{Floating point}.  @command{seq} が @math{2^{64}}
18147 までの整数に対してなら、きちんと動作するが、
18148 それより大きな整数に対しては、数値が不正確になることがあるというのは、よくある話である。
18149
18150 @example
18151 $ seq 50000000000000000000 2 50000000000000000004
18152 50000000000000000000
18153 50000000000000000000
18154 50000000000000000004
18155 @end example
18156
18157 とは言え、負ではない整数を対象とし、インクリメントが 1 で、
18158 フォーマット指定オプションはないという条件の元では、
18159 @command{seq} は任意の大きな数値を表示できることも心に留めておいていただきたい。
18160
18161 @command{seq} でとんでもなく大きな桁の値を扱うときは、気をつけた方がよい。
18162 さもないと、@command{seq} は内部で浮動小数点を使用しているので、結果を見てびっくりするかもしれない。
18163 たとえば、x86 のプラットフォームでは、内部表現が 64 ビットの仮数部を使用しているが、
18164 そこで次のコマンドを実行すると、
18165
18166 @example
18167 seq 1 0.0000000000000000001 1.0000000000000000009
18168 @end example
18169
18170 @command{seq} は 1.0000000000000000007 を二度出力し、1.0000000000000000008
18171 をスキップする (訳注: 訳者の amd64 環境では、1.0000000000000000008
18172 ではなく、1.0000000000000000006 をスキップする)。
18173
18174 @exitstatus
18175
18176
18177 @node File permissions
18178 @chapter ファイルの許可属性
18179 @include perm-ja.texi
18180
18181 @include parse-datetime-ja.texi
18182
18183 @c              What's GNU?
18184 @c              Arnold Robbins
18185 @node Opening the software toolbox
18186 @chapter ソフトウェアの道具箱
18187
18188 この章の初期のバージョンは、「GNU とは何か? (@cite{What's GNU?})」という連載記事として
18189 @cite{Linux Journal} 1994 年 6 月号に掲載された。
18190 執筆者は Arnold Robbins である。
18191 (@uref{http://www.linuxjournal.com/article.php?sid=2762})
18192
18193 @menu
18194 * Toolbox introduction::     はじめに
18195 * I/O redirection::          I/O リダイレクション
18196 * The who command::          @command{who} コマンド
18197 * The cut command::          @command{cut} コマンド
18198 * The sort command::         @command{sort} コマンド
18199 * The uniq command::         @command{uniq} コマンド
18200 * Putting the tools together::  工具を組み合わせる
18201 @end menu
18202
18203
18204 @node Toolbox introduction
18205 @unnumberedsec はじめに
18206
18207 今月の記事と GNU プロジェクトの関係は、周辺的なものにすぎない。お手元の
18208 GNU/Linux システムの GNU ツールをいくつか取り上げて、
18209 こんな使い方もありますよ、と述べている点で、関係があるにすぎないのだ。
18210 今月の記事の真の狙いは、プログラムを開発したり、使用したりする上での、
18211 「ソフトウェアは工具だ」という考え方を説明することである。
18212
18213 ソフトウェアは工具だという思想は、Unix が最初に設計され、開発されたときの重要で不可欠な考え方だった
18214 (Linux も GNU も本質的には Unix のクローンである)。
18215 残念なことに、最近ではインターネットや見栄えのよい GUI の勢いに押されて、
18216 ソフトウェア工具論は流行らなくなっているようだ。
18217 この思想は、様々な問題を解決するための強力な思考モデルを提供してくれるのだから、
18218 まことに残念な話である。
18219
18220 スイス・アーミーナイフをズボンのポケットに (または、小物入れに)
18221 入れて、持ち歩いている人は多い。スイス・アーミーナイフは持っていると重宝な道具だ。
18222 それには、何本かのナイフ、ねじ回し、ピンセット、つまようじ、爪やすり、コルク抜き、
18223 他にもたぶん、いろいろ付いているだろう。
18224 日常のちょっとした雑用には、何にでも使える簡単な道具があれば済むのだから、
18225 そうした用途にはまさにピッタリの道具である。
18226
18227 しかしながら、熟練した大工は、スイス・アーミーナイフを使って家を建てたりしない。
18228 彼は、その代わりに道具箱を持っていて、そこには用途別の工具
18229 --- のこぎり、金槌、ねじ回し、鉋など --- がぎっしり詰まっている。
18230 しかも、彼は一つ一つの工具について、適材適所を心得ている。
18231 ねじ回しの柄で釘を打ち込んだりすることは絶対にないのだ。
18232
18233 ベル研究所にいた Unix の開発者たちは、プロのプログラマやコンピュータ・サイエンスの専門家ばかりだった。
18234 その彼らが、こういうことに気づいたのだ。
18235 万能型のプログラムは、たった一つのプログラムを使えばよいので、
18236 ユーザには受けがよいかもしれない。だが、いざ実際に作ってみると、そうしたプログラムは、
18237
18238 @enumerate a
18239 @item
18240 書くのが難しく、
18241
18242 @item
18243 保守やデバッグが難しく、
18244
18245 @item
18246 新しい状況に合わせて機能を拡張するのが難しい。
18247 @end enumerate
18248
18249 むしろ彼らは、プログラムは用途別の工具であるべきだと痛感した。
18250 要するに、個々のプログラムは、「一つの仕事をきちんとやってのければよい」。
18251 それ以上でもそれ以下でもない。そういったプログラムは、
18252 設計するのも、コードを書くのも、修正するのも、ずっと簡単である ---
18253 たった一つのことしかしないからだ。
18254
18255 それだけではない。適切な仕組みを使って、プログラムを組み合わせると、
18256 全体が部分の総和以上になることにも、彼らは気づいた。
18257 ある用途専用のプログラムをいくつか組み合わせると、
18258 どのプログラムもそのために作られたのではない、ある特定の作業をやってのけることができる。
18259 それも、それ専用のプログラムを書かなければならない場合よりも、
18260 はるかに迅速に、かつ簡単にやってのけられるのだ。この記事の以下では、そうした使用法の
18261 (基本的な) 例をいくつか紹介する。(大事なことを一つ付記しておく。急がば回れだ。
18262 必要になるかもしれないソフトウェア工具があれば、まずそれを作ること。
18263 道具箱に適切な工具がまだない場合の話であるが。)
18264
18265 @node I/O redirection
18266 @unnumberedsec I/O リダイレクション
18267
18268 シェルの入出力リダイレクションについて、基本的なこと、
18269 とくに標準入力、標準出力、標準エラーがどういうものかを、読者はよく御存じだと思う。
18270 要するに、標準入力とは、データの入力元、すなわち、データがそこからやって来る場所のことだ。
18271 データの入力元が、ディスク上のファイルだろうと、キーボードだろうと、磁気テープだろうと、
18272 それどころかパンチカード・リーダーだろうと、プログラムはそれを知る必要もなければ、気にかける必要もない。
18273 同様に、標準出力とは、データの溜まる場所、データがそこに行く場所のことだ。
18274 プログラムとしては、それがどこになろうと、知らなくてもよく、気にかけなくてもよい。
18275 標準入力からデータを読み込み、それに対して何らかの処理を行い、標準出力に送り出すだけのプログラムを、
18276 水道のパイプラインのフィルターになぞらえて、「フィルター (@dfn{filter})」と呼ぶ。
18277
18278 Unix のシェルでは、データのパイプラインを作るのはとてもやさしい。
18279
18280 @smallexample
18281 program_to_create_data | filter1 | ... | filterN > final.pretty.data
18282 @end smallexample
18283
18284 ここでは、まず最初に生のデータを作成している。
18285 各フィルターがそのデータに対して何らかの変形を次々に行い、
18286 最終的に、データが希望どおりの形になって、パイプラインから抜け出してくる。
18287
18288 標準入力と標準出力については、それでよい。
18289 では、標準エラーはどこで登場し、どんな役割を果たすのだろうか?
18290 上記パイプラインの @command{filter1} について考えてほしい。
18291 データを読んでいるうちにエラーが起きたら、どうなるだろうか?
18292 @command{filter1} がエラーメッセージを標準出力に書き出したら、
18293 そのメッセージはパイプラインを下って @command{filter2} の入力に飲み込まれてしまう。
18294 そうなると、ユーザはたぶんメッセージをまったく目にしないことになるだろう。
18295 そこで、プログラムとしては、ユーザがエラーメッセージに気がついてくれるように、
18296 それを送ることのできる場所が必要になる。それが、標準エラーなのであり、
18297 標準エラーは通常、現在使用しているコンソールやウィンドウに結びついている。
18298 プログラムの標準出力を使用中のスクリーン以外にリダイレクトしている場合でも、それは変わらない。
18299
18300 フィルター・プログラムが協力し合うためには、データのフォーマットについて互いに合意している必要がある。
18301 最も素直で使いやすいフォーマットと言えば、何と言っても、行分けされたテキストだ。
18302 そして、Unix のデータファイルは、たいていの場合、まさに、ASCII LF (Line Feed)
18303 文字によって行分けされたバイトの連続なのである。なお、この LF 文字は、Unix
18304 の文書では「改行 (newline)」と呼ばれる習慣になっている (C のプログラマにとっては
18305 @code{\n} だ)。これこそ、すべての伝統的なフィルター・プログラムによって使用されて来たフォーマットである。
18306 (昔のオペレーティング・システムの多くは、バイナリ・データを扱うための複雑な手段や専用のプログラムを備えていた。
18307 だが、Unix は、ただ単にテキストエディタでデータを見たり編集できたりする方がはるかに簡単だという考えから、
18308 そうした道具をずっと敬遠してきたのである。)
18309
18310 さて、前置きはこれくらいで十分だ。まず、道具のいくつかをざっと見てみよう。
18311 その後で、そうした道具をおもしろいやり方で組み合わせる方法をご覧に入れる。
18312 以下の解説では、当面の問題に関係のあるコマンドライン・オプションしか取り上げない。
18313 いつでもそうすべきことだが、コマンドについて詳しいことを知りたかったら、
18314 ご使用のシステムの文書を参照なさるとよい。
18315
18316 @node The who command
18317 @unnumberedsec @command{who} コマンド
18318
18319 最初に取り上げるプログラムは、@command{who} コマンドだ。
18320 これは単独で使うと、現在ログインしているユーザのリストを生成する (参照: @ref{who invocation})。
18321 筆者がこの原稿を書いているのは、シングルユーザのシステムだが、数人のユーザがログインしていることにしよう。
18322
18323 @example
18324 $ who
18325 @print{} arnold   console Jan 22 19:57
18326 @print{} miriam   ttyp0   Jan 23 14:19(:0.0)
18327 @print{} bill     ttyp1   Jan 21 09:32(:0.0)
18328 @print{} arnold   ttyp2   Jan 23 20:48(:0.0)
18329 @end example
18330
18331 ここで @samp{$} はお馴染みのシェルプロンプトであり、筆者はそれに対して
18332 @samp{who} と打ち込んだわけだ。三人のユーザがログインしており、筆者は二度ログインしている。
18333 伝統的な Unix のシステムでは、ユーザ名はアルファベット
18334 8 文字までということになっている。このちょっとした豆知識が、後で役に立つことになる。
18335 @samp{who} の出力は悪くはない。だが、大しておもしろいデータでもない。
18336
18337 @node The cut command
18338 @unnumberedsec @command{cut} コマンド
18339
18340 次に注目するプログラムは @command{cut} コマンドだ。
18341 このコマンドは、入力されたデータから縦の列 (columns) やフィールドを切り出す
18342 (参照: @ref{cut invocation})。そこで、@command{cut} に命じて、@file{/etc/passwd}
18343 ファイルからログイン名とフルネームだけ表示させるといったことができる。
18344 @file{/etc/passwd} には、七つのフィールドがあり、おのおのコロンで区切られている。
18345
18346 @example
18347 arnold:xyzzy:2076:10:Arnold D. Robbins:/home/arnold:/bin/bash
18348 @end example
18349
18350 1 番目と 5 番目のフィールドを取り出すには、次のように @command{cut} を使用する。
18351
18352 @example
18353 $ cut -d: -f1,5 /etc/passwd
18354 @print{} root:Operator
18355 @dots{}
18356 @print{} arnold:Arnold D. Robbins
18357 @print{} miriam:Miriam A. Robbins
18358 @dots{}
18359 @end example
18360
18361 @option{-c} オプションを付けると、 @command{cut} は入力行中の特定の文字
18362 (すなわち、特定の縦の列) を切り出す。これは、入力データが固定幅のフィールドを持ち、
18363 フィールド・セパレータがないときに便利である。
18364 たとえば、今月の月曜日は、何日と何日かをリストするには、次のようにする。
18365
18366 @c Is using cal ok?  Looked at gcal, but I don't like it.
18367 @example
18368 $ cal | cut -c 3-5
18369 @print{} Mo
18370 @print{}
18371 @print{}  6
18372 @print{} 13
18373 @print{} 20
18374 @print{} 27
18375 @end example
18376
18377 @node The sort command
18378 @unnumberedsec @command{sort} コマンド
18379
18380 次に @command{sort} コマンドを一瞥する。
18381 これは Unix 風のシステムにおける最も強力なコマンドの一つであり、
18382 パイプを使って手の込んだデータ処理を行うとき、気がつくと使っていることがよくあるものだ。
18383
18384 @command{sort} コマンドは、コマンドラインで指名された各ファイルを読み込んで、ソートする。
18385 その後で、ソートしたデータをマージし、それを標準出力に書き出す。
18386 コマンドラインでファイルが指定されていない場合は、標準入力を読み込む
18387 (こうして、フィルターになる)。ソートは、文字の照合順序、あるいは、
18388 ユーザが順序について指定した基準に基づいて行われる (参照: @ref{sort invocation})。
18389
18390
18391 @node The uniq command
18392 @unnumberedsec @command{uniq} コマンド
18393
18394 最後に目を向けるのは (少なくとも今のところはだが)、@command{uniq} プログラムだ。
18395 データのソートをしていると、結果に重複行が現れることがよくある。
18396 内容が全く同じ行だ。たいていの場合、各行は一つだけあればよい。そこで、@command{uniq}
18397 の出番になる。@command{uniq} プログラムは、標準入力を読み込み、
18398 連続する同一行については、そのうちの一件だけを表示する。@command{uniq}
18399 には、オプションがいくつかある。後で @option{-c} オプションを使うことになるが、
18400 これはユニークな、つまり他と違っている各行を表示するとき、
18401 その行が入力中に現れた回数を前に付けるものである (参照: @ref{uniq invocation})。
18402
18403
18404 @node Putting the tools together
18405 @unnumberedsec 工具 (tools) を組み合わせる
18406
18407 さて、大規模な ISP のサーバーシステムがあって、何十人ものユーザがログインしているとしよう。
18408 経営側がシステム管理者に、ログインしているユーザのソートしたリストを生成するプログラムを書くことを求めている。
18409 しかも、あるユーザが多重ログインをしていても、その人の名前は出力に
18410 1 回だけ現れればよいという条件がある。
18411
18412 システム管理者は腰を据えてシステムのマニュアル類に取り組み、そうした作業を実行する
18413 C のプログラムを書くこともできるだろう。そのためには、たぶん数百行のコードが必要であり、
18414 プログラムを書いて、テストして、デバッグするには、2 時間ぐらいかかるはずだ。
18415 それに対して、ソフトウェアの道具箱に精通しているシステム管理者なら、
18416 C のプログラムを書く代わりに、ログインしているユーザのリストを生成するところから始めることができる。
18417
18418 @example
18419 $ who | cut -c1-8
18420 @print{} arnold
18421 @print{} miriam
18422 @print{} bill
18423 @print{} arnold
18424 @end example
18425
18426 次に、リストをソートする。
18427
18428 @example
18429 $ who | cut -c1-8 | sort
18430 @print{} arnold
18431 @print{} arnold
18432 @print{} bill
18433 @print{} miriam
18434 @end example
18435
18436 最後に、ソートしたリストを @command{uniq} に渡して、重複を除く。
18437
18438 @example
18439 $ who | cut -c1-8 | sort | uniq
18440 @print{} arnold
18441 @print{} bill
18442 @print{} miriam
18443 @end example
18444
18445 実を言うと、@command{sort} コマンドには @option{-u} というオプションがあって、@command{uniq}
18446 がやることをやってくれる。しかし、@command{uniq} にはほかの働きもあり、そちらは
18447 @samp{sort -u} で代用することができない。
18448
18449 システム管理者が、以下のように、このパイプラインをシェルスクリプトにしておけば、
18450 システムのすべてのユーザが利用できるようになる
18451 (@samp{#} はシステム管理者、すなわち @code{root} のプロンプトだ)。
18452
18453 @example
18454 # cat > /usr/local/bin/listusers
18455 who | cut -c1-8 | sort | uniq
18456 ^D
18457 # chmod +x /usr/local/bin/listusers
18458 @end example
18459
18460 ここには、心に留めておくべき重要なことが四つある。
18461 まず第一に、1 行のコマンドラインにたった四つのプログラムを書くことで、システム管理者は約
18462 2 時間分の仕事をしないで済ますことができた。それだけではない。シェルのパイプラインは、
18463 C のプログラムを使った場合と比べても、ほぼ同じくらい効率がよく、
18464 プログラマの労働時間という点から見ると、ずっとずっと効率がよい。
18465 人間の労働時間はコンピュータの時間よりはるかに高価であり、
18466 「何もかもやるには、いつだって時間が足りない」現代社会では、プログラマの時間を
18467 2 時間も節約するのは、馬鹿にできない成果だ。
18468
18469 二番目に、ツールを組み合わせることで、個々のプログラムの作者が想像もしなかったような、
18470 ある特定の目的のための仕事をやってのけることができる。
18471 これも、強調しておくべき重要なことである。
18472
18473 第三に、ここでやって見せたように、段階を追ってパイプラインを構成するのも有益な方法だ。
18474 そうすれば、パイプラインの段階ごとにデータを目で見ることができるので、
18475 ツール類を間違いなく適切に使っているという自信を得ることができる。
18476
18477 最後に、実行したパイプラインをシェルスクリプトにまとめておけば、他のユーザがそのコマンドを使うことができる。
18478 彼らのために作成した手の込んだコマンドの配管工事を、彼らは憶える必要すらないのだ。
18479 どうやって実行するかという点から見ると、シェルスクリプトもコンパイルされたプログラムも見分けが付かないのである。
18480
18481 ここまでは準備運動だ。続いて、もっと複雑なパイプラインをもう二つご覧に入れよう。
18482 そのためには、工具をもう二つ紹介する必要がある。
18483
18484 一つ目は @command{tr} コマンドだ。``transliterate (翻字する、字を置き換える)''
18485 の意味である。 @command{tr} コマンドは、一字一字処理して行くというやり方で、
18486 文字を置き換える (参照: @ref{tr invocation})。
18487 通常、このコマンドを使用するのは、大文字を小文字に変換するといったことのためである。
18488
18489 @example
18490 $ echo ThIs ExAmPlE HaS MIXED case! | tr '[:upper:]' '[:lower:]'
18491 @print{} this example has mixed case!
18492 @end example
18493
18494 役に立ちそうなオプションがいくつかある。
18495
18496 @table @code
18497 @item -c
18498 リストされた文字の補集合を動作対象にする。
18499 言い換えると、指定された集合に存在しない文字に対して操作が行われる。
18500
18501 @item -d
18502 一つ目の集合にある文字を出力から削除する。
18503
18504 @item -s
18505 出力中の連続する同一文字を、ただの 1 文字に圧縮する。
18506 @end table
18507
18508 すぐ後で、この三つのオプションをすべて使うことになる。
18509
18510 紹介するもう一つのコマンドは、@command{comm} だ。
18511 @command{comm} コマンドは、二つのソートされた入力ファイルを入力データとして受け取り、
18512 両ファイルの各行を三つの列に分けて表示する。
18513 出力される列は、一番目のファイルにのみ存在する行、二番目のファイルにのみ存在する行、
18514 両方のファイルに存在する行の順番である。@option{-1}, @option{-2}, @option{-3}
18515 というコマンドライン・オプションを付けると、対応する列を表示しないようになる。
18516 (これは直感的ではないので、ちょっとした慣れが必要だ。参照: @ref{comm invocation})
18517 例を挙げよう。
18518
18519 @example
18520 $ cat f1
18521 @print{} 11111
18522 @print{} 22222
18523 @print{} 33333
18524 @print{} 44444
18525 $ cat f2
18526 @print{} 00000
18527 @print{} 22222
18528 @print{} 33333
18529 @print{} 55555
18530 $ comm f1 f2
18531 @print{}         00000
18532 @print{} 11111
18533 @print{}                 22222
18534 @print{}                 33333
18535 @print{} 44444
18536 @print{}         55555
18537 @end example
18538
18539 ファイル名を @file{-} にすると、@command{comm} は通常ファイルではなく、標準入力を読み込む。
18540
18541 これで、気の利いたパイプラインを組み立てる準備ができた。
18542 最初に作るアプリケーションは、単語の出現頻度カウンターである。
18543 これは、ある特定の単語を使いすぎていないかどうか、文書の作成者が判断するとき、役に立つ。
18544
18545 最初のステップは、入力ファイル中のすべての文字を大文字か小文字のどちらかに統一することである。
18546 ``The'' と ``the'' は、頻度計算にとって同じ単語だ。
18547
18548 @example
18549 $ tr '[:upper:]' '[:lower:]' < whats.gnu | ...
18550 @end example
18551
18552 次のステップは、句読点を除去することだ。
18553 引用符の付いている単語と付いていない単語も同じものとして扱った方がよいだろう。
18554 それならば、句読点類をすっぱり取り除いてしまうのが、一番簡単だ。
18555
18556 @smallexample
18557 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' | ...
18558 @end smallexample
18559
18560 二番目の @command{tr} コマンドは、リストされた文字の補集合を操作対象にしている。
18561 すなわち、アルファベットのすべての文字、数字、アンダースコア、空白以外を対象にするわけだ。
18562 @samp{\n} は改行文字のことであり、これもそのまま残さなければならない。
18563 (実用に供するスクリプトでは、ついでに ASCII タブ文字も残した方がよいだろう。)
18564
18565 この時点で、空白 (訳注: 改行を含む) で区切られた単語からなるデータができていることになる。
18566 単語には、英数字 (それにアンダースコア) しか含まれていない。
18567 次のステップは、データをバラして、1 行 1 単語になるようにすることだ。
18568 そうすれば、すぐ後で見るように、出現回数の計算がずっと楽になる。
18569
18570 @smallexample
18571 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
18572 > tr -s ' ' '\n' | ...
18573 @end smallexample
18574
18575 このコマンドは、空白を改行に変える。@option{-s} オプションが付いているので、
18576 出力中の連続する改行文字はたった 1 個に圧縮され、空行が取り除かれることになる。
18577 (なお、2 行目行頭の @samp{>} という記号は、シェルの二次プロンプトである。
18578 シェルがユーザに、コマンドがまだ最後まで打ち込まれていないと知らせるとき、これが表示される。)
18579
18580 今や、1 行 1 単語からなるデータが手元にある。句読点は含まれず、すべて小文字だ。
18581 これで、各単語の出現回数を数える準備が整った。
18582
18583 @smallexample
18584 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
18585 > tr -s ' ' '\n' | sort | uniq -c | ...
18586 @end smallexample
18587
18588 この時点で、データはたぶんこんなふうになっているだろう。
18589
18590 @example
18591      60 a
18592       2 able
18593       6 about
18594       1 above
18595       2 accomplish
18596       1 acquire
18597       1 actually
18598       2 additional
18599 @end example
18600
18601 なんと、出力が出現回数ではなく、単語によってソートされている!
18602 こちらとしては、最も頻繁に使われる単語ほど先に表示したいのにだ。
18603 幸いなことに、それは簡単に実現できる。@command{sort} のオプションをもう二つ使うだけでよい。
18604
18605 @table @code
18606 @item -n
18607 文字としてではなく、数値としてソートする。
18608
18609 @item -r
18610 逆順にソートする。
18611 @end table
18612
18613 最終的なパイプラインは次のようになる。
18614
18615 @smallexample
18616 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
18617 > tr -s ' ' '\n' | sort | uniq -c | sort -n -r
18618 @print{}    156 the
18619 @print{}     60 a
18620 @print{}     58 to
18621 @print{}     51 of
18622 @print{}     51 and
18623 @dots{}
18624 @end smallexample
18625
18626 ふう、憶えることがどっさり! うん、でもね、同じ原則を応用してるだけなんだよ。
18627 たった 2 行、6 個のコマンドで (実際には、長い 1 行を便宜上 2 行に分割しているだけだが)
18628 興味深く有用な作業をするプログラムが出来上がった。それも、同じこことする
18629 C のプログラムを書くよりもずっと短い時間でだ。
18630
18631 上記のパイプラインをちょっといじるだけで、なんと、簡単なスペルチェッカーが出来てしまう。
18632 ある単語の綴りが正しいかどうかを判断するには、辞書で調べさえすればよい。
18633 その単語が辞書になければ、綴りを間違えている可能性が高いわけだ。
18634 そこで、とりあえず、辞書が必要になる。辞書の在り処は、慣例からすると
18635 @file{/usr/dict/words} だ (現在では @file{/usr/share/dict/words}
18636 かもしれない)。筆者の GNU/Linux システムでは
18637 @footnote{この記事を 2000 年 11 月に改訂したとき使用したのは、Redhat Linux
18638 6.1 である}、それはソートされた 45,402 語からなる辞書である。
18639
18640 それでは、自分の作ったファイルをどうやって辞書と比べるのか?
18641 前の例と同様、ソートした単語のリストを 1 行 1 語の形式で生成する。
18642
18643 @smallexample
18644 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
18645 > tr -s ' ' '\n' | sort -u | ...
18646 @end smallexample
18647
18648 必要なのは、辞書にない単語のリストだけだ。そこで、@command{comm} の出番になる。
18649
18650 @smallexample
18651 $ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
18652 > tr -s ' ' '\n' | sort -u |
18653 > comm -23 - /usr/dict/words
18654 @end smallexample
18655
18656 @option{-2} と @option{-3} のオプションを使うと、辞書 (2 番目のファイル)
18657 にしかない行と、両方のファイルにある行が排除される。1 番目のファイル
18658 (標準入力、すなわち、自分が使った単語のリストだ) にしかない行は、辞書に存在しない単語だ。
18659 そうした単語は、綴りを間違えている可能性がかなり高いわけである。
18660 ご覧に入れたこのパイプラインは、Unix における本格的なスペルチェッカーへの最初の一歩だったのである。
18661
18662 他にも一言述べておくべきツールがいくつかある。
18663
18664 @table @command
18665 @item grep
18666 ファイルを調べて、正規表現にマッチするテキストを検索する。
18667
18668 @item wc
18669 行数、単語数、文字数を計算する。
18670
18671 @item tee
18672 データが流れるパイプのための T 字管。データをファイルと標準出力にコピーする。
18673
18674 @item sed
18675 ストリーム・エディタ。上級ツール。
18676
18677 @item awk
18678 データ処理用の言語。これも上級ツール。
18679 @end table
18680
18681 ソフトウェア工具論が取り入れたものに、次のちょっとしたアドバイスもある。「骨の折れる部分は、他の奴にやらせろ」。
18682 すなわち、ある道具を選んで、必要なことの大部分をやらせ、それから、その結果に手を加えて、こちらの望む形にする、ということである。
18683
18684 要約しておこう。
18685
18686 @enumerate 1
18687 @item
18688 個々のプログラムは、一つの仕事をきちんとやってのければよい。それ以上でもそれ以下でもない。
18689
18690 @item
18691 プログラムを適切な配管工事で組み合わせると、全体が部分の総和以上になる結果が生じる。
18692 作者が想像もしなかったようなプログラムの新しい使用法が見つかることもある。
18693
18694 @item
18695 プログラムは決して余計なヘッダや追加情報を出力すべきではない。
18696 そうしたものもパイプラインの先へ送られてしまうかもしれないからだ。
18697 (これは、これまでに言及しなかったが、重要なことだ。)
18698
18699 @item
18700 骨の折れる部分は、他の奴にやらせろ。
18701
18702 @item
18703 自分の道具箱をよく知れ! 個々のプログラムを適切に使え。適切なツールがなかったら、それを作れ。
18704 @end enumerate
18705
18706 これを執筆している時点で、ここで取り上げたプログラムはすべて次の
18707 URL から手に入れることができる。@*
18708 @uref{http://ftp.gnu.org/old-gnu/textutils/textutils-1.22.tar.gz} @*
18709 もっと新しいバージョンは以下の場所にある。@*
18710 @uref{http://ftp.gnu.org/gnu/coreutils}
18711
18712 この記事で筆者が述べたことに、新しいことは何もない。
18713 ソフトウェアは工具だという思想が最初に紹介されたのは、Brian Kernighan と P.J. Plauger
18714 による @cite{Software Tools} という本の中だった (Addison-Wesley, ISBN
18715 0-201-03669-X)。ソフトウェア工具の書き方と使い方を教えるこの本は、1976
18716 年に執筆され、@command{ratfor} (RATional FORtran) という名前の FORTRAN
18717 のプリプロセッサを使用している。その当時、C は今ほどありふれてはいず、FORTRAN
18718 がそうだったのだ。最後の章では、@command{ratfor} を FORTRAN に変換するプロセッサを
18719 @command{ratfor} で書いて見せている。@command{ratfor} は C にとてもよく似ているので、
18720 C を御存じの方なら、コードを追うのに何の苦労もないことだろう。
18721 (訳注: @cite{Software Tools} の翻訳は「ソフトウェア作法」という題で
18722 1981 年に出版されている。木村泉 訳、共立出版)
18723
18724 1981 年に本は改訂され、@cite{Software Tools in Pascal}
18725 という形でも手に入るようになった (Addison-Wesley, ISBN 0-201-10342-7)。
18726 どちらの本も現在でも入手可能であり、プログラマなら、一読の価値が十分にある。
18727 この 2 冊の本が筆者のプログラミングに対する見方を大きく変えてくれたことに、疑いの余地はない。
18728
18729 両方の本にあるプログラムは、Brian Kernighan のホームページから手に入れることができる
18730 (@uref{http://cm.bell-labs.com/who/bwk})。Software Tools Users Group
18731 という活動的なグループが長年に渡って存在し、そのメンバーがオリジナルの @command{ratfor}
18732 プログラムを、FORTRAN コンパイラを持っているほとんどすべてのコンピュータ・システムに移植していた。
18733 だが、1980 年代の中頃に Unix が大学を越えて浸透し出すにつれて、グループの人気は衰えて行った。
18734
18735 現在では GNU のコードをはじめ、Unix クローンのプログラムがどんどん作られており、
18736 上記のプログラムはほとんど関心を持たれていない。
18737 それに、現代の C のバージョンの方がはるかに効率がよく、できることも上記のプログラムよりずっと多くなっている。
18738 それでも、よいプログラミング・スタイルのお手本として、
18739 また、今でも価値がある考え方を熱心に説いている点において、
18740 この 2 冊の本は肩を並べるものがない。筆者としては、大いにお薦めする次第だ。
18741
18742 謝辞: ソフトウェア工具の最初の道具鍛冶である、Bell 研究所の Brian
18743 Kernighan 氏に、この記事を読んでチェックしてくださったことについて、
18744 心からお礼を申し上げる。
18745
18746 @node About the translation
18747 @appendix 翻訳について
18748
18749 この文書は GNU core utilities version @value{VERSION} の
18750 info マニュアルの翻訳である。間違いの御指摘や改良の御提案は
18751 Linux JM project 宛にメールでなさっていただきたい
18752 (@email{linuxjm-discuss@@lists.osdn.me})。
18753  
18754 まず最初に、coreutils の日本語版 info マニュアルの呼び出し方を簡単に説明する。
18755 coreutils の 日本語版 info が install-info
18756 コマンドを使ってきちんとシステムにインストールされているならば、コマンドラインから 
18757 @samp{info coreutils-ja} で日本語マニュアル全体を、@samp{info chmod-ja}
18758 などで個々のプログラムの日本語マニュアルを呼び出すことができる。
18759 英語版を読むときは、今までどおり @samp{info coreutils} や @samp{info chmod}
18760 とすればよい。個々のコマンドについては、英語版なら
18761 @samp{info coreutils 'cp invocation'}、日本語版なら
18762 @samp{info coreutils-ja 'cp invocation'} といったマニュアルの呼び出し方もある。
18763
18764 また、@samp{info} を引数なしで実行すると、
18765 info マニュアルのトップレベルのメニューが開く。
18766 ここで、メニュー項目にカーソルを合わせて、リターンキーを押せば、その項目に飛ぶ。
18767 しかし、読みたい項目をキー操作で指定する方が簡単である。たとえば、
18768 @kbd{m} キーを押した後 @kbd{chmod-ja}
18769 と打ち込んで、リターンキーを押せば、chmod コマンドの日本語版マニュアルが、
18770 @kbd{chmod} だけなら英語版マニュアルが表示される。
18771
18772 @kbd{coreutils-ja}、@kbd{chmod-ja} などと
18773 @kbd{-ja} を付けるのは、@command{info} プログラムを起動するときと、
18774 info のトップレベル・メニューにいるときだけである。
18775 すでに日本語版 coreutils マニュアルのどれかを (それが 
18776 coreutils-ja であれ、dd-ja であれ) @command{info} コマンドで開いている場合は、
18777 @kbd{-ja} を後ろに付ける必要がなくなる。と言うより、付けてはいけない。
18778 coreutils-ja の先頭ページのようにコマンドのメニューが存在するページでは
18779 (実際には、スクロールしないと、メニューが見えないが)、たとえば、
18780 @kbd{m} に続けて @kbd{chmod} と打ち込み、リターンキーを押すだけで、
18781 chmod の日本語の説明が開く。また、日本語 coreutils マニュアルの任意のページから
18782 coreutils-ja の他のノードへ直接飛ぶ場合も (ノードは、ほぼ章や節に相当する)、
18783 @kbd{g} キーを押してから、@kbd{chmod invocation} などとノード名を打ち込み、
18784 リターンキーを押せばよい。@kbd{m}, @kbd{g}、どちらの場合も、タブで文字列の補完ができる。
18785
18786 info マニュアルの読み方の基本は、「メニューやクロスリファレンスにカーソルを合わせてリターンキーを押せば、その項目に飛ぶ。
18787 スペースで先に進み、バックスペースで後戻りする。@kbd{l} キーで直前に開いていたノードに戻る。
18788 @kbd{q} キーで終了する」である。たぶん coreutils-ja.info 
18789 のパッケージには、README.ja というファイルが含まれていると思う。
18790 info マニュアルの呼び出し方や使用法について、そこにもう少し詳しい説明を書いておいたので、
18791 ご覧になっていただきたい。
18792
18793 ここで、日本語の info マニュアルを使用するときの問題点を挙げておく。
18794
18795 @enumerate
18796 @item
18797 @command{info} コマンドのバージョンによっては、行末の処理が上手ではない。
18798 そのため、行末に余計な文字が入ることがある。そうしたときは、@kbd{C-l} を押して 
18799 (Ctrl と l (エル) キーを同時に押す)、画面の再描画を行っていただきたい。
18800 表示が正常になるはずである。
18801 Emacs の info リーダーでは、この問題はめったに起きない。
18802
18803 @item
18804 最近の @command{info} コマンド (たとえば、バージョン 6.3) 
18805 では、@kbd{s} や @kbd{/} による日本語の単語の検索ができるようになった。
18806 @kbd{C-s} による日本語のインクリメンタル検索も可能になっている。
18807 バージョンの古い @command{info} では、英単語による検索はできても、
18808 日本語の単語による検索はできないので、注意していただきたい。
18809
18810 @item
18811 X の端末エミュレータで @command{info} コマンドを使用する場合、
18812 端末エミュレータとフォントの組み合わせによっては、
18813 文字列を囲むクォートの表示がおかしくなることがある。
18814 フォントに「Monospace Regular」を使っているなら、
18815 「VL Pゴシック regular」か「Liberation Mono Regular」に変えてみるとよいかもしれない 
18816 (それはそれで、別の問題が出る可能性もあるが)。
18817 ちょっと古風だが、日本語が使える @command{xterm} 
18818 (@command{uxterm} など) なら、クォートの表示にまず問題はない。
18819
18820 @item
18821 coreutils の info のこの翻訳では、インデックスの日本語化まで手が回らなかった。
18822 そのため、インデックスは英語のままである。
18823
18824 @item
18825 古めの Emacs でこの翻訳を読もうとすると、文字化けするかもしれない。
18826 回避法があるのかもしれないが、訳者にはわからなかった。
18827 @end enumerate
18828
18829 この翻訳の最初の版は、coreutils-8.20 所収の texinfo ファイルを元に、
18830 Linux JM project のために訳者が新たに翻訳したものだった。
18831 以下に、そのときの後書きをほぼそのまま載せておく。
18832
18833 この info マニュアルの原文は、本文の「序」でも述べているように、
18834 各プログラムの man ページを統合し、増補・改訂したものである。この info 
18835 マニュアルがまとめられるにともない、公式の man ページの方は、コマンドの 
18836 @samp{--help} オプションで見ることができるものとほぼ同文の、
18837 簡単な内容のものになった。
18838
18839 従来どおりの詳しい man ページを希望する人たちも存在した。
18840 そのために作られたのが、gnumaniak の man ページであり、従来の man ページを
18841 info の情報で増補したものだったが、現在では保守されていないようだ。
18842
18843 作成の経緯がそうしたものなので、この info マニュアルの原文には、
18844 gnumaniak の man ページの原文とほとんど内容が同じものがある。
18845 翻訳作業に当たっては、すべての項目について gnumaniak の
18846 man ページの翻訳を参考にした。あちらの訳文の方がよくできている項目もある
18847 (gnumaniak の翻訳は
18848 @uref{http://linuxjm.osdn.jp/html/gnumaniak/man1/} にある)。
18849
18850 この翻訳は、Linux JM project の gnumaniak の翻訳に多くを負っている。
18851 そこで、まず、gnumaniak の翻訳者の方々 --- 中野武雄、佐藤裕一、白方健太郎、
18852 Kazuyuki Tanisako、Omo Kazuki の諸氏にお礼を申し上げる。
18853
18854 訳文を見直す際には、西尾太さんが以前翻訳なさった coreutils-5.2.1 の 
18855 info を参考にした。また、当然ながら、新しい man ページ
18856 (こちらの翻訳者は、たぶん Yasuaki Taniguchi さんと Akihiro MOTOKI さん)
18857 とも、できるだけ突き合わせた。西尾さん、Taniguchi さん、元木さんにもお礼を申し上げる。
18858
18859 gnumaniak や coreutils の man や info の翻訳をなさった方で、
18860 私がお名前を挙げ忘れた方がいらっしゃるかもしれない。
18861 お知らせくだされば、追加訂正する。
18862
18863 訳文には間違った箇所がたくさんあると思う。そのへんは、ご寛恕いただきたい。
18864 皆さんがこの訳文を叩き台にして、増補・改訂・改訳を続け、
18865 より新しく、よりわかりやすい、そして、より正確な coreutils
18866 の翻訳を作ってくだされば、最初の翻訳者としてそれにまさる喜びはない。
18867
18868 2017-03-26 訳者
18869
18870 [翻訳履歴]
18871
18872 @itemize @bullet
18873 @item
18874 2014-03-15@*
18875 coreutils-8.20 を翻訳    by 長南洋一@*
18876 ptx, tsort, chcon, runcon は未訳
18877
18878 @item
18879 2014-11-25@*
18880 coreutils-8.22 を元に増補・改訂    by 長南洋一@*
18881 numfmt, ptx, tsort, chcon, runcon を翻訳
18882
18883 @item
18884 2016-07-07@*
18885 numfmt の章の構成を修正。訳文の訂正と細かい変更    by 長南洋一
18886
18887 @item
18888 2017-03-26@*
18889 coreutils-8.26 を元に増補・改訂    by 長南洋一
18890
18891 @item
18892 2019-09-09@*
18893 訳文の訂正と変更    by 長南洋一
18894 @end itemize
18895
18896 @node GNU Free Documentation License
18897 @appendix GNU Free Documentation License
18898
18899 @include fdl.texi
18900
18901 @node Concept index
18902 @unnumbered Index
18903
18904 @printindex cp
18905
18906 @bye
18907
18908 @c Local variables:
18909 @c texinfo-column-for-description: 32
18910 @c End: