\input texinfo
@c ===========================================================================
@c
@c This file was generated with po4a. Translate the source file.
@c
@c ===========================================================================
@c %**start of header
@setfilename coreutils-ja.info
@settitle GNU Coreutils
@documentencoding UTF-8
@allowcodebreaks false

@c %**end of header

@include version.texi
@include constants.texi

@c Define new indices.
@defcodeindex op
@defcodeindex fl

@c Put everything in one index (arbitrarily chosen to be the concept index).
@syncodeindex fl cp
@syncodeindex fn cp
@syncodeindex ky cp
@syncodeindex op cp
@syncodeindex pg cp
@syncodeindex vr cp

@dircategory Basics (in Japanese)
@direntry
* Coreutils-ja: (coreutils-ja).  Core GNU (file, text, shell) utilities.
* Common options-ja: (coreutils-ja)Common options.
* File permissions-ja: (coreutils-ja)File permissions.  Access modes.
* Date input formats-ja: (coreutils-ja)Date input formats.    
@end direntry

@c FIXME: the following need documentation
@c * [: (coreutils)[ invocation.                   File/string tests.
@c * pinky: (coreutils)pinky invocation.           FIXME.

@dircategory Individual utilities (in Japanese)
@direntry
* arch-ja: (coreutils-ja)arch invocation.          Print machine hardware name.
* b2sum-ja: (coreutils-ja)b2sum invocation.        Print or check BLAKE2 digests.
* base32-ja: (coreutils-ja)base32 invocation.      Base32 encode/decode data.
* base64-ja: (coreutils-ja)base64 invocation.      Base64 encode/decode data.
* basename-ja: (coreutils-ja)basename invocation.  Strip directory and suffix.
* cat-ja: (coreutils-ja)cat invocation.            Concatenate and write files.
* chcon-ja: (coreutils-ja)chcon invocation.        Change SELinux CTX of files.
* chgrp-ja: (coreutils-ja)chgrp invocation.        Change file groups.
* chmod-ja: (coreutils-ja)chmod invocation.        Change access permissions.
* chown-ja: (coreutils-ja)chown invocation.        Change file owners and groups.
* chroot-ja: (coreutils-ja)chroot invocation.      Specify the root directory.
* cksum-ja: (coreutils-ja)cksum invocation.        Print POSIX CRC checksum. 
* comm-ja: (coreutils-ja)comm invocation.          Compare sorted files by line.
* cp-ja: (coreutils-ja)cp invocation.              Copy files.
* csplit-ja: (coreutils-ja)csplit invocation.      Split by context.
* cut-ja: (coreutils-ja)cut invocation.            Print selected parts of lines.
* date-ja: (coreutils-ja)date invocation.          Print/set system date and time.
* dd-ja: (coreutils-ja)dd invocation.              Copy and convert a file.
* df-ja: (coreutils-ja)df invocation.              Report file system disk usage.
* dir-ja: (coreutils-ja)dir invocation.            List directories briefly.
* dircolors-ja: (coreutils-ja)dircolors invocation.  Color setup for ls.
* dirname-ja: (coreutils-ja)dirname invocation.    Strip last file name component.
* du-ja: (coreutils-ja)du invocation.              Report on disk usage.
* echo-ja: (coreutils-ja)echo invocation.          Print a line of text. 
* env-ja: (coreutils-ja)env invocation.            Modify the environment.
* expand-ja: (coreutils-ja)expand invocation.      Convert tabs to spaces.
* expr-ja: (coreutils-ja)expr invocation.          Evaluate expressions.
* factor-ja: (coreutils-ja)factor invocation.      Print prime factors.
* false-ja: (coreutils-ja)false invocation.        Do nothing, unsuccessfully.
* fmt-ja: (coreutils-ja)fmt invocation.            Reformat paragraph text.
* fold-ja: (coreutils-ja)fold invocation.          Wrap long input lines.
* groups-ja: (coreutils-ja)groups invocation.      Print group names a user is in.
* head-ja: (coreutils-ja)head invocation.          Output the first part of files.
* hostid-ja: (coreutils-ja)hostid invocation.      Print numeric host identifier.
* hostname-ja: (coreutils-ja)hostname invocation.  Print or set system name.
* id-ja: (coreutils-ja)id invocation.              Print user identity.
* install-ja: (coreutils-ja)install invocation.    Copy files and set attributes.
* join-ja: (coreutils-ja)join invocation.          Join lines on a common field.
* kill-ja: (coreutils-ja)kill invocation.          Send a signal to processes.
* link-ja: (coreutils-ja)link invocation.          Make hard links between files.
* ln-ja: (coreutils-ja)ln invocation.              Make links between files.
* logname-ja: (coreutils-ja)logname invocation.    Print current login name.
* ls-ja: (coreutils-ja)ls invocation.              List directory contents.
* md5sum-ja: (coreutils-ja)md5sum invocation.      Print or check MD5 digests.
* mkdir-ja: (coreutils-ja)mkdir invocation.        Create directories.
* mkfifo-ja: (coreutils-ja)mkfifo invocation.      Create FIFOs (named pipes).
* mknod-ja: (coreutils-ja)mknod invocation.        Create special files.
* mktemp-ja: (coreutils-ja)mktemp invocation.      Create temporary files.
* mv-ja: (coreutils-ja)mv invocation.              Rename files.
* nice-ja: (coreutils-ja)nice invocation.          Modify niceness.
* nl-ja: (coreutils-ja)nl invocation.              Number lines and write files.
* nohup-ja: (coreutils-ja)nohup invocation.        Immunize to hangups.
* nproc-ja: (coreutils-ja)nproc invocation.        Print the number of processors.
* numfmt-ja: (coreutils-ja)numfmt invocation.      Reformat numbers.
* od-ja: (coreutils-ja)od invocation.              Dump files in octal, etc.
* paste-ja: (coreutils-ja)paste invocation.        Merge lines of files.
* pathchk-ja: (coreutils-ja)pathchk invocation.    Check file name portability.
* pr-ja: (coreutils-ja)pr invocation.              Paginate or columnate files.
* printenv-ja: (coreutils-ja)printenv invocation.  Print environment variables.
* printf-ja: (coreutils-ja)printf invocation.      Format and print data.
* ptx-ja: (coreutils-ja)ptx invocation.            Produce permuted indexes.
* pwd-ja: (coreutils-ja)pwd invocation.            Print working directory.
* readlink-ja: (coreutils-ja)readlink invocation.  Print referent of a symlink.
* realpath-ja: (coreutils-ja)realpath invocation.  Print resolved file names.
* rm-ja: (coreutils-ja)rm invocation.              Remove files.
* rmdir-ja: (coreutils-ja)rmdir invocation.        Remove empty directories.
* runcon-ja: (coreutils-ja)runcon invocation.      Run in specified SELinux CTX.
* seq-ja: (coreutils-ja)seq invocation.            Print numeric sequences.
* sha1sum-ja: (coreutils-ja)sha1sum invocation.    Print or check SHA-1 digests.
* sha2-ja: (coreutils-ja)sha2 utilities.           Print or check SHA-2 digests.
* shred-ja: (coreutils-ja)shred invocation.        Remove files more securely.
* shuf-ja: (coreutils-ja)shuf invocation.          Shuffling text files.
* sleep-ja: (coreutils-ja)sleep invocation.        Delay for a specified time.
* sort-ja: (coreutils-ja)sort invocation.          Sort text files.
* split-ja: (coreutils-ja)split invocation.        Split into pieces.
* stat-ja: (coreutils-ja)stat invocation.          Report file(system) status.
* stdbuf-ja: (coreutils-ja)stdbuf invocation.      Modify stdio buffering.
* stty-ja: (coreutils-ja)stty invocation.          Print/change terminal settings.
* sum-ja: (coreutils-ja)sum invocation.            Print traditional checksum.
* sync-ja: (coreutils-ja)sync invocation.          Synchronize memory to disk.
* tac-ja: (coreutils-ja)tac invocation.            Reverse files.
* tail-ja: (coreutils-ja)tail invocation.          Output the last part of files.
* tee-ja: (coreutils-ja)tee invocation.            Redirect to multiple files.
* test-ja: (coreutils-ja)test invocation.          File/string tests.
* timeout-ja: (coreutils-ja)timeout invocation.    Run with time limit.
* touch-ja: (coreutils-ja)touch invocation.        Change file timestamps.
* tr-ja: (coreutils-ja)tr invocation.              Translate characters.
* true-ja: (coreutils-ja)true invocation.          Do nothing, successfully.
* truncate-ja: (coreutils-ja)truncate invocation.  Shrink/extend size of a file.
* tsort-ja: (coreutils-ja)tsort invocation.        Topological sort.
* tty-ja: (coreutils-ja)tty invocation.            Print terminal name.
* uname-ja: (coreutils-ja)uname invocation.        Print system information.
* unexpand-ja: (coreutils-ja)unexpand invocation.  Convert spaces to tabs.
* uniq-ja: (coreutils-ja)uniq invocation.          Uniquify files.
* unlink-ja: (coreutils-ja)unlink invocation.      Removal via unlink(2).
* uptime-ja: (coreutils-ja)uptime invocation.      Print uptime and load.
* users-ja: (coreutils-ja)users invocation.        Print current user names.
* vdir-ja: (coreutils-ja)vdir invocation.          List directories verbosely.
* wc-ja: (coreutils-ja)wc invocation.              Line, word, and byte counts.
* who-ja: (coreutils-ja)who invocation.            Print who is logged in.
* whoami-ja: (coreutils-ja)whoami invocation.      Print effective user ID.
* yes-ja: (coreutils-ja)yes invocation.            Print a string indefinitely.
@end direntry

@copying
このマニュアルは、GNU core utilities version @value{VERSION} の詳細な解説である。
core utilities には、テキストやファイルを操作するための標準的なプログラムが入っている。

Copyright @copyright{} 1994-2016 Free Software Foundation, Inc.

Japanese translation copyright @copyright{} 2014-2017 Linux JM project

@quotation
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.3 or any later
version published by the Free Software Foundation; with no Invariant
Sections, with no Front-Cover Texts, and with no Back-Cover Texts.  A copy
of the license is included in the section entitled ``GNU Free Documentation
License''.
@end quotation

【訳者から御注意】 この文書を info コマンドで閲覧なさっている場合は、
行末に余計な文字が入って、読みにくいことがあるかもしれない。
そうしたときは、Ctrl キーと l (エル) キーを同時に押して、画面を再描画していただきたい。
たぶん、表示が正常になるはずである。

お手元の coreutils のバージョンが @value{VERSION} 以外の場合、
この文書の説明と動作が違うことがあるかもしれない 
(たとえば、この文書に書いてあるオプションが使えない、あるいは、
使えるはずのオプションの説明がないなど)。
そうした場合は、お使いの coreutils と同じバージョンの info マニュアルや 
man ページに当ってみていただきたい。そちらの方が正しいはずである。
@end copying

@titlepage
@title GNU @code{Coreutils}
@subtitle Core GNU utilities
@subtitle for version @value{VERSION}, @value{UPDATED}
@author David MacKenzie et al.
@author translated by Linux JM project

@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage
@shortcontents
@contents

@ifnottex
@node Top
@top GNU Coreutils

@insertcopying
@end ifnottex

@cindex core utilities
@cindex text utilities
@cindex shell utilities
@cindex file utilities

@menu
* Introduction::             注意事項、概観、著者
* Common options::           共通オプション
* Output of entire files::   ファイル全体の出力 (cat tac nl od base32 base64)
* Formatting file contents:: ファイルの整形 (fmt pr fold)
* Output of parts of files:: ファイルの部分出力 (head tail split csplit)
* Summarizing files::        チェックサムなど (wc sum b2sum cksum md5sum
                               sha1sum sha2)
* Operating on sorted files::  ソートなど (sort shuf uniq comm ptx tsort)
* Operating on fields::      フィールド操作 (cut paste join)
* Operating on characters::  文字操作 (tr expand unexpand)
* Directory listing::        ディレクトリ一覧 (ls dir vdir dircolors)
* Basic operations::         基本操作 (cp dd install mv rm shred)
* Special file types::       特殊ファイル型 (mkdir rmdir unlink mkfifo mknod
                               ln link readlink)
* Changing file attributes:: ファイルの属性変更 (chgrp chmod chown touch)
* Disk usage::               ディスク使用量など (df du stat sync truncate)
* Printing text::            テキストの表示 (echo printf yes)
* Conditions::               条件 (false true test expr)
* Redirection::              リダイレクション (tee)
* File name manipulation::   ファイル名の操作 (dirname basename pathchk
                               mktemp realpath)
* Working context::          作業環境 (pwd stty printenv tty)
* User information::         ユーザ情報 (id logname whoami groups users who)
* System context::           システム関連 (date arch nproc uname hostname
                               hostid uptime)
* SELinux context::          SELinux コンテキスト (chcon runcon)
* Modified command invocation::  実行環境の変更 (chroot env nice nohup stdbuf
                                   timeout)
* Process control::          プロセス制御 (kill)
* Delaying::                 一時停止 (sleep)
* Numeric operations::       数値の操作 (factor numfmt seq)
* File permissions::         アクセス・モード
* Date input formats::       日付文字列の指定法
* Opening the software toolbox::  ソフトウェア工具という考え方
* About the translation::    翻訳について
* GNU Free Documentation License::  Copying and sharing this manual
* Concept index::            General index

@detailmenu
 --- ノードの詳細なリスト ---

共通オプション

* Exit status::              プログラムが実行に成功したか失敗したかの指標
* Backup options::           バックアップ・オプション
* Block size::               ブロックサイズ
* Floating point::           浮動小数点数の表現
* Signal specifications::    シグナルの指定
* Disambiguating names and IDs::  chgrp, chown, chroot, id
                                    におけるユーザやグループの指定法
* Random sources::           ランダムデータのソース
* Target directory::         出力先ディレクトリ
* Trailing slashes::         末尾のスラッシュ
* Traversing symlinks::      ディレクトリを指すシンボリックリンクのたどり方
* Treating / specially::     / (ルート) を特別扱いする
* Special built-in utilities::  シェルの組み込みコマンド
* Standards conformance::    規格への準拠
* Multi-call invocation::    Multi-call プログラムの起動

ファイル全体の出力

* cat invocation::           ファイルを結合して、書き出す
* tac invocation::           ファイルを結合して、ファイルごとに逆順で書き出す
* nl invocation::            行番号を付けて、ファイルを書き出す
* od invocation::            ファイルを 8 進数などの形式で書き出す
* base32 invocation::        データを ASCII 文字で表示可能なデータに変換する
* base64 invocation::        データを ASCII 文字で表示可能なデータに変換する

ファイル内容の整形

* fmt invocation::           パラグラフに分かれたテキストを整形し直す
* pr invocation::            ページ付けや段組みをしてファイルを表示する
* fold invocation::          入力行を指定された幅に合わせて折り返す

ファイルの部分出力

* head invocation::          ファイルの先頭部分を出力する
* tail invocation::          ファイルの末尾部分を出力する
* split invocation::         ファイルを一定のサイズに分割する
* csplit invocation::        ファイルを内容を目印にして分割する

ファイルの要約

* wc invocation::            行数、単語数、バイト数を表示する
* sum invocation::           チェックサムとブロック数を表示する
* cksum invocation::         CRC チェックサムとバイト数を表示する
* b2sum invocation::         BLAKE2 ダイジェストの表示、または検査をする
* md5sum invocation::        MD5 ダイジェストの表示、または検査をする
* sha1sum invocation::       SHA-1 ダイジェストの表示、または検査をする
* sha2 utilities::           SHA-2 ダイジェストの表示、または検査をする

ソートしたファイルの操作

* sort invocation::          テキストファイルを並べ替える
* shuf invocation::          テキストファイルをシャッフルする
* uniq invocation::          ファイルから重複を省く
* comm invocation::          ソート済みの二つのファイルを一行づつ比較する
* ptx invocation::           ファイル内容の permuted index を作成する
* tsort invocation::         トポロジカル・ソート

@command{ptx}: パミューテド・インデックスを作成する

* General options in ptx::   プログラム全体の動作に関係するオプション
* Charset selection in ptx:: 使用している文字セットについて
* Input processing in ptx::  入力のフィールドと文脈、及びキーワードの選択
* Output formatting in ptx:: 出力フォーマットのタイプ、及びフィールドの幅
* Compatibility in ptx::     GNU による @command{ptx} の拡張

フィールド操作

* cut invocation::           各行の選択した部分を表示する
* paste invocation::         複数のファイルの各行をマージする
* join invocation::          共通のフィールドに基づいて行を連結する

文字操作

* tr invocation::            文字の置換、圧縮、削除を行う
* expand invocation::        タブをスペースに変換する
* unexpand invocation::      スペースをタブに変換する

@command{tr}: 文字の置換、圧縮、削除を行う

* Character sets::           文字集合の指定
* Translating::              ある文字集合を別の文字集合に変換する
* Squeezing and deleting::   文字の削除

ディレクトリの一覧表示

* ls invocation::            ディレクトリの内容を一覧表示する
* dir invocation::           ディレクトリの内容を簡潔に表示する
* vdir invocation::          ディレクトリの内容を詳細に表示する
* dircolors invocation::     @command{ls} のカラー設定

@command{ls}: ディレクトリの内容を一覧表示する

* Which files are listed::      表示対象にするファイル
* What information is listed::  表示する情報
* Sorting the output::          出力のソート
* Details about version sort::  バージョン・ソートの詳細
* General output formatting::   出力全体の形式
* Formatting file timestamps::  タイムスタンプのフォーマット
* Formatting the file names::   ファイル名のフォーマット

基本的なファイル操作

* cp invocation::            ファイルやディレクトリをコピーする
* dd invocation::            ファイルの変換とコピー
* install invocation::       ファイルをコピーし属性をセットする
* mv invocation::            ファイルの移動 (名前の変更) を行う
* rm invocation::            ファイルやディレクトリを削除する
* shred invocation::         セキュリティを向上させたファイルの削除

特殊なファイル型

* link invocation::     システムコール link を使って、ハードリンクを作成する
* ln invocation::       ファイル間のリンクを作成する
* mkdir invocation::    ディレクトリを作成する
* mkfifo invocation::   FIFO (名前付きパイプ) を作成する
* mknod invocation::    ブロック型やキャラクタ型のスペシャルファイルを作成する
* readlink invocation:: シムリンクの値、または正規化されたファイル名を表示する
* rmdir invocation::    空のディレクトリを削除する
* unlink invocation::   システムコール unlink を使って、ファイルを削除する

ファイルの属性変更

* chown invocation::         ファイルの所有者やグループを変更する
* chgrp invocation::         ファイルの所有グループを変更する
* chmod invocation::         アクセス権を変更する
* touch invocation::         ファイルのタイムスタンプを変更する

ディスク使用量

* df invocation::            ファイルシステムのディスク使用状態を報告する
* du invocation::            ファイルのディスク使用量を概算する
* stat invocation::          ファイルやファイルシステムの状態を報告する
* sync invocation::          キャッシュされた書き込みを永続的な記憶装置に同期する
* truncate invocation::      ファイルサイズの短縮・伸長を行う

テキストの表示

* echo invocation::          テキストを 1 行表示する
* printf invocation::        データを整形して表示する
* yes invocation::           中断されるまで文字列を表示する

条件

* false invocation::         何もせず、実行失敗のステータスを返す
* true invocation::          何もせず、正常終了する
* test invocation::          ファイルタイプのチェックや値の比較を行う
* expr invocation::          式を評価する

@command{test}: ファイルタイプのチェックや値の比較を行う

* File type tests::            ファイルタイプのテスト
* Access permission tests::    アクセス許可のテスト
* File characteristic tests::  ファイル特性のテスト
* String tests::               文字列のテスト
* Numeric tests::              数値のテスト

@command{expr}: 式を評価する

* String expressions::       文字列式 (+ : match substr index length)
* Numeric expressions::      数式 (+ - * / %)
* Relations for expr::       論理結合と関係表現 (| & < <= = == != >= >)
* Examples of expr::         @command{expr} の使用例

リダイレクション

* tee invocation::           出力を複数のファイルやプロセスにリダイレクトする

ファイル名操作

* basename invocation::      ファイル名からディレクトリと接尾辞を取り除く
* dirname invocation::       ファイル名から最後の要素を取り除く
* pathchk invocation::       ファイル名の有効性や可搬性を検査する
* mktemp invocation::        テンポラリファイルやディレクトリを作成する
* realpath invocation::      ファイル名を展開して表示する

作業環境

* pwd invocation::           現在作業中のディレクトリを表示する
* stty invocation::          端末の諸特性を表示・変更する
* printenv invocation::      環境変数のすべて、あるいは一部を表示する
* tty invocation::           標準入力に接続している端末のファイル名を表示する

@command{stty}: 端末の諸特性を表示・変更する

* Control::                  制御関係の設定
* Input::                    入力に関する設定
* Output::                   出力に関する設定
* Local::                    ローカル設定
* Combination::              組み合わせ設定
* Characters::               特殊文字
* Special::                  特殊設定

ユーザ情報

* id invocation::            ユーザの ID を表示する
* logname invocation::       現在のログイン名を表示する
* whoami invocation::        実効ユーザ ID を表示する
* groups invocation::        ユーザが所属しているグループ名を表示する
* users invocation::         現在ログインしている全ユーザのログイン名を表示する
* who invocation::           現在誰がログインしているかを表示する

システム関連

* date invocation::          システムの日付や時刻を表示、設定する
* arch invocation::          マシンのハードウェア名を表示する
* nproc invocation::         プロセッサ数を表示する
* uname invocation::         システムについて情報を表示する
* hostname invocation::      システム名を表示、設定する
* hostid invocation::        数値によるホストの識別名を表示する
* uptime invocation::        システムの連続稼働時間と負荷を表示する

@command{date}: システムの日付や時刻を表示、設定する

* Time conversion specifiers:: 時刻関係の変換指定子 %[HIklMNpPrRsSTXzZ]
* Date conversion specifiers:: 日付関係の変換指定子 %[aAbBcCdDeFgGhjmuUVwWxyY]
* Literal conversion specifiers::  文字変換指定子 %[%nt]
* Padding and other flags::  0 や空白による空き埋め、その他
* Setting the time::         システムクロックの変更
* Options for date::         現在時以外の指定
* Date input formats::       日付文字列の指定法
* Examples of date::         用例

SELinux コンテキスト

* chcon invocation::         ファイルの SELinux コンテキストを変更する
* runcon invocation::        指定された SELinux コンテキストでコマンドを実行する

コマンド実行条件の変更

* chroot invocation::        ルートディレクトリを変更して、コマンドを実行する
* env invocation::           変更した環境でコマンドを実行する
* nice invocation::          niceness を変更して、コマンドを実行する
* nohup invocation::         ハングアップ・シグナルで終了しないコマンドを実行する
* stdbuf invocation::        入出力バッファリングを変更して、コマンドを実行する
* timeout invocation::       タイムリミット付きでコマンドを実行する

プロセス制御

* kill invocation::          プロセスにシグナルを送る。

一時停止

* sleep invocation::         指定された時間、停止する

数値の操作

* factor invocation::        素因数を表示する
* numfmt invocation::        数値を整形し直す
* seq invocation::           数列を表示する

@command{numfmt}: 数値を整形し直す
 
* General options in numfmt::  一般オプション
* Possible UNITs::             使用できる UNIT
* Examples of using numfmt::   numfmt の使用例


ファイルの許可属性

* Mode Structure::           ファイルのモードビットの構成
* Symbolic Modes::           ファイルのモードビットの憶えやすい表記
* Numeric Modes::            ファイルのモードビットの 8 進数による表記
* Operator Numeric Modes::   8 進数によるモードの追加、削除、絶対指定
* Directory Setuid and Setgid::  ディレクトリの Set-User-ID と 
                                   Set-Group-ID ビット

日付入力の書式

* General date syntax::      共通規則
* Calendar date items::      19 Dec 1994
* Time of day items::        9:20pm
* Time zone items::          EST, PDT, UTC, @dots{}
* Combined date and time of day items::  1972-09-24T20:02:00,000000-0500
* Day of week items::        Monday, Tuesday
* Relative items in date strings::  next tuesday, 2 years ago
* Pure numbers in date strings::  19931219, 1440
* Seconds since the Epoch::  @@1078100502
* Specifying time zone rules::  TZ="America/New_York", TZ="UTC0"
* Authors of parse_datetime::  Bellovin, Eggert, Salz, Berets, et al.

ソフトウェアの道具箱

* Toolbox introduction::     はじめに
* I/O redirection::          I/O リダイレクション
* The who command::          @command{who} コマンド
* The cut command::          @command{cut} コマンド
* The sort command::         @command{sort} コマンド
* The uniq command::         @command{uniq} コマンド
* Putting the tools together::  工具を組み合わせる

翻訳について

* About the translation::    翻訳について

Copying This Manual

* GNU Free Documentation License::  Copying and sharing this manual

@end detailmenu
@end menu


@node Introduction
@chapter 序

このマニュアルは作成の途上にある。たとえば、多くのセクションで、
基本的な概念を初心者にわかりやすく説明するといった試みがなされていない。
そこで、お願いがある。もし、関心がおありなら、このマニュアルの改良に参加していただきたい。
そうしていただければ、GNU コミュニティ全体が恩恵に浴することになる。

@cindex POSIX
このマニュアルで解説している GNU ユーティリティは、
POSIX の規格におおむね準拠している。
@cindex bugs, reporting

バグの報告は、@email{bug-coreutils@@gnu.org} になさっていただきたい。
そのとき、プログラムのバージョン番号、マシンのアーキテクチャ、
入力に使ったファイルといった情報はもとより、
バグの再現に必要な他のいかなる情報も、記載していただきたい。
たとえば、どんな入力をしたか、どんな結果を期待していたか、実際の結果はどうだったか、
それがおかしいと考える理由は何なのかといったことである。

@command{sort} や @command{date} コマンドの動作に疑問がある場合は、@option{--debug}
オプションを試してみていただきたい。
その出力が手がかりになって、バグレポートに対する回答を待つまでもなく、
問題の在り処を突き止め、解決できることも多いからだ。
デバッグの出力が問題を自分で解決するのに十分でないときは、
それを圧縮して、提出するバグレポートに添付していただきたい。

差分の投稿は歓迎するが、何がどう問題なのかの説明もやはり付けていただきたい。
推測するのが難しいこともあるからだ。
@xref{Bugs, , , gcc, Using and Porting GNU CC}.

@cindex Berry, K.
@cindex Paterson, R.
@cindex Stallman, R.
@cindex Pinard, F.
@cindex MacKenzie, D.
@cindex Meyering, J.
@cindex Youmans, B.
このマニュアルは、ユーティリティ・プログラムの配布に含まれる
Unix man page を元にして作られたものである。そうした man page は、David MacKenzie
によって書かれ、Jim Meyering によって改訂されていた。
現在読者がお読みになっているこのマニュアルは、そうしたユーティリティについての公式文書であり、
man page の方は、今では改訂作業が行われていない。なお、@command{fmt}
の最初の man page の著者は、Ross Paterson だった。
Texinfo 形式への変換を最初に行ったのは、Fran@,{c}ois Pinard である。
Karl Berry が索引を作成し、構成に若干の変更を加えて、その結果に手を入れた。
Free Software Foundation の職員である Brian Youman が
textutils, fileutils, sh-utils のマニュアルを統合し、
多数の項目を含む現在のマニュアルを作成した。こうした作業全般に渡って、
Richard Stallman が例によって洞察力に富む貴重な意見を寄せてくれた。

@node Common options
@chapter 共通オプション

@macro optBackup
@item -b
@itemx --backup[=@var{method}]
@opindex -b
@opindex --backup
@vindex VERSION_CONTROL
@cindex backups, making
@xref{Backup options}.  そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。
@end macro

@macro optBackupSuffix
@item -S @var{suffix}
@itemx --suffix=@var{suffix}
@opindex -S
@opindex --suffix
@option{-b} によって作られる各バックアップファイルの後ろに
@var{suffix} を付ける。 @xref{Backup options}.
@end macro

@macro optTargetDirectory
@item -t @var{directory}
@itemx --target-directory=@var{directory}
@opindex -t
@opindex --target-directory
@cindex target directory
@cindex destination directory
@var{directory} を出力先ディレクトリに指定する。 @xref{Target directory}.
@end macro

@macro optNoTargetDirectory
@item -T
@itemx --no-target-directory
@opindex -T
@opindex --no-target-directory
@cindex target directory
@cindex destination directory
最後のオペランドがディレクトリやディレクトリへのシンボリックリンク
でも、それを特別扱いしない。 @xref{Target directory}.
@end macro

@macro outputNUL
@cindex output NUL-byte-terminated lines
各行の末尾に改行ではなく、ゼロバイト (ASCII NUL)
を出力する。このオプションを使用すると、出力するデータの途中に改行が現れる場合でも、
他のプログラムがその出力を解析できるようになる。
@end macro

@macro optNull
@item -0
@itemx --null
@opindex -0
@opindex --null
@outputNUL
@end macro

@macro optZero
@item -z
@itemx --zero
@opindex -z
@opindex --zero
@outputNUL
@end macro

@macro optZeroTerminated
@item -z
@itemx --zero-terminated
@opindex -z
@opindex --zero-terminated
@cindex process zero-terminated items
項目の区切りに、改行 (ASCII LF) ではなく、ゼロバイトを使用する。
すなわち、入力を ASCII NUL で分離された項目として扱い、出力する各項目の末尾に
ASCII NUL を付加する。このオプションは、@samp{perl -0},
@samp{find -print0}, @samp{xargs -0} などと組み合わせて使用すると、
便利なことがある。そうしたコマンドでも、わがままなファイル名を
(空白などの特殊文字を含んでいる場合でも) きちんと確実に処理するために、
同様なことをしているのである。
@end macro

@macro optSi
@item --si
@opindex --si
@cindex SI output
各サイズにの後ろに、メガバイトなら @samp{M} といった、SI 形式の略号を付ける。
1024 ではなく、1000 の累乗が使用されるので、@samp{M} は
1,000,000 バイトを表している。このオプションは、@option{--block-size=si}
と同じことである。1024 の累乗が使いたければ、@option{-h} や
@option{--human-readable} を使用すればよい。
@end macro

@macro optHumanReadable
@item -h
@itemx --human-readable
@opindex -h
@opindex --human-readable
@cindex human-readable output
各サイズの後ろに、メビバイトなら @samp{M} といった、大きさを示す文字を付ける。
1000 ではなく、1024 の累乗が使われるので、@samp{M} は 1,048,576
バイトを表している。このオプションは、@option{--block-size=human-readable}
と同じである。1000 の累乗が使いたければ、"@option{--si} オプションを使用すればよい。
@end macro

@macro optStripTrailingSlashes
@item --strip-trailing-slashes
@opindex --strip-trailing-slashes
@cindex stripping trailing slashes
@var{source} 引数の後ろにスラッシュが付いていたら、それを削除する。
@xref{Trailing slashes}.
@end macro

@macro mayConflictWithShellBuiltIn{cmd}
@cindex conflicts with shell built-ins
@cindex built-in shell commands, conflicts with
シェルの組み込み機能の @command{\cmd\} やエイリアスのために、
@command{\cmd\} に何の修飾も付けずに対話的に使ったり、スクリプトの中で使ったりすると、
動作がここで述べているものとは違うことがあるかもしれない。
シェルによる干渉を避けるためには、@command{env} 経由で @command{\cmd\}
を起動すればよい (すなわち、@code{env \cmd\ @dots{}} のようにだ)。

@end macro

@macro multiplierSuffixes{varName}
@var{\varName\} は、整数であり、
以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい
(訳注: その場合は、1 が前にあるものと見なされる)。
@example
@samp{b}  =>            512 ("blocks")
@samp{KB} =>           1000 (KiloBytes)
@samp{K}  =>           1024 (KibiBytes)
@samp{MB} =>      1000*1000 (MegaBytes)
@samp{M}  =>      1024*1024 (MebiBytes)
@samp{GB} => 1000*1000*1000 (GigaBytes)
@samp{G}  => 1024*1024*1024 (GibiBytes)
@end example
@samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} についても同様。
@end macro

@c FIXME: same as above, but no ``blocks'' line.
@macro multiplierSuffixesNoBlocks{varName}
@var{\varName\} は、整数であり、
以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい
(訳注: その場合は、1 が前にあるものと見なされる)。
@example
@samp{KB} =>           1000 (KiloBytes)
@samp{K}  =>           1024 (KibiBytes)
@samp{MB} =>      1000*1000 (MegaBytes)
@samp{M}  =>      1024*1024 (MebiBytes)
@samp{GB} => 1000*1000*1000 (GigaBytes)
@samp{G}  => 1024*1024*1024 (GibiBytes)
@end example
@samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} についても同様。
@end macro

@cindex common options

いくつかのオプションは、このマニュアルで取り上げるすべてのプログラムで利用することができる。
そうしたオプションについては、個々のプログラムで同じ説明を繰り返すことはせず、この場で説明しておく
(実のところ、そうしたオプションは、GNU のすべてのプログラムで使用できる (はずである))。

@vindex POSIXLY_CORRECT
通常、オプションとオペランドは、どんな順番で指定してもよい。
プログラムは、すべてのオプションがいかなるオペランドよりも前にあるかのごとく振る舞うようになっている。
たとえば、@samp{sort -r passwd -t :} は、@samp{:} が @option{-t}
のオプション引数 (option-argument) なので、@samp{sort -r -t : passwd}
と同じ動作をする。しかしながら、環境変数 @env{POSIXLY_CORRECT}
が設定されている場合は、オプションはオペランドの前に置かなければならない。
ただし、オプションとオペランドの順番について、そのコマンドに別の決まりがあるときはこのかぎりではない。

若干のプログラムでは、二番目以降のオペランドとして先頭に
@samp{-} が付くオペランドが使えると都合がよい。
そうしたプログラムでは、@env{POSIXLY_CORRECT} が設定されていない場合でも、
オプションをオペランドの前に置く必要がある。
そこで、そうしたプログラムの説明には、その旨注意書きを付けておいた。
たとえば、@command{env} コマンドのオプションは、オペランドの前に置かなければならない。
オペランドとして指定したコマンドが、それ自身のオプションを伴うことがあるからだ。

ロングオプションが使えるたいていのプログラムは、誤解の余地がないかぎり、そうしたオプションの省略形を認識する。
たとえば、@samp{rmdir --ignore-fail-on-non-empty} は、@samp{rmdir --ignore-fail}
という形でも起動できるし、@samp{rmdir --i} でも大丈夫だ。
@samp{ls --h} のような誤解の余地のあるオプションは、まさに曖昧だと判定される。

このマニュアルで説明するプログラムの中には、@option{--help} や @option{--version}
オプションを、それが唯一のコマンドライン引数である場合にしか、認識しないものがある。
そうしたプログラムの場合、ロングオプションの省略形は、常に認識されるとはかぎらない。

@table @samp

@item --help
@opindex --help
@cindex help, online
使用法を表示して利用できるすべてのオプションを列挙し、正常終了する。

@item --version
@opindex --version
@cindex version number, finding
バージョン番号を表示し、正常終了する。

@item --
@opindex --
@cindex option delimiter
オプション群の末尾を示す。これ以降に引数があれば、それが @samp{-}
で始まっている場合でも、オペランドとして扱われる。たとえば、@samp{sort -- -r}
は、@file{-r} という名前のファイルから読み込むということである。

@end table

@cindex standard input
@cindex standard output
単独の @samp{-} はオペランドであって、オプションのように見えるが、
オプションでは全くない。単独の @samp{-} はファイル・オペランドであり、
プログラム次第で、標準入力、あるいは標準出力として扱われる。
後者は、前後の状況からそれが明らかな場合だ。たとえば、@samp{sort -}
は、標準入力から読み込むということであり、ただの @samp{sort} と同じである。
使用できないとはっきり断っていないかぎり、@samp{-}
は、ファイル名が要求されるいかなるところでもオペランドとして使用することができる。

@menu
* Exit status::              プログラムが成功したか失敗したかの指標。
* Backup options::           バックアップ・オプション (-b と -S)。
* Block size::               ブロックサイズ (BLOCK_SIZE と --block-size)。
* Floating point::           浮動小数点数の表現。
* Signal specifications::    --signal オプションによるシグナルの指定。
* Disambiguating names and IDs::  chgrp, chown, chroot, id における
                                    ユーザやグループの指定法。
* Random sources::           ランダムデータのソース (--random-source)。
* Target directory::         出力先ディレクトリの指定。
* Trailing slashes::         末尾のスラッシュ (--strip-trailing-slashes)。
* Traversing symlinks::      シムリンクをたどる (-H, -L, -P)。
* Treating / specially::     --preserve-root や --no-preserve-root の使用。
* Special built-in utilities::  組み込みコマンド @command{break}, @command{:} など。
* Standards conformance::    POSIX 規格への準拠。
* Multi-call invocation::    Multi-call プログラムの起動。
@end menu


@node Exit status
@section 終了ステータス

@macro exitstatus
終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。
@end macro

ほとんどすべてのコマンドは、実行すると、整数の終了ステータス
(@dfn{exit status}) を返し、それは他のコマンドの動作を変更するために使用することができる。
大多数のコマンドにとって、終了ステータス @samp{0} は成功を意味している。
失敗は @samp{0} 以外の値によって示され、たいていは @samp{1} だが、
非標準的なプラットフォームでは違うこともある。POSIX の規定が、@samp{0}
以外であることしか要求していないからである。

しかしながら、ここで詳述しているプログラムの中にも、終了ステータスとして上記以外の値を返すものがあり、
@samp{0} や @samp{1} という値に別の意味を与えているプログラムさえ、少数ながら存在する。
そうした例外的なプログラムとしては、@command{chroot}, @command{env},
@command{expr}, @command{nice}, @command{nohup}, @command{numfmt},
@command{printenv}, @command{sort}, @command{stdbuf}, @command{test},
@command{timeout}, @command{tty} などを挙げることができる。


@node Backup options
@section バックアップ・オプション

@cindex backup options

GNU のプログラムの中には、ファイルの新しいバージョンを書き出す前に、
もしそうしたければ、バックアップを作成できるものがある
(少なくとも @command{cp}, @command{install}, @command{ln}, @command{mv}
がそうだ)。下記のオプションは、そうしたバックアップを細かく制御する。
こうしたオプションについては、個々のプログラムの説明でも簡単に触れている。

@table @samp

@item -b
@itemx --backup[=@var{method}]
@opindex -b
@opindex --backup
@vindex VERSION_CONTROL
@cindex backups, making
通常では上書きされたり、消去されたりする各ファイルのバックアップを作成する。
このオプションを指定しないと、元のバージョンは破棄されるわけだ。
作成するバックアップのタイプを決めるには、@var{method} を使用する。
@var{method} を指定せずに、このオプションを使った場合は、環境変数
@env{VERSION_CONTROL} の値が使用される。@env{VERSION_CONTROL}
が設定されていない場合、デフォルトのバックアップタイプは @samp{existing} である。

このオプションの短縮形である @option{-b} は、引数を取らないことに注意していただきたい。
@option{-b} の使用は、@option{--backup=existing} を使用するのと同じことである。

@vindex version-control @r{Emacs variable}
このオプションは、Emacs の @samp{version-control} 変数に対応している。
すなわち、@var{method} に指定する値は、Emacs で使用される値と同じものである。
とは言え、このオプションでは、より説明的な名前も使用できる。
@var{method} の有効な値は、以下のものである (他と区別できるならば、省略した表現も使用できる)。

@table @samp
@item none
@itemx off
@opindex none @r{backup method}
バックアップを作成しない。

@item numbered
@itemx t
@opindex numbered @r{backup method}
どんな場合でも番号付きのバックアップを作成する。

@item existing
@itemx nil
@opindex existing @r{backup method}
番号付きのバックアップがすでに存在する場合は番号付きで、それ以外の場合は単純形式で、ファイルのバックアップを作成する。
(訳注: 単純形式というのは、バックアップファイル名に番号を付けない形式である。
@option{--suffix=@var{suffix}} の説明を参照。)

@item simple
@itemx never
@opindex simple @r{backup method}
どんな場合でも単純形式のバックアップを作成する。@samp{never} と
@samp{none} を混同なさらないようにしていただきたい。

@end table

@item -S @var{suffix}
@itemx --suffix=@var{suffix}
@opindex -S
@opindex --suffix
@cindex backup suffix
@vindex SIMPLE_BACKUP_SUFFIX
@option{-b} で作成される各バックアップファイルの名前の末尾に
@var{suffix} を付ける。このオプションが指定されていない場合は、環境変数
@env{SIMPLE_BACKUP_SUFFIX} の値が使用される。@env{SIMPLE_BACKUP_SUFFIX}
が設定されていない場合、デフォルトの @var{suffix} は
Emacs の場合と同じで、チルダ @samp{~} である。

@end table

@node Block size
@section ブロックサイズ

@cindex block size

GNU プログラムには、ディスクの使用量を「ブロック数」で表示するものがいくつかある
(少なくとも、@command{df}, @command{du},@command{ls} がそうだ)。
ブロックのサイズや表示の書式は、使用量をわかりやすくするために、変更することができる。
表示に使用されるブロックサイズは、ファイルシステムのブロックサイズとは、
無関係である。ブロック数に端数が出る場合は、切り上げて整数にする。

@opindex --block-size=@var{size}
@vindex BLOCKSIZE
@vindex BLOCK_SIZE
@vindex DF_BLOCK_SIZE
@vindex DU_BLOCK_SIZE
@vindex LS_BLOCK_SIZE
@vindex POSIXLY_CORRECT@r{, and block size}

デフォルトのブロックサイズの選択は、次の環境変数を順番に調べることで行われる。
設定されている最初のものがブロックサイズを決めることになる。

@table @code

@item DF_BLOCK_SIZE
この環境変数は、@command{df} コマンドで使うデフォルトのブロックサイズを指定している。
同様に、@env{DU_BLOCK_SIZE} は @command{du} のデフォルトを、
@env{LS_BLOCK_SIZE} は @command{ls} のデフォルトを指定している。

@item BLOCK_SIZE
この環境変数は、上記のようなコマンド専用の環境変数が設定されていない場合に、
三つのコマンドのすべてが使用するデフォルトのブロックサイズを指定している。

@item BLOCKSIZE
この環境変数は、上記のようなコマンド専用の環境変数と @env{BLOCK_SIZE} のどちらも設定されていない場合に、
通常、ブロック数として表示されるすべての値が使用するデフォルトのブロックサイズを指定している。
ほかの環境変数とは違って、@env{BLOCKSIZE} は、たとえば @code{ls -l}
の出力に含まれるファイルサイズのような、通常バイト数として表示される値には影響を及ぼさない。

@item POSIXLY_CORRECT
@env{@var{command}_BLOCK_SIZE}, @env{BLOCK_SIZE}, @env{BLOCKSIZE}
のいづれも設定されていず、この変数が設定されている場合は、
ブロックサイズのデフォルトは、512 バイトになる。

@end table

上記の環境変数のいづれも設定されていない場合、
ブロックサイズのデフォルトは、現在のところたいていの場合、 1024 バイトである。
ただし、この数値は、将来変更されるかもしれない。なお、@command{ls}
の表示するファイルサイズについては、ブロックサイズのデフォルトは 1 バイトである。

@cindex human-readable output
@cindex SI output

ブロックサイズの指定には、1 ブロックあたりのバイト数を示す正の整数を使えばよい。
あるいは、@code{human-readable} や @code{si} を指定して、
「人間に読みやすい」書式を選ぶこともできる。
整数の後ろには接尾辞 (suffix) を続けてもよい。そうした接尾辞は、単位の前に付けて
@samp{10} の累乗倍を表す SI (国際単位系) の接頭辞 (prefix) や、
@samp{2} の累乗倍を表す ISO/IEC 80000-13 (以前は IEC 60027-2 だった)
の接頭辞の上位互換である。単位の前に付ける接頭辞については、
次の URL を参照していただきたい。@*
@uref{http://www.bipm.org/en/publications/si-brochure/chapter3.html, SI
prefixes:}.
@uref{http://physics.nist.gov/cuu/Units/binary.html, ISO/IEC 80000-13
prefixes:}.

「人間に読みやすい」書式の場合、出力するサイズの後ろに、メガバイトなら
@samp{M} といった、大きさを表す文字が続く。@code{BLOCK_SIZE=human-readable}
の方は、1024 の累乗を使うので、@samp{M} は 1,048,576 バイトを意味している。
@code{BLOCK_SIZE=si} も似ているが、こちらは 1000 の累乗を使用し、さらに @samp{B}
という文字を追加する。そこで、@samp{MB} は 1,000,000 バイトを意味することになる。

@vindex LC_NUMERIC
ブロックサイズの指定の先頭に @samp{'} を付けると、
出力するサイズを数桁ごとに区切って表示することができる。
区切りに使う記号や区切りの位置は、@env{LC_NUMERIC} のロケールによって決まる。
たとえば、アメリカ英語のロケールでは、@samp{--block-size="'1kB"}
と指定すれば、1234000 バイトという容量が @samp{1,234}
と表示されることになるだろう。デフォルトの C ロケールの場合は、
区切り記号が存在しないので、先頭の @samp{'} に効果はない。

ブロックサイズを指定する整数の後ろには、接尾辞を付けて、
その整数の何倍かを示すことができる。大きさを表す (訳注: M, G などの)
文字の後ろに何も続けないときや、@samp{iB} を続けるときは、
1024 の累乗倍ということである。それに対して、大きさを表す文字に
@samp{B} を続ける場合は、1000 の累乗倍ということになる。
たとえば、@samp{1M} や @samp{1MiB} は @samp{1048576} と同じであり、
@samp{1MB} は @samp{1000000} と同じである。

整数を前に付けずに、接尾辞だけを指定したときの動作は、
@samp{1} が前に付いているときとほぼ同じだが、大きさの表示が出力の後ろに付く点が違う。
たとえば、@samp{--block-size="kB"} は、3000 を @samp{3kB} という形で表示する。

以下の接尾辞が定義されている。@code{1Y} のような大きな量は、
算術計算の限界のためにお使いのコンピュータでは使用できないかもしれない。

@table @samp
@item kB
@cindex kilobyte, definition of
キロバイト (kilobyte): @math{10^3 = 1000} バイト。
@item k
@itemx K
@itemx KiB
@cindex kibibyte, definition of
キビバイト (kibibyte): @math{2^{10} = 1024} バイト。
@samp{K} も使えるのは、おまけである。なお本来、SI の接頭辞
(訳注: すなわち @math{10^3} 倍を表す接頭辞) が @samp{k} であり、
ISO/IEC 80000-13 の接頭辞 (訳注: すなわち @math{2^{10}} 倍を表す接頭辞)
が @samp{Ki} だが、これまでの習慣や POSIX の用法では、
@samp{KiB} の意味で @samp{k} を使っている。
@item MB
@cindex megabyte, definition of
メガバイト (megabyte): @math{10^6 = 1,000,000} バイト。
@item M
@itemx MiB
@cindex mebibyte, definition of
メビバイト (mebibyte): @math{2^{20} = 1,048,576} バイト。
@item GB
@cindex gigabyte, definition of
ギガバイト (gigabyte): @math{10^9 = 1,000,000,000} バイト。
@item G
@itemx GiB
@cindex gibibyte, definition of
ギビバイト (gibibyte): @math{2^{30} = 1,073,741,824} バイト。
@item TB
@cindex terabyte, definition of
テラバイト (terabyte): @math{10^{12} = 1,000,000,000,000} バイト。
@item T
@itemx TiB
@cindex tebibyte, definition of
テビバイト (tebibyte): @math{2^{40} = 1,099,511,627,776} バイト。
@item PB
@cindex petabyte, definition of
ペタバイト (petabyte): @math{10^{15} = 1,000,000,000,000,000} バイト。
@item P
@itemx PiB
@cindex pebibyte, definition of
ペビバイト (pebibyte): @math{2^{50} = 1,125,899,906,842,624} バイト。
@item EB
@cindex exabyte, definition of
エクサバイト (exabyte): @math{10^{18} = 1,000,000,000,000,000,000} バイト。
@item E
@itemx EiB
@cindex exbibyte, definition of
エクスビバイト (exbibyte): @math{2^{60} = 1,152,921,504,606,846,976} バイト。
@item ZB
@cindex zettabyte, definition of
ゼタバイト (zettabyte): @math{10^{21} = 1,000,000,000,000,000,000,000} バイト。
@item Z
@itemx ZiB
ゼビバイト (zebibyte): @math{2^{70} = 1,180,591,620,717,411,303,424} バイト。
@item YB
@cindex yottabyte, definition of
ヨタバイト (yottabyte): @math{10^{24} = 1,000,000,000,000,000,000,000,000} バイト。
@item Y
@itemx YiB
ヨビバイト (yobibyte): @math{2^{80} = 1,208,925,819,614,629,174,706,176} バイト。
@end table

@opindex -k
@opindex -h
@opindex --block-size
@opindex --human-readable
@opindex --si

デフォルトのブロックサイズは、コマンドに対して @option{--block-size=@var{size}}
オプションを明示的に指定することで、上書きすることができる。@option{-k}
オプションは、@option{--block-size=1K} と同じであり、環境変数 @env{POSIXLY_CORRECT}
が設定されていないときのデフォルトである。@option{-h} オプションや
@option{--human-readable} オプションは、@option{--block-size=human-readable}
と同じである。@option{--si} オプションは、@option{--block-size=si} と同じだ。
なお、@command{ls} コマンドの場合、
@option{-k} オプションはファイルの見かけのサイズの表示に影響しないのに対し、
@option{--block-size} オプションは影響することに注意していただきたい。

@node Floating point
@section 浮動小数点数
@cindex floating point
@cindex IEEE floating point

浮動小数点数を受け取ったり、生成したりするコマンドは、
下層で動いているシステムの浮動小数点表現法を使用しており、
丸めエラー、オーバーフローなど、浮動小数点にかかわる問題をかかえている。
最近のシステムでは、ほとんどすべてが IEEE-754 の浮動小数点を採用しているので、
今日では IEEE-754 の動作を想定しておけば、たいていどこでも問題がない。
IEEE-754 には、正と負の無限があり、正と負のゼロを区別する。
また、NaN (訳注: Not a Number) という特別な値を使って、
ゼロをゼロで割るといった無効な演算を表現する。
より詳しい情報については、デイビッド・ゴールドバーグの論文
@uref{http://@/www.validlab.com/@/goldberg/@/paper.pdf,
"What Every Computer Scientist Should Know About Floating-Point Arithmetic"}
をご覧になるとよい。

@vindex LC_NUMERIC
浮動小数点数をオプションやオペランドや入力として受け取るコマンドは、
C の標準関数 @code{strtod} や @code{strtold} を使って、
テキストを浮動小数点数に変換している。従って、そうした浮動小数点数には、
@code{1.0e-34} や @code{-10e100} といった指数表現が使用できる。
浮動小数点を解析するコマンドは、大文字小文字を区別しない @code{inf},
@code{infinity},@code{NaN} といった値も理解する。
もっとも、そうした値が役に立つかどうかは、そのコマンド次第だ。
最近の C の実装では、16 進の浮動小数点数も使える。
たとえば、@code{-0x.ep-3} といったものだが、これは @minus{}14/16 掛ける
@math{2^-3} を表し、@minus{}0.109375 に等しい。小数点を表す記号が何になるかは、
@env{LC_NUMERIC} のロケールによって決まる。
@xref{Parsing of Floats,,, libc, The GNU C Library Reference Manual}.

@node Signal specifications
@section シグナルの指定
@cindex signals, specifying

@var{signal} の指定には、@samp{HUP} のようなシグナル名や @samp{1} のようなシグナル番号、
それに、シグナルによって終了させられるときのプロセスの終了ステータスを使うことができる
(訳注: 最後のものは、GNU coreutils の @command{kill} コマンドでは使用できるが、
シェルの組み込みコマンドのような、他の系統の @command{kill}
では使えないかもしれない)。シグナル名は、標準的な形式でも、頭に @samp{SIG}
を付けた形式でも構わない。大文字小文字は区別されない。
以下に挙げるシグナル名とシグナル番号は、POSIX の規格に従っているすべてのシステムで使用できる。

@table @samp
@item HUP
1.  ハングアップ (Hangup)。
@item INT
2.  端末からの割り込みシグナル (Terminal interrupt)。
@item QUIT
3.  端末からの中止シグナル (Terminal quit)。
@item ABRT
6. プロセスの中断 (Process abort)。
@item KILL
9.  強制終了 (Kill) (捕獲することも無視することもできない)。
@item ALRM
14.  アラームクロック (Alarm Clock)。
@item TERM
15.  終了 (Termination)。
@end table

@noindent
これ以外にもサポートされているシグナル名があるが、それに対応するシグナル番号はシステムによって様々である。
POSIX 1003.1-2001 に準拠しているすべてのシステムでは、以下のシグナルも使用できる。

@table @samp
@item BUS
メモリオブジェクトの未定義領域へのアクセス。
@item CHLD
チャイルドプロセスが終了 (terminate)、一時停止 (stop)、または再開 (continue) した。
@item CONT
実行が停止 (stop) しているならば、再開 (continue) する。
@item FPE
誤った算術演算。
@item ILL
不正な命令。
@item PIPE
読み手のないパイプへの書き出し。
@item SEGV
無効なメモリ参照。
@item STOP
実行を一時停止する (stop) (捕獲することも無視することもできない)。
@item TSTP
端末からの一時停止シグナル。
@item TTIN
バックグラウンドプロセスが端末から読み込もうとしている。
@item TTOU
バックグラウンドプロセスが端末へ書き出そうとしている。
@item URG
高帯域幅のデータがソケットに達している。
@item USR1
ユーザ定義シグナル 1。
@item USR2
ユーザ定義シグナル 2。
@end table

@noindent
XSI 拡張に対応している POSIX 1003.1-2001 のシステムでは、以下のシグナルも使用できる。

@table @samp
@item POLL
ポーリング可能なイベント。
@item PROF
プロファイリング・タイマーがタイムアウトした。
@item SYS
不正なシステムコール。
@item TRAP
Trace/breakpoint トラップ。
@item VTALRM
バーチャル・タイマーがタイムアウトした。
@item XCPU
CPU 時間の上限を超過した。
@item XFSZ
ファイルサイズの上限を超過した。
@end table

@noindent
XRT 拡張に対応している POSIX 1003.1-2001 のシステムでは、上記以外にも、
少なくとも 8 個のリアルタイム・シグナルが使用できる。すなわち、@samp{RTMIN},
@samp{RTMIN+1}, @dots{}, @samp{RTMAX-1}, @samp{RTMAX} などだ。

@node Disambiguating names and IDs
@section chown, chgrp, chroot, id: ユーザ名かユーザ ID かを明確にする
@cindex user names, disambiguating
@cindex user IDs, disambiguating
@cindex group names, disambiguating
@cindex group IDs, disambiguating
@cindex disambiguating group names and IDs

@command{chown}, @command{chgrp}, @command{chroot}, @command{id}
といったコマンドでは、引数として @var{owner} や @var{group}
を渡す際に名前で指定しても、ID 番号で指定してもよい。
この指定法が曖昧であることは明らかである。
もし、ユーザ名やグループ名が数字の連続だったら、どうだろう？
@footnote{環境によっては、ユーザ名に数字を使うのは、よくあることである。}
コマンドはそれをユーザ名と解釈すべきだろうか？ ID 番号と解釈すべきだろうか？
POSIX では、「こうしたコマンドは、指定された文字列をまず名前として解決することを試み、
それに失敗した場合のみ、ID 番号として解釈しようとすること」と規定している。
この規定では、ユーザが引数として ID 番号、たとえば 42 を指定しようとすると、
面倒な話になる。42 というユーザ名が存在し、それにユーザ ID 番号として別の数字、
たとえば 1000 が割り当てられているといったややこしい状況でも、
うまく処理できなければならないとすると、厄介なことになるのだ。
単に @code{chown 42 F} を実行したのでは、ファイル @file{F} の所有者の
ID 番号が 1000 になってしまう。これはユーザが意図した動作ではない。

GNU の @command{chown}, @command{chgrp}, @command{chroot},@command{id}
は、この問題に対する回避策を用意している。この回避策を使用すると、
データベースの検索を省略するので、処理速度が著しく向上することがあるというおまけまで付く。
ユーザやグループに ID 番号を指定する際には、その前に @samp{+}
を付けさえすればよい。そうすれば、整数として解釈するように強制できるのである。

@example
chown +42 F
chgrp +$numeric_group_id another-file
chown +0:+0 /
@end example

@samp{+} が前に付く各文字列に対しては、ユーザ名の検索プロセスが省略される。
何故なら、@samp{+} を含む文字列が有効なユーザ名やグループ名であることは絶対にないからだ。
この書き方は、よく使われているたいていの Unix システムで使用できるが、Solaris 10 では使用できない。

@node Random sources
@section ランダムデータのソース

@cindex random sources

@command{shuf}, @command{shred}, @command{sort} コマンドは、
作業を行うためにランダムデータを必要とすることがある。たとえば、@samp{sort -R}
ではハッシュ関数をランダムに選ばねばならず、その選択のためにランダムデータを必要としている。

デフォルトでは、こうしたコマンドは、プログラム内部の擬似乱数ジェネレータを、
少量のエントロピーによって初期化して使用するが、
@option{--random-source=@var{file}} オプションで、
外部ソースを使うように指示することもできる。
@var{file} の中身のバイト数が不十分なときは、エラーが通知される。

たとえば、デバイスファイル @file{/dev/urandom} を、
ランダムデータのソースとして使用してもよい。通常、このデバイスは、
デバイスドライバーなどのソースから環境ノイズを集めて、エントロピー・プールに入れ、
そのプールを使って、ランダムなビットを生成する。プールにデータが足りない場合は、
内部プールを再利用し、暗号的に安全な擬似乱数ジェネレータを使って、
より多くのビットを作り出す。
とは言え、このデバイスは、大量のランダムデータの生成のために設計されたものではなく、
比較的動作が遅いことは、承知しておいた方がよい。

たいていの実用には、@file{/dev/urandom} で十分だが、
プライベートなデータの高度で長期に渡る保護が必要になるアプリケーションでは、
@file{/dev/random} や @file{/dev/arandom} のような他のデータソースが必要になるかもしれない。
どんなデータソースが利用できるかは、ご使用のオペレーティング・システム次第だ。

前回コマンドを実行したときの結果を再現するには、
何らかのランダムデータをファイルに保存しておき、
そのコマンドの一回目の実行でも二回目の実行でも、
ランダムソースとしてそのファイルを使用すればよい。
@cindex random seed
ファイルを使用する代わりに、たとえば、次のような方法を使っても、
ある値を種として与えたときの、再現性のある適当な量の擬似ランダムデータを生成することができる。

@example
get_seeded_random()
@{
  seed="$1"
  openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    </dev/zero 2>/dev/null
@}

shuf -i1-100 --random-source=<(get_seeded_random 42)
@end example

@node Target directory
@section 出力先ディレクトリ

@cindex target directory

通常、@command{cp}, @command{install}, @command{ln}, @command{mv}
といったコマンドは、最後のオペランドがディレクトリやディレクトリへのシンボリックリンクの場合、
それを特別扱いする。たとえば、@samp{cp source dest} は、@file{dest}
がディレクトリならば、@samp{cp source dest/source} と同じことである。
時には、そうした動作が、ユーザが求めている動作とは違うこともある。
そこで、こうしたコマンドは、よりきめ細かな制御ができるように、
以下のオプションをサポートしている。

@table @samp

@item -T
@itemx --no-target-directory
@opindex --no-target-directory
@cindex target directory
@cindex destination directory
最後のオペランドが、ディレクトリやディレクトリへのシンボリックリンクであっても、それを特別扱いしない。
このオプションは、複数のプログラムが共有領域で作業するとき、競合状態を防止する一助になる。
たとえば、@samp{mv /tmp/source /tmp/dest} というコマンドが正常終了しても、
@file{/tmp/source} が @file{/tmp/dest} にリネームされたという保証はない。
もし、何かほかのプロセスが @file{/tmp/dest} をディレクトリとして作成していたら、
@file{/tmp/dest/source} という名前のファイルになってしまうかもしれないのだ。
それに対して、@file{mv -T /tmp/source /tmp/dest} が正常終了した場合は、
@file{/tmp/source} は間違いなく @file{/tmp/dest} にリネームされている。

反対に、最後のオペランドをディレクトリとして扱わせたい、
それができない場合は、エラーメッセージを出したい、ということもある。
そういうときは、@option{--target-directory} (@option{-t}) オプションを使用すればよい。
(訳注: ターゲット・ディレクトリをコマンドラインの最後に置く代わりに、
@option{--target-directory} オプションの引数にするということである。)

@item -t @var{directory}
@itemx --target-directory=@var{directory}
@opindex --target-directory
@cindex target directory
@cindex destination directory
@var{directory} を、出力されるファイルすべてのディレクトリ部分として使用する。

ほとんどのプログラムで、コマンドラインの扱いは次のようになっている。
オプションや、一定数の (0 個のこともある) 位置の固定した引数の処理が終われば、
引数リストにはもう何も残っていないか、残っているとすれば、
それはすべて同じように処理されることになる項目 (通常はファイル) のリストのはずある。
@command{xargs} プログラムは、こうした約束ごとに沿ってうまく動くように作られている。

@command{mv} ファミリーのコマンドが変わっているのは、引数の数が不定であり、
しかも最後の引数を特別扱いするという点である (すなわちターゲット・ディレクトリとして扱う)。
そのため、ある種の作業の実行は、一筋縄ではいかない。
たとえば、「すべてのファイルをここから ../d/ に移動する」がそうだ。
何故なら、@code{mv * ../d/} では、引数を入れておくための領域を使い切ってしまうかもしれないし、
そうかと言って、@code{ls | xargs ...} には、実行対象コマンド (訳注: ここでは、@command{mv})
を起動するたびに最後の引数を特別に指定するためのすっきりした方法がないからである。
(シェルコマンドを駆使すれば、できないことはないが、それでは、人間の労力と脳力を過当に要求することになる。)

@option{--target-directory} (@option{-t}) オプションを使用すると、
@command{cp}, @command{mv}, @command{ln}, @command{install}
といったプログラムを @command{xargs} と一緒に使うとき、たいへん都合がよい。
たとえば、カレントディレクトリから、同じディレクトリ階層にある
@code{d} ディレクトリへファイルを移動するには、こんなふうにすればよい。

@smallexample
ls | xargs mv -t ../d --
@end smallexample

しかし、これでは、ファイル名の先頭に @samp{.}
の付くファイルが移動しない。GNU @command{find}
プログラムを使えば、次のコマンドでそうしたファイルも移動させることができる。

@example
find . -mindepth 1 -maxdepth 1 \
  | xargs mv -t ../d
@end example

とは言え、上記のどちらの方法も、カレントディレクトリにファイルが一つもない場合や、
空白などの特殊文字を名前に含むファイルがある場合には、うまく行かない。
次の例はそうした制限を一掃しているが、GNU @command{find} と
GNU @command{xargs} の両方が必要である。

@example
find . -mindepth 1 -maxdepth 1 -print0 \
  | xargs --null --no-run-if-empty \
      mv -t ../d
@end example

@end table

@noindent
@option{--target-directory} (@option{-t}) オプションと
@option{--no-target-directory} (@option{-T}) オプションを一緒に使うことはできない。

@node Trailing slashes
@section 末尾のスラッシュ

@cindex trailing slashes

いくつかの GNU プログラム (少なくとも、@command{cp} と @command{mv}) では、
@var{source} 引数を処理する前に、その引数の末尾にスラッシュが付いていたら、
それを除去することができるようになっている。@option{--strip-trailing-slashes}
オプションを使用することによって、この動作が有効になる。

@c FIXME: mv's behavior in this case is system-dependent
これが役に立つのは、@var{source} 引数の末尾にスラッシュが付いていて、
しかも、その引数がディレクトリへのシンボリックリンクを指定しているかもしれないときだ。
そうした状況は、実のところ、それほど珍しくない。
と言うのも、シェルの中には、そうしたシンボリックリンクに対してファイル名の補完を行うとき、
末尾にスラッシュを自動的に付加するものがあるからだ。
このオプションを指定しないと、たとえば @command{mv} は、(システムの
rename 関数を通してだが、) 末尾にスラッシュが付いていることを、
「シンボリックリンクの参照をたどれ」という指示として解釈しなければならず、
その結果、シンボリックリンクではなく、間接的に参照されているディレクトリの方をリネームしなければならなくなる。
こうした動作がデフォルトになっているのは意外に思えるかもしれないが、POSIX
で要求されている動作であり、POSIX 規格のほかの部分とも首尾一貫している。

@node Traversing symlinks
@section シンボリックリンクをたどる

@cindex symbolic link to directory, controlling traversal of

@c FIXME: note that 'du' has these options, too, but they have slightly
@c different meaning.
以下のオプションは、@option{--recursive} (@option{-R})
オプションも同時に指定されているとき、@command{chown} コマンドや @command{chgrp}
コマンドがディレクトリ階層をどうたどるか、そのたどり方を変更する。
以下のオプションを複数個指定した場合は、最後に指定したものだけが効果を持つ。
こうしたオプションが指定しているのは、ディレクトリに対するシンボリックリンクを処理する際に、
そのシンボリックリンクそのものを操作の対象にするのか、
それとも、そのディレクトリ以下の階層にあるすべてのファイルを操作の対象にするのかということである。

こうしたオプションは、@option{--dereference} や @option{--no-dereference}
(@option{-h})とは、全く別のものである。あちらは、シンボリックリンクを変更するのか、
それとも、その参照先を変更するのかを制御している。

@table @samp

@macro choptH
@item -H
@opindex -H
@cindex symbolic link to directory, traverse if on the command line
@option{--recursive} (@option{-R}) オプションが指定されている場合に、
コマンドラインで指定された引数がディレクトリへのシンボリックリンクならば、それをたどる。
@end macro
@choptH

@macro choptL
@item -L
@opindex -L
@cindex symbolic link to directory, traverse each that is encountered
ディレクトリ階層を再帰的にたどっている際に、
ディレクトリへのシンボリックリンクに出会ったら、必ずそれをたどる。
@end macro
@choptL

@macro choptP
@item -P
@opindex -P
@cindex symbolic link to directory, never traverse
シンボリックリンクを一切たどらない。これが、@option{-H}, @option{-L}, @option{-P}
のどれも指定されていないときの、デフォルトである。
@end macro
@choptP

@end table


@node Treating / specially
@section @file{/} (ルート) を特別扱いする

ある種のコマンドは、ディレクトリ階層全体に対して破壊的な作用を及ぼす可能性がある。
たとえば、しかるべき特権を持ったユーザが、@samp{rm -rf / tmp/junk}
を誤って実行したら、システム全体のすべてのファイルが消えてしまうかもしれないのだ。
そうしたコマンドの使用が正当であることは、めったにないので、GNU の @command{rm}
は、@file{/} に還元されるようないかなるディレクトリに対しても、通常では、操作を拒否するようになっている。
もし、本当にシステムのすべてのファイルを消去しようと思うのなら、
@option{--no-preserve-root} オプションを使用すればよい。
とは言え、ほとんどの用途で、デフォルトの動作 (明示的に指定するには、
@option{--preserve-root} オプションを使う) の方が安全である。

@command{chgrp}, @command{chmod}, @command{chown}
などのコマンドも、ディレクトリ階層全体に対して破壊的な作用を及ぼす可能性がある。
従って、こうしたコマンドもまた、上記のオプションをサポートしている。
こうしたコマンドは、@command{rm} とは違って、ファイルを実際に削除してしまうわけではないが、
@file{/} から再帰的に働くときは、一層危険だと言うこともできる。
と言うのは、たいていの場合、処理速度がずっと早いので、
注意力のあるユーザがコマンドを中断できるより前に、@command{rm}
の場合より、もっと多くのファイルに被害を与えてしまうからだ。Unix の習慣も
POSIX の規格も、こうしたコマンドが @file{/} から再帰的に働くことを要求している。
それ故、デフォルトが @option{--no-preserve-root} になっているのだが、
こうしたコマンドは、@option{--preserve-root} オプションを使った方が、ほとんどの用途でより安全である。
面倒ならば、エイリアスか、シェル関数を作って、@option{--preserve-root} を指定しておけばよいのだ。

また、@option{--preserve-root} を指定すると、@file{/}
を指しているシンボリックリンクの参照をたどる場合でも、@command{chgrp} や
@command{chown} が、@file{/} のグループや所有者を変更しなくなることも、憶えておいていただきたい。
(訳注: @command{chgrp} や @command{chown} の解説を見ていただけばわかるが、
これは、@option{--recursive} (@option{-R}) を同時に使っているときの話である。)

@node Special built-in utilities
@section 特殊ビルトイン・ユーティリティ

プログラムの中には、@command{nice} のように、ほかのプログラムを起動できるものがある。
たとえば、@samp{nice cat file} というコマンドは、コマンド @samp{cat file}
を実行することによって、@command{cat} プログラムを起動する。しかしながら、@command{exit}
のようなシェルの特殊ビルトイン・ユーティリティ (@dfn{special built-in utilities})
は、この方法で起動することができない。一例を挙げれば、@samp{nice exit}
というコマンドは、どんな動作をするかが明確に定義されていない。
終了する代わりに、エラーメッセージを出すかもしれないのだ。

POSIX 1003.1-2004 の規格では、特殊ビルトイン・ユーティリティとして次のものを挙げている。

@quotation
@t{.@: : break continue eval exec exit export readonly return set shift times
trap unset}
@end quotation

たとえば、@samp{.}, @samp{:}, @samp{exec} は、特殊ビルトイン・ユーティリティなので、
@samp{nice . foo.sh}, @samp{nice :}, @samp{nice exec pwd} といったコマンドの動作は、
読者が予想なさるかもしれないようなものにはならない。

(訳注: exec, exit など対して、同じシェルの組み込みコマンドでも、cd,
alias, fg, kill, pwd, true, umask などは、通常ビルトイン・ユーティリティ
("regular built-in utilities") と呼ばれている。
もっとも、nice などから実行できないという点では、
特殊ビルトイン・ユーティリティも通常ビルトイン・ユーティリティも変わりがない。
nice などから起動できるとすれば、それは同名の実行ファイルが存在するからだ)。

多くのシェルは、上記のリストを拡張している。
たとえば、bash では、@command{history} や @command{suspend}
といったコマンドが特殊ビルトイン・ユーティリティに追加されている。
そこで、bash の場合、@samp{nice suspend} というコマンドを実行すると、
シェルのサスペンドは起こらず、エラーメッセージが出力される。

@node Standards conformance
@section 規格への準拠

@vindex POSIXLY_CORRECT
GNU ユーティリティのデフォルトの動作が POSIX の規格と一致しない場合が、若干ながら存在する。
そうした非互換性を抑制するには、環境変数 @env{POSIXLY_CORRECT} を設定すればよい。
もっとも、POSIX に準拠しているか否かを点検しているのでもないかぎり、
@env{POSIXLY_CORRECT} を設定する必要は、おそらくないだろうが。

POSIX の新しいバージョンが、古いバージョンと非互換であることが、
ときどきある。たとえば、POSIX の古いバージョンでは、@samp{sort +1} というコマンドは、
各入力行の二番目以後のフィールドに基づいて、行の並べ替えを行うことになっていた。
ところが、POSIX 1003.1-2001 では、同じコマンドが @file{+1}
という名前のファイルの行を並べ替えることになっており、
フィールドに基づいた並べ替えを行うには、@samp{sort -k 2}
という別のコマンドを使わなければならないのだ。
そして、さらにややこしいことに、POSIX 1003.1-2008
では、古い動作と新しい動作のどちらをする実装も認められている。

@vindex _POSIX2_VERSION
通常 GNU のユーティリティは、お使いのシステムが規格として採用している
POSIX のバージョンに従っている。GNU ユーティリティを
POSIX の別のバージョンに準拠させるには、環境変数 @env{_POSIX2_VERSION}
を設定すればよい。この環境変数の値は、@var{yyyymm} という形式であり、
その規格が何年の何月に採択されたかを示している。@env{_POSIX2_VERSION}
の値としては、現在のところ、次の三つがサポートされている。すなわち、@samp{199209},
@samp{200112}, @samp{200809} であり、それぞれ POSIX 1003.2-1992,
POSIX 1003.1-2001, POSIX 1003.1-2008 を表している。
一例を挙げよう。御使用のシステムが POSIX 1003.1-2001
に準拠しているのに、動かしているソフトウェアが @samp{sort +1} や @samp{tail +10}
といった旧来の用法も持っている場合には、環境に @samp{_POSIX2_VERSION=200809}
を設定することで、互換性の問題を回避することができる。

@c This node is named "Multi-call invocation", not the usual
@c "coreutils invocation", so that shell commands like
@c 'info coreutils "touch invocation"' work as expected.
@node Multi-call invocation
@section @command{coreutils}: Multi-call プログラム

@pindex multicall
@cindex combined
@cindex calling combined multi-call program

@command{coreutils} コマンドは個々のユーティリティ・プログラムを呼び出す。
呼び出されるユーティリティ・プログラムは、@command{coreutils}
を呼び出すために使ったファイル名の最後の要素によって自動的に選ばれたものか、
あるいは、@option{--coreutils-prog} オプションを使って明示的に指定されたものである。

書式:

@example
coreutils @option{--coreutils-prog=PROGRAM} @dots{}
@end example

@command{coreutils} は、デフォルトではインストールされない。
従って、移植を考慮したスクリプトでは、その存在を当てにしない方がよい。

(訳注: 少し説明が必要だろう。coreutils 8.23 以来、ls, sort
など、個々のバイナリを作るのではなく、coreutils という一つの大きなバイナリを作り、
ls, sort などは、言わば coreutils のビルトイン・コマンドとして呼び出すことができるようになった。
つまり、ls は今までどおり @samp{ls} や @samp{/bin/ls} でも起動できれば、
@samp{coreutils --coreutils-prog=ls} でも起動できるということである。
前者の場合のベースネームの ls が、本文で言う「@command{coreutils}
を呼び出すために使ったファイル名の最後の要素」に当たるわけだ。
もちろん、今でも個々のコマンドを独立したバイナリとして作ることもでき、
その場合は、たぶん @command{coreutils} というコマンドは存在しないことになる。
詳しくは、coreutils パッケージに含まれる NEWS ファイルをご覧いただきたい。)

@node Output of entire files
@chapter ファイル全体の出力

@cindex output of entire files
@cindex entire files, output of

次のコマンドはファイル全体を読み込んで、書き出す。
内容に対して何らかの変換を行うこともある。

@menu
* cat invocation::           ファイルを結合して、書き出す。
* tac invocation::           ファイルを結合し、ファイルごとに逆順で書き出す。
* nl invocation::            行番号を付けて、ファイルを書き出す。
* od invocation::            ファイルを 8 進数などの形式で書き出す。
* base32 invocation::        データを ASCII 文字で表示可能なデータに変換する。
* base64 invocation::        データを ASCII 文字で表示可能なデータに変換する。
@end menu

@node cat invocation
@section @command{cat}: ファイルを結合して、書き出す

@pindex cat
@cindex concatenate and write files
@cindex copying files

@command{cat} は、各 @var{file} (@samp{-} は標準入力を意味する) を標準出力にコピーする。
@var{file} が一つも指定されていない場合は、標準入力から読み込む。

書式:

@example
cat [@var{option}] [@var{file}]@dots{}
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -A
@itemx --show-all
@opindex -A
@opindex --show-all
@option{-vET} と同じ。

@item -b
@itemx --number-nonblank
@opindex -b
@opindex --number-nonblank
空行以外のすべての出力行に、1 から始まる番号を付ける。

@item -e
@opindex -e
@option{-vE} と同じ。

@item -E
@itemx --show-ends
@opindex -E
@opindex --show-ends
各行の末尾に @samp{$} 記号を付ける。

@item -n
@itemx --number
@opindex -n
@opindex --number
すべての出力行に、1 から始まる番号を付ける。このオプションは、@option{-b}
が有効になっているときは、無視される。

@item -s
@itemx --squeeze-blank
@opindex -s
@opindex --squeeze-blank
@cindex squeezing empty lines
@cindex squeezing blank lines
連続する空行の表示を抑制する。すなわち、連続する複数の空行の代わりに、
たった 1 行だけ空行を出力する。

@item -t
@opindex -t
@option{-vT} と同じ。

@item -T
@itemx --show-tabs
@opindex -T
@opindex --show-tabs
TAB 文字を @samp{^I} と表示する。

@item -u
@opindex -u
無視される。POSIX との互換のためにある。

@item -v
@itemx --show-nonprinting
@opindex -v
@opindex --show-nonprinting
LFD と TAB 以外の制御文字を @samp{^} 表記を使って表示する。
高位ビットのセットされている文字の前には、@samp{M-} を付ける。

@end table

テキストファイルとバイナリファイルを区別する MS-DOS のようなシステムでは、
@command{cat} は通常、バイナリモードで読み書きを行う。
しかしながら、@option{-bensAE} といったオプションの一つが使われている場合や、
読み込みの対象が標準入力で、しかも、標準入力が端末である場合は、@command{cat}
はテキストモードで読み込みを行う。同様に出力においても、@option{-bensAE}
といったオプションの一つが使用されていたり、標準出力が端末である場合は、
@command{cat} はテキストモードで書き出しを行う。

@exitstatus

用例:

@smallexample
# f の内容、標準入力、g の内容の順で出力する。
cat f - g

# 標準入力を標準出力にコピーする。
cat
@end smallexample


@node tac invocation
@section @command{tac}: ファイルを結合し、ファイルごとに逆順で書き出す

@pindex tac
@cindex reversing files

@command{tac} は、各 @var{file} (@samp{-} は標準入力を意味する) を、@var{file} ごとにレコード
(records、デフォルトでは行) の順番を逆にして、標準出力にコピーする。
@var{file} が一つも指定されていない場合は、標準入力から読み込む。

書式:

@example
tac [@var{option}]@dots{} [@var{file}]@dots{}
@end example

レコード (@dfn{records}) は、ある文字列 (デフォルトでは改行)
が出現することによって区切られる。出力の際、デフォルトでは、この区切り文字列は、
ファイル中でその区切り文字列の直前にあるレコードの末尾に付加される。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -b
@itemx --before
@opindex -b
@opindex --before
出力の際、区切り文字列は、ファイル中でその区切り文字列の直後に来るレコードの先頭に付加される。

@item -r
@itemx --regex
@opindex -r
@opindex --regex
区切り文字列を正規表現として処理する。

@item -s @var{separator}
@itemx --separator=@var{separator}
@opindex -s
@opindex --separator
改行の代わりに @var{separator} をレコード区切り文字列 (record separator)
として使用する。注意すべきは、@var{separator} に空文字列を指定すると、
ゼロバイトを指定したことになることだ。すなわち、入出力レコードが
ASCII NUL で区切られることになる。

@end table

テキストファイルとバイナリファイルを区別する MS-DOS のようなシステムでは、
@command{tac} はバイナリモードで読み書きを行う。

@exitstatus

用例:

@example
# ファイルを一字一字逆にする。
tac -r -s 'x\|[^x]'
@end example


@node nl invocation
@section @command{nl}: 行番号を付けて、ファイルを書き出す

@pindex nl
@cindex numbering lines
@cindex line numbering

@command{nl} は、各 @var{file} (@samp{-} は標準入力を意味する)
を、すべての行、または、一部の行に行番号を付けて、標準出力に書き出す。
@var{file} が一つも指定されていない場合は、標準入力から読み込む。

書式:

@example
nl [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@cindex logical pages, numbering on
@command{nl} は、入力を (論理) ページセクションに分解する。
デフォルトでは、行番号は各論理ページセクションで 1 にリセットされる。
@command{nl} は、すべての入力ファイルをまとめて、一つのドキュメントとして扱う。
従って、入力ファイルが変わるたびに、論理ページや行番号をリセットすることはない。

@cindex headers, numbering
@cindex body, numbering
@cindex footers, numbering
論理ページは、三つのセクションからなる。すなわち、ヘッダ、本文、フッタである。
どのセクションも空であって構わない。
セクションごとに他のセクションとは異なる番号付けの方式を選ぶこともできる。

入力ファイル中で論理ページの各セクションが始まる位置を指示するには、
以下の区切り文字列の一つのみからなる行を使用する。

@table @samp
@item \:\:\:
ヘッダの先頭。
@item \:\:
本文の先頭。
@item \:
フッタの先頭。
@end table

上記の文字列を構成する二文字は、オプションを使って (下記参照)、@samp{\}
と @samp{:} の組み合わせ以外のものに、変更することができる。
だが、各文字列のパターンや長さは、変えることができない。

セクションの区切りは、出力では空行に置き換えられる。
入力ファイル中の最初のセクション区切り文字列より前にあるテキストは、
いかなるテキストも、本文セクションの一部と見なされる。
従って、@command{nl} は、セクションの区切りを全く含まないファイルを、一個の本文セクションとして扱う。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -b @var{style}
@itemx --body-numbering=@var{style}
@opindex -b
@opindex --body-numbering
各論理ページの本文セクションにおける行の番号付けの方式を選択する。
行に番号が付かない場合、行番号の現在値は増加しないが、それでも行番号の区切り文字は行の前に付く
(訳注: ここで言う行番号の区切り文字 (line number separator character)
とは、行番号とテキストの区切り文字ではなく、行頭とテキストとの間にある行番号のために用意された空間を埋める空白のことらしい)。
番号付けの方式には、以下のものがある。

@table @samp
@item a
すべての行に番号を振る。
@item t
空ではない行にのみ番号を振る (本文のデフォルト)。
@item n
行番号を付けない (ヘッダとフッタのデフォルト)。
@item p@var{bre}
基本正規表現 @var{bre} にマッチする部分を含む行にのみ番号を振る。
@xref{Regular Expressions, , Regular Expressions, grep, The GNU Grep
Manual}.
@end table

@item -d @var{cd}
@itemx --section-delimiter=@var{cd}
@opindex -d
@opindex --section-delimiter
@cindex section delimiters of pages
セクションの区切り文字を @var{cd} にする。デフォルトは @samp{\:}。
@var{c} のみを指定すると、二番目の文字は、デフォルトと同じ @samp{:} になる。
(@samp{\} などのメタ文字は、シェルが展開しないように、引用符やバックスラッシュで保護するのをお忘れなく。)

@item -f @var{style}
@itemx --footer-numbering=@var{style}
@opindex -f
@opindex --footer-numbering
@option{--body-numbering} と同様。

@item -h @var{style}
@itemx --header-numbering=@var{style}
@opindex -h
@opindex --header-numbering
@option{--body-numbering} と同様。

@item -i @var{number}
@itemx --line-increment=@var{number}
@opindex -i
@opindex --line-increment
行番号を @var{number} づつ増やす (デフォルトは 1)。

@item -l @var{number}
@itemx --join-blank-lines=@var{number}
@opindex -l
@opindex --join-blank-lines
@cindex empty lines, numbering
@cindex blank lines, numbering
空行にも番号を付けるとき、連続する @var{number} (デフォルトは 1) 行の空行を
1 論理行と数え、最後の空行にのみ番号を振る。連続する空行が
@var{number} 行未満のときは、番号を振らない。
空行というのは、文字を全く含まない、スペースやタブさえも含まない行のことである。

@item -n @var{format}
@itemx --number-format=@var{format}
@opindex -n
@opindex --number-format
行番号付けのフォーマットを選択する (デフォルトは @code{rn})。

@table @samp
@item ln
@opindex ln @r{format for @command{nl}}
左詰めにする。先頭を 0 で埋めない。
@item rn
@opindex rn @r{format for @command{nl}}
右詰めにする。先頭を 0 で埋めない。
@item rz
@opindex rz @r{format for @command{nl}}
右詰めにする。先頭を 0 で埋める。
@end table

@item -p
@itemx --no-renumber
@opindex -p
@opindex --no-renumber
論理ページの先頭で行番号をリセットしない。

@item -s @var{string}
@itemx --number-separator=@var{string}
@opindex -s
@opindex --number-separator
出力中で行番号とテキスト部分との区切りに @var{string} を使う (デフォルトはタブ文字)。

@item -v @var{number}
@itemx --starting-line-number=@var{number}
@opindex -v
@opindex --starting-line-number
各論理ページで行番号を @var{number} から始める (デフォルトは 1)。

@item -w @var{number}
@itemx --number-width=@var{number}
@opindex -w
@opindex --number-width
行番号に  @var{number} 個の文字を使用する (デフォルトは 6 文字)。

@end table

@exitstatus


@node od invocation
@section @command{od}: ファイルを 8 進数などの形式で書き出す

@pindex od
@cindex octal dump of files
@cindex hex dump of files
@cindex ASCII dump of files
@cindex file contents, dumping unambiguously

@command{od} は、各 @var{file} (@samp{-} は標準入力を意味する) の内容を、
曖昧さの余地がない形で標準出力に書き出す。@var{file} が一つも指定されていない場合は、
標準入力から読み込む。

書式:

@smallexample
od [@var{option}]@dots{} [@var{file}]@dots{}
od [-abcdfilosx]@dots{} [@var{file}] [[+]@var{offset}[.][b]]
od [@var{option}]@dots{} --traditional [@var{file}]@c
 [[+]@var{offset}[.][b] [[+]@var{label}[.][b]]]
@end smallexample

各出力行の構成は、入力中の位置をオフセットで表したものの後に、
ファイルのデータをいくつかのまとまりに分けたものが続くという形になっている。
デフォルトでは、@command{od} はオフセットを 8 進数で表示する。
ファイル・データの個々のまとまりは、入力を C 言語の @code{short int}
ごとに分けたものであり、1 個の 8 進数として表示される。

@var{offset} を指定した場合、それは、整形と出力を始める前に、
入力を何バイト読み飛ばすかを示している。デフォルトでは、@var{offset}
は 8 進数と見なされるが、数字の後ろに小数点を付ければ、10 進数と見なされる。
小数点が指定されず、オフセットの数字が @samp{0x} や @samp{0X} で始まっている場合は、
16 進数として解釈される。もし、数字の後ろに @samp{b} が付いているならば、
読み飛ばすバイト数は、@var{offset} に 512 を掛けたものになる。

(訳注: 数字の後ろに小数点を付けることで @var{offset}
が 10 進数であることを示す方法は、現在では無効のようである。
オフセットを 10 進数で指定したければ、@option{-j} オプションを使用した方がよい。)

コマンドが「書式」における第一の型と第二の型のどちらとも取れるときは、
最後のオペランドが @samp{+} で始まっている場合や、オペランドが 2 個で
2 番目のオペランドが数字で始まっている場合は、第二の型だと見なされる。
たとえば、@samp{od foo 10} や @samp{od +10} では、@samp{10} はオフセットである。
それに対して、@samp{od 10} では、@samp{10} はファイル名である。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -A @var{radix}
@itemx --address-radix=@var{radix}
@opindex -A
@opindex --address-radix
@cindex radix for file offsets
@cindex file offset radix
ファイル・オフセットの表示に使う基数を選択する。@var{radix} には、
以下の一つが使える。

@table @samp
@item d
10 進数
@item o
8 進数
@item x
16 進数
@item n
なし (オフセットを表示しない)
@end table

デフォルトは 8 進数である。

@item --endian=@var{order}
@opindex --endian
@cindex byte-swapping
@cindex endianness
入力のバイトオーダーを変更する。入力を別のバイトオーダーで扱うため、
あるいは、使用システムのエンディアン方式にとらわれない一貫した出力を生成するために使用する。
変換は、@option{--type} で指定されたサイズと @var{order} のエンディアンに従って行われる。
@var{order} には、@samp{little} または @samp{big} が指定できる。

@item -j @var{bytes}
@itemx --skip-bytes=@var{bytes}
@opindex -j
@opindex --skip-bytes
整形と出力を行う前に、入力を @var{bytes} バイト読み飛ばす。@var{bytes} が @samp{0x}
や @samp{0X} で始まっている場合は、16 進数と見なされる。
@samp{0} のみで始まっている場合は、8 進数だ。どちらでもない場合は、10 進数である。
@multiplierSuffixes{bytes}

@item -N @var{bytes}
@itemx --read-bytes=@var{bytes}
@opindex -N
@opindex --read-bytes
入力から最大で @var{bytes} バイト出力する。@code{bytes} に接頭辞や接尾辞を付けると、
@option{-j} オプションの場合と同じように解釈される。

@item -S @var{bytes}
@itemx --strings[=@var{bytes}]
@opindex -S
@opindex --strings
@cindex string constants, outputting
通常の出力はせず、文字列定数 (@dfn{string constants}) のみを出力する。
すなわち、@var{bytes} バイト以上の連続する ASCII 表示文字で、ゼロバイト
(ASCII NUL) が続くものを出力するわけだ。@var{bytes} に接頭辞や接尾辞を付けると、
@option{-j} オプションの場合と同じように解釈される。

@option{--strings} に続く @var{bytes} が省略された場合、デフォルトは 3 である。
(訳注: 短縮形の @option{-S} では @var{bytes} を省略できない。)

@item -t @var{type}
@itemx --format=@var{type}
@opindex -t
@opindex --format
ファイルデータの出力形式を選択する。
@var{type} は、1 個以上の下記の形式指定文字からなる文字列である。
一つの @var{type} 文字列に複数の形式指定文字が含まれている場合や、
このオプションを複数回使用した場合は、@command{od} は出力行ごとに、
指定された各データ形式で表現したその行を、指定された順番で書き出す。

どんな形式指定であれ、その最後に ``z'' を付けると、
形式指定によって生成された出力行の後ろに、
表示可能文字を 1 バイト文字によって表現したものが、出力される。

@table @samp
@item a
文字の名称 (訳注: たとえば、A は A、改行文字は nl)。最上位ビットは無視する。
@item c
表示可能な 1 バイト文字、C 言語のバックスラッシュ・エスケープ、
あるいは 3 桁の 8 進数。
@item d
符号付き 10 進数
@item f
浮動小数点数 (@pxref{Floating point})
@item o
8 進数
@item u
符号なし 10 進数
@item x
16 進数
@end table

@code{a} 形式の出力では、空白文字は @samp{sp}、改行文字は @samp{nl}、ゼロバイトは
@samp{nul} といった具合に表現される。このとき、各バイトの下位 7 ビットのみが使われ、
最上位ビットは無視される。@code{c} 形式の出力では、上記の例は、それぞれ
@samp{ }、@samp{\n}、@code{\0} になる。

@cindex type size
@samp{a} と @samp{c} 形式を除き、形式指定文字の後ろに
10 進数の整数を続けることによって、入力データの各数値を読み込んで、
指定されたデータ形式に変換して行く際に、何バイトづつ使用するかを指定することができる。
あるいは、形式指定文字の後ろに以下の文字の一つを続けることによって、
C コンパイラの組み込みデータ型のいづれかのサイズを指定することも可能だ。
すなわち、整数 (@samp{d}, @samp{o}, @samp{u}, @samp{x})
に対しては、以下を後置する。

@table @samp
@item C
char
@item S
short
@item I
int
@item L
long
@end table

 浮動小数点数 (@code{f}) に対しては、次のものが使用できる。

@table @asis
@item F
float
@item D
double
@item L
long double
@end table

@item -v
@itemx --output-duplicates
@opindex -v
@opindex --output-duplicates
連続する行が同一であっても出力する。デフォルトでは、出力する行が、
二行以上連続して全く同一になりそうな場合、@command{od} は最初の行だけを出力し、
次の行にはアステリスクのみを置いて、二行目以下を省略したことを示す。

@item -w[@var{n}]
@itemx --width[=@var{n}]
@opindex -w
@opindex --width
1 出力行当たり、@code{n} バイトの入力をダンプする。
この値は、指定した各出力形式に結び付いているサイズの最小公倍数の倍数でなければならない。

このオプションが全く指定されないときのデフォルトは 16 である。
このオプションが @var{n} なしで指定されたときのデフォルトは 32 である。

@end table

以下に挙げるいくつかのオプションは、形式指定の簡易版である。GNU @command{od}
では、形式指定オプションと簡易版オプションをどのように組み合わせても構わない。
こうしたオプションは、累加されていく。

@table @samp

@item -a
@opindex -a
文字の名称で出力する。@samp{-t a} と同じ。

@item -b
@opindex -b
1 バイトづつ 8 進数として出力する。@samp{-t o1} と同じ。

@item -c
@opindex -c
表示可能な 1 バイト文字か、C 言語のバックスラッシュ・エスケープ、
あるいは 3 桁の 8 進数として出力する。@samp{-t c} と同じ。

@item -d
@opindex -d
2 バイトづつ符号なし 10 進数として出力する。@samp{-t u2} と同じ。

@item -f
@opindex -f
浮動小数点数として出力する。@samp{-t fF} と同じ。

@item -i
@opindex -i
10 進数の int として出力する。@samp{-t dI} と同じ。

@item -l
@opindex -l
10 進数の long int として出力する。@samp{-t dL} と同じ。

@item -o
@opindex -o
2 バイトづつ 8 進数として出力する。@option{-t o2} と同じ。

@item -s
@opindex -s
2 バイトづつ 10 進数として出力する。@option{-t d2} と同じ。

@item -x
@opindex -x
2 バイトづつ 16 進数として出力する。@samp{-t x2} と同じ。

@item --traditional
@opindex --traditional
昔の @command{od} で使用できた、オプションではない引数 @var{label} を認識する。
書式は次のようになる。

@smallexample
od --traditional [@var{file}] [[+]@var{offset}[.][b] [[+]@var{label}[.][b]]]
@end smallexample

@noindent
この書式を使用すると、ファイルは 1 個までしか指定できないが、必要なら、
オフセットを示す引数や、@var{label} という、開始位置の仮アドレスを示す引数を、
続けて指定することができる。引数 @var{label} は @var{offset}
と全く同じように解釈されるが、出力を開始する位置の仮アドレスを指定している。
仮アドレスは、通常のアドレスの後ろに、カッコで囲まれて、表示される。

@end table

@exitstatus


@node base32 invocation
@section @command{base32}: データを表示可能データ (printable data) に変換する

@pindex base32
@cindex base32 encoding

@command{base32} はファイル、または標準入力から読み込んだデータを、
base32 でエンコードした形式に変換する (あるいは、その逆を行う)。
base32 でエンコードした形式は、表示可能な ASCII 文字を用いて、バイナリデータを表現する。
このコマンドの使用法やオプションは、
@command{base64} と全く同じである。  @xref{base64 invocation}.


@node base64 invocation
@section @command{base64}: データを表示可能データ (printable data) に変換する

@pindex base64
@cindex base64 encoding

@command{base64} はファイル、または標準入力から読み込んだデータを、
base64 でエンコードした形式に変換する (あるいは、その逆を行う)。
base64 でエンコードした形式は、表示可能な ASCII 文字を用いて、バイナリデータを表現する。

書式:

@smallexample
base64 [@var{option}]@dots{} [@var{file}]
base64 --decode [@var{option}]@dots{} [@var{file}]
@end smallexample

base64 でエンコードすると、データが元のデータのほぼ 133% に増大する。
base32 エンコーディングの場合は、元のデータのほぼ 160% になる。
こうしたエンコード形式は、RFC4648 に準拠している。
@uref{ftp://ftp.rfc-editor.org/in-notes/rfc4648.txt}

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -w @var{cols}
@itemx --wrap=@var{cols}
@opindex -w
@opindex --wrap
@cindex wrap data
@cindex column to wrap data after
エンコード中に、出力が @var{cols} 文字に達したら改行する。この値は、正の整数でなければならない。

デフォルトでは、76 文字で改行する。改行を全く行わないようにするには、値を 0 にする。

@item -d
@itemx --decode
@opindex -d
@opindex --decode
@cindex Decode base64 data
@cindex Base64 decoding
動作モードを変更する。デフォルトの、データをエンコードするモードではなく、
データをデコードするモードになる。入力には、base64
でエンコードしたデータが期待され、出力は、エンコードする前のデータになる。

@item -i
@itemx --ignore-garbage
@opindex -i
@opindex --ignore-garbage
@cindex Ignore garbage in base64 stream
デコードする際、改行文字がどこに現れても、適切に処理する。デコード中に
ASCII 表示可能文字以外を表すバイトが現れたら、一部壊れたデータでもデコードできるように、それを無視する。

@end table

@exitstatus


@node Formatting file contents
@chapter ファイル内容の整形

@cindex formatting file contents

以下のコマンドは、ファイルの内容を整形し直す。

@menu
* fmt invocation::           パラグラフに分かれたテキストを整形し直す。
* pr invocation::            ページ付けや段組みをしてファイルを表示する。
* fold invocation::          入力行を指定された幅に合わせて折り返す。
@end menu


@node fmt invocation
@section @command{fmt}: パラグラフに分かれたテキストを整形し直す

@pindex fmt
@cindex reformatting paragraph text
@cindex paragraphs, reformatting
@cindex text, reformatting

@command{fmt} は行を折り返したり、結合したりして、出力する各行が指定された文字数に納まるように調整する。
1 行のデフォルトはアスキー文字で 75 文字である。
(訳注: 日本語のテキストは、通常単語を空白で区切らないので、うまく整形できない。)

書式:

@example
fmt [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@command{fmt} は、指定された引数 @var{file} から
(指定されていない場合は、標準入力から) テキストを読み込んで、標準出力に書き出す。

デフォルトでは、空行、単語間の空白、インデント (字下げ) は、出力でもそのまま維持される。
インデントの違う入力行が連続する場合は、行の結合は行われない。
タブは入力のときにスペースに展開され、出力でタブに戻される。

@cindex line-breaking
@cindex sentences and line-breaking
@cindex Knuth, Donald E.
@cindex Plass, Michael F.
@command{fmt} は、できるだけ文の終わりで改行しようとする。
また、文の最初の単語の直後や、文の最後の単語の直前で改行するのは避けようとする。
「文の終わり (@dfn{sentence break})」の定義は、パラグラフがそこで終わっているか、
あるいは、単語の末尾に @samp{.?!} のどれかが付き、さらにスペースが 2 個続くか、
行末が来ることである。後者の場合、ピリオドなどとスペース
2 個、あるいは行末の間にカッコや引用符が入っていてもよい。
@TeX{} と同様、@command{fmt} は、どこで行を折り返すかを決める前に、パラグラフ全体を読み込む。
使用しているアルゴリズムは、Donald E. Knuth と Michael F. Plass が ``Breaking
Paragraphs Into Lines'' で提示しているものに変更を加えたものである
(`Software---Practice & Experience 誌'、第 11 巻 第 11 号 (November
1981) 1119-1184 ページ)。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --crown-margin
@opindex -c
@opindex --crown-margin
@cindex crown margin
クラウンマージン・モード (@dfn{Crown margin} mode)。
パラグラフ中の最初の 2 行のインデントはそのまま維持し、(同一パラグラフの)
それに続く各行の左の余白は 2 行目の左の余白に揃える。

(訳注: これは要するに、1 行目の行頭を字下げしたお馴染みのスタイルのパラグラフ表示である。
逆に 1 行目が左に張り出しているスタイルもありえる。なお、2 行目以降のインデントは、
@option{--crown-margin} オプションによって揃えられるわけではなく、
入力テキストにおいてすでに揃っていなければならない。
さもないと、そもそも同一パラグラフの行と見なされない。)

@item -t
@itemx --tagged-paragraph
@opindex -t
@opindex --tagged-paragraph
@cindex tagged paragraphs
標識 (タグ) 付きパラグラフ・モード (@dfn{Tagged paragraph} mode)。
クラウンマージン・モードに似ているが、次の点が違う。パラグラフの最初の行と
2 番目の行のインデントが同じ場合、最初の行は 1 行からなるパラグラフとして扱われる。

@item -s
@itemx --split-only
@opindex -s
@opindex --split-only
行の分割のみを行う。短い行を結合して、長い行を作ることはしない。
その結果、サンプル・コードの行のような、すでに整形されたテキストをむやみに結合しないで済む。

@item -u
@itemx --uniform-spacing
@opindex -u
@opindex --uniform-spacing
空白の数を一定にする。すなわち、単語間の空白は 1 個に、文の間の空白は 2 個にする。

@item -@var{width}
@itemx -w @var{width}
@itemx --width=@var{width}
@opindex -@var{width}
@opindex -w
@opindex --width
出力する各行を、長くても @var{width} 文字までにする (デフォルトは 75
文字。@var{goal} が指定されている場合は、@var{goal} プラス 10 文字)。

@item -g @var{goal}
@itemx --goal=@var{goal}
@opindex -g
@opindex --goal
とりあえず、各行を @var{goal} 文字の長さにしてみようとする。
これは、デフォルトでは @var{width} より 7% 短い。

@item -p @var{prefix}
@itemx --prefix=@var{prefix}
@var{prefix} で始まる行のみを整形の対象にする (@var{prefix}
の前にホワイトスペースがあってもよい)。@var{prefix}
とそれに先行するホワイトスペースは、整形の際に取り除かれ、整形後に各出力行に付け直される。
このオプションの用途を一つ挙げると、プログラムのコメントのような行だけを整形し、
コードには手を加えないことが考えられる。

@end table

@exitstatus

@node pr invocation
@section @command{pr}: ページ付けや段組みをしてファイルを表示する

@pindex pr
@cindex printing, preparing files for
@cindex multicolumn output, generating
@cindex merging files in parallel

@command{pr} は、各 @var{file} (@samp{-} は標準入力を表す)
を標準出力に書き出す。@var{file} が指定されていない場合は、標準入力を対象にする。
その際、ページ付けを行い、指定があれば段組みをして出力する。また、すべての
@var{file} を一つに統合し、1 段 1 ファイルの形式で平行して表示することもできる。

(訳注: @command{pr} はページ構成をするコマンドであって、
長い行の折り返しなどの整形をするわけではない。そうしたことは、@command{fmt} や
@command{fold} の仕事である。なお、@command{pr} の日本語対応は十分ではない。
とくに段組みがうまくいかない。)

書式:

@example
pr [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@vindex LC_MESSAGES
デフォルトでは、5 行のヘッダが各ページに付く。2 行の空行、
日付・ファイル名・ページ番号からなる 1 行、そしてもう 2 行の空行という形式である。
5 行の空行からなるフッタも出力される。デフォルトのページ長 (@var{page_length})
は 66 行なので、本文に使用されるデフォルトの行数は、56 行になる。
ヘッダのテキスト行は、@samp{@var{date} @var{string} @var{page}} の形を取り、
@var{string} の両側に空白を入れて、行の幅がページ幅 (@var{page_width})
いっぱいになるようにしている。@var{date} は日付であり (詳細については、
@option{--date-format} (@option{-D}) オプションを参照)、
@var{string} は中央揃えのヘッダ文字列 (訳注: デフォルトではファイル名)、
@var{page} はページ番号である。@var{page} という単語の綴りは、
@env{LC_MESSAGES} ロケール・カテゴリによって変わってくる。デフォルトの C
ロケールでは、@samp{Page @var{number}} であり、@var{number} の位置には
10 進数のページ番号が入る。

入力にフォームフィード (Form feed) があると、出力では改ページが行われる。
フォームフィードが続くと、白紙のページが生ずる。

段組みをした場合、どの段の幅も同じになり、段と段の間には任意の文字列
(デフォルトはスペース) が置かれる。多段組みの出力では、@option{-J}
オプションを使用しないかぎり、各行は常に @var{page_width} (デフォルトは 72)
文字までに切り詰められる (訳注: これは、各段や段間の空白などを合計した 1 行の長さが、
最長でも @var{page_width} 文字までになるということであって、
各段がそれぞれ @var{page_width} 文字になるということではない)。
1 段のみの出力では、デフォルトでは行の切り詰めは行われない。
その場合でも、行の切り詰めを行うには、@option{-W} を使用する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item +@var{first_page}[:@var{last_page}]
@itemx --pages=@var{first_page}[:@var{last_page}]
@c The two following @opindex lines evoke warnings because they contain ':'
@c The 'info' spec does not permit that.  If we use those lines, we end
@c up with truncated index entries that don't work.
@c @opindex +@var{first_page}[:@var{last_page}]
@c @opindex --pages=@var{first_page}[:@var{last_page}]
@opindex +@var{page_range}
@opindex --pages=@var{page_range}
表示を @var{first_page} ページから始めて、 @var{last_page} ページで終了する。
@samp{:@var{last_page}} の指定を省略するのは、ファイルの最後までということである。
スキップするページ数を計算する際、入力ファイル中にフォームフィードがあると、
そのたびに 1 ページ進むことになる。ページ番号は、@samp{+@var{first_page}}
を指定してもしなくても同じになる。デフォルトでは、
入力ファイルの最初のページからページ数を数えるからだ (表示される最初のページからではない)。
行番号については @option{-N} オプションで変更することができる。

@item -@var{column}
@itemx --columns=@var{column}
@opindex -@var{column}
@opindex --columns
@cindex down columns
個々の @var{file} に対して @var{column} 段に段組みした出力を生成する
(デフォルトは 1 段)。@option{-a} オプションを使用しない場合、ページ内で本文は、
段内を上から下へと進む。段が増えると、段の幅は自動的に狭くなる。
ただし、@option{-W/-w} を同時に使用して、@var{page_width}
を増加させている場合は、そのかぎりではない。このオプションを使うと、
切り詰められる行がたぶん生じるだろう。ページごとの各段の行数は、
できるだけ揃えられる。多段組みの本文出力では、オプション @option{-e} と
@option{-i} が有効になる。@option{-J} オプションと一緒に使った場合は、
段の整列と行の切り詰めは行われない。各行は、元の長さのまま、不定長フィールドとして
(free field format) 結合されるのである。その際も、@option{-S}
オプションによってフィールド・セパレータを指定することは可能だ。なお
@option{-@var{column}} は、@option{-m} オプションと一緒に使用できない。

@item -a
@itemx --across
@opindex -a
@opindex --across
@cindex across columns
個々の @var{file} を段組みで表示するとき、本文の各行が、段内を上から下へではなく、
左の段から右の段へと進むようにする。@option{-@var{column}}
オプションに指定する段の数は、2 以上でなければならない。
行が段の幅に納まらないほど長い場合、その行は切り詰められる。

@item -c
@itemx --show-control-chars
@opindex -c
@opindex --show-control-chars
制御文字をハット表記 (たとえば、@samp{^G}) を使って表示する。
他の非表示文字は、バックスラッシュ付きの 8 進数表記になる。@command{pr}
のデフォルトでは、非表示文字の表示文字化は行われない。

@item -d
@itemx --double-space
@opindex -d
@opindex --double-space
@cindex double spacing
ダブルスペースで出力する (訳注: すなわち、行間を 1 行分あける)。

@item -D @var{format}
@itemx --date-format=@var{format}
@cindex time formats
@cindex formatting times
ヘッダの日付を @var{format} を用いて整形する。@var{format} には、コマンド
@samp{date +@var{format}} で使うのと同じ指定法が使用できる。@xref{date invocation}.
@samp{%} で始まる日時の指定を除いて、@var{format} 中の文字はそのまま表示される。
従って、このオプションを使用すれば、ヘッダの日付の位置に任意の文字列を指定することもできるわけだ。
たとえば、@option{--date-format="Monday morning"} といった具合に。

@vindex POSIXLY_CORRECT
@vindex LC_TIME
デフォルトの日付書式は @samp{%Y-%m-%d %H:%M} という形である (たとえば、
@samp{2001-12-04 23:59})。だが、環境変数 @env{POSIXLY_CORRECT} が設定され、
しかも @env{LC_TIME} ロケール・カテゴリが POSIX ロケールを指定している場合は、
デフォルトの書式は @samp{%b %e %H:%M %Y} になる
(たとえば、@samp{Dec@ @ 4 23:59 2001})。

@vindex TZ
タイムスタンプは、タイムゾーンのルールに従って表示されるが、
そのルールを指定しているのは、環境変数 @env{TZ} である。
@env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
The GNU C Library Reference Manual}.

@item -e[@var{in-tabchar}[@var{in-tabwidth}]]
@itemx --expand-tabs[=@var{in-tabchar}[@var{in-tabwidth}]]
@opindex -e
@opindex --expand-tabs
@cindex input tabs
入力の際にタブをスペースに展開する。省略できる引数 @var{in-tabchar} は、
入力で使われるタブ文字である (デフォルトは TAB 文字)。
これも省略できる二番目の引数 @var{in-tabwidth} は、
入力で使われるタブ文字の幅である。(デフォルトは 8 桁)。

@item -f
@itemx -F
@itemx --form-feed
@opindex -F
@opindex -f
@opindex --form-feed
複数個の改行文字ではなく、1 個のフォームフィードを使用して、
出力する各ページを分離する。このオプションによって、
66 行というデフォルトのページの長さが変わることはない。

@item -h @var{header}
@itemx --header=@var{header}
@opindex -h
@opindex --header
ヘッダのファイル名の部分を、中央揃えの @var{header} という文字列で置き換える。
シェル上では、@var{header} はクォートするべきである。また、@option{-h}
との間に空白を入れた方がよい。

@item -i[@var{out-tabchar}[@var{out-tabwidth}]]
@itemx --output-tabs[=@var{out-tabchar}[@var{out-tabwidth}]]
@opindex -i
@opindex --output-tabs
@cindex output tabs
出力の際にスペースをタブで置き換える。省略できる引数 @var{out-tabchar}
は、出力で使われるタブ文字である (デフォルトは TAB 文字)。
これも省略できる二番目の引数 @var{out-tabwidth} は、出力で使われるタブ文字の幅である
(デフォルトは 8 桁)。

@item -J
@itemx --join-lines
@opindex -J
@opindex --join-lines
長い行は長いまま結合する。段組みオプション @option{-@var{column}}, @option{-a -@var{column}},
@option{-m} と併せて使用する。@option{-W/-w} による行の切り詰めが無効になる。
段の整列も行わなくなる。@option{--sep-string[=@var{string}]} と併せて使ってもよい。
@option{-J} というオプションが (@option{-W} や @option{--sep-string} とともに)
新たに設けられたのは、@option{-w} や @option{-s} という、前からある (POSIX に準拠した)
オプションを 3 種の段組みオプションと組み合わせて使ったときの混乱を解消するためである。


@item -l @var{page_length}
@itemx --length=@var{page_length}
@opindex -l
@opindex --length
1 ページの行数を、ヘッダ行 (及び フッタ行) を含めて、@var{page_length}
行にする (デフォルトは 66 行)。@var{page_length} が 10 行以下だったら、
@option{-t} オプションが指定されたかのように、 ヘッダとフッタは省略する。

@item -m
@itemx --merge
@opindex -m
@opindex --merge
すべての @var{file} を統合し、各段に 1 ファイルを割り当てて、平行表示する。
長すぎて段に納まらない行があれば、@option{-J} オプションが使用されていないかぎり、
切り詰めが行われる。@option{--sep-string[=@var{string}]}
を指定してもよい。いづれかの @var{file} に (フォームフィードの指定により)
空白のページが存在すると、空白の段が生ずるが、それでも段を分離する記号の
@var{string} は表示される。すなわち、統合されたファイルの最初から最後まで、
行番号と (訳注: これはもちろん、@option{-n} オプションが指定されている場合)
段の分離記号は、連続して表示されるわけだ。
ただし、統合されたページのどの段も空白の場合は、分離記号も行番号も表示されない。
デフォルトのヘッダは、@samp{@var{date} @var{page}} という形式になり、
中央には長い空白が挿入される。@option{-h} や @option{--header} オプションを
@option{-m} と一緒に使えば、この中央の空白部分に文字列を入れることができる。

@item -n[@var{number-separator}[@var{digits}]]
@itemx --number-lines[=@var{number-separator}[@var{digits}]]
@opindex -n
@opindex --number-lines
@var{digits} の幅の行番号を表示する (@var{digits} のデフォルトは 5 桁)。
通常の多段組みの出力では、行番号は、各段ごとに本文の最初の @var{digits}
桁分の位置を占めるが、@option{-m} の出力の場合は、各行の先頭だけに表示される。
1 段組みでは、@option{-m} の場合と同様、各行の先頭に付く。
デフォルトでは、行数は、入力ファイルの最初の行から数え始める
(表示される最初の行からではない。@option{--page} や @option{-N} オプションを参照)。
省略可能な引数 @var{number-separator} は、行番号の後ろに付けて、
後に続く本文と区別するための文字であり、デフォルトのセパレータはタブ文字である。
厳密に言うと、常にタブが表示されるのは、1 段組みの出力のときだけである。
タブの幅は、本来タブの現れる位置によって変化し、たとえば、@option{-o}
オプションで指定される左の余白 (@var{margin}) によって変わってくるものである。
しかし、多段組みの出力では、「出力される段の幅が同じになる」ことが優先されるため
(POSIX の仕様)、タブの幅は、最初の段における値に固定され、左の余白の値が変わっても、
変化することはない。従って、@var{number-separator} であるタブの位置には、
常に一定数のスペースが表示されることになる。スペースをタブに置き換えるかどうかは、
出力される位置次第である。

@item -N @var{line_number}
@itemx --first-line-number=@var{line_number}
@opindex -N
@opindex --first-line-number
表示される最初のページの最初の行を @var{line_number} として行を数えて行く
(入力ファイルの最初の行以外から表示を始めるときによく使う)。

@item -o @var{margin}
@itemx --indent=@var{margin}
@opindex -o
@opindex --indent
@cindex indenting lines
@cindex left margin
スペース @var{margin} 個分の余白で各行をインデントする (デフォルトは、
スペース 0 個)。ページの横幅は、@option{-W/-w} で指定した @var{page_width}
と余白を合計したサイズになる。行番号付きの 1 段組み出力では、
行から少しはみ出す文字が生ずるかもしれない (@option{-n} オプション参照)。

@item -r
@itemx --no-file-warnings
@opindex -r
@opindex --no-file-warnings
引数 @var{file} がオープンできないときも、警告メッセージを表示しない
(終了ステータスは、それでもやはり 0 以外になる)。

@item -s[@var{char}]
@itemx --separator[=@var{char}]
@opindex -s
@opindex --separator
段と段の区切りに 1 個の文字 @var{char} を使う。@option{-s}
オプションを指定したときのデフォルトの @var{char} は、@option{-w}
オプションを同時に指定しなければタブ、指定すれば「なし」である。
なお、@option{-s} オプションを指定しない場合のデフォルトのセパレータはスペースだ。
@option{-s[char]} オプションを使用すると、@option{-w} も同時に指定しないかぎり、
3 種の段組みオプション (@option{-COLUMN}|@option{-a -COLUMN}|@option{-m})
のすべてにおいて、行の切り詰めが行われない。これは、POSIX に準拠した仕様である。


@item -S[@var{string}]
@itemx --sep-string[=@var{string}]
@opindex -S
@opindex --sep-string
出力される段の区切りに、文字列 @var{string} を使用する。@option{-s}
オプションが @option{-W/-w} オプションに影響を及ぼすのとは異なり、
@option{-S} オプションは @option{-W/-w} オプションに影響を及ぼさない。
また、行の切り詰めや段の整列にも影響しない。@option{-S} オプションを指定せずに、
@option{-J} オプションを指定すると、@command{pr}
はデフォルトの出力セパレータであるタブを使用する
(訳注: @option{-J} 使用時のデフォルトということだと思う)。@option{-S} も
@option{-J} も指定しない場合、@command{pr} が区切りに使用するのはスペースである
(@option{-S"@w{ }"} と同じこと)。@option{-S} だけで、引数の @samp{@var{string}} を指定しないと、
空文字列 (@samp{""}) を指定したことになる。

@item -t
@itemx --omit-header
@opindex -t
@opindex --omit-header
常とは異なり、各ページにヘッダ (とフッタ) を表示しない。
また、ページの最下部を (空行やフォームフィードで) 埋めることもしない。
ページ構成は行わないが、入力ファイルにあるフォームフィードは、
そのままにしておく。つまり、あらかじめ決めておいたページ分割が、
変更されないということだ。@option{-t} や @option{-T} オプションは、
他のオプションと組み合わせて使うと、便利なことがある。たとえば、@option{-t -e4}
は、入力ファイルのタブ文字を 4 個のスペースに展開するが、
それ以外何の変更も行わない。@option{-t} オプションを使用すると、
@option{-h} オプションが無効になる。

@item -T
@itemx --omit-pagination
@opindex -T
@opindex --omit-pagination
ヘッダ (とフッタ) を表示しない。さらに、入力ファイルにあるフォームフィードをすべて取り除く。

@item -v
@itemx --show-nonprinting
@opindex -v
@opindex --show-nonprinting
非表示文字をバックスラッシュ付きの 8 進数表記で表示する。

@item -w @var{page_width}
@itemx --width=@var{page_width}
@opindex -w
@opindex --width
本文を多段組み出力にしたときにのみ、ページの幅を @var{page_width} 文字にする
(@var{page_width} のデフォルトは 72 字)。各段の幅が等しくなるようにするため、
ページ幅が指定した @var{page_width} より狭くなることがある。
多段組みで @option{-w} オプションを指定せず、@option{-s[CHAR]}
オプションだけ指定すると、デフォルトのページ幅が無効になり、
行の切り詰めや段の整列も行われなくなる。
すなわち、各段の長い行が長いまま結合されてしまうのだ。なお、1 段組みの出力では、
@var{page_width} の指定はできない。以上は、POSIX に準拠した仕様である。

@item -W @var{page_width}
@itemx --page_width=@var{page_width}
@opindex -W
@opindex --page_width
ページの幅を @var{page_width} 文字にする。この指定は、
段組みオプションがあってもなくても、有効である。段組みオプションとともに使った場合、
各段の幅が等しくなるようにするため、ページ幅が指定した @var{page_width}
より狭くなることがある。@option{-J} オプションを使用しないかぎり、本文の行が切り詰められる。
3 種の段組みオプション (@option{-@var{column}}, @option{-a -@var{column}},
@option{-m}) と組み合わせて使った場合、段の整列が常に行われる。
セパレータを指定するオプションの @option{-S} や @option{-s} が、
@option{-W} オプションを無効にすることはない。デフォルトは 72 文字である。
@option{-W @var{page_width}} オプションもなく、
段組みオプションも全く指定されていない場合に、行の切り詰めが行われることは絶対にない
(下位互換を維持しつつ、よく行われる作業のほとんどに対応するために、そうなっている)。
この動作は、@option{-W 72 -J} と同じである。
なお、ヘッダ行が切り詰められることは絶対にない。

@end table

@exitstatus


@node fold invocation
@section @command{fold}: 入力行を指定された幅に合わせて折り返す

@pindex fold
@cindex wrapping long input lines
@cindex folding long input lines

@command{fold} は、各 @var{file} (@option{-} は標準入力を表す)
を、長い行は折り返して、標準出力に書き出す。
@var{file} が指定されていない場合は、標準入力を対象にする。

(訳注: @command{fold} の日本語対応は完全ではない。
3 バイトで表現される UTF-8 の漢字やかなは、1 文字 が 3 桁として計算され、
画面上では 2 桁分を占める。だから、日本語のテキストが
3 バイトの UTF-8 文字だけで書かれているならば、@samp{fold -w 105}
で長い行が 1 行 35 字 (70 桁) できちんと折り返される。
だが、出力行の長さが不適切だったり、ASCII 文字や
4 バイトの漢字が交じったりすると、行末や行頭で文字化けが生じかねない。
もちろん、日本語の禁則処理は期待できない。)

書式:

@example
fold [@var{option}]@dots{} [@var{file}]@dots{}
@end example

デフォルトでは、@command{fold} は 80 桁よりも長い行を折り返す。
出力は必要なら何行にも分割されることになる。

@cindex screen columns
@command{fold} はデフォルトでは、画面上の桁数を数える。従って、タブは
2 桁以上に数えられるかもしれないし、バックスペースは桁数を減らすことになる。
また、復帰文字 (carriage return) は、桁数を 0 にする。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -b
@itemx --bytes
@opindex -b
@opindex --bytes
桁数ではなく、バイト数を数える。従って、タブ、バックスペース、復帰文字も、
他の文字と全く同じように、それぞれ 1 桁を占めるものとして計算される。

@item -s
@itemx --spaces
@opindex -s
@opindex --spaces
単語境界で折り返す。行は、行の最大長より前にある最後の空白の後ろで折り返される。
行にそうした空白がない場合は、通常通り、行の最大長で折り返される。

@item -w @var{width}
@itemx --width=@var{width}
@opindex -w
@opindex --width
行の最大長に 80 桁ではなく、@var{width} 桁を使用する。

互換性のために、@command{fold} は古い書式のオプション @option{-@var{width}}
もサポートしている。新しいスクリプトでは、@option{-w @var{width}} の方を使用すべきである。

@end table

@exitstatus


@node Output of parts of files
@chapter ファイルの部分出力

@cindex output of parts of files
@cindex parts of files, output of

以下のコマンドは、入力の一部を出力する。

@menu
* head invocation::          ファイルの先頭部分を出力する。
* tail invocation::          ファイルの末尾部分を出力する。
* split invocation::         ファイルを分割する
* csplit invocation::        ファイルを内容を目印にして分割する。
@end menu

@node head invocation
@section @command{head}: ファイルの先頭部分を出力する

@pindex head
@cindex initial part of files, outputting
@cindex first part of files, outputting

@command{head} は、各 @var{file} の先頭部分 (デフォルトでは 10 行) を表示する。
ファイルが指定されていない場合や、@var{file} として
@option{-} が指定されている場合は、標準入力から読み込む。

書式:

@example
head [@var{option}]@dots{} [@var{file}]@dots{}
@end example

指定された @var{file} が 2 個以上あると、
@command{head} は、次のような 1 行からなるヘッダを出力する。

@example
==> @var{file name} <==
@end example

@noindent
このヘッダは、各 @var{file} の出力の前に置かれる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c [-]@var{num}
@itemx --bytes=[-]@var{num}
@opindex -c
@opindex --bytes
ファイルの先頭数行を表示する代わりに、先頭から @var{num} バイトを表示する。
ただし、@var{num} の前に @samp{-} が付いている場合は、各ファイルについて、
末尾の @var{num} バイトを除いたすべてを表示することになる。
@multiplierSuffixes{num}

@item -n [-]@var{num}
@itemx --lines=[-]@var{num}
@opindex -n
@opindex --lines
ファイルの先頭から @var{num} 行を表示する。ただし、@var{num} の前に
@samp{-} が付いている場合は、各ファイルについて、末尾の @var{num} 行を除いたすべてを表示することになる。
サイズの乗数接尾辞は、@option{-c} オプションの場合と同様である。

@item -q
@itemx --quiet
@itemx --silent
@opindex -q
@opindex --quiet
@opindex --silent
ファイル名を示すヘッダを出力しない。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
ファイル名を示すヘッダを常に出力する。

@optZeroTerminated

@end table

@command{head} は、互換性を考慮して、@option{-[@var{num}][bkm][cqv]}
というオプション指定の古い書式もサポートしている。
ただし、この書式が認識されるのは、最初のオプションとして指定されたときだけである。
@var{num} は 10 進数であり、@option{-c} オプションの場合と同様、
サイズを示す文字 (@samp{b}, @samp{k}, @samp{m}) を後ろに続けてもよく、
また、行数であることを明示する @samp{l} や、ほかのオプション文字
(@samp{cqv}) を続けることもできる。標準的なホストで使うことを意図したスクリプトでは、
古い書式ではなく、@option{-c @var{num}} や @option{-n @var{num}} を使用するべきである。
そのスクリプトが、古い書式にしか対応していないホストでも動作する必要がある場合は、
@command{head} を使わないで済ました方が、たいていの場合簡明である。
たとえば、@samp{head -5} の代わりに、@samp{sed 5q} を使用するわけだ。

@exitstatus


@node tail invocation
@section @command{tail}: ファイルの末尾部分を出力する

@pindex tail
@cindex last part of files, outputting

@command{tail} は、各 @var{file} の末尾部分 (デフォルトでは 10 行) を表示する。
ファイルが指定されていない場合や、@var{file} として
@samp{-} が指定されている場合は、標準入力から読み込む。

書式:

@example
tail [@var{option}]@dots{} [@var{file}]@dots{}
@end example

指定された @var{file} が 2 個以上あると、@command{tail} は、
各 @var{file} の出力の前に、以下のような 1 行からなるヘッダを出力する。

@example
==> @var{file name} <==
@end example

tail の出力をさらに処理したい場合は、ファイルヘッダを行頭の見出しに変更すると便利かもしれない。
こんなふうにすればよい。

@example
tail @dots{} |
awk '
  /^==> .* <==$/ @{prefix=substr($0,5,length-8)":"; next@}
  @{print prefix$0@}
' | @dots{}
@end example

@cindex BSD @command{tail}
GNU の @command{tail} は、出力するデータの量に制限がない (ほかの系統の
@command{tail} には、制限があるものもある)。また、GNU の @command{tail} には、
@option{-r} オプション (逆順で表示する) が存在しない。ファイルを逆順にするのは、
ファイルの末端部分を表示するのとは、全く別の仕事だからだ。BSD の @command{tail}
には、@option{-r} があるが、バッファの大きさまでのファイルしか逆順にできず、
それは通常 32 KiB である。ファイルを逆順にするなら、GNU の @command{tac}
コマンドの方が、信頼性という点でも、用途の広さという点でも優れている。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c [+]@var{num}
@itemx --bytes=[+]@var{num}
@opindex -c
@opindex --bytes
ファイルの末尾数行を出力する代わりに、末尾の @var{num} バイトを出力する。
ただし、@var{num} の前に @samp{+} が付いている場合は、各ファイルの末端から
@var{num} バイト目ではなく、先頭から @var{num} バイト目を始点として出力を開始する。
@multiplierSuffixes{num}

@item -f
@itemx --follow[=@var{how}]
@opindex -f
@opindex --follow
@cindex growing files
@vindex name @r{follow option}
@vindex descriptor @r{follow option}
ファイルの末端まで達しても、さらに文字を読み込もうとして、無限ループする。
たぶん、ファイルのサイズが増加し続けているからである。
複数のファイルが指定されている場合、@command{tail} は、
異なるファイルから出力があるたびに、その出力がどのファイルから来たものかわかるように、
ヘッダを表示する。

このオプションを使ってファイルの追跡をするとき、二つの方法が選択できるが、
その違いが現れるのは、追いかけているファイルが消去されたり、
名前を変更されたりしたときだけである。もし、増大しつつあるファイルが削除されたあとでも、
そのファイルの末尾の追跡を続行したいならば、@option{--follow=descriptor}
を使用すればよい。これがデフォルトの動作だが、ログファイルを追跡している際には、
役に立たない。ログファイルは、ローテートされる
(すなわち、消去、または名前を変更されてから、改めてオープンされる)
可能性があるからだ。そうした場合には、@option{--follow=name} を使用すれば、
指定した名前のファイルを追跡することができる。おそらく追跡には、
定期的にその名前のファイルをオープンし直すことで、
何らかのプログラムによってファイルが消去されてから再作成されなかったかどうかを確かめるといった方法が、
使われることだろう。なお、inotify をベースにした実装では、そうしたケースを処理するのに、
ファイルを定期的に再オープンする必要がないことを付記しておく。

どちらの方法を使った場合でも、追跡中のファイルのサイズが小さくなっていることがわかると、
@command{tail} は、ファイルが短縮されたというメッセージを出し、
ファイルの末端と改めて判断したところからファイルの追尾を再開する。

ファイルが消去されたときの @command{tail} の動作は、追いかけているものが、
名前か (@option{--follow=name})、ディスクリプタか (@option{--follow=descriptor})
によって異なっている。名前による追跡の場合、
tail はファイルが消去されたことを検出できるので、その旨メッセージを表示する。
このとき、@option{--retry} も指定されていると、
同じ名前のファイルが再作成されているかどうか、定期的な検査を継続して行う。
ディスクリプタを追跡する場合は、ファイルが削除されたり、名前の変更が行われたりしても、
tail はそれを検出しないので、メッセージを出さない。そうしたファイルが、
もはや元の名前ではアクセスできなくなっていても、なお増大し続けているということもありえる。

@samp{descriptor} や @samp{name} というオプションの値は、
長い方のオプションの形式によってのみ指定できる。@option{-f} では指定できない。

オペランド @var{file} が全く指定されていず、標準入力が
FIFO やパイプである場合は、@option{-f} オプションは無視される。また、標準入力が
FIFO やパイプである場合は、@samp{-} という形で指定されたオペランドがあっても、
@option{-f} はそれに対して効果を持たない。

カーネルが inotify をサポートしていると、出力はファイルの変更が引き金になるので、一般に反応がキビキビしている。
それに対して、カーネルが inotify をサポートしていないと、@command{tail}
はチェックごとに 1 秒間スリープするので
(このデフォルトを変更するには、@option{--sleep-interval=@var{n}} を使用する)、
出力がやや遅めに感じられたり、断続的に感じられたりするかもしれない。inotify
のサポートなしで tail を使用する場合、反応を向上させるには、sleep
する間隔を 1 秒以下に設定すればよい。たとえば、次のようなエイリアスを作成するわけだ。

@example
alias tail='tail -s.1'
@end example

@item -F
@opindex -F
このオプションは @option{--follow=name --retry} と同じである。すなわち、
ファイルが消去された場合、tail はその名前のファイルをオープンし直そうとする。
それに失敗しても、ファイルに再びアクセスできるようになるまで、再オープンを試み続ける。

@item --max-unchanged-stats=@var{n}
@opindex --max-unchanged-stats
名前によってファイルの追尾を行っているとき、連続して @var{n} 回
(デフォルトは n=@value{DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS})
追尾動作を実行しても、その間にファイルに変更がなかった場合に、ファイルを
@code{open} し、@code{fstat} して、
そのファイル名と結びついている「デバイス番号/inode 番号」の組み合わせが、
今でも前と同じままかどうかを確認する。ローテートを行うログファイルを追跡している場合、
この @var{n} は、tail がローテートする前に最後の行を表示してから、
新しいログファイルに溜まっている行を表示するまでの秒数に、ほぼ等しい。
このオプションに意味があるのは、ポーリングを使用して
(すなわち、inotify を使わずに)、名前による追跡を行うときだけである。

@item -n [+]@var{num}
@itemx --lines=[+]@var{num}
@opindex -n
@opindex --lines
末尾の  @var{num} 行を出力する。ただし、@var{num} の前に @samp{+}
が付いている場合は、各ファイルの末端から @var{num} 行目ではなく、
先頭から @var{num} 行目を始点として出力を開始する。サイズの乗数接尾辞は、@option{-c} の場合と同様である。

@item --pid=@var{pid}
@opindex --pid
追跡が名前によって行われていようと、ディスクリプタによって行われていようと、
@var{file} 引数で指定されたすべてのファイルに書き込みを行うプログラムがたった一つならば、
そのプログラムのプロセス番号 @var{pid} を指定することができる。
そうしておくと、そのプロセスが終了する直後に tail も終了するようになるのだ。
これがきちんと動作するのは、書き込みプログラムと tail のプロセスが、
同じマシンで動いているときだけである。たとえば、プログラムをビルドするとき、
その出力をファイルに保存しながら、ファイルが増大して行くのを見守りたいならば、
下記のように @command{make} と @command{tail} を実行すればよい。
そうすれば、ビルドが完了したとき、tail のプロセスも終了する。
このオプションを使わない場合は、@code{tail -f} のプロセスを自分で止めなければならないだろう。

@example
$ make >& makerr & tail --pid=$! -f makerr
@end example

使用されていない @var{pid} を指定した場合や、
tail が対象とするファイルに書き込んでいるプロセスとは別のプロセスの
@var{pid} を指定した場合は、
@command{tail} は、@var{file} の増大が止まるずっと前に終了してしまうかもしれないし、
実際に書き込んでいるプログラムが終了してしまっても、当分の間終了しないかもしれない。
気をつけてほしいが、システムによっては、@option{--pid} が使えないことがある。
その場合、@command{tail} は警告メッセージを出すはずだ。

@item -q
@itemx --quiet
@itemx --silent
@opindex -q
@opindex --quiet
@opindex --silent
ファイル名を示すヘッダを出力しない。

@item --retry
@opindex --retry
指定された名前のファイルを繰り返し何度でもオープンしようとする。
このオプションが役に立つのは、ファイルの末尾を追跡している場合がほとんどである
(それ以外の場合は、警告メッセージを出す)。

ファイル・ディスクリプタによって追跡している場合は (すなわち、
@option{--follow=descriptor} の場合は)、
このオプションは、最初にファイルをオープンするときの動作にしか影響しない。
ひとたびオープンに成功してしまえば、@command{tail} は、ファイル名ではなく、
ファイル・ディスクリプタを追跡することになるからである。

ファイル名によって追跡している場合は (すなわち、@option{--follow=name}
の場合は)、@command{tail} は、ユーザによって中断 (kill) されるまで、
いつまでも繰り返しその名前のファイルを再オープンしようとする。

このオプションを付けないと、 @command{tail} は、ファイルが存在しなくなったり、
何かほかの理由でファイルにアクセスできなくなったりすることがあっても、
その旨報告するだけで、以後再検査を行うことがない。

@item -s @var{number}
@itemx --sleep-interval=@var{number}
@opindex -s
@opindex --sleep-interval
何秒間隔で追尾・表示動作を行うかを変更する (デフォルトは 1.0 秒間隔)。
@command{tail} は動作の繰り返しごとに、指定されたすべてのファイルについて、
サイズが変わっていないかどうかのチェックを行う。@command{tail}
の伝統的な実装では、@var{number} は整数でなければならなかったが、GNU の
@command{tail} では、任意の浮動小数点数を指定することが可能になっている。
@xref{Floating point}.  @command{tail} が inotify を使用していると、
このポーリング関係の (polling-related) オプションは通常無視される。
ただし、@option{--pid=@var{p}} も一緒に指定されている場合は別で、その場合は、
プロセス @var{p} が生きているかどうかを、@command{tail} が少なくとも
@var{number} 間隔でチェックすることになる。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
ファイル名を示すヘッダを常に出力する。

@optZeroTerminated

@end table

@command{tail} は互換性のために、@samp{tail -[@var{num}][bcl][f] [@var{file}]}
という古い用法もサポートしているが、それが認識されるのは、
上で説明した用法と衝突しないときだけである。この旧来の書式では、
オプションはただ 1 個しか指定できず、ファイルも 1 個までしか指定できない。
オプション中の @var{num} は、省略可能な 10 進数であり、サイズを表す文字
(@samp{b}, @samp{c}, @samp{l}) を後ろに続けて、1 ブロック当たり
512 バイトのブロック数か、バイト数か、行数かを示すことができる。
さらに、@option{-f} と同じ意味を持つ、@samp{f} を続けてもよい。

@vindex _POSIX2_VERSION
POSIX 1003.1-2001 に準拠していないシステムでは、
旧来のオプション書式において、先頭の @samp{-} を @option{-c}
や @option{-n} オプションの場合と同じ意味で @samp{+} に置き換えることができる。
また、POSIX 1003.1-2001 以前の旧式なシステムでは、
旧来の用法と標準的な用法が衝突する場合には、旧来の用法が優先される。
なお、そうした動作は、環境変数 @env{_POSIX2_VERSION} によってコントロールできる。
(@pxref{Standards conformance})。

標準的なホストで使用するためのスクリプトでは、旧来の書式を使わずに、
@option{-c @var{num}[b]}, @option{-n @var{num}} オプションや @option{-f}
オプションの方を使うべきである。
そのスクリプトが、旧来の書式にしか対応していないホストでも動作しなければならない場合でも、
問題を起こしかねない表現を避けるように書き直すことが、たいていはできるものだ。
たとえば、@samp{tail -1} の代わりに、@samp{sed -n '$p'} を使うといった具合である。
それさえ不可能な場合は、どちらの書式を使うべきかを判断するために、
@samp{if tail -c +1 </dev/null >/dev/null 2>&1; then @dots{}}
といった条件文をスクリプトで使用すればよい。

作成するスクリプトが標準的な動作を想定している場合でも、
POSIX のバージョンによって動作に違いのある用法には、気を付けた方がよい。
たとえば、@samp{tail - main.c} は避けるべきである。@samp{tail main.c}
と解釈することも、@samp{tail -- - main.c} と解釈することもできるからだ。
@samp{tail -c 4} も避けるべきである。@samp{tail -c4} を意味するかもしれないし、
@samp{tail -c 10 4} を意味するかもしれない。@samp{tail +4} も使わない方がよい。
@samp{tail ./+4} の意味にも、@samp{tail -n +4} の意味にも取れるからである。

@exitstatus


@node split invocation
@section @command{split}: ファイルを分割する。

@pindex split
@cindex splitting a file into pieces
@cindex pieces, splitting a file into

@command{split} は、入力ファイル @var{input} を分割して複数の出力ファイルを作成する。
各出力ファイルには、@var{input} の断片が、連続した形で、
あるいは 1 行づつ順番に分配された形で含まれることになる (訳注: 前者は単純な分割であり、
後者は後述の「ラウンド・ロビン方式」である。@option{-n} オプションを参照)。
@var{input} が指定されていない場合や、@samp{-} である場合には、標準入力から読み込む。

書式:

@example
split [@var{option}] [@var{input} [@var{prefix}]]
@end example

デフォルトでは、@command{split} は @var{input} を 1000 行づつ各出力ファイルに書き込む
(最後の断片については、何行であれ残っている行を書き込む)。

@cindex output file name prefix
出力ファイルの名前は、上記書式の @var{prefix} (デフォルトでは @samp{x})
に複数の文字 (デフォルトでは、@samp{aa}, @samp{ab}, @dots{})
を続けたものであり、各出力ファイルをファイル名による伝統的なソート順で結合すると、
元の入力ファイルが再構成されるようになっている
(ただし、@option{-nr/@var{n}} オプションを指定した場合は除く)。
デフォルトでは、split はまず、作成するファイルに 2 文字からなる接尾辞
(訳注: suffix、すなわち上記の @samp{aa}, @samp{ab} など) を生成して付け、
その接尾辞の 1 番目の文字がアルファベットの最後に達した時点で、接尾辞を
2 文字づつ増やして行く (@samp{yz} の次は @samp{zaaa}, @samp{zaab}, @dots{} という具合)。
こうした命名法を使えば、出力ファイルがいくつあっても対応できるし、また
@option{--additional-suffix} オプションを付けたときでも、
出力ファイルが上で述べたような順に並ぶことになるわけだ。
@option{-a} オプションが指定されている場合に、出力ファイルの名前が種切れになってしまうと、
@command{split} はエラーメッセージを出すが、作成した出力ファイルを消去することはない。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -l @var{lines}
@itemx --lines=@var{lines}
@opindex -l
@opindex --lines
@var{input} から @var{lines} 行づつ各出力ファイルに書き込む。
@option{--separator} オプションが指定されている場合は、@var{lines}
はレコード数の指定になる。

互換性を考慮して、@command{split} は @option{-@var{lines}}
という古いオプションの書式もサポートしている。新規にスクリプトを書くなら、
@option{-l @var{lines}} の方を使うべきである。

@item -b @var{size}
@itemx --bytes=@var{size}
@opindex -b
@opindex --bytes
@var{input} から @var{size} バイトづつ各出力ファイルに書き込む。
@multiplierSuffixes{size}

@item -C @var{size}
@itemx --line-bytes=@var{size}
@opindex -C
@opindex --line-bytes
各出力ファイルに、ファイルサイズが @var{size} バイトを超過しない範囲で、
@var{input} の完全な行をできるだけ多く書き込む。
一つの行やレコードの長さが @var{size} バイトを越える場合は、複数のファイルに分割される。
@var{size} の書式は、@option{--bytes} オプションの場合と同じである。
@option{--separator} オプションが指定されている場合は、
できるだけ多くの行ではなく、できるだけ多くのレコードを書き込むことになる。

@item --filter=@var{command}
@opindex --filter
このオプションを使用すると、各出力は、そのままファイルに書き出されるのではなく、
パイプを通して一つづつ、指定されたシェルコマンド @var{command}
に引き渡される。@var{command} 中では、環境変数 $FILE を使用するべきであり、
この変数には、シェルコマンドを実行するごとに、異なる出力ファイル名が代入される。
たとえば、1TiB の圧縮ファイルがあるとしよう。伸長したら、サイズが大きすぎて、
ディスクに納まり切らない。しかし、それを分割して、もっと扱いやすいサイズの、
それぞれ圧縮したファイルを作らねばならない。そうした課題を解決するには、
次のようなコマンドを実行すればよいだろう。

@example
xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-
@end example

圧縮率が 10:1 だとすると、上のコマンドは 20GiB のファイルを
50 個ほど生成することになるだろう。ファイルの名前は、@file{big-aa.xz},
@file{big-ab.xz}, @file{big-ac.xz} などになる。

@item -n @var{chunks}
@itemx --number=@var{chunks}
@opindex -n
@opindex --number

@var{input} を @var{chunks} 個の出力ファイルに分割する。
@var{chunks} の位置には以下のものが指定できる。

@example
@var{n}      @var{input} の現在のサイズに基づいて @var{n} 個のファイルを生成する。
@var{k}/@var{n}    @var{n} 個中の @var{k} 番目のみを標準出力へ出力する。
l/@var{n}    @var{n} 個のファイルを生成する。行やレコードの途中で分割しない。
l/@var{k}/@var{n}  同上。ただし、@var{n} 個中の @var{k} 番目のみを標準出力に出力する。
r/@var{n}    @samp{l} に似ている。ただし、分配はラウンド・ロビン方式で行う。
       (訳注： トランプの親がカードを 1 枚づつ子に配るように、
               入力から 1 行 (1 レコード) づつ各出力ファイルに
               分配して行く。)
r/@var{k}/@var{n}  同上。ただし、@var{n} 個中の @var{k} 番目のみを標準出力に出力する。
@end example

@var{input} を  @var{n} 個の「部分 (chunk)」に分けたときに出た余りのバイトは、
最後の「部分」に割り振られる。最初に行われる分割のための計算の後で追加されるバイトがあっても、
それは捨て去られる (@samp{r} モードを使用している場合を除く)。

@var{input} の行数が @var{n} 行に足りなかったり、@var{input} が短縮された場合でも、
@var{n} 個のファイルすべてが作成される。

@samp{l} モードについて言うと、「部分」の大きさは、「@var{input} サイズ / @var{n}」前後になる。
@var{input} は、まず @var{n} 個の同一サイズの区画 (partition) に分割され、
余りがあれば、それは最後の区画に割り当てられる。
ある行の先頭が、ある区画の内側にある場合、その行は行末まで、その区画に対応するファイルに書き込まれる。
行やレコードは、たとえ後続する区画にまではみ出していても分割されないので、
書き出されるファイルは、区画のサイズより大きくなることもあれば、小さくなることもある。
行やレコードが後続する区画をすっぽり覆ってしまうほど長い場合には、空っぽのファイルができることさえある。

@samp{r} モードでは、@var{input} のサイズは問題にならない。だから、入力は、
たとえば、パイプからであっても構わない。

@item -a @var{length}
@itemx --suffix-length=@var{length}
@opindex -a
@opindex --suffix-length
使用する接尾辞の長さを @var{length} 文字にする。@var{length} に
0 を指定すると、@option{-a} オプションを (すでに指定していた場合でも)
全く指定しなかったのと同じことになり、従って、デフォルトの動作が有効になる。
すなわち、接尾辞は、2 文字から始まり、@option{-n} や
@option{--numeric-suffixes=@var{from}} オプションが指定されていないかぎり、
必要になるごとに、2 文字づつ自動的に増えて行く。

@item -d
@itemx --numeric-suffixes[=@var{from}]
@opindex -d
@opindex --numeric-suffixes
接尾辞にアルファベットの小文字ではなく、数字を使用する。
数字の接尾辞は、 @var{from} が指定されていれば @var{from} から、
指定されていなければ 0 から数を数えて行く。

@var{from} を指定できるのは、長い形式のオプションを使ったときだけである。
@var{from} を指定すると、@command{split} を一回だけ実行する場合に最初の接尾辞を決めたり、
それぞれ別々にスプリットする入力に対して相互の接尾辞間をどれくらい離すかを決めたりすることができるが、
上で述べた接尾辞の長さを自動的に増やしていく機能は無効になる。
そこで、ユーザとしては、@samp{99} を越える数字を接尾辞として使えるようにするため、
@option{-a} オプションも併せて指定したくなるかもしれない。
なお、@option{--number} オプションが指定され、しかも、生成されるファイルの数より
@var{from} が小さい場合は、一回かぎりの実行と見なされ、接尾辞に最小限必要な長さが、自動的に割り出される。

(訳注: 上記の「なお」以下で言っているのは、@samp{split -d -n100 some.data}
などとすると、x00 から x99 までのファイルが作られるが、@samp{split --numeric-suffixes=1 -n100
some.data}
なら、x001 から x100 まで、3 桁の接尾辞を持つファイルが作られるということらしい。
しかし、coreutils 8.26 では、@samp{split -d -n200 some.data}
や @samp{split --numeric-suffixes=10 -n100 some.data} は、
"output file suffixes exhausted" というエラーになる。
そして、@samp{split -d -n201 some.data} や @samp{split --numeric-suffixes=10
-n101 some.data}
なら、実行に成功するのである。よくわからない仕様だと思う。@option{--suffix-length}
を使って、自分で接尾辞の長さを決めた方が、間違いがない。)

@item --additional-suffix=@var{suffix}
@opindex --additional-suffix
出力ファイル名の末尾に @var{suffix} をさらに追加する。
@var{suffix} 中にスラッシュが含まれていてはならない。

@item -e
@itemx --elide-empty-files
@opindex -e
@opindex --elide-empty-files
サイズ 0 の出力ファイルができないようにする。そうしたものが生成されることがあるのは、
@option{--number} を使ったときである。入力ファイルが (短縮されたりして)
指定された数の出力ファイルを作るには分量が足りない場合や、
1 行が長すぎて、後続する「部分」をすっぽり飲み込んでしまっている場合などがそれに当たる。
このオプションが指定されているときでも、出力ファイルの連続番号が、
順番に増えていくことに変わりはない。

@item -t @var{separator}
@itemx --separator=@var{separator}
@opindex -t
@opindex --separator
@cindex line separator character
@cindex record separator character
レコード・セパレータとしてデフォルトの改行文字 (ASCII LF) の代わりに、
文字 @var{separator} を使用する。ASCII NUL をセパレータに指定するには、
二文字からなる文字列 @samp{\0} を使用すればよい。@samp{split -t '\0'} のようにだ。

@item -u
@itemx --unbuffered
@opindex -u
@opindex --unbuffered
@option{--number r/@dots{}} モードにおいて入力を即座に出力する。
このモードは、作業にかなり時間がかかるのだ。

@item --verbose
@opindex --verbose
各出力ファイルをオープンする直前に、診断メッセージを表示する。

@end table

@exitstatus

@option{--number} (@option{-n}) の動作を理解していただくために、
用例をいくつか挙げてみる。

デフォルトでは、1 行が 2 行以上に分割されることがあるのに、注目していただきたい。

@example
$ seq -w 6 10 > k; split -n3 k; head xa?
==> xaa <==
06
07
==> xab <==

08
0
==> xac <==
9
10
@end example

"l/" 修飾子を使用して、行の途中で分割しないようにする。

@example
$ seq -w 6 10 > k; split -nl/3 k; head xa?
==> xaa <==
06
07

==> xab <==
08
09

==> xac <==
10
@end example

"r/" 修飾子を使用して、ラウンド・ロビン方式で分配する。

@example
$ seq -w 6 10 > k; split -nr/3 k; head xa?
==> xaa <==
06
09

==> xab <==
07
10

==> xac <==
08
@end example

K 番目の「部分」だけ取り出すこともできる。次の例は、33 の「部分」に分け、
そのうちの  7 番目だけを取り出して、表示している。

@example
$ seq 100 > k; split -nl/7/33 k
20
21
22
@end example


@node csplit invocation
@section @command{csplit}: ファイルを内容を目印にして分割する。

@pindex csplit
@cindex context splitting
@cindex splitting a file into pieces by context

@command{csplit} は、入力ファイル @var{input} を分割して 0 個以上の出力ファイルを生成する。
@var{input} が @samp{-} である場合は、標準入力から読み込む。

書式:

@example
csplit [@var{option}]@dots{} @var{input} @var{pattern}@dots{}
@end example

出力ファイルの中身がどうなるかは、以下で詳しく述べるように、引数
@var{pattern} によって決まってくる。引数 @var{pattern} が、
入力ファイル中に存在しない行を指している場合は、エラーになる
(たとえば、入力の残りの部分に、指定された正規表現にマッチする行がもう存在しない場合)。
すべてのパターン・マッチが終わったとき、残っている入力があれば、
最後の出力ファイルに書き出される。

デフォルトでは、@command{csplit} は、出力ファイルを生成した後で、
各出力ファイルに書き込んだバイト数を表示する。

パターン引数 @var{pattern} には、以下のタイプがある。

@table @samp

@item @var{n}
入力の最初から @var{n} 行目の直前までを含む (つまり、@var{n-1} 行目までの)
出力ファイルを作成する (@var{n} は正の整数)。繰り返し回数の指定が後に続く場合は、
繰り返しごとに、入力ファイルの次の @var{n} 行分を含む出力ファイルを作成していく。
(訳注: パターンが @var{N} の場合は、あと何回繰り返すかを正確かつ具体的に指定しなければならない。
すなわち、回数が多かったり、@{*@} を指定すると、@option{-k} も指定しないかぎり、
エラーになり、出力ファイルが作成されない。)

@item /@var{regexp}/[@var{offset}]
現在行から、入力ファイル中の次に @var{regexp} にマッチする行の直前までを内容とする
(すなわち、マッチする行は含まない) 出力ファイルを作成する。
整数の @var{offset} を指定してもよい。指定した場合は、マッチする行にプラス/マイナス
@var{offset} した行の直前までの入力が (つまり、その行は含まない)、
出力ファイルに書き込まれ、書き込まれた次の行から入力の後続部分が始まることになる。

@item %@var{regexp}%[@var{offset}]
上記のタイプと同様だが、出力ファイルを作成しない点が異なる。
要するに、入力ファイルのその部分は捨てられることになるわけだ。

@item @{@var{repeat-count}@}
直前に行ったパターンの検索を、さらに @var{repeat-count} 回繰り返す。
@var{repeat-count} には正の整数か、アステリスクを指定できる。後者は、
入力がなくなるまで、必要なだけ何回でも繰り返すことを意味する。
(訳注: @samp{csplit @var{input} '/@var{pattern_1}/' '@{3@}'
'/@var{pattern_2}/' '@{*@}'}
のように使用する。)

@end table

出力ファイルの名前は、接頭辞 (prefix、デフォルトでは @samp{xx}) に接尾辞
(suffix) を続けたものになる。デフォルトの接尾辞は、二桁の 10 進数を @samp{00}
から @samp{99} まで順番に増やして行ったものである。いかなる場合でも、
出力ファイルを、ファイルの名前によってソートした順番で結合すると、
元の入力ファイルが生成されるようになっている。

@command{csplit} のデフォルトでは、エラーになった場合や、ハングアップ、
割り込み、中止、終了といったシグナルを受け取った場合には、
それまでに作成した出力ファイルをすべて消去してから終了する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -f @var{prefix}
@itemx --prefix=@var{prefix}
@opindex -f
@opindex --prefix
@cindex output file name prefix
@var{prefix} を出力ファイル名の接頭辞として使用する。

@item -b @var{format}
@itemx --suffix-format=@var{format}
@opindex -b
@opindex --suffix-format
@cindex output file name suffix
@var{format} を出力ファイル名の接尾辞として使用する。
このオプションを指定する場合、接尾辞として指定する文字列には、@code{printf(3)}
方式の変換指定が必ず一つは (それも、一つだけ) 含まれていなければならない。
変換指定には、形式指定フラグ、フィールド幅、精度指定といった修飾子を付けてもよく、
3 種の修飾子をすべて付けることもできる。
フォーマット文字は、バイナリの符号なし整数である引数を、
人間に読みやすい形式に変換するものでなければならない。フォーマット文字の
@samp{d} と @samp{i} は、@samp{u} の別名であり、@samp{u}, @samp{o},
@samp{x}, @samp{X} 変換が可能である。@var{format} の全体が
(現在の出力ファイルが何番目かという情報とともに) @code{sprintf(3)}
関数に引き渡され、出力ファイルの一つ一つに対して、ファイル名に使う接尾辞が順番に作られることになる。
なお、このオプションを使用すると、@option{--digits} オプションは無視される。

@item -n @var{digits}
@itemx --digits=@var{digits}
@opindex -n
@opindex --digits
出力ファイル名に含まれる数字の桁数を、デフォルトの 2 桁から
@var{digits} 桁にする。

@item -k
@itemx --keep-files
@opindex -k
@opindex --keep-files
エラーが起きても、出力ファイルを消去しない。

@item --suppress-matched
@opindex --suppress-matched
指定した @var{pattern} にマッチする行を出力しない。言い換えれば、
境界になる行が、分割されたファイルの 2 番目以降の断片の先頭に現れないようにする。
(訳注: @var{pattern} が正規表現の場合には、境界になる行がファイル中にたとえ 1 箇所しかなくても、
その行の表示を抑制するには、@samp{csplit --suppress-matched @var{input}
@var{pattern} '@{*@}'} などと、繰り返しの指定をする必要があるようだ。)

@item -z
@itemx --elide-empty-files
@opindex -z
@opindex --elide-empty-files
サイズ 0 の出力ファイルができないようにする (入力ファイルを各部分に区切る行が、
どの部分においても最初の行になることを期待している場合に、
このオプションを使わないと、一番目の出力ファイルがたいていサイズ 0 になる)。
このオプションが指定されているときでも、出力ファイルの連続番号が 0 から始まって、
順番に増えていくことに変わりはない。

@item -s
@itemx -q
@itemx --silent
@itemx --quiet
@opindex -s
@opindex -q
@opindex --silent
@opindex --quiet
出力ファイルのサイズを表示しない。

@end table

@exitstatus

用例を挙げてみよう。まず、練習用に空のディレクトリを作って、そこに移動する。

@example
$ mkdir d && cd d
@end example

次に、1 から 14 まで連続する数を、0 または 5 で終わる行で分割する。

@example
$ seq 14 | csplit - '/[05]$/' '@{*@}'
8
10
15
@end example

ここで表示された各数字は、csplit が今作成した出力ファイルのサイズである。
その出力ファイルの名前をリストする。

@example
$ ls
xx00  xx01  xx02
@end example

@command{head} を使って、内容を見る。

@example
$ head xx*
==> xx00 <==
1
2
3
4

==> xx01 <==
5
6
7
8
9

==> xx02 <==
10
11
12
13
14
@end example

次の例では、入力を空行で分割している。

@example
$ csplit --suppress-matched @var{input.txt} '/^$/' '@{*@}'
@end example

@c
@c TODO: "uniq" already supports "--group".
@c        when it gets the "--key" option, uncomment this example.
@c
@c Example of splitting input file, based on the value of column 2:
@c
@c @example
@c $ cat @var{input.txt} |
@c       sort -k2,2 |
@c       uniq --group -k2,2 |
@c       csplit -m '/^$/' '@{*@}'
@c @end example

@node Summarizing files
@chapter ファイルの要約 (行数、単語数、チェックサム)

@cindex summarizing files

以下のコマンドは、ファイル内容全体を表現する若干の数字を生成する。

@menu
* wc invocation::            行数、単語数、バイト数を表示する。
* sum invocation::           チェックサムとブロック数を表示する。
* cksum invocation::         CRC チェックサムとバイト数を表示する。
* b2sum invocation::         BLAKE2 ダイジェストの表示、または検査をする。
* md5sum invocation::        MD5 ダイジェストの表示、または検査をする。
* sha1sum invocation::       SHA-1 ダイジェストの表示、または検査をする。
* sha2 utilities::           SHA-2 ダイジェストの表示、または検査をする。
@end menu


@node wc invocation
@section @command{wc}: 行数、単語数、バイト数を表示する

@pindex wc
@cindex byte count
@cindex character count
@cindex word count
@cindex line count

@command{wc} は、指定された各 @var{file} に含まれる、バイト数、文字数、ホワイトスペース
(訳注: 空白、タブ、改行など) で区切られた単語数、改行数を算出する。
@var{file} が指定されなかった場合や、@var{file} として @samp{-}
が指定された場合は、標準入力を対象とする。

書式:

@example
wc [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@cindex total counts
@command{wc} は各ファイルにつき、一行の算出結果を出力する。
引数としてファイルが指定されていれば、そのファイル名を数値の後ろに表示する。
複数の @var{file} が指定されている場合は、最後の行で合計を表示し、
ファイル名の列に、「合計 (@file{total})」と書き込む。表示される数値の順番は、
改行数、単語数、文字数、バイト数、最長行の長さになる。
各数値は、フィールドに右詰めで表示され、フィールド間には、少なくとも一個の空白が置かれる。
そうすることで、複数の数字とファイル名が、たいていの場合きちんと整列するようになっているのだ。
数値の入るフィールドの幅は、入力に応じて変化するので、
一定のフィールド幅を当てにするべきではない。ただし、GNU の拡張として、
表示される数値がただ 1 個だけの場合は、その数値の頭に空白を入れないことになっている。

デフォルトでは、@command{wc} は 3 個の数値を表示する。
すなわち、改行数、単語数、バイト数である。
オプションによって、特定の数値のみを表示するように指定することもできる。
どんなオプションも、それ以前に指定されたオプションを取り消すことはない。従って、

@example
wc --bytes --words
@end example

@noindent
上記のコマンドは、バイト数と単語数の両方を表示することになる。

@option{--max-line-length} を指定すると、@command{wc}
はファイルごとの最長行の長さを表示する。さらに、複数のファイルが存在する場合は、
(各最長行の合計ではなく) 最長行中の最長のものを表示する。ここで言う行の長さは、
画面に表示される桁数のことである。表示桁数の計算は現在のロケールに従って行われ、
タブ位置は 8 桁ごとに来るものとされる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --bytes
@opindex -c
@opindex --bytes
バイト数のみを表示する。

@item -m
@itemx --chars
@opindex -m
@opindex --chars
文字数のみを表示する。

@item -w
@itemx --words
@opindex -w
@opindex --words
単語数のみを表示する。

@item -l
@itemx --lines
@opindex -l
@opindex --lines
改行数のみを表示する。

@item -L
@itemx --max-line-length
@opindex -L
@opindex --max-line-length
最長表示行の長さのみを表示する。タブ位置は 8 桁ごとにあるものとする。
ワイド・キャラクタについては、表示される幅を考慮する。非表示文字の幅は 0 とする。

@macro filesZeroFromOption{cmd,withTotalOption,subListOutput}
@item --files0-from=@var{file}
@opindex --files0-from=@var{file}
@c This is commented out to avoid a texi2dvi failure.
@c texi2dvi (GNU Texinfo 4.11) 1.104
@c @cindex including files from @command{\cmd\}
コマンドラインで名前を指定されたファイルの処理を行わない。その代わりに、
ファイル @var{file} に名前が書き込まれているファイルの処理を行う。
なお、@var{file} 中に書かれている各ファイル名は、ゼロバイト (ASCII NUL)
で終端されていなければならない。このオプションは、ファイル名のリストが長すぎて、
コマンドライン長の上限を超過してしまいそうなときに、
\withTotalOption\便利である。そうした場合、@command{\cmd\} を
@command{xargs} 経由で実行するのは、望ましくない。
なぜなら、@command{xargs} はファイルのリストをいくつかの部分に分割して
@command{\cmd\} に渡すので、@command{\cmd\} はリスト全体の\subListOutput\ではなく、
部分リストごとの\subListOutput\を表示してしまうからである。
ASCII NUL で終端されたファイル名のリストを得る方法の一つは、
GNU @command{find} に @option{-print0} を付けて使うことである。
@var{file} に @samp{-} を指定すれば、
ASCII NUL で終端されたファイル名を標準入力から読み込むことができる。
@end macro
@filesZeroFromOption{wc,,合計}

たとえば、カレント・ディレクトリ以下にある、すべての @file{.c} ファイルや
@file{.h} ファイルの内で、最長の行の長さを知るには、次のようにする。

@example
find . -name '*.[ch]' -print0 |
  wc -L --files0-from=- | tail -n1
@end example

@end table

@exitstatus


@node sum invocation
@section @command{sum}: チェックサムとブロック数を表示する

@pindex sum
@cindex 16-bit checksum
@cindex checksum, 16-bit

@command{sum} は、指定された各 @var{file} の 16-bit チェックサムを計算する。
@var{file} が指定されなかった場合や、@var{file} として @samp{-} が指定された場合は、
標準入力を対象とする。

書式:

@example
sum [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@command{sum} は各 @var{file} のチェックサムを表示し、その後にファイルのブロック数
(整数に切り上げたもの) を続ける。複数の @var{file} が指定されていると、
ファイル名も表示される (デフォルト)。(@option{--sysv} オプションが指定されている場合は、
引数に一つでもファイルがあれば、そのファイル名が表示される。)

デフォルトでは、GNU の @command{sum} は、BSD の @command{sum}
と互換性のあるアルゴリズムを使って、チェックサムを計算し、
1 ブロック 1024 バイトのブロック数でファイルサイズを表示する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -r
@opindex -r
@cindex BSD @command{sum}
デフォルトの (BSD と互換性のある) アルゴリズムを使用する。
このオプションが存在しているのは、System V の @command{sum} との互換性のためである。
前方に @option{-s} オプションも指定されているとき以外、このオプションは効果を持たない。

@item -s
@itemx --sysv
@opindex -s
@opindex --sysv
@cindex System V @command{sum}
System V の @command{sum} のデフォルトと互換性のあるアルゴリズムを使って、
チェックサムを計算し、1 ブロック 512 バイトのブロック数でファイルサイズを表示する。

@end table

@command{sum} は、互換性のために提供されている。新しいアプリケーションでは、
@command{cksum} プログラム (次のセクションを参照) を使う方がよい。

@exitstatus


@node cksum invocation
@section @command{cksum}: CRC チェックサムとバイト数を表示する

@pindex cksum
@cindex cyclic redundancy check
@cindex CRC checksum

@command{cksum} は、指定された各 @var{file} の
CRC (cyclic redundancy check、巡回冗長検査) チェックサムを計算する。
@var{file} が指定されなかった場合や、@var{file} として @samp{-} が指定された場合は、
標準入力を対象とする。

書式:

@example
cksum [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@command{cksum} は、各ファイルの CRC チェックサムとバイト数を表示する。
また、引数が指定されていない場合を除いて、ファイル名も表示する。

@command{cksum} は通常、信頼性の低い方法 (たとえば、netnews)
によって転送されたファイルに損傷がないことを確認するために使用される。
受信したファイルに対する @command{cksum} の出力を、転送元のファイルに対する
@command{cksum} の出力 (たいてい、配布物中に入っている) と比較するわけである。

CRC のアルゴリズムは、POSIX 規格によって規定されており、BSD や
System V の @command{sum} のアルゴリズム (直前のセクションを参照) と互換性がない。
CRC アルゴリズムの方が信頼性が高い。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@exitstatus


@node b2sum invocation
@section @command{b2sum}: BLAKE2 ダイジェストの表示、または検査をする

@pindex b2sum
@cindex BLAKE2
@cindex 512-bit checksum
@cindex checksum, 512-bit
@cindex fingerprint, 512-bit
@cindex message-digest, 512-bit

@command{b2sum} は、指定された各 @var{file} の 512-bit チェックサムを計算する。
@command{md5sum} コマンドと同じ使用法とオプションがサポートされている。
@xref{md5sum invocation}.  なお、@command{b2sum} では、以下のオプションも使用できる。

@table @samp
@item -l
@itemx --length
@opindex -l
@opindex --length
@cindex BLAKE2 hash length
ダイジェストのデフォルトの長さを変更 (短縮) する。
長さは bit で指定する。従って 8 の倍数でなければならない。
@option{--check} オプションが指定されていると、このオプションは無視される。
チェックを行うときは、ダイジェストの長さは自動的に判断されるからである。
@end table

@node md5sum invocation
@section @command{md5sum}: MD5 ダイジェストの表示、または検査をする

@pindex md5sum
@cindex MD5
@cindex 128-bit checksum
@cindex checksum, 128-bit
@cindex fingerprint, 128-bit
@cindex message-digest, 128-bit

@command{md5sum} は、指定された各 @var{file} の 128-bit チェックサムを計算する。
チェックサムは、指紋 (@dfn{fingerprint}) とか、メッセージ・ダイジェスト
(@dfn{message-digest}) とも呼ばれる (訳注: ハッシュ値と呼ばれることもある)。

注意: MD5 ダイジェストは、ファイルの不測の損傷を検知することに関して、
単純な CRC (@command{cksum} コマンドで使用できる) よりも信頼性が高い。
二つのファイルがたまたま同一の MD5 値を持っている確率は、ほとんどゼロだからである。
だからと言って、悪意のある改竄に対して安全だと考えてはならない。
ある特定の MD5 指紋を持つファイルを見つけ出すことは、現在のところ事実上不可能だと考えられているが、
デジタル証明書などのファイルが署名に MD5 ダイジェストを使用しているとき、
そうしたファイルに手を加えて、正当に見えるようする方法なら、周知のことだからである。
もっと安全なハッシュ値が必要なら、SHA-2 の使用を考慮した方がよい。
@xref{sha2 utilities}.

指定された @var{file} が @samp{-} の場合や、ファイルが全く指定されなかった場合は、
@command{md5sum} は標準入力のチェックサムを計算する。また、@command{md5sum}
は、ファイルとチェックサムの間に矛盾がないかどうかを判定することもできる。

書式:

@example
md5sum [@var{option}]@dots{} [@var{file}]@dots{}
@end example

各 @var{file} に対して @samp{md5sum} は、デフォルトでは
MD5 チェックサム、一個の空白、入力モードがバイナリかテキストかを示すフラグ、
それにファイル名を出力する。バイナリモードの指標は @samp{*} であり、
テキストモードの指標は @samp{ } (空白) である。
モードの区別に意味のあるシステムでは、バイナリモードがデフォルトだが、
そうでないシステムではテキストモードがデフォルトである。
@var{file} にバックスラッシュや改行文字が含まれている場合は、出力する行の先頭にバックスラッシュを付け、
さらに、ファイル名中の問題のある各文字をバックスラッシュでエスケープする。
そうすることで、わがままなファイル名があっても、出力に誤解の余地がないようにしているのだ。
@var{file} が指定されていなかったり、@samp{-} という形で指定されている場合は、
標準入力から読み込む。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -b
@itemx --binary
@opindex -b
@opindex --binary
@cindex binary input files
各入力ファイルをバイナリとして扱う。すなわち、入力ファイルをバイナリモードで読み込み、
出力に @samp{*} というフラグを付ける。このオプションは
@option{--text} の反対である。バイナリファイルとテキストファイルを区別しない GNU
のようなシステムでは、このオプションは入力モードがバイナリであるとのフラグを付けるだけであり、
MD5 チェックサムの値には影響を及ぼさない。
このオプションは、バイナリファイルとテキストファイルを区別する MS-DOS のようなシステムでは、
デフォルトである。だだし、読み込みを標準入力から行い、その標準入力が端末であるときは除く。

@item -c
@itemx --check
各 @var{file} から (@var{file} が指定されなかった場合は、標準入力から)、
ファイル名とチェックサム情報を読み込み
(@var{file} をチェックサム計算の対象となるデータとして読み込むわけはない)、
そのチェックサム情報が、それに対して名前を挙げられているファイルの内容に対応しているかどうかを報告する。
このモードの @command{md5sum} に対する入力は、たいていの場合、事前に @samp{md5sum}
を実行してチェックサムを生成したときの出力である。
入力ファイルの書式は、三種類のものがサポートされている。それは、上記のデフォルトの出力書式、
@option{--tag} オプションを付けたときの出力書式、
それに BSD の逆順表示モード (reversed mode) の書式であり、最後のものは、デフォルトの書式に似ているが、
バイナリとテキストモードを区別する文字を使用しないものである。
@sp 1
そうした入力ファイルの各行に対して、@command{md5sum} は、そこに名前を記載されたファイルを読み込み、
その MD5 チェックサムを計算する。そして、算出したメッセージダイジェストが、
そのファイル名と同じ行にあるチェックサムと一致しなかった場合は、
そのファイルをテストに失敗したものとするのである。
両者が一致した場合は、テストにパスしたことになる。
デフォルトでは、有効な各行に対して標準出力にメッセージを 1 行づつ書き出し、
指名されているファイルがテストにパスしたかどうかを報告する。
また、すべてのチェックが完了したとき、テストに失敗したものが一つでもあれば、
警告メッセージを標準エラーに出力する。
この出力を抑制したければ、@option{--status} オプションを使用すればよい。
リストされたファイルの中に、オープンできなかったり、読み込めなかったりするものがあった場合や、
有効な行に書いてあるチェックサムが対応するファイルの実際の値と一致しなかった場合、
それに、有効な行が全く存在しなかった場合は、@command{md5sum} は 0 以外のステータスで終了する。
それ以外の場合は正常終了することになる。

@item --ignore-missing
@opindex --ignore-missing
@cindex verifying MD5 checksums
このオプションが役に立つのは、チェックサムの照合をするときだけである。
このオプションを指定すると、チェックサムを照合する際にファイルが存在しなくても、
実行に失敗したり、ステータス情報を出したりしなくなる。
ダウンロードしたファイルにチェックサムの長大なリストが付いているとき、
一部のファイルの照合をするのに便利である。

@item --quiet
@opindex --quiet
@cindex verifying MD5 checksums
このオプションが役に立つのは、チェックサムの照合をするときだけである。
このオプションを指定すると、チェックサムを照合する際、
検査に成功したファイルごとに 'OK' (訳注: 日本語では、「成功」または「完了」)
のメッセージを出さなくなる。ただし、ファイルが照合に失敗した場合は、
デフォルトと同じ 1 ファイル 1 行の形式で結果を報告する。
チェックサムに何らかの不一致があった場合は、失敗を総括した警告メッセージも標準出力に表示する。

@item --status
@opindex --status
@cindex verifying MD5 checksums
このオプションが役に立つのは、チェックサムの照合をするときだけである。
このオプションを指定すると、チェックサムを照合する際、デフォルトの
1 ファイルに付き 1 行の判定メッセージを出さなくなる。
また、照合の失敗があっても、それを総括した警告メッセージを出力することもない。
とは言え、ファイルのオープンや読み込みに失敗した場合は、
やはりそれぞれの診断結果を標準エラーに表示する。
リストされたすべてのファイルを読み込むことができ、しかも、すべてのファイルについて、
対応する MD5 チェックサムと矛盾がなければ、正常終了する。
それ以外の場合は、失敗があったことを示すステータスコードで終了する。

@item --tag
@opindex --tag
@cindex BSD output
BSD スタイルのチェックサムを出力する。
つまり、使用したチェックサムのアルゴリズムも表示するということだ。
GNU の拡張として、問題を起こしかねない文字を含むファイル名は、上述したようにエスケープされ、
さらに、行の先頭に エスケープの指標に使われたのと同じ
@samp{\} 文字が付けられる。@option{--tag} オプションはバイナリ・モードを意味し、
@option{--text} オプションと一緒に使うことは認められていない。
そんなことをサポートしても、出力の書式をむやみに繁雑にするだけで、
利益はほとんどないからである。

@item -t
@itemx --text
@opindex -t
@opindex --text
@cindex text input files
各入力ファイルをテキストとして扱う。すなわち、入力ファイルをテキストモードで読み込み、
出力に @samp{ } というフラグを付ける。このオプションは
@option{--binary} の反対である。バイナリファイルとテクストファイルを区別しない GNU
のようなシステムでは、このオプションがデフォルトである。
ほかのシステムでも、読み込みを標準入力から行い、その標準入力が端末であるときは、デフォルトになる。
ただし、@option{--tag} が使用されているときに、このモードがデフォルトになることはない。

@item -w
@itemx --warn
@opindex -w
@opindex --warn
@cindex verifying MD5 checksums
チェックサムを照合する際、MD5 チェックサムを記載した行の書式に正しくないものがあると、
その旨警告を発する。このオプションが役に立つのは、
チェックされる入力中の、数行を除いたすべての行が、有効なときだけである。

@item --strict
@opindex --strict
@cindex verifying MD5 checksums
チェックサムを照合する際、無効な入力行が 1 行でもあれば、
そうした行のすべてについて警告を発したのち、0 以外の終了ステータスで終了する。

@end table

@exitstatus


@node sha1sum invocation
@section @command{sha1sum}: SHA-1 ダイジェストの表示、または検査をする

@pindex sha1sum
@cindex SHA-1
@cindex 160-bit checksum
@cindex checksum, 160-bit
@cindex fingerprint, 160-bit
@cindex message-digest, 160-bit

@command{sha1sum} は、指定された各 @var{file} の 160-bit チェックサムを計算する。
このコマンドの使用法やオプションは、@command{md5sum} と全く同じである。
@xref{md5sum invocation}.

注意: SHA-1 ダイジェストは MD5 より安全であり、コリジョン
(collision、衝突。別のファイルが同一の指紋を持つこと) が起きたという話を聞いたことはない。
しかしながら、大量の --- と言っても非現実的なほどではない --- リソースがあれば、
コリジョンを作り出せることがわかっている。この理由から、
SHA-1 は、もっと安全な SHA-2 ハッシュ・アルゴリズムに徐々に移行すべきだと、一般に考えられている。
@xref{sha2 utilities}.


@node sha2 utilities
@section sha2 utilities: SHA-2 ダイジェストの表示、または検査をする

@pindex sha224sum
@pindex sha256sum
@pindex sha384sum
@pindex sha512sum
@cindex SHA-2
@cindex 224-bit checksum
@cindex 256-bit checksum
@cindex 384-bit checksum
@cindex 512-bit checksum
@cindex checksum, 224-bit
@cindex checksum, 256-bit
@cindex checksum, 384-bit
@cindex checksum, 512-bit
@cindex fingerprint, 224-bit
@cindex fingerprint, 256-bit
@cindex fingerprint, 384-bit
@cindex fingerprint, 512-bit
@cindex message-digest, 224-bit
@cindex message-digest, 256-bit
@cindex message-digest, 384-bit
@cindex message-digest, 512-bit

コマンド @command{sha224sum}, @command{sha256sum}, @command{sha384sum},
@command{sha512sum}
は、一まとめにして SHA-2 ハッシュと呼ばれる様々な長さのチェックサムを計算する
(それぞれ、224, 256, 384, 512 bits である)。
こうしたコマンドの使用法とオプションは、@command{md5sum} や @command{sha1sum}
と全く同じである。 @xref{md5sum invocation}.


@node Operating on sorted files
@chapter ソートしたファイルの操作

@cindex operating on sorted files
@cindex sorted files, operations on

以下のコマンドは、ソートしたファイルを操作 (生成) する。

@menu
* sort invocation::          テキストファイルを並べ替える。
* shuf invocation::          テキストファイルをシャッフルする。
* uniq invocation::          ファイルから重複を省く。
* comm invocation::          ソート済みの二つのファイルを一行づつ比較する。
* ptx invocation::           ファイル内容の permuted index を作成する。
* tsort invocation::         トポロジカル・ソート。
@end menu


@node sort invocation
@section @command{sort}: テキストファイルを並べ替える

@pindex sort
@cindex sorting files

@command{sort} は、指定されたファイルから読み込んだすべての行に対して、ソート
(sort、一定の基準に従った並べ替え)、マージ (merge、データの統合)、比較
(compare) を行う。ファイルが一つも指定されなかった場合や、@var{file} として
@samp{-} が指定された場合は、標準入力から読み込む。デフォルトでは、@command{sort}
は結果を標準出力に書き出す。

書式:

@example
sort [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@cindex sort stability
@cindex sort's last-resort comparison
多くのオプションが、@command{sort} が行を比較する方法に影響を及ぼす。
そこで、結果が期待どおりでないときは、@option{--debug}
オプションを使って、どうしてそうなったかを調べてみていただきたい。
二つの行の比較は、次のように行われる。@command{sort} は、対になる各フィールドを
(@option{--key} オプションを参照)、
コマンドラインで指定された順番で、そのフィールドに結びついた順序関係のオプションに従いつつ比較し、
相違が見つかるか、比較するフィールドがなくなるまでそれを続ける。
キーとなるフィールドが指定されていない場合は、デフォルトのキーである行全体が比較に使用される。
最後に、すべてのキーが同じだったときは、最後の手段として、@option{--reverse} (@option{-r})
以外の順序関係のどんなオプションも指定されていないかのように、行全体を比較する。
@option{--stable} オプションを指定すると、この最後の手段の比較
(@dfn{last-resort comparison}) を行わないようになり、
その結果、すべてのキー・フィールドが等価である行は、互いに対する元の順序がそのまま維持される。
@option{--unique} (@option{-u}) オプションも、最後の手段の比較を行わないようにする。
@vindex LC_ALL
@vindex LC_COLLATE

別の指定がなされていないかぎり、すべての比較は、@env{LC_COLLATE}
のロケールによって指定されている文字の照合順序で行われる。@footnote{POSIX
以外のロケールを使用すると (たとえば、@env{LC_ALL} を @samp{en_US}
に設定すると)、@command{sort} の出力が、見慣れない順序でソートされたものになるかもしれない。
その場合は、環境変数 @env{LC_ALL} を @samp{C} にすればよい。
注意すべきは、@env{LC_COLLATE} だけを設定したのでは、二つの問題が生じてしまうということだ。
一つは、@env{LC_ALL} も設定されている場合、@env{LC_COLLATE}
は無効だということ。二つ目は、@env{LC_CTYPE} が
(@env{LC_CTYPE} が設定されていないときは、@env{LANG} が)
@env{LC_COLLATE} と矛盾する値に設定されている場合、動作が未定義だということである。
たとえば、@env{LC_CTYPE} が @code{ja_JP.PCK} であるのに、
@env{LC_COLLATE} が @code{en_US.UTF-8} の場合、@command{sort} の動作は未定義なのである。}
行末の改行は、比較に当たっては、行の一部として扱われない。
入力ファイルの最後のバイトが改行でなければ、GNU の @command{sort} は黙って改行を追加する。
GNU の @command{sort} では (GNU のすべてのユーティリティについて規定されているとおり)、
入力行の長さに上限がない。すなわち、各行に含まれるバイト数に制限がない。

@command{sort} には三つの動作モードがある。ソート (これがデフォルト)、
マージ、それに、すでにソートされているかどうかのチェックである。
動作モードの変更には、以下のオプションを使用する。

@table @samp

@item -c
@itemx --check
@itemx --check=diagnose-first
@opindex -c
@opindex --check
@cindex checking for sortedness
指定されたファイルがすでにソートされているかどうかをチェックする。
ファイル全体がソート済みでない場合は、診断メッセージを出し、
順番から外れている最初の箇所を示してから、ステータス 1 で終了する。
ファイルがソート済みの場合は、正常終了する。
入力ファイルは、1 個しか指定できない。

@item -C
@itemx --check=quiet
@itemx --check=silent
@opindex -c
@opindex --check
@cindex checking for sortedness
指定されたファイルがすでにソート済みだったら、正常終了する。
さもなければ、ステータス 1 で終了。入力ファイルは、1 個しか指定できない。
このオプションは @option{-c} と同様だが、診断メッセージを出さない点が異なる。

@item -m
@itemx --merge
@opindex -m
@opindex --merge
@cindex merging sorted files
指定された複数のファイルを一つのグループとしてソートすることでデータの統合を行う。
各入力ファイルは、必ずそれぞれがソート済みでなければならない。
マージモードの代わりにソートモードを使えば、
そうした条件なしで、ソートとマージを行うことができる。
マージモードがあるのは、それが使える場合は、その方が高速だからである。

@end table

@cindex exit status of @command{sort}
終了ステータス:

@display
0: エラーが起きなかった。
1: @option{-c} や @option{-C} を付けて実行した際に、入力がソートされていなかった。
2: エラーが起きた。
@end display

@vindex TMPDIR
環境変数 @env{TMPDIR} が設定されていれば、@command{sort}
はその値をテンポラリ・ファイルを置くディレクトリとして @file{/tmp} の代わりに使用する。
@option{--temporary-directory} (@option{-T}) オプションは、環境変数よりさらに優先される。

以下に挙げるオプションは、出力する行の順序に影響を与える。
こうしたオプションは、グローバルなオプションとして指定することもできるし、
キーとなる特定のフィールドに対してのみ働くように指定することもできる。
キーとなるフィールドが全く指定されていない場合は、グローバルなオプションが行全体の比較に使用される。
キー・フィールドの指定がある場合は、グローバルなオプションは、
キー・フィールドのうち、それ自身のオプションが特に指定されていないフィールドに継承される。
POSIX 以前の @command{sort} のバージョンを使用している場合、グローバルなオプションが効果を持つのは、
それより後で指定されるキー・フィールドに対してだけなので、
移植を考慮したシェルスクリプトでは、グローバル・オプションを最初に指定した方がよい。

@table @samp

@item -b
@itemx --ignore-leading-blanks
@opindex -b
@opindex --ignore-leading-blanks
@cindex blanks, ignoring leading
@vindex LC_CTYPE
各行中でソートに使うキーを捜すときに、文字の前にある空白を無視する。
デフォルトの空白は、スペースまたはタブだが、@env{LC_CTYPE} のロケールによっては違うかもしれない。
なお、次のことに留意してほしい。
空白は、使用しているロケールの照合ルールによっては無視されることがあるが、
このオプションを指定しておかないと、@option{-k} オプションで指定されるキー中の文字の位置に関して、
空白が意味を持つことになる。

@item -d
@itemx --dictionary-order
@opindex -d
@opindex --dictionary-order
@cindex dictionary order
@cindex phone directory order
@cindex telephone directory order
@vindex LC_CTYPE
電話帳 (@dfn{phone directory}) 順にソートする。
すなわち、ソートする際にアルファベット、数字、空白以外のすべての文字を無視する。
デフォルトのアルファベットと数字は ASCII のそれであり、空白はスペースまたはタブだが、
後者は @env{LC_CTYPE} のロケールによっては違うかもしれない。

@item -f
@itemx --ignore-case
@opindex -f
@opindex --ignore-case
@cindex ignoring case
@cindex case folding
@vindex LC_CTYPE
アルファベットの小文字を、一回すべて対応する大文字に直してから、比較する。
その結果、たとえば、@samp{b} と @samp{B} は等価なものとしてソートされる。
どの文字がどのタイプに属するか (訳注: たとえば、大文字か小文字か)
を決めているのは、@env{LC_CTYPE} のロケールである。@option{--unique}
オプションと一緒に使用したとき、小文字を使っている等価な行があると、
その小文字の行は捨てられることになる。(大文字を使っている等価な行の方を捨てる方法は、
現在のところ存在しない。(@option{--reverse} オプションがあっても、
それが効果を発揮するのは、小文字の行が捨てられた後の最終結果に対してだけなのだ。))
(訳注: 実際の動作はこの説明と少し違う。最近の @command{sort} では、
@option{--unique} と併せて使用した場合、小文字を使っている行が捨てられるのではなく、
等価な行のうち、最初に現れた行が残り、それ以外のすべてが捨てられるようである。)

@item -g
@itemx --general-numeric-sort
@itemx --sort=general-numeric
@opindex -g
@opindex --general-numeric-sort
@opindex --sort
@cindex general numeric sort
@vindex LC_NUMERIC
各行の先頭部分を倍精度浮動小数点数 (long double-precision floating
point number) に変換して、数値としてソートする
(訳注: 実際には、各行の先頭と言うより、比較される各フィールドの先頭部分を対象にする)。
@xref{Floating point}.  オーバーフロー、アンダーフロー、変換エラーが起きても、
通知しない。行の並ぶ順番は以下のようになる。

@itemize @bullet
@item
数字で始まっていない行 (すべて同じ数値と見なされる)。
@item
NaN (IEEE の浮動小数点演算で使う ``Not a Number'' を表す値)
を一貫した、ただし、マシンに依存する順番で並べる。
@item
マイナスの無限大。
@item
有限数を数値として昇順で並べる (@math{-0} と @math{+0} は等価とする)。
@item
プラスの無限大。
@end itemize

このオプションを使うのは、他に方法がないときのみにすること。
処理速度が @option{--numeric-sort} (@option{-n}) よりずっと遅いし、
浮動小数点数に変換するとき、情報を失う恐れがあるからだ。

@item -h
@itemx --human-numeric-sort
@itemx --sort=human-numeric
@opindex -h
@opindex --human-numeric-sort
@opindex --sort
@cindex human numeric sort
@vindex LC_NUMERIC
数値としてソートする。その際、ソートを、まず数が正か負かによって行い
(負の数、ゼロ、正の数の順)、次に SI 接尾辞 によって行い
(接尾辞なし、@samp{k} や @samp{K}、そして @samp{MGTPEZY} の順  @pxref{Block size})、
最後に数値によって行う。たとえば、@samp{1023M} は @samp{1G} の前に来る。
SI 接尾辞として @samp{M}(メガ) は @samp{G} (ギガ) の前になるからだ。
つまり、このオプションでソートする対象は、接尾辞の意味が 1000
の累乗か、1024 の累乗かを問わず、一貫したやり方で、
数値の規模にもっともふさわしい接尾辞を付けられている数値である。
従って、このオプションは、@command{df}, @command{du}, @command{ls}
などのコマンドに @option{--human-readable} や @option{--si}
オプションを付けて実行したときの、一回分の出力をソートするのに用いられる。
数値の書式は、@option{--numeric-sort} の場合と同じであり
(訳注: すなわち、数値の前に付けた @samp{+} 符号を理解しない)、
SI 接尾辞は、数値の後ろに直接続いていなければならない。
なお、@command{numfmt} コマンドを使用することも考慮していただきたい。@command{numfmt}
を使用すれば、数値をソートした後で、人間に読みやすい形に整形し直すことができるので、
たいていの場合 @command{sort} の対象に、より精密な数値を使うことが可能になるからだ。

@item -i
@itemx --ignore-nonprinting
@opindex -i
@opindex --ignore-nonprinting
@cindex nonprinting characters, ignoring
@cindex unprintable characters, ignoring
@vindex LC_CTYPE
表示できない文字を無視する。どの文字がどのタイプに属するかを決めているのは、
@env{LC_CTYPE} のロケールである。より強力なオプションである
@option{--dictionary-order} (@option{-d}) が一緒に指定されていると、
このオプションは効果を持たない。

@item -M
@itemx --month-sort
@itemx --sort=month
@opindex -M
@opindex --month-sort
@opindex --sort
@cindex months, sorting by
@vindex LC_TIME
比較する部分の先頭が、0 個以上の空白に続いて、月名の短縮形になっているとき、
すべての文字を大文字に直して @samp{JAN} < @samp{FEB} < @dots{} < @samp{DEC}
の順序で比較する。月名として無効な名前は、有効な月名より前に置かれる。
月名のつづりを決めているのは、@env{LC_TIME} カテゴリのロケールである
(訳注: だから、英語の月名によってソートするには、ロケールを英語か
C にしておく必要がある)。デフォルトの空白は、スペースまたはタブだが、
@env{LC_CTYPE} のロケールによっては違うかもしれない。

@item -n
@itemx --numeric-sort
@itemx --sort=numeric
@opindex -n
@opindex --numeric-sort
@opindex --sort
@cindex numeric sort
@vindex LC_NUMERIC
数値としてソートする。数値は行頭から始まり
(訳注: 比較する位置が指定されていれば、実は行頭でなくてもよい)、
任意個の空白、必要なら @samp{-} 符号、それに、0 個以上の数字から構成される。
数値は、区切り記号で 3 桁づつ区切られていてもよく、小数点記号と 0 個以上の数字が続いていてもよい。
数字がない場合は、@samp{0} と見なされる。小数点記号や桁区切りの記号を規定しているのは、
@env{LC_NUMERIC} のロケールである。デフォルトの空白は、スペースまたはタブだが、
@env{LC_CTYPE} のロケールによっては違うかもしれない。

比較は厳密であり、丸めによるエラーはない。

このオプションは、数値に前置した @samp{+} 符号や、指数表記を理解しない。
そうした文字列を数値として比較するには、@option{--general-numeric-sort}
(@option{-g}) を使用するべきである。

@item -V
@itemx --version-sort
@opindex -V
@opindex --version-sort
@cindex version number sort
バージョン名とバージョン番号によってソートする。標準用法のソートと動作が似ているが、
10 進数の数字が連続する各部分をインデックス番号やバージョン番号と見なし、
(文字列としてではなく) 数値として取り扱う点が違う。
(@xref{Details about version sort}.)

@item -r
@itemx --reverse
@opindex -r
@opindex --reverse
@cindex reverse sorting
比較の結果を逆順にする。その結果、出力ではより大きなキーの値を持つ行が、
後ではなく、先に表示される。

@item -R
@itemx --random-sort
@itemx --sort=random
@opindex -R
@opindex --random-sort
@opindex --sort
@cindex random sort
ソートを行うのに、入力中のキーをハッシュしてから、そのハッシュ値をソートするという方法を用いる。
ハッシュ関数はランダムに選択する。
その際、衝突 (collision) が絶対起きないように関数を選択するので、
値の違うキーは必ず違うハッシュ値を持つようになる。
これは、入力のランダムな並び替えに似ているが (@pxref{shuf invocation})、
同じ値を持つキーは一緒に並べるという点が、異なっている。

ランダムソートを行うフィールドが複数指定されている場合は、
ランダムに選択された一つの同じハッシュ関数が、すべてのフィールドで使用される。
フィールドごとに別のランダムなハッシュ関数を使うようにするには、
@command{sort} を複数回呼び出せばよい。

ハッシュ関数の選択は、 @option{--random-source} オプションの影響を受ける。

@end table

その他のオプション。

@table @samp

@item --compress-program=@var{prog}
テンポラリ・ファイルを @var{prog} というプログラムで圧縮する。

@var{prog} プログラムは、
引数が一つも存在しない場合に、標準入力を圧縮して標準出力に書き出し、
@option{-d} オプションの指定があれば、
標準入力を展開して標準出力に書き出すものでなければならない。

@var{prog} が 0 以外のステータスで終了した場合は、
エラーメッセージを出して、@command{sort} の実行を中止する。

@var{prog} の指定中でホワイトスペース (訳注: 空白、タブ、改行など)
やバックスラッシュ文字を使ってはならない。
そうした文字は、将来の使用のために、予約されている。

@filesZeroFromOption{sort,,ソートした結果}

@item -k @var{pos1}[,@var{pos2}]
@itemx --key=@var{pos1}[,@var{pos2}]
@opindex -k
@opindex --key
@cindex sort field
行中の @var{pos1} から @var{pos2} までの部分 (両者を含む)
を、ソートの対象となる場所として指定する。@var{pos2} が省略されている場合は、
@var{pos1} から行末までがソートの対象になる。

最も単純な形の場合、@var{pos} で指定するのは、何番目のフィールドかということである (1 から数える)。
フィールドは 1 個以上の空白文字によって区切られるが、
デフォルトでは、そうした空白文字は比較するとき各フィールドの先頭に含まれることになる。
空白文字の扱い方を調整する方法については、@option{-b} や @option{-t}
オプションの説明をご覧いただきたい。

より一般的に言うと、各 @var{pos} は、@samp{@var{f}[.@var{c}][@var{opts}]} という形式を取る。
@var{f} は、比較に使用するフィールドは何番目かということであり、
@var{c} は、そのフィールドの始めから数えて何番目の文字かということである。
フィールドや文字の位置は、1 から数える。
なお、@var{pos2} の文字の位置として 0 を指定すると、
そのフィールドの最後の文字を指すことになる。@samp{.@var{c}} が、@var{pos1}
で省略されている場合は、デフォルトの 1 (フィールドの最初の文字)
を指定したことになり、@var{pos2} で省略されている場合は、デフォルトの 0
(フィールドの最後の文字) を指定したことになる。
@var{opts} は順序関連のオプションであり、
これを指定することで、各キーを異なったルールでソートすることが可能になる。
詳細については後述しているので、参照していただきたい。
なお、キーは複数のフィールドにまたがることができる。

たとえば、二番目のフィールドでソートするには、@option{--key=2,2} (@option{-k 2,2})
を使用する。後述部分で、キーについてさらに説明し、
用例ももっとたくさん挙げているので、ご覧になっていただきたい。
また、@option{--debug} オプションの説明もご覧になるとよい。@option{--debug}
オプションを使うと、行中のどの部分がソートに使用されているかが明らかになる。

@item --debug
各行のソートに使われている部分を強調表示する。
また、使用法に問題がありそうなときは、標準エラーに警告メッセージを出す。

@item --batch-size=@var{nmerge}
@opindex --batch-size
@cindex number of inputs to merge, nmerge
一度にマージする入力ファイルの数を多くても @var{nmerge} 個までとする。

@var{nmerge} 個を越える入力ファイルをマージしなければならない場合、@command{sort}
は @var{nmerge} 個のファイルからなるグループを作ってマージし、
その結果をテンポラリ・ファイルに保存する。
そして、今度はそれを入力として使用して、後に続くマージを行うのである。

@var{nmerge} の値が大きいと、実行速度が向上し、ハードディスクの一時的な使用が減るかもしれないが、
その分、メモリの使用量と I/O が増加する。
逆に、@var{nmerge} の値が小さいと、メモリに対する要求と I/O は減少するかもしれないが、
その分、ハードディスクの一時的な使用が増え、実行速度が低下することになる。

@var{nmerge} の値は、2 以上でなければならない。デフォルトの値は 16 だが、
これは実装次第なので、将来は変わるかもしれない。

@var{nmerge} の値は、オープンできるファイル・ディスクリプタの上限によって制限されているかもしれない。
@samp{ulimit -n} や @samp{getconf OPEN_MAX}
コマンドを使えば、使用しているシステムの上限を知ることができる。
ただし、そうした上限がさらに小さくなっていることもあり、
使用中のプログラムがすでにファイルをいくつかオープンしている場合や、
オープンできるファイルの数についてオペレーティング・システムに他の制限がある場合が、
それに当たる。@var{nmerge} がリソースの上限を越えているときは、
@command{sort} は警告メッセージを出さずに、より小さい値を使用する。

@item -o @var{output-file}
@itemx --output=@var{output-file}
@opindex -o
@opindex --output
@cindex overwriting of input, allowed
出力を標準出力ではなく、@var{output-file} に書き出す。通常、@command{sort}
は、入力をすべて読み込んでから、@var{output-file} をオープンする。
従って、@code{sort -o F F} や @code{cat F | sort -o F}
といったコマンドを使って、ファイルを直接書き変えるやり方でソートをすることが可能だ。
とは言え、他の用途に使用されていないファイルに出力する方が、おおむね安全である。
ファイルを直接書き変えるやり方でソートしている最中に、システムがクラッシュしたり、
@command{sort} が入出力エラーなど、深刻なエラーに遭遇したりすると、データが失われてしまいかねないからだ。
また、@option{--merge} (@option{-m}) オプションを指定した場合は、@command{sort}
は、入力をすべて読み込む前に、出力ファイルをオープンするかもしれないので、
@code{cat F | sort -m -o F - G} といったコマンドは安全ではない。
@command{cat} が @file{F} の読み込みを済ます前に、@command{sort}
が @file{F} への書き込みを始めてしまうかもしれないからだ。

@vindex POSIXLY_CORRECT
比較的新しいシステムでも、環境変数 @env{POSIXLY_CORRECT} を設定している場合は、
たとえば @samp{sort F -o F} のように、入力ファイルの後に
@option{-o} オプションを置くことはできない。移植を考慮したスクリプトでは、
@option{-o @var{output-file}} を入力ファイルの前で指定するべきである。

@item --random-source=@var{file}
@opindex --random-source
@cindex random source for sorting
@var{file} をランダムデータのソースとして使用する。そのランダムデータは、
@option{-R} オプションでどのランダムハッシュ関数を使うかを決めるのに使用される。
@xref{Random sources}.

@item -s
@itemx --stable
@opindex -s
@opindex --stable
@cindex sort stability
@cindex sort's last-resort comparison

最後の手段の比較 (last-resort comparison) を行うのを止めて、@command{sort}
を入力順尊重 (stable) にする。このオプションは、フィールド指定オプションや、
@option{--reverse} (@option{-r}) 以外のグローバルな順序関係のオプションが指定されていなければ、効果を持たない。

(訳注: いわゆる stable sort (普通、安定ソート、固定ソートと訳される) である。
たとえば、@option{-b} オプションを使って、先行する空白を無視して比較した場合に、等価となる行があったとしよう。
通常では、それでも、最後の手段の比較によって、
先行する空白の有無も考慮に入れた行全体の比較が行われ、
等価な行に順序を付けることになるが、@option{--stable} オプションが指定されていると、
それをしないので、等価な行は入力されたときの順序で出力される)。

@item -S @var{size}
@itemx --buffer-size=@var{size}
@opindex -S
@opindex --buffer-size
@cindex size for main memory sorting
指定された @var{size} のメインメモリをソート用のバッファとして使用する。
デフォルトでは、@var{size} は 1024 バイトを 1 単位とする数値である。@samp{%}
を後ろに付けると、@var{size} は、物理メモリの何パーセントの意味になる。
後置するのが @samp{K} ならば、@var{size} は 1024 倍され (デフォルトと同じ)、
@samp{M} なら 1,048,576 倍、@samp{G} なら 1,073,741,824 倍される。
@samp{T}, @samp{P}, @samp{E}, @samp{Z}, @samp{Y} の後置も、同じ理屈である。
@samp{b} を後置すると、@var{size} はバイト数と見なされ、掛け算は行われない。

このオプションを指定すると、@command{sort} は作業を始めるとき、
デフォルトよりも大きかったり、小さかったりするソート用のバッファを使用することになり、
そのために動作速度が向上することがある。
とは言え、このオプションは起動直後のバッファサイズにしか影響を持たない。
@command{sort} が @var{size} を越える入力行に出会うと、バッファのサイズは
@var{size} 以上に拡大されるからである。

@item -t @var{separator}
@itemx --field-separator=@var{separator}
@opindex -t
@opindex --field-separator
@cindex field separator character
各行でソートに使うキーを探すとき、文字 @var{separator}
をフィールド・セパレータとして使用する。
デフォルトでフィールドを区分するのは、非空白文字と空白文字の間の空文字列である。
デフォルトの空白は、スペースとタブだが、@env{LC_CTYPE} のロケールによっては、
違うかもしれない。

たとえば、入力行が @w{@samp{ foo bar}} だったとしよう。@command{sort} はこれを
@w{@samp{ foo}} と @w{@samp{ bar}} のフィールドに分割する。
フィールド・セパレータは前後どちらのフィールドにも属さないことになっている。
そこで、@samp{sort @w{-t " "}} を使用した場合は、同じ入力行が、空っぽのフィールド、
@samp{foo}、それに @samp{bar} という 3 個のフィールドを持つことになる。
とは言え、キー・フィールドが、@option{-k 2} のように、行末まで続く場合や、
@option{-k 2,3} のように、範囲からなる場合は、
範囲の両端の間に存在するフィールド・セパレータは、キー・フィールド中にそのまま保持される。

ASCII NUL をフィールド・セパレータに指定するには、二文字からなる文字列
@samp{\0} を使用すればよい。@samp{sort -t '\0'} のようにだ。

@item -T @var{tempdir}
@itemx --temporary-directory=@var{tempdir}
@opindex -T
@opindex --temporary-directory
@cindex temporary directory
@vindex TMPDIR
テンポラリファイルの置き場所にディレクトリ @var{tempdir} を使用する。
この指定は、環境変数 @env{TMPDIR} に優先する。このオプションを二回以上指定すると、
テンポラリファイルの置き場所として、指定されたすべてのディレクトリが使用されることになる。
大規模なソートやマージを行って、I/O が足枷になる場合、このオプションを使って、
別のディスク上にあり、別のコントローラを使用している複数のディレクトリを指定すると、
実行速度が向上することがよくある。

@item --parallel=@var{n}
@opindex --parallel
@cindex multithreaded sort
平行して実行するソートの数を  @var{n} に設定する。デフォルトでは、
@var{n} は、利用できるプロセッサーの数になっている。ただし、上限は
8 であり、これは、それ以上にしても、速度の向上が頭打ちになるからだ。
@var{n} 個のスレッドを使用すると、メモリの使用量が log @var{n} 倍になることにも注意していただきたい。
参照 @ref{nproc invocation}.

@item -u
@itemx --unique
@opindex -u
@opindex --unique
@cindex uniquifying output

通常は、等価と評価される複数の行の内、最初のもののみを出力する。
@option{--check} (@option{-c} または @option{-C}) オプションが指定されている場合は、
等価と評価される行が、2 行連続していないかをチェックする
(訳注: 等価な行の連続があると、終了ステータスが 1 になる)。

また、このオプションを指定すると、デフォルトでは実行する、最後の手段の比較を行わなくなる。

コマンド @code{sort -u} と @code{sort | uniq} は等価である。
しかし、その等価性は、@command{sort} に何か他のオプションが付いたときにまでは及ばない。
たとえば、@code{sort -n -u} は、唯一性のチェックをするとき、行頭にある数字の並びの値しか調べないが、
@code{sort -n | uniq} の方は、行全体を検査するのである。@xref{uniq invocation}.

@optZeroTerminated
@macro newlineFieldSeparator
@option{-z} オプションを使用した場合、改行文字はフィールド・セパレータ扱いになる。
@end macro

@end table

@command{sort} の従来の (すなわち BSD と System V の) 実装では、
いくつかのオプションの解釈が互いに異なっていた。
とりわけ、@option{-b}, @option{-f}, @option{-n} についてそうだった。
GNU の sort は、POSIX 規格の動作に従っており、
これは、たいていの場合 (常にではない！)、System V の動作と同じである。POSIX
によると、@option{-n} はもはや @option{-b} を自動的に設定しない。
そこで、動作の一貫性のために、@option{-M} も同様に変更した。
この変更によって、フィールドを指定するとき、文字の位置がどこを指すかが、
微妙なケースでは変わってくるかもしれない。
これに対する唯一の対処法は、明示的に @option{-b} オプションを指定することである。

@option{-k} によってソート・フィールドを指定するとき、
その位置指定の後ろにオプション文字 @samp{MbdfghinRrV} のうち任意のものを付けることができる。
その場合、そのフィールドは、グローバルな順序関係のオプションを一切引き継がないことになる。
@option{-b} オプションは、フィールド限定のオプションとしては、
フィールド指定の開始位置と終端位置の片方、あるいは両方に付けることができるが、
グローバル・オプションから継承した場合は、両方に付いていることになる。
入力行が、行頭やフィールド間に複数の空白を含んでいる可能性があって、
しかも @option{-t} を使っていない場合は、@option{-k} を使用するとき、@option{-b}
と組み合わせるか、先行する空白を暗黙のうちに無視するオプション (すなわち @samp{Mghn})
と組み合わせるのが普通だ。そうしないと、フィールドにある先行する空白の数の違いのせいで、
結果がわけのわからないものになりかねないからである。

ソートフィールド指定の開始位置が、行末より後ろや、終端側のフィールドより後ろに来てしまうと、
そのフィールドは空になる。@option{-b} オプションを指定した場合、
フィールド指定の @samp{.@var{c}} の部分は、そのフィールドの最初の非空白文字から数えることになる。

@vindex _POSIX2_VERSION
@vindex POSIXLY_CORRECT
POSIX 1003.1-2001 に準拠していないシステムの @command{sort}
では、ソート・キーの指定に、@samp{+@var{pos1} [-@var{pos2}]}
という 0 から数える旧来の書式が使用できる。
@samp{sort +@var{a}.@var{x} -@var{b}.@var{y}} という旧来のコマンドは、
もし @var{y} が @samp{0} であるか、指定されていない場合は、
@samp{sort -k @var{a+1}.@var{x+1},@var{b}} と同じである。
それ以外の場合は、@samp{sort -k @var{a+1}.@var{x+1},@var{b+1}.@var{y}} と同じだ。

(訳注: 旧来の書式と新しい書式の違いは、フィールドやフィールド中の文字の位置を
0 から数えるか、1 から数えるかだけではない。
終端指定の位置が、旧来の書式ではキー・フィールドに含まれないのに対し
(つまり、その直前までなのに対し)、新しい書式では含まれるという違いもある。
そこで、上のようになる。なお、旧来の書式であれ、新しい書式であれ、
デフォルトのフィールド・セパレータは、
「非空白文字と空白文字の間の空文字列」であることに注意していただきたい。)

この旧来の動作は、環境変数 @env{_POSIX2_VERSION} を使えば、コントロールすることができる
(@pxref{Standards conformance})。また、@env{POSIXLY_CORRECT}
が設定されていないときに、@samp{-@var{pos2}} が存在する旧来の書式を使っても、有効になる。

標準的なホストで使用することを意図したスクリプトでは、旧来の書式は使わずに、
@option{-k} の方を使用するべきである。たとえば、@samp{sort +2} は使わない方がよい。
@samp{sort ./+2} と解釈されるか、@samp{sort -k 3} と解釈されるか、わからないからである。
そのスクリプトが、旧来の書式にしか対応していないホストでも動作しなければならないのなら、
スクリプト中で @samp{if sort -k 1 </dev/null >/dev/null 2>&1; then @dots{}}
といったテストを行って、どちらの書式を使うべきかを判断すればよい。

用例をいくつか挙げて、オプションの様々な組み合わせを説明する。

@itemize @bullet

@item
数値としてソートし、降順に (つまり、通常の逆に) 並べる。

@example
sort -n -r
@end example

@item
同時にソートを 4 つまで行う。バッファサイズを 10M にする。

@example
sort --parallel=4 -S 10M
@end example

@item
1 番目と 2 番目のフィールドを無視し、さらに 3 番目のフィールドの先頭の空白も無視して、
アルファベット順に並べる。ここで使っているキーは一つであり、
それは 3 番目のフィールドの最初の非空白文字に始まって、
各行の末尾まで続くすべての文字からなっている。

@example
sort -k 3b
@end example

@item
2 番目のフィールドを数値としてソートし、同点の決着を付けるために、
5 番目のフィールドの 3 番目と 4 番目の文字をアルファベット順でソートする。
フィールドの区切りには @samp{:} を使用する。

@example
sort -t : -k 2,2n -k 5.3,5.4
@end example

ここで注意していただきたいが、もし @option{-k 2,2n} の代わりに @option{-k 2n}
と書いたなら、@command{sort} は、2 番目のフィールドに始まり、行末まで続くすべての文字を、
主キー (primary key) として、それも「数値」のキーとして使用したことだろう。
@command{sort} を実行するたいていの場合について言えることだが、
複数のフィールドにまたがるキーを数値として使用しても、期待する結果は得られないものである。

もう一つ注意していただきたい。
上の例では、@samp{n} 修飾子を最初のキーのフィールド終端指定に付けている。
これは、@option{-k 2n,2} とか @option{-k 2n,2n}
とか指定しても、同じことだったろう。@samp{b} を除くすべての修飾子は、
キー指定のフィールド開始側に付けるか、フィールド終端側に付けるか、
あるいは、その両方に付けるかにかかわりなく、
付けられた「キー・フィールド全体」に適用されるのである。

@item
パスワードファイルを 5 番目のフィールドでソートする。このとき、
先頭の空白は無視する。5 番目のフィールドが同じ値になる行については、
3 番目のフィールドのユーザ ID 番号でソートする。
フィールドの区切りは、@samp{:} という文字である。

@example
sort -t : -k 5b,5 -k 3,3n /etc/passwd
sort -t : -n -k 5b,5 -k 3,3 /etc/passwd
sort -t : -b -k 5,5 -k 3,3n /etc/passwd
@end example

この三つのコマンドは同じ働きをする。
1 番目のコマンドは、最初のキーの開始位置では先行する空白を無視し、
二番目のキーを数値としてソートするように指定している。他の二つのコマンドは、
グローバル・オプションは修飾子がないソート・キーによって継承されるという特性を利用している。
この場合、継承がうまく働くのは、@option{-k 5b,5b} と
@option{-k 5b,5} が同じことだからだ (訳注: 「@option{-b} オプションは @dots{}
グローバル・オプションから継承した場合は、(開始位置と終端位置の)
両方に付いていることになる」ので、3 番目のコマンドは、@option{-k 5b,5b}
と指定するのと事実上等しい)。両者が同じになるのは、@samp{.@var{c}}
という文字位置を欠いたフィールド終端の指定では、
先頭の空白をスキップしてもしなくても、終端位置は変わらないからである。

@item
一群のログファイルをソートする。主キーとして IPv4 アドレスを使用し、
副キーとしてタイムスタンプを使用する。二つの行の主キーと副キーが全く同じ場合は、
入力されたときと同じ順番で、その行を出力する。ログファイルは、次のような行からなっている。

@example
4.150.156.3 - - [01/Apr/2004:06:31:51 +0000] message 1
211.24.3.231 - - [24/Apr/2004:20:17:39 +0000] message 2
@end example

フィールドは、ただ 1 個の空白で区切られている。
IPv4 アドレスのソートは辞書順 (lexicographically) で行う。
たとえば、212.61.52.2 は 212.129.233.201 の前に来る。
61 は 129 よりも小さいからだ。

@example
sort -s -t ' ' -k 4.9n -k 4.5M -k 4.2n -k 4.14,4.21 file*.log |
sort -s -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n
@end example

この例の場合は、@command{sort} を一回起動するだけでは、ことがすまない。
日付が空白 1 個のすぐ後に置かれているだけなのに対して、
IPv4 の構成要素は @samp{.} で区切られているからである。そこで、作業を分割し、
@command{sort} を 2 回起動している。1 回目はタイムスタンプでソートし、
2 回目は IPv4 アドレスでソートするわけだ。タイムスタンプは、
年、月、日のフィールドの順番でソートし、最後に、時・分・秒のフィールドでソートしているが、
それは @option{-k} オプションを使って、各フィールドを分離することで実現している。
時・分・秒を除いて、各キー・フィールドの終端を指定する必要はない。
@samp{n} や @samp{M} 修飾子は、フィールドの先頭にある数値や月名の短縮形に基づいてソートを行うが、
そうしたものは、フィールドの境界を越えられないからである。IPv4 アドレスのソートは、
辞書順で行っている。なお、二回目のソートで @samp{-s} を使っているのは、
主キーで一ヶ所にまとめられる行が、副キーによってソートされているようにするためである。
それに対して、一回目のソートで  @samp{-s} を使っているのは、
二つのソートの組み合わせ全体を入力順尊重 (stable) にするためだ。

@item
アルファベットの大文字小文字の違いを無視してソートし、その順番で
tags ファイルを作成する。

@smallexample
find src -type f -print0 | sort -z -f | xargs -0 etags --append
@end smallexample

この例では、@option{-print0}, @option{-z}, @option{-0} といったオプションを使っている。
そのため、空白などの特殊文字を含んでいるファイル名が、
ソート操作によって分断されることがない。

@c This example is a bit contrived and needs more explanation.
@c @item
@c Sort records separated by an arbitrary string by using a pipe to convert
@c each record delimiter string to @samp{\0}, then using sort's -z option,
@c and converting each @samp{\0} back to the original record delimiter.
@c
@c @example
@c printf 'c\n\nb\n\na\n' |
@c perl -0pe 's/\n\n/\n\0/g' |
@c sort -z |
@c perl -0pe 's/\0/\n/g'
@c @end example

@item
慣用句 DSU (Decorate Sort Undecorate) の手法 (訳注: 指標を付けて、
ソートして、指標を取る) を採用して、短いものから長いものへと、行を並べる。

@example
awk '@{print length, $0@}' /etc/passwd | sort -n | cut -f2- -d' '
@end example

一般に、あるデータが @command{sort} コマンドでは直接ソートできないとか、
効率が悪いというとき、そうしたデータをソートするのに、この手法が役に立つ。

@item
ディレクトリをランダムな順番でで並べる。ただし、各ディレクトリ内のファイルについては、
その順番を維持する。一例を挙げると、この方法で演奏リストを作成すれば、
アルバムはシャッフルするけれど、
各アルバム内の曲は通常のソート順で演奏するといったことが可能になる。

@example
ls */* | sort -t / -k 1,1R -k 2,2
@end example

@end itemize


@node shuf invocation
@section @command{shuf}: テキストをシャッフルする

@pindex shuf
@cindex shuffling files

@command{shuf} は、入力された行をランダムに並べ替えてから出力することによって、
入力のシャッフルを行う。どの並び替えが出力されるかは、確率的に等しい。

書式:

@example
shuf [@var{option}]@dots{} [@var{file}]
shuf -e [@var{option}]@dots{} [@var{arg}]@dots{}
shuf -i @var{lo}-@var{hi} [@var{option}]@dots{}
@end example

@command{shuf} には三つの動作モードがあり、それぞれ、入力行をどこから取得するかが違っている。
デフォルトでは、標準入力から行を読み込む。以下のオプションは、動作モードを変更する。

@table @samp

@item -e
@itemx --echo
@opindex -c
@opindex --echo
@cindex command-line operands to shuffle
コマンドラインの各オペランドを入力行として扱う。

@item -i @var{lo}-@var{hi}
@itemx --input-range=@var{lo}-@var{hi}
@opindex -i
@opindex --input-range
@cindex input range to shuffle
@var{lo} から @var{hi} の範囲の符号なしの 10 進整数を
1 行に 1 個含むファイルから入力があったかのように動作する。

@end table

@command{shuf} の他のオプションは、どの動作モードでも、その動作に影響を与える。

@table @samp

@item -n @var{count}
@itemx --head-count=@var{count}
@opindex -n
@opindex --head-count
@cindex head of output
最大でも @var{count} 行までしか出力しない。デフォルトでは、入力されたすべての行を出力する。

@item -o @var{output-file}
@itemx --output=@var{output-file}
@opindex -o
@opindex --output
@cindex overwriting of input, allowed
出力を、標準出力ではなく、@var{output-file} に書き出す。@command{shuf} は、
入力をすべて読み込んでから、@var{output-file} をオープンする。従って、
@code{shuf -o F <F} や @code{cat F | shuf -o F} というコマンドを使って、
ファイルを直接書き変える形でシャッフルしても安全である。

@item --random-source=@var{file}
@opindex --random-source
@cindex random source for shuffling
ランダムデータのソースとして  @var{file} を使用する。
そのランダムデータはどんな並べ替えになるかを決めるのに使用される。
@xref{Random sources}.

@item -r
@itemx --repeat
@opindex -r
@opindex --repeat
@cindex repeat output values
値の反復出力を行う。別の言い方をすると、置き換えるものについてそのつど選択を行う。
このオプションを使用した場合、出力は入力を並び替えたものになるのではない。
そうではなく、各出力行がすべての入力からランダムに選ばれるのである。
このオプションは、たいてい @option{--head-count} と組み合わせて使用する。
@option{--head-count} を指定しないと、@command{shuf} はいつまでも出力を続けることになる。

@optZeroTerminated

@end table

例を挙げる。

@example
shuf <<EOF
A man,
a plan,
a canal:
Panama!
EOF
@end example

@noindent
上記の結果は、こんな出力になるかもしれない。

@example
Panama!
A man,
a canal:
a plan,
@end example

@noindent
同様に、次のコマンドの出力は、

@example
shuf -e clubs hearts diamonds spades
@end example

@noindent
こうなるかもしれない。

@example
clubs
diamonds
spades
hearts
@end example

@noindent
下記は、@samp{shuf -i 1-4} というコマンドの出力の一例である。

@example
4
2
1
3
@end example

@noindent
上記のどの例でも、入力行は 4 行である。
従って、入力は 24 とおりに並べ替えることが可能であり、@command{shuf}
が生成するのは、そのどれか一つである。
一般的に言うと、入力行が @var{n} 行なら、@var{n}! とおりに
(@var{n} の階乗、すなわち、@w{@var{n} * (@var{n} - 1) * @dots{} * 1} とおりに)
並べ替えて、出力することができる。

@noindent
それぞれが 0 から 9 までの範囲にある数値を 50 回ランダムに出力するには、次のようにする。

@example
shuf -r -n 50 -i 0-9
@end example

@noindent
コイン・トス 100 回をシミュレートする。

@example
shuf -r -n 100 -e Head Tail
@end example

@exitstatus


@node uniq invocation
@section @command{uniq}: ファイルから重複を省く

@pindex uniq
@cindex uniquify files

@command{uniq} は、指定された @var{input} ファイルにある行を、重複を省いて書き出す。
ファイルが指定されていない場合や、@var{input} として
@samp{-} が指定されている場合は、標準入力を対象とする。

書式:

@example
uniq [@var{option}]@dots{} [@var{input} [@var{output}]]
@end example

デフォルトでは、@command{uniq} は入力された行を表示するとき、
隣接する同一行があれば、出力に重複する行が現れないように、最初の行だけを残して、
残りの行を捨ててしまう。また、オプションによっては、重複しない行を捨てることや、
すべての隣接する同一行を捨てることもできる。

入力はソートされている必要はないが、重複する入力行が検出されるのは、
それが隣接しているときだけである。もし、隣接していない重複行も捨てたいのなら、
@code{sort -u} を使うとよいだろう。 @xref{sort invocation}.

@vindex LC_COLLATE
比較には @env{LC_COLLATE} ロケール・カテゴリが指定しているルールを使用する。

@var{output} ファイルが指定されていない場合、@command{uniq} は標準出力に書き出す。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -f @var{n}
@itemx --skip-fields=@var{n}
@opindex -f
@opindex --skip-fields
重複の検査を行う前に、各行のフィールドを @var{n} 個スキップする。その行に
@var{n} 個より少ないフィールドしかない場合は、比較に空の文字列を使用する。
フィールドとは、少なくとも 1 個以上のスペースやタブで間を区切られた、スペースやタブを含まない文字の連続である。

互換性のために、@command{uniq} は @option{-@var{n}} という旧来のオプション書式をサポートしている。
新しいスクリプトでは、@option{-f @var{n}} の方を使うべきである。

@item -s @var{n}
@itemx --skip-chars=@var{n}
@opindex -s
@opindex --skip-chars
重複の検査を行う前に、@var{n} 文字スキップする。
その行に @var{n} 個より少ない文字しかない場合は、比較に空の文字列を使用する。
フィールドをスキップするオプションと、文字をスキップするオプションの両方を使っている場合は、
フィールドのスキップが先に行われる。

@vindex _POSIX2_VERSION
POSIX 1003.1-2001 に準拠していないシステムでは、@command{uniq} が
@option{+@var{n}} という旧来のオプションの書式をサポートしている。
この旧来の書式は、環境変数 @env{_POSIX2_VERSION} を使えば、コントロールできるが (@pxref{Standards
conformance})、
移植を考慮したスクリプトでは、この環境変数に動作が依存するコマンドの使用は、避けた方がよい。
たとえば、@samp{uniq +10} ではなく、@samp{uniq ./+10} や @samp{uniq -s 10}
を使うべきだ。前者では、@samp{+10} が、オプションかファイル名か、まぎらわしいからである。

@item -c
@itemx --count
@opindex -c
@opindex --count
各行に出現回数を付けて表示する。

@item -i
@itemx --ignore-case
@opindex -i
@opindex --ignore-case
行を比較するとき、アルファベットの大文字小文字を区別しない。

@item -d
@itemx --repeated
@opindex -d
@opindex --repeated
@cindex repeated lines, outputting
重複していない行を除去する。このオプションを単独で使った場合、@command{uniq}
は、連続する同一行のうち、最初の 1 行だけを表示し、それ以外の何も表示しない。

@item -D
@itemx --all-repeated[=@var{delimit-method}]
@opindex -D
@opindex --all-repeated
@cindex all repeated lines, outputting
入力行のうち、連続する同一行の二行目以降を除去せず、重複していない行だけを除去する。
このオプションが役に立つのは、主として、大文字小文字を無視するとか、
選択したフィールドのみを比較するとかいった、他のオプションと組み合わせて使うときである。
長い書式のオプションで使用できる @var{delimit-method} は、
省略可能であり、指定した場合は、重複行のグループ間の区切り方を指示することになる。
@var{delimit-method} は、以下の一つでなければならない。

@table @samp

@item none
重複行のグループ間に、区切りの印を置かない。@option{--all-repeated}
(@option{-D}) とのみ指定するのと同じことである。

@item prepend
重複行の各グループの前に改行を出力する。
@macro nulOutputNote
@option{--zero-terminated} (@option{-z}) を指定している場合は、
区切りの印として改行の代わりに、ゼロバイト (ASCII NUL) を使用する。
@end macro
@nulOutputNote

@item separate
重複行のグループ間を 1 個の改行で分離する。これは、@samp{prepend}
を使うのとほぼ同じだが、最初のグループの前に区切りの印を挿入しないのが異なっている。
それ故、ユーザが出力を直接見る場合に、より適しているかもしれない。@nulOutputNote
@end table

@macro ambiguousGroupNote
注意していただきたいが、グループ同士を改行で分離しているとき、
入力ストリームに複数の空行があると、出力がまぎらわしいものになる。
これを避けるには、入力を @samp{tr -s '\\n'} でフィルタリングして、
複数の空行をなくせばよい。
@end macro
@ambiguousGroupNote

@c FIXME: give an example showing *how* it's useful
このオプションは、GNU による拡張である。

@item --group[=@var{delimit-method}]
@opindex --group
@cindex all lines, grouping
すべての行を出力し、他と区別される各グループの間に区切りを入れる。
@nulOutputNote @var{delimit-method}
は省略可能であり、指定した場合は、グループ間の区切り方を指示することになる。
@var{delimit-method} は、以下の一つでなければならない。

@table @samp

@item separate
他と区別されるグループを 1 個の区切りの印で分離する。
これが、何も指定されていないときの、デフォルトの区切り方であり、
出力をユーザに直接見せる場合に適している。

@item prepend
他と区別される各グループの前に区切りの印を出力する。

@item append
他と区別される各グループの後ろに区切りの印を出力する。

@item both
他と区別される各グループの前後に区切りの印を出力する。
@end table

@ambiguousGroupNote

このオプションは、GNU による拡張である。

@item -u
@itemx --unique
@opindex -u
@opindex --unique
@cindex unique lines, outputting
重複する入力行のグループを表示するときは (訳注: すなわち、@option{--all-repeated}
(@option{-D}) オプションを使用しているときは)、グループの最後の行を表示しない。
このオプションを単独で使用する場合は、ユニークな
(訳注: この場合は、同一行が連続していないという意味) 行だけを表示し、それ以外の何も表示しない。

@item -w @var{n}
@itemx --check-chars=@var{n}
@opindex -w
@opindex --check-chars
各行で (フィールドや文字をスキップする指定があれば、スキップした後で)
文字を何個まで比較するかを指定する。デフォルトでは、行の残り全部が比較の対象になる。

@optZeroTerminated @newlineFieldSeparator

@end table

@exitstatus


@node comm invocation
@section @command{comm}: ソート済みの二つのファイルを一行づつ比較する

@pindex comm
@cindex line-by-line comparison
@cindex comparing sorted files

@command{comm} は、二つの入力ファイルの共通する行と独自な行を、標準出力に区別して書き出す。
@samp{-} というファイル名は、標準入力を意味している。

書式:

@example
comm [@var{option}]@dots{} @var{file1} @var{file2}
@end example

@vindex LC_COLLATE
入力ファイルは、@command{comm} に渡す前に、@env{LC_COLLATE}
のロケールによって規定されている照合順序でソートされていなければならない。
入力ファイルが改行以外の文字で終わっている場合は、自動的に改行が追加される。
@command{sort} コマンドをオプションなしで実行すると、@command{comm} の入力にふさわしいファイルが必ず得られる。

@cindex differing lines
@cindex common lines
@c FIXME: when there's an option to supply an alternative separator
@c string, append "by default" to the above sentence.
オプションを付けずに実行すると、@command{comm} は 3 列の出力を生成する。
1 列目は @var{file1} にのみある行であり、2 列目は @var{file2} にのみある行、そして
3 列目は両方のファイルに共通する行である。各列は、1 個のタブ文字で区切られる。

@opindex -1
@opindex -2
@opindex -3
@option{-1}, @option{-2}, @option{-3} というオプションは、対応する列
(と区切り記号) を表示しないようにする。
オプションについては、「共通オプション」の章も参照すること。 @ref{Common options}.

比較のための他のユーティリティとは違って、@command{comm} の終了ステータスは、
比較結果の如何によらない。@command{comm} は、正常終了すると 0 の終了コードを返す。
エラーがあれば、0 以外のステータスで終了する。

@macro checkOrderOption{cmd}
@option{--check-order} を指定した場合、入力がソートされていないと、
エラーメッセージを出して、実行を中断する。@option{--nocheck-order}
オプションを指定した場合は、入力がソートされていなくても、エラーメッセージを出すことはない。
どちらのオプションも指定されていない場合に、入力がソートされていないとの診断を下すのは、
@ifset JOIN_COMMAND
片方の入力ファイルにもう一方と対にならない行が見つかったときだけであり、
それも入力ファイルのどちらも空ではなく、中身を持っているときだけである。
@end ifset
@ifclear JOIN_COMMAND
片方の入力ファイルにもう一方と対にならない行が見つかったときだけである。
@end ifclear
入力ファイルがソートされていないと診断すると、@command{\cmd\}
は 0 以外のステータスで終了する (従って、そうした出力は使用するべきではない)。

入力ファイルがきちんとソートされていず、しかも、対にならない行を含む場合に、
@option{--nocheck-order} を指定して、そうしたファイルを @command{\cmd\}
で無理矢理処理しても、何か特定の結果をもたらすことは保証できない。
おそらく出力は、期待に添わないものになるだろう。
@end macro
@checkOrderOption{comm}

@table @samp

@item --check-order
入力ファイルのどちらかの内容がきちんとソートされていないと、
エラーメッセージを出して、実行に失敗する。

@item --nocheck-order
入力ファイルの内容がソートされた順番になっているかどうかを、
どちらのファイルについてもチェックしない。

その他のオプション。

@item --output-delimiter=@var{str}
出力における隣り合う列の間に、デフォルトのタブ文字 1 個ではなく、
@var{str} を出力する。

区切り記号の @var{str} は、空であってはならない。

@item --total
最後の行に要約を出力する。

通常の出力と同じように、1 列目は @var{file1} にのみある行の合計数、
2 列目は @var{file2} にのみある行の合計数、3 列目は両方のファイルに共通する行の合計数である。
さらに 4 列目に @samp{total} という文字が追加される。

次の例では、@command{comm} は通常の出力を省略して (@option{-123})、
要約のみを表示している。

@example
$ printf '%s\n' a b c d e     > file1
$ printf '%s\n'   b c d e f g > file2
$ comm --total -123 file1 file2
1       2       4       total
@end example

このオプションは GNU の拡張である (coreutils 8.26 から)。
移植を考慮したスクリプトで合計数を出したければ、@command{wc}
を使用するべきである。たとえば、上記の例なら、次のようにする。

@example
$ comm -23 file1 file2 | wc -l    # file1 にのみある行の行数
1
$ comm -13 file1 file2 | wc -l    # file2 にのみある行の行数
2
$ comm -12 file1 file2 | wc -l    # 両方のファイルに共通する行の行数
4
@end example

@optZeroTerminated

@end table

@node ptx invocation
@section @command{ptx}: パミューテド・インデックスを作成する

@pindex ptx

@command{ptx} の基本的な働きは、テキストファイルを読み込んで、
パミューテド・インデックスを作成することである。パミューテド・インデックスというのは、
各キーワードに前後の文脈を付けて索引項目にするインデックスのことだ。

(訳注: パミューテド・インデックスは、KWIC (Key Word In Context)
インデックスとも言われる。簡単に言えば、本文にあるとおり、
キーワードに前後の文脈を付けて項目として立てる索引のことである。たとえば、"The cow
jumped over the moon." という文があるとしよう。今、キーワードを角カッコ ([])
で示すとすると、@command{ptx} による一番簡単なパミューテド・インデックスの作成では、
この文から、

@example
[The] cow jumped over the moon.
The [cow] jumped over the moon.
The cow [jumped] over the moon.
The cow jumped [over] the moon.
The cow jumped over [the] moon.
The cow jumped over the [moon].
@end example

@noindent
という、キーワードの位置だけが違う 6 個の索引項目が作られ、
キーワードによってソートされて、出力される。
「パミューテド (permuted)」というのは、文中でキーワードが順番に移動するのを、
円順列 (cyclic permutation) に見立てているかららしい。
「順列索引」と訳されることもある。

上記の文を cow.txt というファイルに保存し、それに対して @option{-A} 
オプションのみを付けて @command{ptx} を実行してみよう。
その出力は、次のようになる。出力された行のほぼ中央にある 
(すなわち、少し長めの空白の後ろの) 単語がキーワードである。
大文字小文字を区別してアルファベット順に並んでいるのが、おわかりになるだろう。
各行頭にあるのは、@option{-A} オプションによって生成された参照箇所情報 
(ファイル名と行番号) である。

@example
$ echo "The cow jumped over the moon." >cow.txt
$ ptx -A cow.txt
cow.txt:1:  .                        The cow jumped over the moon
cow.txt:1:                     The   cow jumped over the moon.
cow.txt:1:                 The cow   jumped over the moon.
cow.txt:1: The cow jumped over the   moon.
cow.txt:1:          The cow jumped   over the moon.
cow.txt:1:     The cow jumped over   the moon.
@end example

パミューテド・インデックスの代表的な例としては、
英語などの聖書の巻末に付属している文脈付きの語句索引、「コンコーダンス」を挙げることができる。
実際、この文書でもコンコーダンスをパミューテド・インデックスの同義語として使用している。
なお、この @command{ptx} プログラムは、日本語に対応していない。)

@command{ptx} 実行の書式は次のうちのどちらかである。

@example
ptx [@var{option} @dots{}] [@var{file} @dots{}]
ptx -G [@var{option} @dots{}] [@var{input} [@var{output}]]
@end example

@option{-G} (または、それと等価な @option{--traditional}) オプションを指定すると、
GNU によるすべての拡張が無効になり、従来のモードで動作するようになる。
従って、いくつかの制限が課されるようになり、プログラムのオプションのデフォルトの値がいくつか変更される。
@option{-G} が指定されていない場合は、GNU による拡張が常に有効になる。
@command{ptx} に対する GNU の拡張については、この文書では折に触れて説明している。
拡張の詳細なリストについては、「GNU による @command{ptx} の拡張」の節を御覧になっていただきたい。
@xref{Compatibility in ptx}.

個々のオプションについては、以下に続く節で説明する。

GNU による拡張が有効になっていれば、オプションの後ろに 0 個以上の
@var{file} を指定することができる。@var{file} を一つも指定しない場合は、標準入力が読み込まれる。
@var{file} を 1 個以上指定した場合、それは入力ファイルの名前であり、
入力ファイルはすべて順番に、あたかもすべてのファイルが結合されているかのように読み込まれる。
とは言え、各ファイル同士は文脈的に完全に分離しており、
参照箇所情報の自動作成を指定している場合に、参照箇所のファイル名や行番号が指し示すのは、
個々の入力テキストファイルのそれである。
どの場合でも、@command{ptx} は、パミューテド・インデックスを標準出力に出力する。

GNU による拡張が有効になっていない場合、すなわち、プログラムが従来モードで動作する場合は、
オプションのほかに 0 から 2 個のパラメータを指定できる。パラメータがない場合、
プログラムは標準入力を読み込んで、標準出力にパミューテド・インデックスを出力する。
パラメータが 1 個だけの場合、それが示しているのは、標準入力の代わりに読み込まれるテキストファイル
(訳注: 上記書式の @var{input}) の名前である。
パラメータが二つある場合、それぞれが示しているのは、読み込み対象の @var{input}
ファイルと出力先の @var{output} ファイルの名前だ。
この場合、二番目のパラメータによって指定されたファイルの元の内容が破壊されることに、
くれぐれも気をつけていただきたい。この動作は、System V の @command{ptx}
との互換性を維持するために必要になっているものだが、
通常 GNU の規格では、オプションによって指定されるのではない出力パラメータを、使用しないように勧めている。

オプションの値や入力テキストファイルとして指定するいかなるファイルに対しても、
ファイル名の代わりに 1 個のダッシュ @samp{-} を使用することができる。
その場合は、標準入力が使われることになる。もっとも、この習慣をプログラム
1 回の起動につき 1 回以上使うのは、たぶん理屈に合わない。

@menu
* General options in ptx::   プログラム全体の動作に関係するオプション。
* Charset selection in ptx:: 使用している文字セットについて。
* Input processing in ptx::  入力のフィールドと文脈、及びキーワードの選択。
* Output formatting in ptx:: 出力フォーマットのタイプ、及びフィールドの幅。
* Compatibility in ptx::     
@end menu


@node General options in ptx
@subsection 一般オプション

@table @samp

@item -G
@itemx --traditional
すでに述べたように、このオプションは @command{ptx} に対する
GNU による拡張のすべてを無効にして、動作を従来モードに切り替える。

@item --help
簡単なヘルプメッセージを標準出力に表示し、それ以上の処理をせずに終了する。

@item --version
プログラムのバージョンを標準出力に表示し、それ以上の処理をせずに終了する。

@end table

@exitstatus


@node Charset selection in ptx
@subsection @command{ptx} が使用する文字セット

@c FIXME:  People don't necessarily know what an IBM-PC was these days.
現在の設定では、@command{ptx} プログラムは、入力ファイルが符号化に
8-bit の ISO 8859-1 コード (Latin-1 文字セットとも言われる)
を使用していると見なすようになっている。
ただし、MS-DOS 用にコンパイルされている場合は別で、
その場合は、IBM-PC の文字セットが使用される (GNU の @command{ptx} が
MS-DOS マシンで使えるかどうか、今ではわからないけれど)。
7-bit ASCII と比べると、ISO 8859-1 の文字セットは、アルファベットの部分が異なっている。
そのため、正規表現におけるマッチングの振る舞いが変わってくる。
キーワードに対するデフォルトの正規表現が (訳注: つまり、GNU の拡張が有効なときの
@samp{\w+} が)、英語で使用しない文字や、ウムラウトやアクセントのような発音区別符の付いた文字を受け入れることになるのである。
とは言え、キーワードのソート方法は今だに大雑把であり、使用している文字セットの順序にきわめて盲目的に従っている。

@table @samp

@item -f
@itemx --ignore-case
@opindex -f
@opindex --ignore-case
ソートするとき、小文字を大文字と同じものとして扱う。

@end table


@node Input processing in ptx
@subsection 単語の選択と入力の処理

@table @samp

@item -b @var{file}
@itemx --break-file=@var{file}
@opindex -b
@opindex --break-file

このオプションを使えば、単語を構成するのはどんな文字かを、@option{-W}
とは別のやり方で定義することができる。このオプションでファイルを指名し、
そこに、単語の構成要素になることができない文字のリストを入れておくのである。
このファイルは、@dfn{Break file} と呼ばれる。Break file
に含まれていないいかなる文字も、単語の構成要素になるわけだ。@option{-b}
と @option{-W} の両方のオプションが指定されている場合は、@option{-W}
の方が優先され、@option{-b} は無視される。

GNU の拡張が有効になっているとき、改行を単語区切り文字 (break character)
にしない唯一の方法は、単語区切り文字をすべて Break file に書き込み、
そこに改行を全く含めないことである。Break file 末尾の改行も除かなければならない。
GNU の拡張が無効な場合、スペース、タブ、改行は、それが Break file
に含まれていなくても、常に単語区切り文字と見なされる。

@item -i @var{file}
@itemx --ignore-file=@var{file}
@opindex -i
@opindex --ignore-file

このオプションで指名するファイルには、
出力するコンコーダンスでキーワードとして採用しない単語のリストを入れておく。
このファイルは、@dfn{Ignore file} と呼ばれる。
このファイルは、1 行 1 単語の形式であり、単語の分離は常に行末によって行われて、
@option{-S} オプションの値の影響を受けることはない。

@item -o @var{file}
@itemx --only-file=@var{file}
@opindex -o
@opindex --only-file

このオプションで指名するファイルには、
出力するコンコーダンスでキーワードとして採用する単語のリストを入れておく。
このファイルに書かれていないどんな単語も、キーワードとして採用されることはない。
このファイルは、@dfn{Only file} と呼ばれる。
このファイルは、1 行 1 単語の形式であり、単語の分離は常に行末によって行われて、
@option{-S} オプションの値の影響を受けることはない。

Only file として使われるデフォルトのファイルは存在しない。Only file
と Ignore file の両方が指定されている場合に、ある単語がキーワードと見なされるのは、
その単語が Only file に存在し、しかも Ignore file に存在しないときだけである。

@item -r
@itemx --references
@opindex -r
@opindex --references

各入力行において、行頭にあるホワイトスペース以外の文字の連続を参照箇所情報
(訳注: たとえば、ファイル名、ページ番号、行番号など)
として扱うようにする。この参照箇所情報は、その入力行がどこにあるかを、
作成されるパミューテド・インデックス中で示すために用いられる。
参照箇所情報の生成についての詳細は、次節「出力のフォーマット」を御覧いただきたい。
@xref{Output formatting in ptx}.
このオプションを使用すると、@option{-S} オプションのデフォルトの値が変更されることになる
(訳注: すなわち、GNU の拡張が有効な場合も、@option{-S} オプションのデフォルト値が文末ではなく、行末になる)。

このオプションを使用したとき、@command{ptx} プログラムは、参照箇所情報が出力される文脈に混入しないようにするが、
その試みはそれほど徹底したものではない。しかし、文脈が改行できちんと終止していれば、
@command{ptx} はその試みに成功する。もし、@option{-r} オプションが
@option{-S} オプションのデフォルト値とともに使われているか、
あるいは、GNU の拡張が無効になっているならば、この条件は必ず満たされることになる。
従って、その場合は、参照箇所情報が出力される文脈からきちんと分離される。

(訳注: 文脈 (context) というのは、
出力については、キーワードとその前後と考えておけばよいが、入力について言うと、
@command{ptx} が操作の対象にする本文の単位 --- 入力のまとまり --- を指すことになる。
@option{-S} の値によって、普通は文か、行になる。)

@item -S @var{regexp}
@itemx --sentence-regexp=@var{regexp}
@opindex -S
@opindex --sentence-regexp

このオプションでは、行の終わり、または文の終わりを示す正規表現を指定する。

(訳注: もう少し説明すると、このオプションで指定するのは、
入力を何で区切るかということである。改行で区切れば、いわゆる行が、@command{ptx}
の操作の対象となる入力のまとまり (入力の単位) になり、
ピリオドなどで区切れば、いわゆる文が、入力のまとまりになる。
このまとまりが @command{ptx} にとっての文脈でもある。
ただし、出力では、文脈のすべてが表示されるとはかぎらない。
なお、そうしたければ、行末や文末以外で入力を区切ることもできる。)

実際のテキストでは、ここで指定される正規表現のみが、
行の終わりや文の終わりの指標として使われているとはかぎらない。
また、入力の区切りに何を指定しようとも、このオプションの外で特別な意味を持つことはない
(訳注: すなわち、オプション @option{-A}, @option{-i}, @option{-o}
などには影響が及ばない)。デフォルトでは、GNU の拡張が有効なとき、@option{-r}
オプションが指定されていなければ、文の終わりの方が入力の区切りとして使われる。
その場合は、GNU Emacs から取り込まれた次の正規表現が使用される。

@example
[.?!][]\"')@}]*\\($\\|\t\\|  \\)[ \t\n]*
@end example

GNU の拡張が無効になっている場合や、@option{-r} オプションが指定されている場合は、
行の終わりの方が入力の区切りとして使用される。
その場合、デフォルトの正規表現は、単に次のものである。

@example
\n
@end example

空の @var{regexp} を使用するのは、行末や文末の認識を全く無効にするのと同じである。
その場合、ファイル全体が、たった 1 個の長い行、あるいは、長い文と見なされることになる。
ユーザとしては、オプション @option{-F ""}
を使用して、省略の印の生成も全く行わないようにしたくなるかもしれない。
@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
Manual}.

キーワードがたまたま入力行や入力文の先頭近くにあると、
出力する文脈行の行頭に、使用しない領域が生ずることがよくある。
また、キーワードが入力行や入力文の末尾近くにあると、
出力する文脈行の行末に、使用しない領域がしばしば生ずる。
@command{ptx} プログラムは、その文脈を折り返して、そうした不使用領域を埋めようと試みる。
すなわち、その入力行や入力文の後続する部分 (@var{tail}) を使って、
出力する行の左にある不使用領域を埋め、その入力行や入力文の先行する部分
(@var{head}) を使って、出力する行の右にある不使用領域を埋めるのである。

このオプションの引数中では、ユーザーの便宜のために、
C 言語由来のよく使うバックスラッシュ・エスケープシーケンスの多くが、@command{ptx}
そのものによって認識され、対応する文字に変換されるようになっている。

@item -W @var{regexp}
@itemx --word-regexp=@var{regexp}
@opindex -W
@opindex --word-regexp

このオプションでは、各キーワードとなる単語とはどのようなものかを示す正規表現を指定する。
デフォルトでは、GNU の拡張が有効になっていれば、単語とはアルファベットの文字の連続である。
すなわち、使用される正規表現は @samp{\w+} だ。
GNU の拡張が無効な場合、デフォルトで単語と見なされるのは、
何であれ、スペース、タブ、改行で区切られているものである。
この場合、使用される正規表現は @samp{[^ \t\n]+} になる。

@var{regexp} に空の文字列を指定するのは、このオプションを使用しないのと同じことである。
@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
Manual}.

このオプションの引数中では、ユーザーの便宜のために、
C 言語で見られるような、よく使うバックスラッシュ・エスケープシーケンスの多くが、
@command{ptx} そのものによって認識され、対応する文字に変換されるようになっている。

@end table


@node Output formatting in ptx
@subsection 出力のフォーマット

出力のフォーマットを決めるのは、主として @option{-O} と @option{-T} オプションだが、
両者については、以下のオプション一覧で説明している。@option{-O} も @option{-T}
も指定されず、しかも、GNU の拡張が有効な場合、@command{ptx} プログラムは、
ダム端末に適した出力フォーマットを選択する。
各キーワードは一行の中央に表示され、前後の文脈がその左右に出力される。
コンコーダンスとしての出力が一目でわかるように
(訳注: すなわち、どれがキーワードで、どれがその前後の語句かわかりやすいように)、
各フィールドはきちんと揃えられる。おまけの機能として、次のものがある。
参照箇所情報の自動作成が @option{-A} オプションによって選択され、
参照箇所が左側の文脈の前に表示される場合には
(すなわち、@option{-R} オプションが選択されていない場合には)、
参照箇所の後ろにコロンが追加される。こうしておくと、参照箇所を
GNU Emacs の @code{next-error} 処理にうまく渡せるようになるのである。
このデフォルトの出力フォーマットでは、改行やタブのようなホワイトスペース文字は、
それぞれ単にただ 1 個のスペースに変換されるだけであり、
連続するスペースをわざわざ圧縮するようなことは行われない。
この動作は、将来変更されるかもしれない。そうしたホワイトスペース文字を除いて、
使用している 256 文字からなる文字セット中のほかのすべての文字は、
入力から出力へと手を加えずにそのまま送り出される。

出力フォーマットは、以下のオプションによって、さらに制御される。

@table @samp

@item -g @var{number}
@itemx --gap-size=@var{number}
@opindex -g
@opindex --gap-size

出力行の各フィールドは、ホワイトスペースによって区切られるが、
そのフィールド同士の間隔の最小サイズを指定する。

@item -w @var{number}
@itemx --width=@var{number}
@opindex -w
@opindex --width

最終的に出力される各行の最大長を指定する。
参照箇所を使用する際、その長さが最大長に含まれるかどうかは、
@option{-R} オプションを付けるか付けないかよって決まる。
@option{-R} オプションを指定しない場合、
すなわち、参照箇所が左の文脈より前に表示される場合は、すべての参照箇所中の最大長が、
出力行の最大長の長さの内に含まれることになる。@option{-R}
オプションを指定した場合、すなわち、参照箇所が右の文脈より後に表示される場合は、
参照箇所や、それに先行するフィールドの区切りが占める領域は、
出力行の最大長の長さに含まれない。

@item -A
@itemx --auto-reference
@opindex -A
@opindex --auto-reference

参照箇所情報の自動生成を選択する。
ファイル名と行番号からなる参照箇所が自動的に生成されて、各入力行に付くことになる。
ファイル名と行番号は 1 個のコロンで区切られる。
ただし、標準入力から読み込んでいる場合は、ファイル名は空になる。
@option{-A} と @option{-r} の両方のオプションが指定されている場合は、
入力中にある参照箇所情報が読み込まれた上で本文から外されることは @option{-r}
単独の場合と同じだが、出力時に使用されるのは、自動生成された参照箇所の方である。
すなわち、入力中にある参照箇所情報は、自動生成されたもので置き換えられる。

@item -R
@itemx --right-side-refs
@opindex -R
@opindex --right-side-refs

デフォルトの出力フォーマットでは、@option{-R} オプションを使用しない場合、
@option{-r} や @option{-A} オプションの働きによって生成される参照箇所は、
出力行の左の端、すなわち、左の文脈の前に表示される。それに対して、
デフォルトの出力フォーマットで @option{-R} オプションを指定した場合、
参照箇所が表示されるのは、各出力行の右端、すなわち、右の文脈の後ろになる。
ほかのいかなる出力フォーマットにおいても、基本的に @option{-R}
オプションは無視されるが (訳注: デフォルト以外の出力フォーマットでは、
@option{-R} オプションがあってもなくても、参照箇所は右端に出力される)、
それでも、@option{-R} オプションが付いていると、参照箇所の長さが、@option{-w}
で指定した出力行全体の長さの内に入らないという働きだけは残る。

このオプションは、GNU の拡張が無効であるときは、常に自動的に選択される。

@item -F @var{string}
@itemx --flag-truncation=@var{string}
@opindex -F
@opindex --flag-truncation

このオプションを指定すると、出力に省略があった場合、それを示すために文字列 @var{string}
を使用するようになる。ほとんどの出力フィールドは、理論上では、@option{-S}
オプションで何を選択するかによって、現在の行、または、現在の文の、先頭や末尾に向かって伸びて行くものである。
しかし、@option{-w} オプションによって長さを変更できるとは言え、
出力行には許される最大長というものがあり、
その最大長はさらにさまざまな出力フィールドで使用する領域に分割されている。
従って、フィールドは、それを収納する現在の出力行の先頭や末尾を越えて伸ばすことができないために、
切り詰めなければならないことがあり、そういうときに、省略が行われるのである。
省略の指標として使用されるデフォルトの文字列は、1 個のスラッシュである。
これは、@option{-F /} と指定した場合と同じだ。

@var{string} には、@option{-F @dots{}} のように 1 個以上の文字を指定してもよい。
また、@var{string} が空文字列 (@option{-F ""}) の場合には、
省略のフラグは立てられないことになり、従って、省略の指標は一切付加されない。

このオプションの引数中では、ユーザーの便宜のために、
C 言語で見られるような、よく使うバックスラッシュ・エスケープシーケンスの多くが、
@command{ptx} そのものによって認識され、対応する文字に変換されるようになっている。

@item -M @var{string}
@itemx --macro-name=@var{string}
@opindex -M
@opindex --macro-name

@command{nroff} や @command{troff}、あるいは @TeX{}
で処理するのにふさわしい出力フォーマットを生成するとき、
@samp{xx} の代わりに使用する別の文字列 @var{string} を指定する。
(訳注: @option{-O} や @option{-T} オプションを参照。)

@item -O
@itemx --format=roff
@opindex -O
@opindex --format=roff

出力フォーマットとして、@command{nroff} や @command{troff}
で処理するのに適した形式を選択する。各出力行は次のようになる。
(訳注: 下記の @var{tail} と @var{head} については、前節 @option{--sentence-regexp}
オプションの説明の終わりから 2 番目のパラグラフをご覧いただきたい。
@var{ref} は参照箇所である。)

@smallexample
.xx "@var{tail}" "@var{before}" "@var{keyword_and_after}"@c
 "@var{head}" "@var{ref}"
@end smallexample

従って、あとは、出力の整形を担当する roff のマクロ @samp{.xx}
を出力ファイルに書き込めばよいことになる。この出力フォーマットは、
GNU の拡張が無効なときのデフォルトである。@samp{xx} を別のマクロ名に変更するには、
@option{-M} オプションを使用すればよい
(訳注: @option{-M "xx"} のように、@samp{xx} の部分のみ指定する)。

この出力フォーマットでは、改行やタブのような非表示文字は、
それぞれただ 1 個のスペースに変換されるだけで、
連続するスペースをわざわざ圧縮するようなことは行われない。
ダブルクォート文字 @samp{"} はそれぞれ二重化されるので、
@command{nroff} や @command{troff} によって正しく処理される。

@item -T
@itemx --format=tex
@opindex -T
@opindex --format=tex

出力フォーマットとして、@TeX{} で処理するのに適した形式を選択する。
各出力行は、次のようになる。
(訳注: 下記の @var{tail} と @var{head} については、前節 @option{--sentence-regexp}
オプションの説明の終わりから 2 番目のパラグラフをご覧いただきたい。
@var{ref} は参照箇所である。)

@smallexample
\xx @{@var{tail}@}@{@var{before}@}@{@var{keyword}@}@c
@{@var{after}@}@{@var{head}@}@{@var{ref}@}
@end smallexample

@noindent
従って、あとは、出力の整形を担当する @code{\xx} コマンドの定義を出力ファイルに書き込めばよいことになる。
なお、参照箇所の生成が行われていない場合、すなわち、@option{-A} オプションも
@option{-r} オプションも指定されていない場合には、
各 @code{\xx} 呼び出しの最後の引数は出力されないことに注意していただきたい。
@samp{xx} を別のマクロ名に変更するには、@option{-M} オプションを使用すればよい
(訳注: @option{-M "xx"} のように、@samp{xx} の部分のみ指定する)。

この出力フォーマットでは、@samp{$}, @samp{%}, @samp{&}, @samp{#}, @samp{_}
のような特殊文字のいくつかは、自動的にバックスラッシュで保護される。
波カッコ @samp{@{}, @samp{@}} は、一対のドル記号とバックスラッシュとで保護される
(強引に数式モードにするわけだ)。
バックスラッシュそのものは、@code{\backslash@{@}} というシーケンスになる。
同形の他の文字と区別するために文字の上下に付ける発音区別符のうち、
サーカムフレックスとチルダは、それぞれ @code{\^@{ @}} と @code{\~@{ @}}
というシーケンスになる (訳注: 実際には @code{@{ @}} の位置に
a  なり e なりといった文字が来る)。
使用している文字セット中の他の発音区別符が付いている文字についても、
可能なかぎり、適切な @TeX{} のシーケンスが生成される。それ以外の文字について言うと、
改行やタブのような非表示文字や、ASCII の文字セットに属さない他のすべての文字は、
単にただ 1 個のスペースに変換され、連続するスペースをわざわざ圧縮するようなことは行われない。
@TeX{} のための特殊文字の処理は以上のようなものだが、
改善する方法があれば、作者までお知らせいただきたい。

@end table


@node Compatibility in ptx
@subsection GNU による @command{ptx} の拡張

このバージョンの @command{ptx} には、System V の @command{ptx}
には存在しない機能がいくつかある。
そうした追加機能は、コマンドラインオプションの @option{-G} を使えば、働かなくなるが、
ほかのコマンドラインオプションによって上書きされれば、話は別である。
もっとも、GNU の拡張の中には、上書きによって回復できないものもあるので、
GNU の拡張を使いたければ、@option{-G} オプションを最初から使わないのが、
すっきりした方法だ。以下に、このプログラムと
System V の @command{ptx} の相違点を挙げておく。

@itemize @bullet

@item
このプログラムでは、一度に複数の入力ファイルを読み込むことができる。
また、生成したコンコーダンスは、常に標準出力に書き出される。
それに対して、System V の @command{ptx} は、ファイルをたった 1 個しか読み込まず、
結果を書き出すのは、標準出力のこともあるが、コマンドに 2 番目の @var{file}
パラメータが指定されていれば、その @var{file} に対してである。

オプションで指定しない出力パラメータを持つのは、危険な習慣であり、
GNU では、できるだけ避けるようにしている。従って、@command{ptx} を GNU と
System V のどちらでも、問題なく同じように使いたいなら、入力ファイルは常に一つしか使わず、
実行結果は常に標準出力に書き出されるものと考えておいた方がよい。
また、@command{ptx} を使用してアプリケーションを作成する場合には、
インストールされている @command{ptx} で @option{-G} オプションが使用できるとわかれば、
@command{ptx} を呼び出すとき、@option{-G} オプションを必ず付けるようにしたくなるかもしれない。

@item
System V の @command{ptx} で利用できるオプションは、@option{-b}, @option{-f}, @option{-g},
@option{-i},
@option{-o}, @option{-r}, @option{-t}, @option{-w} だけである。
他のオプションは、すべて GNU の拡張だが、今この箇条書きで繰り返すことはしない。
なお、オプションの中には、以下でも述べているように、GNU の拡張が有効になっていると、
効果が少し変わるものもある。

@item
GNU の拡張のデフォルトでは、コンコーダンス出力のフォーマットは、
@command{troff} や @command{nroff} 向けになっていない。
むしろ、ダム端末向けのフォーマットになっている。@command{troff} や
@command{nroff} 向けの出力を選択したかったら、@option{-O} オプションを使用すればよい。

@item
@option{-R} オプションを使用しないと、
参照箇所の最大長が、出力行全体の長さから差し引かれる。
GNU の拡張を無効にすると、参照箇所の長さは、出力行の長さの勘定に入らないことになる。

@item
GNU の拡張が無効になっていても、256 バイトの文字セットのすべての文字が ---
ASCII NUL バイト含めて --- 常に入力ファイルから読み込まれて処理され、
有害な作用をもたらすことはない。それに対して、
System V の @command{ptx} は、8-bit の文字を受け付けない。
若干の制御文字も拒否する。また、チルダ @samp{~} も拒否する。

@item
GNU の拡張が無効になっていても、入力行の長さは、利用できるメモリによってしか制限されない。
それに対して、System V の @command{ptx} が処理の対象にするのは、
各行に付き最初の 200 文字だけである。

@item
単語区切り文字 (break character、単語を構成しない文字) のデフォルトは、
使用している文字セットにおけるアルファベットのすべての文字
(発音区別符のあるなしを問わない) 以外のあらゆる文字である。
GNU の拡張が無効な場合は、単語区切り文字のデフォルトは、スペース、タブ、改行のみになる。

@item
このプログラムは、出力行の長さを System V の @command{ptx} より上手に処理する。
GNU の拡張が無効になっている場合、このプログラムは System V
の @command{ptx} の動作をなるべく真似ようとするが、
それでも、System V のちょっとした癖のいくつかは、完全には再現できない。

@item
ユーザは Ignore file と Only file の両方を指定することができる。
System V の @command{ptx} では、そんなことはできない。

@end itemize


@node tsort invocation
@section @command{tsort}: トポロジカル・ソート

@pindex tsort
@cindex topological sort

@command{tsort} は、指定された @var{file} に対してトポロジカル・ソートを行う。
入力ファイルが指定されていない場合や、@var{file} として @samp{-}
が指定されている場合は、標準入力を対象にする。
より詳しい説明や、このコマンドが作成された経緯については、次節「@command{tsort}:
誕生の背景」を御覧になっていただきたい。 @ref{tsort background}

書式:

@example
tsort [@var{option}] [@var{file}]
@end example

@command{tsort} は入力を、空白で区切られた 2 個一組の文字列として読み込む。
そうした文字列の各組は、部分的な順序を示している。
出力は、与えられた部分的な順序に対応する全体としての順序である。

例を挙げよう。

@example
tsort <<EOF
a b c
d
e f
b c d e
EOF
@end example

@noindent
(訳注: 上の例は、"a b/c d/e f/b c/d e" という組を与えている。)

出力は、こうなる。

@example
a
b
c
d
e
f
@end example

もっと現実的な例を考えてみよう。たくさんの関数をすべて一つのファイルに書いているとしよう。
しかも、一つを除いて、他のすべての関数を static として宣言している。
現在のところ、その例外 (@code{main} ということにする)
が、ファイル中で定義されている最初の関数であり、それが直接呼び出す関数群がそれに続き、
さらにその後に、その関数群が呼び出す関数が続く @dots{}
という形になっている。さて、ここで、プロトタイプを利用することにしたとしよう。
そうなると、呼び出される関数のすべてを宣言するか
(そのためには、定義の部分から情報をどっさりコピーしなければならない）、
あるいは、できるだけ多くの関数が、使用される前に定義されているように、
関数群を並べ替えるか、どちらかを選ばなければならない。
後者の作業を自動化する方法の一つが、各関数についてそれが直接呼び出す関数のリストを作成することである。
そうしたリストを生成するプログラムはたくさんある。
いわゆるコール・グラフを作成するプログラムだ。
以下のリストをご覧になっていただきたい。
各行は、左側の関数が右側の関数を直接呼び出していることを示している。

@example
main parse_options
main tail_file
main tail_forever
tail_file pretty_name
tail_file write_header
tail_file tail
tail_forever recheck
tail_forever pretty_name
tail_forever write_header
tail_forever dump_remainder
tail tail_lines
tail tail_bytes
tail_lines start_lines
tail_lines dump_remainder
tail_lines file_lines
tail_lines pipe_lines
tail_bytes xlseek
tail_bytes start_bytes
tail_bytes dump_remainder
tail_bytes pipe_bytes
file_lines dump_remainder
recheck pretty_name
@end example

ここで @command{tsort} を使用すると、
こうした関数について、上記の後者の要求を満たすような順番を作成することができる。

@example
example$ tsort call-graph | tac
dump_remainder
start_lines
file_lines
pipe_lines
xlseek
start_bytes
pipe_bytes
tail_lines
tail_bytes
pretty_name
write_header
tail
recheck
parse_options
tail_file
tail_forever
main
@end example

@command{tsort} は、入力にループがあれば検出し、
出会った最初のループを標準エラーに書き出す。

一般に、ある部分的な順序に対して、唯一の全体的な順序というものは存在しないことに、
留意していただきたい。上記のコール・グラフの場合で言えば、
関数 @code{parse_options} は、@code{main} の前でありさえすれば、
リストのどこにでも来ることができる。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@exitstatus

@menu
* tsort background::         tsort が誕生した経緯。
@end menu

@node tsort background
@subsection @command{tsort}: 誕生の背景

@command{tsort} が存在しているのは、Unix のリンカのごく初期のバージョンでは、
一つのアーカイブファイルの処理をたった一回しか行わず、
それも、ファイルの最初から最後へと順番に見ていくだけだったからである。当時の
@command{ld} は、アーカイブ中の各オブジェクトを読み込むとき、
そのオブジェクトがプログラムに必要かどうかの判断を、
リンク作業のその時点でまだ定義されていない何らかのシンボルを定義しているかどうかを基準にして行っていた。

そのため、アーカイブ中の依存関係には、特別な扱いが必要になった。
たとえば、@code{scanf} はたぶん @code{read} を呼んでいる。
それは、リンカがアーカイブをたった一回最初から順番に読んで行くとき、@code{scanf.o}
が @code{read.o} より前にあることが重要だったということである。
なぜなら、そうなっていないと、@code{scanf} を呼ぶけれど、@code{read}
を呼ばないプログラムでは、@code{read} に対する参照が、予期に反して
"unresolved" になってしまいかねなかったからだ。

この問題に対処する方法は、次のようなものだった。
まず、オブジェクトファイル同士の依存関係の集合を生成した。
この作業は、@command{lorder} というシェルスクリプトによって行われていた。
筆者の知るかぎり、現在 GNU では lorder というツールを提供していないが、
BSD 系のディストリビューションでは、今でもなお見つけることができる。

次に、この　@command{lorder} の出力に対して @command{tsort} を実行した。
そして、そのソートされた結果を使って、アーカイブにオブジェクトを追加する順番を決めたのである。

こうした作業全体が、1980 年ごろから時代遅れのものになった。
というのは、Unix のアーカイブは現在ではシンボル・テーブルを内蔵しており
(従来は @command{ranlib} によって作られていたが、今ではたいてい @command{ar}
そのものによって作られている)、Unix のリンカはこのシンボル・テーブルを使用して、
アーカイブファイルに対する複数回の読み込みを効率的に行うからである。

ともあれ、これが tsort が誕生した経緯である。
すなわち、当時のリンカのアーカイブファイルを取り扱う方法に問題があり、
その問題を解決するための工夫だったのだ。
そして、その問題は、その後、別のやり方で解決されるようになったのである。


@node Operating on fields
@chapter フィールド操作

@menu
* cut invocation::           各行の選択した部分を表示する。
* paste invocation::         複数のファイルの各行をマージする。
* join invocation::          共通のフィールドに基づいて行を連結する。
@end menu


@node cut invocation
@section @command{cut}: 各行の選択した部分を表示する

@pindex cut
@command{cut} は、各ファイルから各行の一部を抜き出して、標準出力に書き出す。
ファイルが指定されていない場合や、ファイル名として @samp{-}
が指定されている場合は、標準入力を対象とする。

書式:

@example
cut @var{option}@dots{} [@var{file}]@dots{}
@end example

以下のオプション一覧で @var{byte-list}, @var{character-list}, @var{field-list}
と表記されているものは、コンマで区切られた、1 個以上の数字や範囲からなるリストである
(範囲は、ダッシュを間に挟む 2 個の数字)。バイト、文字、フィールドは 1 から数える。
不完全な範囲を指定することもでき、@option{-@var{m}} は @samp{1-@var{m}}
と同じことであり、@samp{@var{n}-} は @samp{@var{n}}
から行末、あるいは最後のフィールドまでと同じことである。
リストの要素は、繰り返してもよく、部分的に重なり合ってもよく、どんな順序で指定してもよい。
ただし、入力中の選択した部分が書き出されるのは、読み込まれたときと同じ順序であり、
しかも、ただ一度だけである。(訳注: たとえば、@samp{-f 3,1,3}
などと指定することはできるが、出力されるときは field-1, field-3
の順番であり、field-3 が二度出力されることもない。)

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -b @var{byte-list}
@itemx --bytes=@var{byte-list}
@opindex -b
@opindex --bytes
@var{byte-list} で指定された位置にあるバイトのみを選択して、表示する。
タブやバックスペースも他の文字と同様に扱う。
すなわち、そうしたものも 1 バイトを占める。出力用のデリミタ (delimiter、区切りの印)
が指定されている場合は (@option{--output-delimiter} の説明を参照)、
選択されたバイトからなる範囲同士の間にデリミタ文字列を出力する。

@item -c @var{character-list}
@itemx --characters=@var{character-list}
@opindex -c
@opindex --characters
@var{character-list} で指定された位置にある文字のみを選択して、表示する。
現在のところ、@option{-b} と同じだが、プログラムの国際化が進むと、
動作が変わることになるだろう。タブやバックスペースも他の文字と同様に扱う。
すなわち、そうしたものも 1 文字と数える。
出力用のデリミタが指定されている場合は (@option{--output-delimiter} の説明を参照)、
選択された文字からなる範囲同士の間にデリミタ文字列を出力する。

@item -f @var{field-list}
@itemx --fields=@var{field-list}
@opindex -f
@opindex --fields
@var{field-list} で指定されたフィールドのみを選択して、表示する。
フィールドの区切りは、デフォルトではタブ文字 1 個である。
なお、@option{--only-delimited} (@option{-s}) オプションが指定されていない場合は、
デリミタ文字を全く含まない行も表示する。

一言言っておくと、@command{awk} を使えば、もっと洗練されたフィールド処理ができるようになる。
たとえば、フィールドの順番を入れ替える、
空白文字を入れて列が揃うようにしたフィールドを取り扱う、そういったことが可能になる。
@command{awk} ならデフォルトで、フィールドの区切りに空白文字の連続を使用し
(そして、フィールドの前後から除去し)、さらに、行頭と行末の空白を無視してくれるのだ。
@example
@verbatim
awk '{print $2}'      # 2 番目のフィールドを表示する
awk '{print $(NF-1)}' # 最後から 2 番目のフィールドを表示する
awk '{print $2,$1}'   # 最初の 2 フィールドを逆に並べる
@end verbatim
@end example
@command{cut} では、任意の順番でフィールドを指定することができるが、
出力は常にファイル中で出会った順番であることに注意していただきたい。

ありそうにないことだが、@command{awk} が利用できない状況だとしよう。
その場合は、@command{join} コマンドを使えば、
上記で @command{awk} がやっているように、空白文字を処理することができる。
@example
@verbatim
join -a1 -o 1.2     - /dev/null # 2 番目のフィールドを表示する
join -a1 -o 1.2,1.1 - /dev/null # 最初の 2 フィールドを逆に並べる
@end verbatim
@end example

@item -d @var{input_delim_byte}
@itemx --delimiter=@var{input_delim_byte}
@opindex -d
@opindex --delimiter
@option{-f} と併せて使うと、入力のフィールド区切りに @var{input_delim_byte}
の最初のバイトが使用される (デフォルトはタブ)。

@item -n
@opindex -n
マルチバイト文字を分割しない (現在のところ、機能しない)。

@item -s
@itemx --only-delimited
@opindex -s
@opindex --only-delimited
@option{-f} を使うとき、フィールド区切り文字を含まない行の表示をしない。
通常は、フィールド区切り文字を含まない行は、行全体がそのまま表示される。

@item --output-delimiter=@var{output_delim_string}
@opindex --output-delimiter
@option{-f} と一緒に使った場合は、出力フィールド間が
@var{output_delim_string} で区切られる。
@option{-f} を指定したときのデフォルトは、入力時のデリミタを使用することである。
@option{-b} や @option{-c} を使用して、(フィールドの範囲ではなく)
バイト位置や文字位置の範囲を選択した場合は、
選択されたバイトの重なり合わない範囲同士の間に @var{output_delim_string} が出力される。

@item --complement
@opindex --complement
このオプションは GNU の拡張である。@option{-b}, @option{-c}, @option{-f}
オプションで選択されたバイト、文字、フィールドを含まない部分を選択して、表示する。
言い換えれば、そうしたオプションによって指定されたバイトや文字やフィールドは「表示しない」ということだ。
このオプションは、フィールドがたくさんあるとき、そのうちの一部を除いたすべてを表示したい場合に便利である。

@optZeroTerminated

@end table

@exitstatus


@node paste invocation
@section @command{paste}: 複数のファイルの各行をマージする

@pindex paste
@cindex merging files

@command{paste} は、指定された各ファイルの行番号が同じ行を、
タブ文字を間にはさんで連結して、標準出力に書き出す。
入力ファイルが全く指定されていない場合や、ファイル名が @samp{-} だった場合は、
標準入力が使用される。

書式:

@example
paste [@var{option}]@dots{} [@var{file}]@dots{}
@end example

たとえば、次のような 2 個のファイルに対して、
@example
$ cat num2
1
2
$ cat let3
a
b
c
@end example

各ファイルから行を順番に拾う。
@example
$ paste num2 let3
1       a
2       b
       @ c
@end example

片方のファイルの行を二回使う。
@example
$ paste num2 let3 num2
1       a      1
2       b      2
       @ c
@end example

標準入力から行を取得して混ぜる。
@example
$ paste - let3 - < num2
1       a      2
       @ b
       @ c
@end example

連続する行を、スペースを間にはさんで結合する。
@example
$ seq 4 | paste -d ' ' - -
1 2
3 4
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -s
@itemx --serial
@opindex -s
@opindex --serial
各ファイルから 1 行づつ取り出して連結するのではなく、
一つのファイルのすべての行をまとめて 1 行に連結する。
上の例のデータを使用すると、

@example
$ paste -s num2 let3
1       2
a       b       c
@end example

@item -d @var{delim-list}
@itemx --delimiters=@var{delim-list}
@opindex -d
@opindex --delimiters
連結する行の区切りに、タブではなく、@var{delim-list} の各文字を順番に使用する。
@var{delim-list} を使い切ってしまった場合は、最初の文字に戻って使用して行く。
上記のデータを例に取ると、

@example
$ paste -d '%_' num2 let3 num2
1%a_1
2%b_2
%c_
@end example

@optZeroTerminated

@end table

@exitstatus


@node join invocation
@section @command{join}: 共通のフィールドに基づいて行を結合する

@pindex join
@cindex common field, joining on

@command{join} は、二つの入力ファイルを対象に、同一の共通フィールド
(join field) を持つことで「対」になっている各行を、
1 行にまとめて、標準出力に書き出す。

書式:

@example
join [@var{option}]@dots{} @var{file1} @var{file2}
@end example

@var{file1} と @var{file2} の片方は @samp{-}、すなわち標準入力であってもよい
(両方とも標準入力は不可)。@var{file1} と @var{file2} は、
共通フィールドに基づいてソートされているべきである。

@vindex LC_COLLATE
通常、ソート順は、@env{LC_COLLATE} のロケールが規定している照合順序である。
@option{-t} オプションが指定されていない場合は、両ファイルについて並び方を比較する際、
@code{sort -b} の場合と同様に、共通フィールドの先頭にある空白が無視される。
また、@option{--ignore-case} が指定されている場合は、
@code{sort -f} と同様、共通フィールドでアルファベットの大文字と小文字は区別されない。

@command{sort} の出力を @command{join} に渡すなら、@command{sort} と
@command{join} が使用するロケールやオプションは首尾一貫していなければならない。
@samp{sort -k 1b,1} のようなコマンドを使用すれば、
デフォルトの共通フィールドに基づいて、ファイルをソートすることができる。
しかし、ロケール、共通フィールド、区切り記号、比較オプションなどにデフォルト以外のものを使用する場合は、
@command{join} と @command{sort} の間で矛盾が起きないように、そうしたものを選択しなければならないのだ。
@samp{join -t ''} が指定された場合は、行全体が共通フィールドとして考慮の対象になるが、
これは、sort のデフォルトの動作に対応している。

入力のすべての行が対になっている場合は、GNU による拡張が利用できる。
この場合、並んでいる順番は、対になる二つのフィールドが同じであると判断されるならば、どんな順番でもよい。
ただし、並び方の比較を上述のように行ったとき、二つのフィールドが同じだと判断される場合であり、
その場合のみである。例を挙げよう。

@example
$ cat file1
a a1
c c1
b b1
$ cat file2
a a2
c c2
b b2
$ join file1 file2
a a1 a2
c c1 c2
b b1 b2
@end example

@set JOIN_COMMAND
@checkOrderOption{join}
@clear JOIN_COMMAND

デフォルトの動作は次のようになっている。
@itemize
@item 共通フィールド (join field) は、各行の最初のフィールドである。
@item 入力の各フィールドは、1 個以上の空白 (スペースやタブ) で区切られる。
行頭の空白は無視される。
@item 出力の各フィールドは、1 個のスペースで区切られる。
@item 各出力行の構成は、共通フィールド、@var{file1} の残りのフィールド、
@var{file2} の残りのフィールドの順になる。
@end itemize

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -a @var{file-number}
@opindex -a
@var{file-number} (@samp{1} か @samp{2}) のファイルに、もう一方のファイルと対にならない行がある場合、
通常の出力のほかに、その行も表示する。

@item --check-order
入力ファイルのどちらかの内容がきちんとソートされていないと、
エラーメッセージを出して、実行に失敗する。

@item --nocheck-order
入力ファイルの内容がソートされた順番になっているかどうかを、
どちらのファイルについてもチェックしない。これが、デフォルトである。

@item -e @var{string}
@opindex -e
入力では欠けているフィールドを、出力では @var{string} で補う。
すなわち、オプション @option{-1}, @option{-2}, @option{-j}, @option{-o}
などを指定したときに、欠けているフィールドがそれに当たる。

@item --header
@opindex --header
各入力ファイルの最初の行をヘッダ行と見なす。ヘッダ行も結合され、
最初の出力行として表示される。@option{-o} を使って、出力フォーマットを指定している場合は、
ヘッダ行もそのフォーマットに従って出力される。
ヘッダ行は、@option{--check-order} が指定されていても、並び順のチェックを受けない。
なお、両ファイルのヘッダ行がマッチしない場合は、
一番目のファイルのヘッダ・フィールドが使用される。

@item -i
@itemx --ignore-case
@opindex -i
@opindex --ignore-case
キーを比較する際、アルファベットの大文字小文字を区別しない。
このオプションを使用するときは、
両方の入力ファイルの行が、同じように大文字小文字を区別せず並んでいなければならない。
そうした順番で並べるには、@samp{sort -f} を使えばよい。

@item -1 @var{field}
@opindex -1
ファイル 1 では @var{field} 番目のフィールドを共通フィールドとする
(@var{field} は正の整数)。

@item -2 @var{field}
@opindex -2
ファイル 2 では @var{field} 番目のフィールドを共通フィールドとする
(@var{field} は正の整数)。

@item -j @var{field}
@option{-1 @var{field} -2 @var{field}} と等価。

@item -o @var{field-list}
@itemx -o auto
キーワードの @samp{auto} が指定されると、
@command{join} は各ファイルの最初の行を元にして、出力フォーマットを推測する。
それは、デフォルトの出力フォーマットとほぼ同じだが、
それだけでなく、各行に必ず同数のフィールドを出力するようにする。
また、欠けているフィールドがあれば、@option{-e} オプションの指定する文字列で補う。
余分なフィールドは除去する。

@samp{auto} が指定されていない場合は、@var{field-list} のフォーマットに従って、
各出力行を構成する。@var{field-list} の各要素は、@samp{0} 一文字か、@var{m.n}
という形を取る。ここで、@var{m} はファイル番号 (@var{file-number}) であり、@samp{1}
か @samp{2} である。@var{n} はフィールド番号であり、正の整数である。

@samp{0} というフィールド指定は、共通フィールドを指している。ほとんどの場合、
@samp{0} というフィールド指定と同じことが、共通フィールドを明示的に
@var{m.n} で示すことでも、実現できるだろう。しかしながら、(@option{-a}
オプションなり @option{-v} オプションなりを使用して)、対にならない行を表示する場合、
対にならない行が両方のファイルに存在すると、@var{field-list} で @var{m.n}
をどう使おうとも、共通フィールドを指定できないのだ。@command{join}
で共通フィールドの指定が常に可能になるように、POSIX は @samp{0}
というフィールド指定法を考案したのである。

@var{field-list} の各要素は、コンマ、または空白で区切られる。
区切りに空白を使用するときは、シェルによって解釈されないように、
たいていの場合引用符で囲む必要がある。たとえば、コマンド @samp{join -o 1.2,2.2}
と @samp{join -o '1.2 2.2'} は、同じ動作になる。

@var{field-list} の指定は、すべての出力行に適用される。これは、@option{-a} や
@option{-v} オプションによって出力されるものにも当てはまる。

@item -t @var{char}
入出力のフィールドの区切りに、文字 @var{char} を使用する。
@var{char} は、入力ファイルに現れる一つ一つが、有意なものとして扱われる。
@samp{sort -t @var{char}} を @option{-b} なしで実行すれば、
このオプションに対応する順序に行を並べることができる。
@samp{join -t ''} を指定すると、行全体が共通フィールドとして考慮の対象になり、
これは sort のデフォルトの動作に対応している。
@samp{-t '\0'} を指定すると、ASCII NUL 文字がフィールドの区切りに使用される。

@item -v @var{file-number}
通常の出力はせず、@var{file-number} (@samp{1} か @samp{2} である)
のファイルに存在する、対にならない各行を表示する。

@optZeroTerminated @newlineFieldSeparator

@end table

@exitstatus


@node Operating on characters
@chapter 文字操作

@cindex operating on characters

以下のコマンドは、個々の文字に対して操作を行う。

@menu
* tr invocation::            文字の置換、圧縮、削除を行う。
* expand invocation::        タブをスペースに変換する。
* unexpand invocation::      スペースをタブに変換する。
@end menu


@node tr invocation
@section @command{tr}: 文字の置換、圧縮、削除を行う

@pindex tr

書式:

@example
tr [@var{option}]@dots{} @var{set1} [@var{set2}]
@end example

@command{tr} は標準入力を標準出力にコピーするが、
その際に次の操作の一つを行う。

@itemize @bullet
@item
文字を置換する。置換した結果に同一文字の連続があるときは、それを
1 文字に圧縮することもできる。
@item
同一文字の連続を 1 文字に圧縮する。
@item
文字を削除する。
@item
文字を削除する。さらに、削除した結果に同一文字の連続があるときは、
それを 1 文字に圧縮する。
@end itemize

上記書式の @var{set1} と (もし、指定しているなら) @var{set2} の二つの引数には、
順序が意味を持つ文字の集合を指定する。以下の説明で、それぞれ @var{set1}、@var{set2}
と呼ばれることになるそうした文字集合こそ、入力中に存在する文字のうちで
@command{tr} が操作の対象とする文字群である。@option{--complement} (@option{-c},
@option{-C})
オプションを指定すると、@var{set1} の代わりにその補集合
(@var{set1} に含まれないすべての文字) が使われることになる。

現在のところ、@command{tr} が完全に対応しているのは、シングルバイト文字だけである。
将来は、マルチバイト文字もサポートすることになるだろうが、
そのときは、@option{-C} オプションで文字集合の補集合を作り、@option{-c}
オプションで値 (訳注: いわゆる文字コード) の集合の補集合を作ることになるだろう。
この区別が意味を持つのは、指定する値の中に文字ではないものがあるときだけだが、
そういった事態は、マルチバイト・エンコーディングを使用しているロケールで、
入力にエンコーディング・エラーが含まれるときしか起きそうにない。

このプログラムでは、@option{--help} や @option{--version} オプションも使える。
@xref{Common options}. なお、オプションは、オペランドの前で指定しなければならない。

@exitstatus

@menu
* Character sets::           文字集合の指定。
* Translating::              ある文字集合の別の文字集合への変換。
* Squeezing and deleting::   文字の削除。
@end menu


@node Character sets
@subsection 文字集合の指定

@cindex specifying sets of characters

@var{set1} や @var{set2} 引数の書式は、正規表現の書式に似ているが、
正規表現ではなく、文字のリストにすぎない。
そうした文字列中のほとんどの文字は、単にその文字自身を表しているだけだが、
便宜のため文字列中では以下に列挙する簡易記法も使うことができる。
簡易記法によっては、以下で述べているように、
@var{set1} と @var{set2} のどちらか一方でしか使えないこともある。

@table @asis

@item バックスラッシュ・エスケープ
@cindex backslash escapes

以下のバックスラッシュ・エスケープ・シーケンスを認識する。

@table @samp
@item \a
Control-G (ベル).
@item \b
Control-H (バックスペース).
@item \f
Control-L (フォームフィード).
@item \n
Control-J (改行).
@item \r
Control-M (復帰).
@item \t
Control-I (水平タブ).
@item \v
Control-K (垂直タブ).
@item \@var{ooo}
1 から 3 桁の 8 進数 @var{ooo} によって表される値を持つ 8 ビット文字。
@samp{\400} は、@samp{\040} @samp{0}
という連続する 2 バイトに解釈されるので、注意すること。
@item \\
1 個のバックスラッシュ。
@end table

上記以外の 1 個の文字がバックスラッシュに続く場合は、その文字として解釈される。
またバックスラッシュには、特別な意味を打ち消す働きもあるので、
@samp{[}, @samp{]}, @samp{*}, @samp{-} をエスケープするのにも使用できる。

@item 範囲指定
@cindex ranges

@samp{@var{m}-@var{n}} という表記は、昇順で @var{m} から @var{n} までのすべての文字に展開される。
@var{m} は文字の照合順序で @var{n} より前のものでなければならず、
さもないと、エラーになる。たとえば、@samp{0-9} は @samp{0123456789}
と同じである。

System V の書式では、範囲は、角カッコ (square brackets）を使って囲むことになっているが、
GNU の @command{tr} はこの書式をサポートしていない。
System V の書式で指定した場合でも、置換が期待どおり行われることもあるが、
それは、たいていの場合、角カッコが角カッコに置換されるからである。
そうだとしても、予想外の動作をすることもあるので、
角カッコの使用は避けた方がよい。たとえば、@samp{tr -d '[0-9]'}
は、数字だけでなく、角カッコも削除してしまう。

昔からよく使われている範囲の指定法の多くが
--- 正しい用法として認められているものでさえ --- 他のシステムで使えるとはかぎらない。
たとえば、EBCDIC のホストでは、 @samp{A-Z} という範囲の指定をしても、
たいていの人が予想するような結果は得られないだろう。
なぜなら、そこでは @samp{A} から @samp{Z} までが、ASCII
におけるように隣り合ってはいないからである。POSIX 準拠の @command{tr}
を使うことができるならば、この問題を回避する最善の方法は、文字クラスを使用することである
(下記参照)。それができない場合は、範囲の要素を一つ一つ書き込むのが、
一番可搬性のある方法だ (一番野暮ったい方法でもあるけれど)。

@item 文字の繰り返し
@cindex repeated characters

@var{set2} における @samp{[@var{c}*@var{n}]} という表記は、
文字 @var{c} の @var{n} 個の連続に展開される。
従って、@samp{[y*6]} は @samp{yyyyyy} と同じである。また、@var{set2}
における @samp{[@var{c}*]} という表記は、@var{set2} を @var{set1}
と同じ長さにするのに必要な数の @var{c} の連続に展開される。
@var{n} が @samp{0} で始まっている場合は、
8 進数として扱われる。それ以外の場合は、10 進数である。

@item 文字クラス
@cindex character classes

@samp{[:@var{class}:]} という表記は、(あらかじめ定義されている) 文字クラス
@var{class} に属するすべての文字に展開される。
展開された文字に特定の順序はないが、@code{upper} と @code{lower}
の文字クラスは別で、この二つは、昇順に展開される。
@option{--delete} (@option{-d}) と @option{--squeeze-repeats} (@option{-s})
オプションの両方を指定している場合は、@var{set2} で任意の文字クラスを使用することができる。
それ以外の場合 @var{set2} で使えるのは、@code{lower} と @code{upper}
の文字クラスだけであり、それも、対応する文字クラスを (すなわち、@code{upper}
に対しては @code{lower}、@code{lower} に対しては @code{upper} を)、
@var{set1} の対応する位置で指定しているときだけである。
その場合は、大文字小文字の変換を指定していることになるわけだ。
以下に文字クラスの名前を列挙する。なお、無効なクラス名を指定すると、エラーになる。

@table @code
@item alnum
@opindex alnum
アルファベットの文字と数字。
@item alpha
@opindex alpha
アルファベットの文字。
@item blank
@opindex blank
水平方向の空白 (Horizontal whitespace)。
@item cntrl
@opindex cntrl
制御文字。
@item digit
@opindex digit
数字。
@item graph
@opindex graph
表示可能文字。空白を含まない
(訳注: スペースもタブも改行も、すなわち、ホワイトスペースを一切含まない)。
@item lower
@opindex lower
アルファベットの小文字。
@item print
@opindex print
表示可能文字。空白を含む (訳注: タブや改行は含まないが、スペース (0x20) は含む)。
@item punct
@opindex punct
句読点 (訳注: 引用符なども含む)。
@item space
@opindex space
水平方向や垂直方向の空白 (Horizontal or vertical whitespace)。
@item upper
@opindex upper
アルファベットの大文字。
@item xdigit
@opindex xdigit
16 進数の数字。
@end table

@item 等価クラス
@cindex equivalence classes

@samp{[=@var{c}=]} という書式は、@var{c} と等価な文字のすべてに展開される。
展開される文字の間に特定の順序はない。等価クラスは、比較的最近の発明であり、
英語以外のアルファベットをサポートするためのものである。
しかしながら、等価クラスを定義したり、何が等価クラスに含まれるかを決定したりする標準的な方法は存在しないようだ。
そのため、GNU の @command{tr} は、等価クラスを十分に実装していない。
各文字の等価クラスにはその文字しか含まれていないので、あまり使い道がない。

@end table


@node Translating
@subsection 置換

@cindex translating characters

@command{tr} は、@var{set1} と @var{set2} の両方が指定され、@option{--delete}
(@option{-d})
オプションが指定されていない場合は、文字の置換を行う。
@command{tr} は入力の中に @var{set1} に存在する文字が現れるたびに、
それを @var{set2} の対応する文字に置き換える。
入力中の @var{set1} に存在しない文字は、読み飛ばして、変更しない。
ある文字が @var{set1} 中に 2 個以上存在し、@var{set2} 中のそれに対応する文字がすべて同じでない場合、
置換に使用するのは、最後の文字だけである。
たとえば、次の二つのコマンドは、同じ動作をする。

@example
tr aaa xyz
tr a z
@end example

@command{tr} がよく使われるのは、アルファベットの小文字を大文字に変換するときである。
それには、いろいろな方法がある。例を三つほど挙げてみる。

@example
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
tr a-z A-Z
tr '[:lower:]' '[:upper:]'
@end example

@noindent
ただし、上記の @code{a-z} のような範囲指定の使用は、
可搬性がないことに注意していただきたい。

@command{tr} で置換を行う際には、普通 @var{set1} と @var{set2} を同じ長さにする。@var{set1} が
@var{set2} より短いと、@var{set2} の後尾にある余分な文字が無視されることになる。

逆に、@var{set1} が @var{set2} より長い場合は、可搬性がなくなる。
POSIX の規定では、結果は未定義なのだ。こうした場合、BSD の @command{tr} は、
@var{set2} の最後の文字を必要なだけ繰り返して、@var{set2} が @var{set1}
と同じ長さになるようにする。
System V の @command{tr} は、@var{set1} を @var{set2} と同じ長さに切り詰める。

デフォルトでは、GNU 版の @command{tr} は、この問題を BSD の @command{tr}
と同じやり方で処理する。そして、@option{--truncate-set1} (@option{-t})
オプションが指定されている場合のみ、System V の @command{tr} のように処理するのである。
このオプション (@option{--truncate-set1}) は、置換以外の操作では無視される。

この問題で System V の @command{tr} の動作を選ぶと、
比較的よく使われる BSD 式の次の慣用表現が使えなくなる。

@example
tr -cs A-Za-z0-9 '\012'
@end example

@noindent
なぜなら、System V の動作では、アルファベットと数字以外のすべての文字を改行文字に変換するのではなく、
ゼロバイトしか (ASCII NUL 文字、それが @var{set1} の補集合の最初の要素である)
改行文字に変換しないからだ。

@noindent
ちなみに、上記の慣用表現は、システムによってはうまく動作しない。
なぜなら、範囲指定を使っているからであり、また、改行の 8 進数によるコードを
012 と決め込んでいるからでもある。@command{tr} が POSIX に準拠しているなら、
以下の方が、よりよい書き方である。

@example
tr -cs '[:alnum:]' '[\n*]'
@end example


@node Squeezing and deleting
@subsection 連続する文字の圧縮と文字の削除

@cindex squeezing repeat characters
@cindex deleting characters
@cindex removing characters

@option{--delete} (@option{-d}) オプションのみが指定された場合、@command{tr} は、
@var{set1} に存在する文字が入力中にあれば、それを削除する。

@option{--squeeze-repeats} (@option{-s}) オプションのみが指定され、置換が要求されていない場合、
@command{tr} は、@var{set1} に存在する文字が入力中に連続して現れるたびに、
その部分をただ 1 個のその文字に置き換える。

@option{--delete} と @option{--squeeze-repeats} の両方が指定された場合、
@command{tr} は、まず @var{set1} を使って削除を行い、
その後で、残っている文字に対して、@var{set2} を使って連続する同一文字の圧縮を行う。

@option{--squeeze-repeats} オプションは、置換の際に使用することもできる。
その場合、@command{tr} は、まず置換を実行し、その後で、置換結果に対して、
@var{set2} を使って連続する同一文字の圧縮を行う。

例をいくつか挙げて、オプションの様々な組み合わせを説明する。

@itemize @bullet

@item
すべてのゼロバイトを削除する。

@example
tr -d '\0'
@end example

@item
入力中のすべての単語 (訳注: 空白などで前後を区切られた文字列) を 1 行に 1 個づつ書き出す。
このコマンドは、アルファベットと数字以外のすべてを改行文字に変換し、
さらに、改行が連続して現れるそれぞれの箇所を 1 個の改行文字に圧縮している。

@example
tr -cs '[:alnum:]' '[\n*]'
@end example

@item
連続する改行文字が現れるごとに、それを一個の改行文字に変換する。
すなわち、空行を除去する。

@example
tr -s '\n'
@end example

@item
@c Separate the following two "the"s, so typo checkers don't complain.
文書中の単語の重複を探し出す。たとえば、 改行を挟んで同じ単語を繰り返して、
``the @w{}the'' のように書いてしまうとことは、よくあることである。
以下の Bourne シェルのスクリプトは、次のように動作する。
まず、句読点や空白文字が 1 個以上続けて現れるたびに、それを 1 個の改行文字に置き換える。
そうすることで、単語が 1 行に 1 個づつ出力されることになるわけだ。
次には、すべての大文字を小文字に変換する。そして、最後に、@command{uniq} を
@option{-d} オプション付きで実行して、重複した単語のみを書き出すのである。

@example
#!/bin/sh
cat -- "$@@" \
  | tr -s '[:punct:][:blank:]' '[\n*]' \
  | tr '[:upper:]' '[:lower:]' \
  | uniq -d
@end example

@item
文字のちょっとした集団を削除するのは、たいていの場合ごく簡単である。
たとえば、@samp{a}, @samp{x}, @samp{M} という文字をすべて消すには、
次のようにするだけでよい。

@example
tr -d axM
@end example

ところが、削除する文字の一つに  @samp{-} があると、@samp{-}
は特殊な意味をもっているので、厄介なことになりかねない。
上記と同様の作業を行うけれど、今度は @samp{-} という文字もついでにすべて削除するとしよう。
@code{tr -d -axM} をやってみるかもしれないが、うまく行かないだろう。
@command{tr} が @option{-a} をコマンドライン・オプションとして解釈しようとするからである。
それではと、ハイフンを文字列の内側に入れてみることもできる。
@code{tr -d a-xM} のようにだ。だが、これもうまく行きそうにない。
@command{tr} が @code{a-x} を 3 個の文字としてではなく、@samp{a}@dots{}@samp{x}
という文字の範囲として解釈することになるからだ。
この問題を解決する方法の一つは、ハイフンを文字のリストの最後に置くことである。

@example
tr -d axM-
@end example

あるいは、@samp{--} を使って、オプション処理はここで終わりと明示することもできる。

@example
tr -d -- -axM
@end example

より普遍的な方法は、等価クラスの記法  @code{[=c=]} を、@samp{c} を @samp{-} で
(あるいは、他の任意の文字で) 置き換えて使うことである。

@example
tr -d '[=-=]axM'
@end example

上記の例では、角カッコがシェルによって解釈されないように、
シングルクォートを使っていることに注意していただきたい。

@end itemize


@node expand invocation
@section @command{expand}: タブをスペースに変換する

@pindex expand
@cindex tabs to spaces, converting
@cindex converting tabs to spaces

@command{expand} は指定された各 @var{file} の内容を標準出力に書き出し、
その際にタブ文字を適切な数のスペースに変換する。
@var{file} が指定されていない場合や、@var{file} として @samp{-}
が指定されている場合は、標準入力を対象にする。

書式:

@example
expand [@var{option}]@dots{} [@var{file}]@dots{}
@end example

デフォルトでは、@command{expand} はすべてのタブをスペースに変換する。
バックスペース文字は、出力にそのまま残しておく。バックスペースには、
タブ幅を計算する際に、桁数を減らす働きがあるのだ。デフォルトの動作は、
@option{-t 8} を指定したときと同じである (タブ位置を 8 桁ごとにする)。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -t @var{tab1}[,@var{tab2}]@dots{}
@itemx --tabs=@var{tab1}[,@var{tab2}]@dots{}
@opindex -t
@opindex --tabs
@cindex tab stops, setting
タブ位置 (tab stop) が一つだけ指定された場合には、
(訳注: 入力行における) タブ位置が @var{tab1} 桁ごとあるものとする
(デフォルトは 8 桁ごと)。それ以外の場合は、タブ位置を
@var{tab1}, @var{tab2}, @dots{} 桁目に置き (行頭を 0 桁目として数える)、
指定された最後のタブ位置より後ろにあるタブは 1 個のスペースで置き換える。
タブ位置の指定は、コンマで区切ってもよく、空白で区切ってもよい。

互換性を考慮して、GNU の @command{expand} は、@option{-@var{tab1}[,@var{tab2}]@dots{}}
という、
このオプションの古い書式も認めている。新しいスクリプトでは、
@option{-t @var{tab1}[,@var{tab2}]@dots{}} の方を使うべきである。

@item -i
@itemx --initial
@opindex -i
@opindex --initial
@cindex initial tabs, converting
各行の行頭にあるタブ群だけを
(言い換えれば、スペースでもタブでもないどんな文字よりも前にある 1 個以上のタブだけを)
スペースに変換する。

@end table

@exitstatus


@node unexpand invocation
@section @command{unexpand}: スペースをタブに変換する

@pindex unexpand

@command{unexpand} は、指定された各 @var{file} の内容を標準出力に書き出し、
その際に各行の先頭にある複数の空白 (blank) を、必要な数のタブ文字に変換する。
@var{file} が指定されていない場合や、@var{file} として @samp{-} が指定されている場合は、
標準入力を対象にする。デフォルトの POSIX ロケールでは、空白 (@dfn{blank})
とは、スペースかタブのことである。
他のロケールでは、ほかの空白文字が追加されているかもしれない。

書式:

@example
unexpand [@var{option}]@dots{} [@var{file}]@dots{}
@end example

デフォルトでは、@command{unexpand} が変換するのは、各行の行頭にある複数の空白だけである
(言い換えれば、空白以外のどんな文字よりも前にある複数の空白だけ)。
バックスペース文字は、出力にそのまま残しておく。バックスペースには、
タブ幅を計算する際に、桁数を減らす働きがあるのだ。
デフォルトでは、タブ位置は 8 桁ごとに置かれる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -t @var{tab1}[,@var{tab2}]@dots{}
@itemx --tabs=@var{tab1}[,@var{tab2}]@dots{}
@opindex -t
@opindex --tabs
タブ位置 (tab stop) が一つだけ指定された場合には、
(訳注: 入力行における) タブ位置をデフォルトの 8 桁ごとではなく、@var{tab1} 桁ごとに設定する。
それ以外の場合は、タブ位置を @var{tab1}, @var{tab2}, @dots{} 桁目に置き
(行頭を 0 桁目として数える)、指定された最後のタブ位置より後ろにある空白は、
変換せず、そのままにする。タブ位置の指定は、コンマで区切ってもよく、空白で区切ってもよい。
このオプションを指定すると、@option{-a} オプションが自動的に設定される。

(訳注: 一例を挙げておく。たとえば、@samp{-t 8,12} なら、入力行は、先頭を
0 桁目として、8 桁目、12 桁目にタブ位置があると見なされる。
そこで、先頭に 12 個のスペースがある行に対して @code{unexpand -t 8,12} を行うと、
空白がタブ 2 個に変換される。出力におけるタブ位置はデフォルトのままなので、
出力ではその行は、 0 から数えて 16 桁目から文字が始まることになる。)

互換性を考慮して、GNU の @command{unexpand} は、
@option{-@var{tab1}[,@var{tab2}]@dots{}} という、このオプションの古い書式も認めている。
そちらを使う場合は、タブ位置を必ずコンマで区切らなければならない。
なお、@option{-t} とは違って、この古いオプションは、@option{-a}
を自動的に設定しない。新しいスクリプトでは (訳注: 古い書式と同じ動作をさせたい場合)、
古い書式に代えて、@option{--first-only -t @var{tab1}[,@var{tab2}]@dots{}}
を使うべきである。

@item -a
@itemx --all
@opindex -a
@opindex --all
空白の連続が、行の中で空白以外の文字の後ろにある場合でも、
タブ位置の直前にある 2 個以上の空白の連続は、すべて変換する。

@end table

@exitstatus


@node Directory listing
@chapter ディレクトリの一覧表示

この章では、@command{ls} とその変種の @command{dir} 及び @command{vdir} について説明する。
こうしたコマンドは、ファイルに関する情報を一覧表示する。

@menu
* ls invocation::            ディレクトリの内容を一覧表示する。
* dir invocation::           簡潔な ls。
* vdir invocation::          詳細な ls。
* dircolors invocation::     ls のカラー設定など。
@end menu


@node ls invocation
@section @command{ls}: ディレクトリの内容を一覧表示する

@pindex ls
@cindex directory listing

@command{ls} プログラムはファイルに関する情報を一覧表示する
(ファイルは、いかなるタイプでもよく、ディレクトリでもよい)。
オプションとファイルを示す引数は、ほとんどのコマンドと同様、どんな順番で指定しても構わない。

コマンドラインで指定したオプション以外の引数がディレクトリならば、
@command{ls} はデフォルトでは、そのディレクトリの内容を一覧表示する。
その際、再帰的な表示はせず、名前が @samp{.} で始まるファイルも表示しない。
オプション以外の引数がディレクトリでなければ、単にそのファイルの名前を表示するのが、
@command{ls} のデフォルトの動作である。
オプション以外の引数が一つも指定されていない場合は、カレントディレクトリを対象にし、あたかも
@samp{.} という引数を一つだけ付けて起動したかのように動作する。

@vindex LC_ALL
デフォルトでは、出力を、現在のロケール設定に従って、アルファベット順でソートする
@footnote{POSIX 以外のロケールを使用している場合は (たとえば、@env{LC_ALL}
を @samp{en_US} に設定している場合は)、@command{ls}
の出力が、見慣れない順序で並んでいるかもしれない。そうした場合は、環境変数
@env{LC_ALL} を @samp{C} にしてみるとよい。}。
標準出力が端末の場合は、出力を多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
表示し、制御文字を疑問符として出力する (ソートは縦方向に行う)。
それ以外の場合は、出力が 1 行 1 ファイルの形式になり、制御文字はそのまま手を加えずに出力する。

(訳注: 端末へ出力されるファイル名は、現在ではデフォルトのスタイルが、
「制御文字を疑問符で」から別のものに変更されているかもしれない。
詳しくは、「ファイル名のフォーマット」の節の @option{--quoting-style}
の訳注をご覧いただきたい。)

@command{ls} はきわめて基本的なプログラムなので、長年の間にオプションがどんどん増えてしまった。
以下のサブセクションでは、そうしたオプションについて説明している。
各サブセクション内では、オプションを (大文字小文字を無視して) アルファベット順に並べている。
このようにオプションをサブセクションに分けてはみたが、この分類法は完全なものではない。
オプションの中には、@command{ls} の動作の複数の側面に作用するものもあるからである。

@cindex exit status of @command{ls}
終了ステータス:

@display
0: 成功
1: 軽微な問題 (たとえば、コマンドライン引数として指定されていない
   ファイルやディレクトリにアクセスできなかった場合。ディレクトリの
   内容を一覧表示しようとしたとき、その中にあるエントリが今まさに
   削除やリネームの最中だと、そういうことが起きる)
2: 深刻なトラブル (たとえば、メモリの不足、無効なオプション、
   コマンドライン引数として指定されたファイルやディレクトリに
   アクセスできなかった場合、ディレクトリのループなど)
@end display

参照 @ref{Common options}.

@menu
* Which files are listed::      表示対象にするファイル
* What information is listed::  表示する情報
* Sorting the output::          出力のソート
* Details about version sort::  バージョン・ソートの詳細
* General output formatting::   出力全体の形式
* Formatting file timestamps::  タイムスタンプのフォーマット
* Formatting the file names::   ファイル名のフォーマット
@end menu


@node Which files are listed
@subsection 表示対象にするファイル

以下のオプションは、どんなファイルについて @command{ls} が情報を表示するかを決定する。
デフォルトで @command{ls} が表示するのは、コマンドラインで指定されたファイルだが、
ディレクトリが指定された場合は、その内容になる。
ただし、ディレクトリの内容のうち、名前が @samp{.} で始まるファイルは表示しない。

@table @samp

@item -a
@itemx --all
@opindex -a
@opindex --all
ディレクトリの内容を表示する際、@samp{.} で始まるファイル名も無視しない。

@item -A
@itemx --almost-all
@opindex -A
@opindex --almost-all
ディレクトリの内容を表示する際、@file{.} と @file{..} は無視するが、
それ以外の @samp{.} で始まるいかなるファイル名も無視しない。@option{--all}
(@option{-a}) オプションは、このオプションに優先する。

@item -B
@itemx --ignore-backups
@opindex -B
@opindex --ignore-backups
@cindex backup files, ignoring
ディレクトリの内容表示において、@samp{~} で終わるファイルを無視する。
このオプションは、@samp{--ignore='*~' --ignore='.*~'} と同じである。

@item -d
@itemx --directory
@opindex -d
@opindex --directory
@c The following sentence is the same as the one for -F.
ディレクトリについても、ディレクトリ内容の一覧ではなく、
他のタイプのファイルの場合と同じように、名前だけを表示する。
また、@option{--dereference-command-line} (@option{-H}),
@option{--dereference} (@option{-L}),
@option{--dereference-command-line-symlink-to-dir}
といったオプションが指定されていないかぎり、
コマンドラインでシンボリックリンクが指定されても、それをたどらない。

@item -H
@itemx --dereference-command-line
@opindex -H
@opindex --dereference-command-line
@cindex symbolic links, dereferencing
コマンドライン引数がシンボリックリンクを指定している場合、
リンクそのものではなく、リンクが参照しているファイルの情報を表示する。

@item --dereference-command-line-symlink-to-dir
@opindex --dereference-command-line-symlink-to-dir
@cindex symbolic links, dereferencing
原則としてシンボリックリンクの参照を行わないが、一つだけ例外がある。
すなわち、コマンドライン引数がシンボリックリンクを指定し、
それがディレクトリを指している場合は、リンクそのものではなく、そのディレクトリの情報を表示する。
この動作は、リンクの参照に関係する他のオプションが全く指定されていないときの、
@command{ls} のデフォルトの動作である (リンクの参照に関係する他のオプションには、
@option{--classify} (@option{-F}), @option{--directory} (@option{-d}),
@option{-l}, @option{--dereference} (@option{-L}),
@option{--dereference-command-line} (@option{-H}) がある)。

@item --group-directories-first
@opindex --group-directories-first
すべてのディレクトリをまとめてファイルの前に置き、その上で、選択したソート・キーを使って
(@option{--sort} オプション参照)、ディレクトリとファイルをそれぞれ別々にソートする。
別の言い方をすると、このオプションはソートする際の主キーを設定し、
@option{--sort} オプションが副キーを設定するということだ。ただし、
@option{--sort=none} (@option{-U}) を使ったりすると、このオプションは全く無効になる。

@item --hide=PATTERN
@opindex --hide=@var{pattern}
ディレクトリの内容表示において、@option{--all} (@option{-a}) や
@option{--almost-all} (@option{-A}) が同時に指定されていないかぎり、
シェルのパターン @var{pattern} に名前がマッチするファイルを無視する。
このオプションの動作は、@option{--ignore=@var{pattern}}
とほぼ同じだが、@option{--all} (@option{-a}) や @option{--almost-all}
(@option{-A}) が併せて指定されていると、効果がないという点が違う。

このオプションは、シェルのエイリアスで使うと、便利かもしれない。
たとえば、@command{lx} が @samp{ls --hide='*~'} のエイリアスで、@command{ly}
は @samp{ls --ignore='*~'} のエイリアスだとしよう。
その場合、@samp{lx -A} というコマンドは、ファイル @file{README~} を表示するが、
@samp{ly -A} は表示しないことになる。

@item -I @var{pattern}
@itemx --ignore=@var{pattern}
@opindex -I
@opindex --ignore=@var{pattern}
ディレクトリの内容表示において、シェルのパターン (正規表現ではない)
@var{pattern} に名前がマッチするファイルを無視する。
シェルの場合と同様、ファイル名の先頭にある @samp{.} は @var{pattern}
の先頭のワイルドカードとマッチしない。
このオプションを二度以上使うと、便利なことがある。たとえば、

@smallexample
$ ls --ignore='.??*' --ignore='.[^.]' --ignore='#*'
@end smallexample

最初のオプションは @samp{.} で始まる 3 文字以上のファイル名を無視する。
二番目のオプションは @samp{.} で始まる二文字のファイル名のうち、 @samp{..}
を除くすべて無視し、三番目のオプションは @samp{#} で始まるファイル名を無視する。

@item -L
@itemx --dereference
@opindex -L
@opindex --dereference
@cindex symbolic links, dereferencing
シンボリックリンクについてファイル情報を表示する際、リンクそのものではなく、
リンクが参照しているファイルの情報を表示する。とは言え、
このオプションを使用した場合でも、表示されるファイル名については、
リンクそのものの名前のままであり、リンクが指しているファイルの名前にはならない。

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
@cindex recursive directory listing
@cindex directory listing, recursive
すべてのディレクトリの内容を再帰的に一覧表示する。

@end table


@node What information is listed
@subsection 表示する情報

以下のオプションは、@command{ls} がどんな情報を表示するかに関係している。
@command{ls} がデフォルトで表示するのは、ファイル名だけである。

@table @samp

@item --author
@opindex --author
@cindex hurd, author, printing
詳細形式でディレクトリ内容のリストを出力する際、各ファイルの作成者情報を表示する。
GNU/Hurd では、ファイルの作成者 (author) はファイルの所有者 (owner)
と別人であることがあるが、他のオペレーティング・システムでは、両者は同一である。

@item -D
@itemx --dired
@opindex -D
@opindex --dired
@cindex dired Emacs mode support
詳細表示形式 (@option{-l}) と併せて使用すると、
出力本体の後ろに以下のような追加の行を表示する。

@example
//DIRED// @var{beg1} @var{end1} @var{beg2} @var{end2} @dots{}
@end example

@noindent
@var{begn} や @var{endn} は符号なしの整数であり、
出力における各ファイル名の開始バイト位置と終了バイト位置を示している。このようにすることで、
ファイル名に空白や改行のような普段使わない文字が含まれている場合でも、手の込んだ検索をするまでもなく、
Emacs が簡単にファイル名を見つけられるようにしているのである。

ディレクトリを再帰的にリストしている場合には (@option{-R})、
各サブディレクトリ名のオフセットを記した同様の行も出力する。

@example
//SUBDIRED// @var{beg1} @var{end1} @dots{}
@end example

そして最後に、次の形式の行を出力する。

@example
//DIRED-OPTIONS// --quoting-style=@var{word}
@end example

@noindent
ここで、@var{word} はクォートの方式である
(@pxref{Formatting the file names})。

実例を挙げてみる。

@example
$ mkdir -p a/sub/deeper a/sub2
$ touch a/f1 a/f2
$ touch a/sub/deeper/file
$ ls -gloRF --dired a
  a:
  total 8
  -rw-r--r-- 1    0 Jun 10 12:27 f1
  -rw-r--r-- 1    0 Jun 10 12:27 f2
  drwxr-xr-x 3 4096 Jun 10 12:27 sub/
  drwxr-xr-x 2 4096 Jun 10 12:27 sub2/

  a/sub:
  total 4
  drwxr-xr-x 2 4096 Jun 10 12:27 deeper/

  a/sub/deeper:
  total 0
  -rw-r--r-- 1 0 Jun 10 12:27 file

  a/sub2:
  total 0
//DIRED// 48 50 84 86 120 123 158 162 217 223 282 286
//SUBDIRED// 2 3 167 172 228 240 290 296
//DIRED-OPTIONS// --quoting-style=literal
@end example

上記 @samp{//DIRED//} 行の 2 個づつ組になっているオフセットは、次の
6 個の名前の区切りとなるバイト位置を示している
(訳注: 別の言い方をするなら、出力の先頭からある名前の直前までのバイト数と、
その名前の最後の文字までのバイト数を示している)。6 個の名前とは、すなわち
@file{f1}, @file{f2}, @file{sub}, @file{sub2}, @file{deeper}, @file{file}
である。
@samp{//SUBDIRED//} の行のオフセットが示しているのは、次のディレクトリ名の区切りである。
@file{a}, @file{a/sub}, @file{a/sub/deeper}, @file{a/sub2}。

下記の例では、5 番目の項目の名前 @samp{deeper} を抜き出してみせている。
この項目の名前は、217 と 223 のオフセットの組に対応している。

@example
$ ls -gloRF --dired a > out
$ dd bs=1 skip=217 count=6 < out 2>/dev/null; echo
deeper
@end example

上記のファイル一覧表示では、@samp{deeper} という項目の後ろにスラッシュが付いているが、
オフセットが名前として選択しているのは、後ろのスラッシュを除いた部分であることに注目していただきたい。
しかしながら、@command{ls} を @option{--dired} とともに @option{--escape}
(短縮形は @option{-b}) のようなオプションを付けて実行し、
名前に特殊文字が入っているファイルを処理の対象にする場合には、
バックスラッシュがオフセットの示す範囲のうちに含まれることに注意しなければならない。

@example
$ touch 'a b'
$ ls -blog --dired 'a b'
  -rw-r--r-- 1 0 Jun 10 12:28 a\ b
//DIRED// 30 34
//DIRED-OPTIONS// --quoting-style=escape
@end example

引用符を付加するクォート方式を使用している場合には (たとえば、
@option{--quoting-style=c})、引用符もオフセットの示す範囲に含まれる。
そこで、そうしたクォート方式が、環境変数 @env{QUOTING_STYLE}
によって選択されている可能性も考慮に入れておくべきだ。
すなわち、@option{--dired} を使用するアプリケーションでは、
コマンドラインで明示的に @option{--quoting-style=literal}
オプションを指定するか (@option{-N} や @option{--literal} と指定しても同じことだ)、
あるいは、エスケープされた名前を解析できるするようにしておくか、
どちらかをするべきだということである。

@item --full-time
@opindex --full-time
詳細形式でディレクトリ内容のリストを生成し、日時の情報を省略なしで表示する。
これは、@option{--format=long} を @option{--time-style=full-iso}
と一緒に使うのと同じである (@pxref{Formatting file timestamps})。

@item -g
@opindex -g
詳細形式でディレクトリ内容のリストを生成するが、所有者情報は表示しない。

@item -G
@itemx --no-group
@opindex -G
@opindex --no-group
詳細形式でディレクトリ内容をリスト表示する際に、グループ情報を表示しない
(GNU 版以外の @command{ls} には、この動作がデフォルトのものがある。
そこで、互換性のために、このオプションを用意している)。

@optHumanReadable

@item -i
@itemx --inode
@opindex -i
@opindex --inode
@cindex inode number, printing
ファイル名の左側にそのファイルの inode 番号を表示する (inode
番号は、ファイル連続番号とか、インデックスナンバーとも呼ばれる。
この番号は、ある特定のファイルシステムにある各ファイルを、一意に指し示す)。

@item -l
@itemx --format=long
@itemx --format=verbose
@opindex -l
@opindex --format
@opindex long ls @r{format}
@opindex verbose ls @r{format}
各ファイルの名前のほかに、(訳注: 行頭から順に) ファイルのタイプ、ファイルのモードビット
(訳注: 一般に「アクセス権」とか「許可属性」と言われるもの)、
ハードリンク数、所有者名、グループ名、サイズ、タイムスタンプを表示する
(@pxref{Formatting file timestamps})。
タイムスタンプは、通常は更新日時 (訳注: いわゆる mtime) である。
特定することのできない情報については、疑問符を表示する。

通常、サイズは、桁を区切る記号を付けずに、バイト数で表示されるが、
この表示法は変更することができる (@pxref{Block size})。たとえば、
@option{-h} オプションを指定すると、人間に読みやすい短縮表示になり、
@samp{--block-size="'1"} を指定すると、現在のロケールの区切り記号で
3 桁ごとに区切ったバイト数が表示される。

ディレクトリの内容をリストする場合は、対象となるディレクトリごとに、ファイルのリストの前に
@samp{total @var{blocks}} という行を置く。ここで、@var{blocks} は、
そのディレクトリにあるすべてのファイルに割り当てられたディスク容量の合計である。
現在のところブロックサイズはデフォルトでは 1024 バイトであるが、
この値は変更することができる (@pxref{Block size})。
@var{blocks} の計算では、各ハードリンクを別のものとして計算している。
これはバグだと言えないこともない。

ファイルタイプには、以下の文字の一つが使われる。

@c The commented-out entries are ones we're not sure about.

@table @samp
@item -
通常ファイル
@item b
ブロック・スペシャルファイル
@item c
キャラクタ・スペシャルファイル
@item C
ハイパフォーマンス (``contiguous data'') ファイル
@item d
ディレクトリ
@item D
@c @item F
@c semaphore, if this is a distinct file type
ドア (Solaris 2.5 以上)
@item l
@c @item m
@c multiplexed file (7th edition Unix; obsolete)
シンボリックリンク
@item M
オフライン (``migrated'') ファイル (Cray DMF)
@item n
ネットワーク・スペシャルファイル (HP-UX)
@item p
FIFO (名前付きパイプ)
@item P
@c @item Q
@c message queue, if this is a distinct file type
ポート (Solaris 10 以上)
@item s
@c @item S
@c shared memory object, if this is a distinct file type
@c @item T
@c typed memory object, if this is a distinct file type
@c @item w
@c whiteout (4.4BSD; not implemented)
ソケット
@item ?
上記以外のファイルタイプ
@end table

@cindex permissions, output by @command{ls}
ファイルのモードビットの表示は、アクセス権を設定する際のシンボリックモードの仕様とほぼ同じである (@pxref{Symbolic Modes})。
ただし、@command{ls} は、以下のように、複数のモードビットを一つにまとめて、
アクセス権の各セットの 3 番目の文字で表現している。

@table @samp
@item s
set-user-ID ビットまたは set-group-ID ビットと、対応する実行ビットの両方が立っている場合。

@item S
set-user-ID ビットまたは set-group-ID ビットが立っているが、
対応する実行ビットは立っていない場合。

@item t
削除制限フラグまたはスティキー・ビット (sticky bit) と、
その他のユーザ (other) の実行ビットの両方が立っている場合。
削除制限フラグは、スティッキー・ビットの別名である。 @xref{Mode Structure}.

@item T
削除制限フラグまたはスティキー・ビットが立っているが、
その他のユーザの実行ビットが立っていない場合。

@item x
実行ビットが立っていて、上記のどれにも当てはまらない場合。

@item -
それ以外。
@end table

ファイルのモードビットの後に続く 1 個の文字は、アクセス・コントロール・リスト (ACL)
のような他のアクセス方式が、そのファイルに使われているかどうかを表している。
ファイルのモードビットに続く文字が空白の場合は、他のアクセス方式を使用していないということである。
表示文字が続く場合は、そうしたアクセス方式を使用しているということだ。

GNU の @command{ls} は、SELinux セキュリティ・コンテキストを持つが、
それ以外に他のアクセス方式を使用していないファイルを示すのに、
ピリオド (@samp{.}) を使う。

それ以外で、ファイルが、標準以外のアクセス方式の何らかの組み合わせを使用している場合には、
@samp{+} 文字が印として付く。

@item -n
@itemx --numeric-uid-gid
@opindex -n
@opindex --numeric-uid-gid
@cindex numeric uid and gid
@cindex numeric user and group IDs
詳細形式でディレクトリの内容をリストするが、
所有者やグループの名前の代わりに、数字の user-ID や group-ID を表示する。

@item -o
@opindex -o
詳細形式でディレクトリの内容をリストするが、グループ情報を表示しない。
これは、@option{--format=long} を @option{--no-group} と併せて使うのと同じである。

@item -s
@itemx --size
@opindex -s
@opindex --size
@cindex disk allocation
@cindex size of files, reporting
各ファイルに対するディスク割り当て量をファイル名の左側に表示する。
これはファイルが使用しているディスクスペースの量であり、
普通はファイルのサイズより少し多いが、穴空きファイル (sparse file)
の場合は、少ないこともある。

通常、ディスク割り当て量は 1024 バイトを単位として表示されるが、
これは変更することができる (@pxref{Block size})。

@cindex NFS mounts from BSD to HP-UX
ファイルが HP-UX のシステムから BSD のシステムに NFS マウントされている場合、
このオプションで報告されるディスク使用量は、正確な値の半分である。
それに対して、HP-UX システムの場合は、BSD システムから
NFS マウントされているファイルについて、このオプションは正確な値の 2 倍の量を報告する。
これは、HP-UX システムにある欠陥のせいであり、HP-UX の @command{ls}
プログラムも、そのとばっちりを受けているのである。

@optSi

@item -Z
@itemx --context
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
SELinux セキュリティ・コンテキストを表示する。ない場合は、@samp{?}
を表示する。@option{-l} オプションと一緒に使った場合は、
サイズの左にセキュリティ・コンテキストを出力する。

@end table


@node Sorting the output
@subsection 出力のソート

@cindex sorting @command{ls} output
以下のオプションは、@command{ls} が出力する情報を並べる際の順序を変更する。
デフォルトでは、情報は文字コードによってソートされる (たとえば ASCII コード順)。

@table @samp

@item -c
@itemx --time=ctime
@itemx --time=status
@opindex -c
@opindex --time
@opindex ctime@r{, printing or sorting by}
@opindex status time@r{, printing or sorting by}
@opindex use time@r{, printing or sorting files by}
詳細表示形式 (たとえば、@option{-l}, @option{-o}) を使用しているときは、更新日時
(modification time) の代わりに、ステータス変更日時
(status change time、inode の @samp{ctime}) を表示する。
日時によって明示的にソートしているときや (@option{--sort=time} あるいは
@option{-t})、詳細表示形式を使用していないときは、ステータス変更日時によってソートする。

@item -f
@opindex -f
@cindex unsorted directory listing
@cindex directory order, listing by
主な働きは、@option{-U} と同じで、ソートしないことである。
すなわち、ファイルをリストする際、ファイルがディレクトリにどんな順序で格納されていようと、
そのままの順序で出力する。それだけでなく、@option{-a} (すべてのファイルをリストする)
を有効にし、@option{-l}, @option{--color}, @option{-s} を
(@option{-f} より前で指定されていたら) 無効にする働きもある。

@item -r
@itemx --reverse
@opindex -r
@opindex --reverse
@cindex reverse sorting
どんな方法でソートされていようと、逆順にする。
たとえば、ファイルを並べる際に、アルファベットの後ろから並べる、
最新バージョンから先に並べる、サイズの小さいものから先に並べる、などなど。

@item -S
@itemx --sort=size
@opindex -S
@opindex --sort
@opindex size of files@r{, sorting files by}
ファイルのサイズによってソートし、大きいものから順に並べる。

@item -t
@itemx --sort=time
@opindex -t
@opindex --sort
@opindex modification time@r{, sorting files by}
更新日時 (modification time、inode の @samp{mtime}) によってソートし、
新しいものから順に並べる。

@item -u
@itemx --time=atime
@itemx --time=access
@itemx --time=use
@opindex -u
@opindex --time
@opindex use time@r{, printing or sorting files by}
@opindex atime@r{, printing or sorting files by}
@opindex access time@r{, printing or sorting files by}
詳細表示形式 (たとえば、@option{--format=long}) を使用しているときは、
最終アクセス日時 (last access time、inode の @samp{atime}) を表示する。
日時によって明示的にソートしているときや (@option{--sort=time} あるいは
@option{-t})、詳細表示形式を使用していないときは、アクセス日時によってソートする。

@item -U
@itemx --sort=none
@opindex -U
@opindex --sort
@opindex none@r{, sorting option for @command{ls}}
ソートを行わない。すなわち、ファイルをリストする際、ファイルがディレクトリにどんな順序で格納されていようと、
そのままの順序で出力する (@option{-f} が行う、ソートに無関係な他のことは、何もしない)。
このオプションは非常に大きなディレクトリを一覧表示するとき、ことのほか役に立つ。
ソートを全くしないことで、作業速度が著しく向上するからである。

@item -v
@itemx --sort=version
@opindex -v
@opindex --sort
@opindex version@r{, sorting option for @command{ls}}
バージョン名とバージョン番号によってソートし、低いバージョンから順に並べる。
デフォルトのソート方法と動作が似ているが、 10 進数の数字が連続する各部分を、
インデックス番号やバージョン番号と見なし、(文字列としてではなく)
数値として取り扱う点が違う。 (@xref{Details about version sort}.)

@item -X
@itemx --sort=extension
@opindex -X
@opindex --sort
@opindex extension@r{, sorting files by}
ディレクトリの内容をファイルの拡張子 (最後の @samp{.} の後に続く文字)
によってアルファベット順でソートする。拡張子のないファイルは、
最初に並べられる。

@end table


@node Details about version sort
@subsection バージョン・ソートの詳細

ファイル名にはインデックス番号やバージョン番号が含まれていることがしばしばあるが、
バージョン・ソートは、そうした状況に対処している。
通常のソートでは、1 文字づつ文字の比較を行うので、結果がこちらの期待する順番にならないことがよくあるのだ。
バージョン・ソートが特に役に立つのは、
インデックス番号やバージョン番号を名前に含むファイルがたくさんあるディレクトリを一覧するときである。

@example
$ ls -1            $ ls -1v
abc.zml-1.gz       abc.zml-1.gz
abc.zml-12.gz      abc.zml-2.gz
abc.zml-2.gz       abc.zml-12.gz
@end example

バージョン・ソートにおける文字列の比較は、次のように行われる。
@var{ver1} と @var{ver2} がバージョン番号で、@var{prefix} (前置部分) と @var{suffix} (後置部分)
が文字列だとしよう (@var{suffix} は正規表現の @samp{(\.[A-Za-z~][A-Za-z0-9~]*)*}
にマッチするもの)。その場合、@var{ver1} < @var{ver2} ならば、``@var{prefix} @var{ver1}
@var{suffix}''
から構成される名前は ``@var{prefix} @var{ver2} @var{suffix}'' より前に来る。

数字の部分の先行する 0 は無視されることにも注意していただきたい。

@example
$ ls -1            $ ls -1v
abc-1.007.tgz      abc-1.01a.tgz
abc-1.012b.tgz     abc-1.007.tgz
abc-1.01a.tgz      abc-1.012b.tgz
@end example

この機能は gnulib の @code{filevercmp} 関数を使って実装されている。
そこで、知っておいた方がよい注意事項がいくつかある。

@itemize @bullet
@item @env{LC_COLLATE} は無視される。そのため、@samp{ls -v} や @samp{sort -V} は、
数値ではない PREFIX (前置部分) を、@env{LC_COLLATE} ロケール・カテゴリが
@samp{C} に設定されているかのようにソートする。
@item SUFFIX (後置部分) に上記の正規表現がマッチしてくれないことがある。
従って、以下の例は、期待通りの順序ではないかもしれない。

@example
abc-1.2.3.4.7z
abc-1.2.3.7z
@end example

@example
abc-1.2.3.4.x86_64.rpm
abc-1.2.3.x86_64.rpm
@end example
@end itemize

@node General output formatting
@subsection 出力全体の形式

以下のオプションは出力全体の見かけに影響を及ぼす。

@table @samp

@item -1
@itemx --format=single-column
@opindex -1
@opindex --format
@opindex single-column @r{output of files}
1 行 に 1 ファイルを表示する。標準出力が端末でないときの
@command{ls} のデフォルトである。
ファイル名中に改行文字があっても、それをそのまま出力してしまわないようにするには、
@option{-b} や @option{-q} オプションも参照していただきたい。

(訳注: @option{-1} オプションを指定しても、標準出力が端末ならば、
ファイル名中の改行文字を @samp{?} 記号で表示するか、ファイル名を
@samp{shell-escape} スタイルでクォートするか、どちらかをやってくれるはずだ。
上の注意書きは、標準出力が端末でないときの話である。)

@item -C
@itemx --format=vertical
@opindex -C
@opindex --format
@opindex vertical @r{sorted files in columns}
ファイルのリストを多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
表示し、ソートは縦方向に行う。これは、標準出力が端末のときの
@command{ls} のデフォルトである。@command{dir} コマンドにとっては、
これが常にデフォルトになる。GNU の @command{ls} は、
できるだけ少ない行数でできるだけ多くのファイルを表示するために、段の幅を可変にしている。

@item --color[=@var{when}]
@opindex --color
@cindex color, distinguishing file types with
ファイルのタイプを区別するためにカラー表示を使用するかどうかを指定する。
@var{when} は省略してもよく、以下の一つでもよい。
@itemize @bullet
@item none
@vindex none @r{color option}
カラー表示を全く使用しない。これがデフォルトである。
@item auto
@vindex auto @r{color option}
@cindex terminal, using color iff
標準出力が端末の場合のみ、カラー表示を使用する。
@item always
@vindex always @r{color option}
常にカラー表示を使用する。
@end itemize
@var{when} を付けずに @option{--color} を指定するのは、"@option{--color=always}
と同じことである。カラー表示にしたファイルのリストをパイプで @command{more} や
@command{less} のようなページャに送ると、たいての場合、判読に苦しむ羽目になる。
ただし、@code{more -f} を使うと、うまく行くようだ。(訳注: 訳者の手元では、
@samp{less -R} や @samp{lv -c} で一応問題なくカラー表示ができているようだ。)

@vindex LS_COLORS
@vindex SHELL @r{environment variable, and color}
留意すべきは、@option{--color} オプションを使用すると、
大量のファイルがあるディレクトリで @command{ls} を実行したとき、
目に見えて動作速度が低下するかもしれないことである。
これは、カラー表示のデフォルトの設定では、@command{ls} は、
リストするファイルを一つづつ @code{stat} システムコールで調べる必要があるからだ。
とは言え、ファイルタイプのカラー表示はおおむね使用したいけれど、
他の色付けオプションは使わなくてもよいこともある
(たとえば、実行属性、リンク切れ、スティッキー・ビット、その他のユーザの書き込み権限、
ケーパビリティなどは、色で表示しなくてもよい)。
その場合は、こんなふうに、@command{dircolors} コマンドを使用して、環境変数
@env{LS_COLORS} を設定すればよい。
@example
eval $(dircolors -p | perl -pe \
  's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)
@end example
そうすれば、@code{dirent.d_type} が使えるファイルシステムなら、
@command{ls} は各コマンドライン引数に対してたった一回だけ
@code{stat} システムコールを行うだけですむようになる。

@item -F
@itemx --classify
@itemx --indicator-style=classify
@opindex -F
@opindex --classify
@opindex --indicator-style
@cindex file type and executables, marking
@cindex executables and file type, marking
@c The following sentence is the same as the one for -d.
各ファイル名の後ろに、ファイルタイプを示す 1 文字を付ける。
通常ファイルの場合も、実行可能ファイルならば、@samp{*} を後置する。
ファイルタイプの指標は、ディレクトリならば @samp{/}、シンボリックリンクならば
@samp{@@}、FIFO ならば @samp{|}、ソケットならば @samp{=}、ドアならば
@samp{>} であり、通常ファイルを表す指標はない。
なお、@option{--dereference-command-line} (@option{-H}),
@option{--dereference} (@option{-L}),
@option{--dereference-command-line-symlink-to-dir}
といったオプションが指定されていないかぎり、コマンドラインで指定されたシンボリックリンクをたどることはない。

@item --file-type
@itemx --indicator-style=file-type
@opindex --file-type
@opindex --indicator-style
@cindex file type, marking
各ファイル名の後ろに、ファイルタイプを示す 1 文字を付ける。
@option{-F} に似ているが、こちらは、実行ファイルに指標を付けない。

@item --indicator-style=@var{word}
@opindex --indicator-style
ファイル名の後ろに指標文字を付けるとき、@var{word} というスタイルを使用する。
@var{word} には次のものがある。

@table @samp
@item none
指標文字を全く付けない。これがデフォルトである。
@item slash
ディレクトリの後ろに @samp{/} を付ける。これは、@option{-p} オプションと同じである。
@item file-type
ディレクトリ、シンボリックリンク、FIFO、ソケットの後ろに、
それぞれ @samp{/}, @samp{@@}, @samp{|},  @samp{=} を付け、
通常ファイルの後ろには何も付けない。これは、@option{--file-type} オプションと同じである。
@item classify
実行可能な通常ファイルの後ろに @samp{*} を付ける。それ以外は、
@samp{file-type} の場合と同じ動作をする。これは、@option{-F} や
@option{--classify} オプションと同じである。
@end table

@item -k
@itemx --kibibytes
@opindex -k
@opindex --kibibytes
デフォルトのブロックサイズを標準の値の 1024 バイトに設定する。
そのとき、環境変数でそれ以外のどんな値が設定されていても、
それを上書きする (@pxref{Block size})。このオプション自身も、
@option{--block-size}, @option{--human-readable} (@option{-h}),
@option{--si} オプションがあれば、それによって上書きされる。

@option{--kibibytes} (@option{-k}) オプションが影響を及ぼすのは、@option{-l}
などのオプションが書き出すディレクトリごとのブロック数や、@option{--size}
(@option{-s}) オプションが表示するディスク割り当て量に対してである。
@option{-l} の表示するファイルサイズには影響を及ぼさない。

@item -m
@itemx --format=commas
@opindex -m
@opindex --format
@opindex commas@r{, outputting between files}
ファイルを横に並べ、各行に収まる範囲でできるだけ多くの項目を表示する。
ファイル同士は @samp{, } (コンマとスペース) で区切る。

@item -p
@itemx --indicator-style=slash
@opindex -p
@opindex --indicator-style
@cindex file type, marking
ディレクトリ名の後ろに @samp{/} を付ける。

@item -x
@itemx --format=across
@itemx --format=horizontal
@opindex -x
@opindex --format
@opindex across@r{, listing files}
@opindex horizontal@r{, listing files}
ファイルのリストを多段組みで (訳注: すなわち、1 行に複数ファイルの形式で)
表示し、ソートは横方向に行う。

@item -T @var{cols}
@itemx --tabsize=@var{cols}
@opindex -T
@opindex --tabsize
タブ位置が @var{cols} 桁ごとにあると想定する。デフォルトは 8 桁ごと。
@command{ls} は効率を考慮し、使えるときはタブを出力で使用する。
@var{cols} が 0 の場合は、タブを使用しない。

端末エミュレータの中には、ASCII 以外のバイトが前にあると、
列をタブ位置の右にきちんと揃えてくれないものがあるかもしれない。
この問題を回避するには、@option{-T0} オプションを使うか、環境変数
@code{TABSIZE=0} を設定するかして、列を揃えるのにタブではなく、
スペースを使うよう、@command{ls} に指示すればよい。

@item -w @var{cols}
@itemx --width=@var{cols}
@opindex -w
@opindex --width
@vindex COLUMNS
スクリーンの横幅が @var{cols} 桁だと想定する。デフォルトの値は、
可能ならば端末の設定から取得する。取得できないときは、環境変数
@env{COLUMNS} が設定されていれば、それを使用する。
それも設定されていないときのデフォルトの値は 80 である。
@var{cols} の値を @samp{0} にすると、出力行の長さに制限がなくなる。
その場合、ただ一行の出力中で各項目を分離するのは、タブではなく、スペースになる。

@end table


@node Formatting file timestamps
@subsection タイムスタンプのフォーマット

デフォルトでは、ファイルのタイムスタンプは短縮形式で表示される。
すなわち、最近のタイムスタンプ以外は、@samp{Mar 30@ @ 2002}
といった日付表示になり、最近のタイムスタンプは、@samp{Mar 30 23:45}
といった年度なしの日付と時刻の表示になる。この書式は、後で詳しく述べるように、
使用しているロケールによっては違ったものになるかもしれない。

@cindex clock skew
タイムスタンプは、ここ 6 ヶ月以内のもので、未来の日付が付いていなければ、
最近 (@dfn{recent}) として扱われる。今日の日付のタイムスタンプが、
最近用の書式で表示されない場合、そのタイムスタンプは未来扱いされている。
それは、おそらく時計に狂いが生じているということであり、@command{make}
のような、ファイルのタイムスタンプに頼っているプログラムは、まともに動かないかもしれない。

@vindex TZ
タイムスタンプは、タイムゾーンのルールに従って表示されるが、
そのルールを指定しているのは、環境変数 @env{TZ} である。
@env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
The GNU C Library Reference Manual}.

以下のオプションは、ファイルのタイムスタンプの表示方法を変更する。

@table @samp
@item --time-style=@var{style}
@opindex --time-style
@cindex time style
タイムスタンプを @var{style} 形式で表示する。
@var{style} は以下の一つでなければならない。

@table @samp
@item +@var{format}
@vindex LC_TIME
@var{format} を使って、タイムスタンプを表示する。
その場合、@var{format} は、@command{date} コマンドの書式引数と同じように解釈される
(@pxref{date invocation})。
たとえば、@option{--time-style="+%Y-%m-%d %H:%M:%S"} と指定すると、
@command{ls} の表示するタイムスタンプは、@samp{2002-03-30 23:45:56}
のようになる。@command{date} の場合と同様、@var{format}
の解釈は、@env{LC_TIME} ロケール・カテゴリの影響を受ける。

@var{format} に改行で分離された二つの書式文字列がある場合、
前半は最近のファイル以外に使用され、後半は最近のファイルに使用される。
出力される列をきちんと揃えたければ、二つの書式のどちらかに、
空白をいくつか入れる必要があるかもしれない。

@item full-iso
タイムスタンプを省略なしで表示する。
すなわち、ISO 8601 の日付、時刻、タイムゾーンという構成要素を
nanosecond (10 億分の 1 秒) の精度で使用するわけだ。
一例を挙げると、@samp{2002-03-30 23:45:56.477817180 -0700}
といった表示になる。この形式は、@samp{+%Y-%m-%d %H:%M:%S.%N %z} と同じである。

これが有用なのは、タイムスタンプが、オペレーティング・システムから取得できる時間関係のすべての情報を含んでいるからである。
たとえば、GNU の @command{make} は、あるファイルが古いかどうかを判定するのに、
省略なしのタイムスタンプを使用している。そのため、この情報が、@command{make}
の動作を説明するために役立つことがあるのである。

@item long-iso
ISO 8601 の日付と時刻の構成要素を分の単位まで表示する。たとえば、
@samp{2002-03-30 23:45}。このタイムスタンプは、@samp{full-iso} タイム
スタンプより短く、日常作業にはたいてい十分である。この形式は
@samp{+%Y-%m-%d %H:%M} と同じである。

@item iso
最近以外のタイムスタンプでは、ISO 8601 の日付を表示し
(たとえば @samp{2002-03-30@ })、最近のタイムスタンプでは、
ISO 8601 風の月・日・時・分を表示する (たとえば @samp{03-30 23:45})。
この形式は、@samp{long-iso} の形式に比べて見かけがよくないが、
より狭いスペースでほぼ同量の情報を伝えており、また、簡潔なので
@command{ls} の出力を伝統的な 1 行 80 桁の出力行に納めるのに都合がよい。
@command{ls} を実行する以下の二つの方法は、同じことである。

@example
newline='
'
ls -l --time-style="+%Y-%m-%d $newline%m-%d %H:%M"
ls -l --time-style="iso"
@end example

@item locale
@vindex LC_TIME
タイムスタンプをロケール依存形式で表示する。たとえば、
フィンランド語のロケールだと、最近以外のタイムスタンプを
@samp{maalis 30@ @ 2002} のように表示し、最近のタイムスタンプは
@samp{maalis 30 23:45} のように表示するかもしれない。
ロケール依存のタイムスタンプは、概して @samp{iso} のタイムスタンプより長くなるし、
ロケールごとの規則の違いは非常に大きいので、プログラムによる解析がずっと難しくなる。
だが、こちらの方がわかりやすい人も大勢いる。

タイムスタンプの書式を決めているのは、@env{LC_TIME} ロケール・カテゴリである。
デフォルトの POSIX ロケールでは、@samp{Mar 30@ @ 2002} や
@samp{Mar 30 23:45} といったタイムスタンプを使っている。
POSIX ロケールでは、@command{ls} を実行する次の二つの方法は、同じことである。

@example
newline='
'
ls -l --time-style="+%b %e  %Y$newline%b %e %H:%M"
ls -l --time-style="locale"
@end example

しかし、他のロケールでは動作が違う。たとえば、ドイツ語のロケールだと、
@option{--time-style="locale"} は @option{--time-style="+%e. %b %Y
$newline%e. %b %H:%M"}
とおそらく同じになり、@samp{30. M@"ar 2002@ } や
@samp{30. M@"ar 23:45} といったタイムスタンプを生成するだろう。

@item posix-@var{style}
@vindex LC_TIME
@env{LC_TIME} ロケール・カテゴリが POSIX なら、POSIX ロケールのタイムスタンプを表示し、
それ以外なら、@var{style} 形式のタイムスタンプを表示する。
たとえば、@samp{posix-long-iso} という指定は、POSIX ロケールでは
@samp{Mar 30@ @ 2002} や @samp{Mar 30 23:45} といったタイムスタンプを表示し、
それ以外のロケールでは @samp{2002-03-30 23:45} といったタイムスタンプを表示する。
@end table
@end table

@vindex TIME_STYLE
@option{--time-style} オプションのデフォルト値は、環境変数 @env{TIME_STYLE}
を使って指定することができる。@env{TIME_STYLE} が設定されていない場合、
デフォルトの形式は @samp{locale} である。GNU Emacs のバージョン 21.3
以降では、@command{ls} の @option{--dired} オプションを使用しており、
従って、どんな日付のフォーマットでも解析することができる。しかし、Emacs 21.1
や 21.2 を使っていて、POSIX 以外のロケールを指定している場合は、
@samp{TIME_STYLE="posix-long-iso"} を設定する必要があるかもしれない。

ある種のサービス不能化攻撃 (denial-of-service attacks) を回避するため、
1000 バイトより長くなりそうなタイムスタンプは、エラーとして処理されることがある。


@node Formatting the file names
@subsection ファイル名のフォーマット

以下のオプションは、ファイル名の表示方法を変更する。

@table @samp

@item -b
@itemx --escape
@itemx --quoting-style=escape
@opindex -b
@opindex --escape
@opindex --quoting-style
@cindex backslash sequences for file names
ファイル名中の非表示文字を、C 言語で使うような、バックスラッシュにアルファベットや
8 進数を続ける方法を使用して、クォートする (訳注:
このオプションでは、タブや改行だけでなく、空白 (Ox20)
もバックスラッシュでクォートされる)。

@item -N
@itemx --literal
@itemx --quoting-style=literal
@opindex -N
@opindex --literal
@opindex --quoting-style
ファイル名をクォートしない。とは言え、@command{ls} では、出力先が端末の場合は、
@option{--show-control-chars} が指定されていないかぎり、
非表示文字を疑問符として表示するぐらいのことは行う。

@item -q
@itemx --hide-control-chars
@opindex -q
@opindex --hide-control-chars
ファイル名中の非表示文字に代えて、疑問符を表示する。
この動作は、出力先が端末で、プログラムが @command{ls}
の場合のデフォルトである。

(訳注: このオプションの現在の動作は変わっているかもしれない。
すなわち、出力先が端末以外の場合は、上記の通り、非表示文字を疑問符で表示するが、
出力先が端末の場合は、非表示文字を疑問符ではなく、@samp{$''}
という形で表示し、空白 (0x20) を含むファイル名はファイル名全体をシングルクォートで囲むかもしれない。
@option{--quoting-style} の説明の末尾の訳注もご覧になっていただきたい。)

@item -Q
@itemx --quote-name
@itemx --quoting-style=c
@opindex -Q
@opindex --quote-name
@opindex --quoting-style
ファイル名をダブル・クォートで囲み、非表示文字を C 言語と同じやり方でクォートする。

@item --quoting-style=@var{word}
@opindex --quoting-style
@cindex quoting style
ファイル名などの文字列には、通常使われない文字が含まれているかもしれない。
このオプションを指定すると、@var{word} というスタイルを使って、
そうした文字列をクォートすることになる。
@var{word} は、以下に挙げるものの一つでなければならない。

@macro quotingStyles
@table @samp
@item literal
文字列に手を加えず、そのまま出力する。これは、@option{-N} や
@option{--literal} オプションと同じである。
@item shell
文字列にシェルのメタ文字がある場合や、出力が誤解を招くものになりそうな場合に、
シェル向けのクォートを施す。このクォート方法は、@command{bash} のような
POSIX 互換のシェルにはふさわしいものだが、
@command{csh} のような非互換のシェルでは、必ずしもうまく働くとはかぎらない。
@item shell-always
普通ならクォートが不要な場合でも、文字列にシェル向けのクォートを施す。
@item shell-escape
@samp{shell} に似ているが、非表示文字のクォーティングに POSIX 提唱の
@samp{$''} という書式を使用する。ほとんどのシェルに適している。
(訳注: ファイル名中に空白 (0x20) がある場合は、ファイル名全体をシングルクォートで囲む。)
@item shell-escape-always
@samp{shell-escape} に似ているが、普通ならクォートが不要な場合でも、
文字列にクォートを施す。
@item c
C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
文字列をダブル・クォートで囲むことも行う。
これは、@option{-Q} や @option{--quote-name} オプションと同じである。
@item escape
C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
ただし、文字列をダブル・クォートで囲むことはしない。
これは、@option{-b} や @option{--escape} と同じである。
@item clocale
C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
ただし、文字列を囲む引用符には、ロケールにふさわしいものを使う。
@item locale
@c Use @t instead of @samp to avoid duplicate quoting in some output styles.
C 言語の文字列リテラルをクォートするときのように、文字列をクォートする。
ただし、文字列を囲む引用符には、ロケールにふさわしいものを使い、
さらに、デフォルトの C ロケールで言うと、@t{"like this"} ではなく、
@t{'like this'} のようにクォートを行う。この方が見栄えのよいディスプレイが多い。
@end table
@end macro
@quotingStyles

@option{--quoting-style} オプションのデフォルト値は、環境変数
@env{QUOTING_STYLE} によって指定することができる。
この環境変数が設定されていない場合、デフォルトの値は、出力先が端末のときは
@samp{shell-escape} であり、端末以外のときは @samp{literal} である。

(訳注: 上記の説明からは、デフォルトの端末に対する出力のスタイルは、
@samp{shell-escape} であるように読める。しかし、@option{--hide-control-chars}
(@option{-q}) の説明や、@command{ls} の章全体の冒頭では、
非表示文字を疑問符として表示するのが、デフォルトの端末に対する出力だと言っている。
info マニュアルの説明に少し混乱があり、部分的に古い記述が残っているらしい。実のところ、coreutils
の開発元では、バージョン 8.25 あたりから、デフォルトの端末に対する出力を
@option{--quoting-style=shell-escape} にしている。
たとえば、ファイル名にタブが含まれている場合、オプションなしの
@command{ls} は、@samp{aaa?bbb} ではなく @samp{'aaa'$'\t''bbb'}
のように端末に表示するのである。また、ファイル名中に空白がある場合は、
ファイル名全体をシングルクォートで囲って、@samp{'/misc/xxx yyy'}
のように表示する。しかし、ディストリビューションによっては、バージョン
8.26 でも、デフォルトの端末に対する出力を
@option{--quoting-style=literal} にしていることもある。
その方が見やすいかもしれないので、それも一見識だと思う。端末に対するデフォルトの出力や
@option{-q} オプションの動作が、ご自分のところではどうなっているか、一度お確かめになっておくとよい。)

@item --show-control-chars
@opindex --show-control-chars
ファイル名中の非表示文字に手を加えず、そのまま出力する。
この動作は、出力先が端末ではない場合や、プログラムが @command{ls}
ではない場合のデフォルトである。

(訳注: 開発元配布のバージョン 8.26 では、@option{--show-contrls-chars}
を指定した場合も、出力先が端末だと、非表示文字を @samp{$''} の書式で表示している。
出力先が端末以外なら、上の説明どおり、非表示文字がそのまま出力される。
しかし、ディストリビューション配布の @command{ls}
では、出力先が端末の場合に上記説明通りの動作をするものもある。
これも、お手元で実際の動作を確かめておいていただきたい。)

@end table


@node dir invocation
@section @command{dir}: ディレクトリの内容を簡潔に表示する

@pindex dir
@cindex directory listing, brief

@command{dir} の動作は、@code{ls -C -b} と同じである。
すなわち、デフォルトでは、ファイルのリストを多段組みで
(訳注: 1 行に複数ファイルの形式で) 表示し、ソートは縦方向に行う。
また、特殊文字は、バックスラッシュ・エスケープシーケンスを使って表示する。

@xref{ls invocation, @command{ls}}.


@node vdir invocation
@section @command{vdir}: ディレクトリの内容を詳細に表示する

@pindex vdir
@cindex directory listing, verbose

@command{vdir} の動作は、@code{ls -l -b} と同じである。
すなわち、デフォルトでは、詳細形式でファイルをリストし、
特殊文字は、バックスラッシュ・エスケープシーケンスを使って表示する。

@xref{ls invocation, @command{ls}}.

@node dircolors invocation
@section @command{dircolors}: @command{ls} のカラー設定

@pindex dircolors
@cindex color setup
@cindex setup for color

@command{dircolors} は、@command{ls} (や @command{dir} など)
でカラー出力をするのに必要な端末設定のためのシェルコマンドのシーケンスを出力する。
通常、次のような形で使用される。

@example
eval "$(dircolors [@var{option}]@dots{} [@var{file}])"
@end example

@var{file} が指定されていると、@command{dircolors} はそれを読み込んで、
どのファイルタイプや拡張子に対してどの色を使うかを決定する。
@var{file} が指定されていない場合は、プログラムに埋め込まれているデータベースが使用される。
そうした設定ファイルの書式について詳しいことを知りたかったら、
@samp{dircolors --print-database} を実行してみるとよい。

ファイル @file{~/.dircolors} が存在していたら、@command{dircolors}
がそれを読み込むようにするには、以下の行を自分の @file{~/.bashrc} に書き込めばよい
(お気に入りのシェルが bash でないなら、適切に書き直すこと)。

@example
d=.dircolors
test -r $d && eval "$(dircolors $d)"
@end example

@vindex LS_COLORS
@vindex SHELL @r{environment variable, and color}
@command{dircolors} の出力は、環境変数 @env{LS_COLORS}
を設定するシェルコマンドである。どのシェルの文法にするかは、
コマンドラインで指定することができる。指定しない場合は、環境変数 @env{SHELL}
の値から @command{dircolors} が推測する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp
@item -b
@itemx --sh
@itemx --bourne-shell
@opindex -b
@opindex --sh
@opindex --bourne-shell
@cindex Bourne shell syntax for color setup
@cindex @command{sh} syntax for color setup
Bourne シェルのコマンドを出力する。これが、環境変数 @env{SHELL}
が設定されていて、その値が @samp{csh} や @samp{tcsh}
で終わっていないときのデフォルトである。

@item -c
@itemx --csh
@itemx --c-shell
@opindex -c
@opindex --csh
@opindex --c-shell
@cindex C shell syntax for color setup
@cindex @command{csh} syntax for color setup
C シェルのコマンドを出力する。これは、環境変数 @code{SHELL} の値が、
@command{csh} や @command{tcsh} で終わっているときのデフォルトである。

@item -p
@itemx --print-database
@opindex -p
@opindex --print-database
@cindex color database, printing
@cindex database for color setup, printing
@cindex printing color database
(プログラムに埋め込まれている) デフォルトのカラー設定データベースを出力する。
この出力は、それ自体有効な設定ファイルであり、どういう設定が可能かについてかなり詳しく説明している。

@end table

@exitstatus


@node Basic operations
@chapter 基本的なファイル操作

@cindex manipulating files

この章では、基本的なファイル操作のためのコマンドを説明する。
すなわち、コピー、移動 (名前の変更)、消去 (削除) といった操作である。

@menu
* cp invocation::            ファイルをコピーする。
* dd invocation::            ファイルの変換とコピー。
* install invocation::       ファイルをコピーし属性をセットする。
* mv invocation::            ファイルの移動 (名前の変更) を行う。
* rm invocation::            ファイルやディレクトリを削除する。
* shred invocation::         セキュリティを向上させたファイルの削除。
@end menu


@node cp invocation
@section @command{cp}: ファイルやディレクトリをコピーする

@pindex cp
@cindex copying files and directories
@cindex files, copying
@cindex directories, copying

@command{cp} はファイルをコピーする (もしそうしたければ、ディレクトリのコピーもできる)。
コピーによって作られたファイルは、コピー元から全く独立したものになる。
一つのファイルを別のファイルにコピーすることもできるし、
好きなだけたくさんのファイルをコピー先のディレクトリに一遍にコピーすることもできる。

書式:

@example
cp [@var{option}]@dots{} [-T] @var{source} @var{dest}
cp [@var{option}]@dots{} @var{source}@dots{} @var{directory}
cp [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
@end example

@itemize @bullet
@item
ファイル名を二つ指定すると、@command{cp} は最初のファイルを 2 番目のファイルにコピーする。

@item
@option{--target-directory} (@option{-t}) オプションを指定した場合や、
あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
@option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
@command{cp} は、各コピー元 (@var{source}) ファイルを、指定されたディレクトリにコピー元
(@var{source}) と同じ名前でコピーする。
@end itemize

ほとんどの場合、ファイルは読み込まれたとおりに書き出される。
例外については、後述の @option{--sparse} オプションをご覧になっていただきたい。

デフォルトでは、@command{cp} はディレクトリをコピーしない。
ただし、@option{-R}, @option{-a}, @option{-r} オプションを指定すると、
@command{cp} は再帰的なコピーを行う。
すなわち、コピー元のディレクトリを段階的に下って、対応するコピー先のディレクトリにファイルをコピーすることになる。

コピー元がシンボリックリンクの場合、@command{cp} がリンクをたどるのは
(訳注: すなわち、リンクそのものではなく、参照先の実ファイルをコピーするのは)、
通常では、再帰的なコピーをしていないときか、あるいは、@option{--link}
(@option{-l}) オプションが使用されているときだけである。
このデフォルトの動作は、次に挙げるオプションによって変更することができる。
@option{--archive} (@option{-a}), @option{-d}, @option{--dereference}
(@option{-L}),
@option{--no-dereference} (@option{-P}), @option{-H}。
こうしたオプションを二つ以上指定すると、@command{cp} は警告を出さず、最後のオプションで他のものを上書きする。

(訳注: 最近の @command{cp} では @option{--link} オプションの動作が変更されている。
コピー元がシンボリックリンクの場合、coreutils-8.21 までは、
デフォルトでは、シンボリックリンクのハードリンクを作っていたが、8.22
以後の @command{cp} では参照先ファイルのハードリンクを作るようになっている。)

コピー先がシンボリックリンクの場合、@command{cp} がリンクをたどるのは
(訳注: すなわち、コピー元ファイルで、リンクそのものではなく、参照先のファイルを上書きするのは)、
そのリンクが、存在する通常ファイルを指しているときだけである。
それに対して、コピー先のシンボリックリンクがリンク切れしている場合は、@command{cp}
は、デフォルトではコピーを拒否し、エラーメッセージを出して、実行に失敗する。
そうした操作は、本質的に危険だからである。
この動作は、伝統的な習慣や POSIX の仕様に反している。
たとえリスクがあろうとも、リンク切れしたシンボリックリンクの参照先を
@command{cp} が作成するようにしたいなら、環境変数 @env{POSIXLY_CORRECT}
を設定すればよい。なお @option{--backup} や @option{--link}
といったオプションが、コピーする前にコピー先ファイルの名前変更や削除を行う場合、
@command{cp} は、リンクが指しているファイルではなく、シンボリックリンクの名前変更や削除を行う。

デフォルトでは、@command{cp} がスペシャルファイルの内容をコピーするのは、
再帰的なコピーをしていないときだけである。このデフォルトの動作は、
@option{--copy-contents} によって変更できる。

@cindex self-backups
@cindex backups, making only
@command{cp} は通常、ファイルを自分自身にコピーすることを拒否するが、次の例外がある。
@var{source} と @var{dest} が同一で、しかも、通常ファイルを指しているとき、
@option{--force --backup} オプションが指定されると、@command{cp}
はバックアップファイルを作成することになる。バックアップファイルを標準のものにするか
(訳注: ファイルの末尾にチルダ @samp{~} が 1 個付く)、番号付きのものにするかは、
いつもどおりの方法で指定できる (@pxref{Backup options})。
存在するファイルに変更を加える前に、そのバックアップをちょっと作っておきたい場合、この動作は便利である。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp
@item -a
@itemx --archive
@opindex -a
@opindex --archive
コピー元ファイルの構造と属性をコピー先でもできるだけ維持する
(ただし、ディレクトリの内部構造を維持しようとはしない。そのため、コピー先で
@samp{ls -U} を実行すると、コピー元とは違った順序でファイルがリストされるかもしれない)。
SELinux コンテキストや拡張属性 (xattr) も維持しようとするが、
そうした操作に失敗しても無視し、その旨エラーメッセージを表示することはない。
エラーメッセージが少ないだけで、@option{-dR --preserve=all} と同じある。

@item --attributes-only
@opindex --attributes-only
コピー元ファイルの指定された属性のみを、コピー先にコピーする。
コピー先ファイルがすでに存在している場合、その内容を変更することはない。
属性のうち、何をコピーするかを決める方法については、@option{--preserve}
オプションの項を見ていただきたい。

@item -b
@itemx --backup[=@var{method}]
@opindex -b
@opindex --backup
@vindex VERSION_CONTROL
@cindex backups, making
@xref{Backup options}.
そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。
特殊な用法としては、次のものがある。force と backup
の両方のオプションが指定されているとき、コピー元 (@var{source})
とコピー先 (@var{dest}) が同じ名前で、しかも実在する通常ファイルを指していると、
@command{cp} はコピー元 (@var{source}) のバックアップを作成する。
次のちょっとした Bourne シェルのスクリプトは、オプションのこの組み合わせの応用だが、便利である。

@example
#!/bin/sh
# Usage: backup FILE...
# リストされた各 FILE について GNU スタイルのバックアップを
# 作成する
fail=0
for i; do
  cp --backup --force --preserve=all -- "$i" "$i" || fail=1
done
exit $fail
@end example

@item --copy-contents
@cindex directories, copying recursively
@cindex copying directories recursively
@cindex recursively copying directories
@cindex non-directories, copying as special files
再帰的なコピーを行っている際に、スペシャルファイル (たとえば、FIFO やデバイスファイル)
の内容を、操作対象が通常ファイルであるかのようにコピーする。
要するに、コピー元の各ファイルからデータを読み込んで、それをコピー先に書き出そうとするわけである。
このオプションを使うのは、ほとんどの場合誤りである。なぜなら、
FIFO や、通常 @file{/dev} ディレクトリにあるようなスペシャルファイルを対象にした場合、
望ましくない結果を生ずることが珍しくないからだ。
@code{cp -R --copy-contents} は、FIFO や @file{/dev/console}
のようなスペシャルファイルからデータを読み込もうとすると、
たいていの場合、いつまでも無反応になるだろうし、@file{/dev/zero}
をコピーしようとすれば、コピー先のディスクを溢れさせてしまうだろう。
このオプションは、再帰的なコピーをするとき以外、効果を持たない。
また、シンボリックリンクのコピーには影響しない。

@item -d
@opindex -d
@cindex symbolic links, copying
@cindex hard links, preserving
シンボリックリンクをコピーする際、リンクが指しているファイルをコピーするのではなく、
シンボリックリンクをシンボリックリンクとしてコピーする。
また、コピー元において複数のファイルがハードリンクの関係にある場合、
コピー先でもその関係を維持する。
@option{--no-dereference --preserve=links} と同じである。

@item -f
@itemx --force
@opindex -f
@opindex --force
このオプションを付けずにコピーを行う場合、
コピー先ファイルがすでに存在し、しかも書き込みモードでオープンできないと、コピーに失敗する。
それに対して、@option{--force} を付けた場合は、コピー先ファイルがオープンできないと、
@command{cp} は、まずそれを削除してから、再度オープンを試みる。
この動作は、@option{--force} と一緒に @option{--link} や @option{--symbolic-link}
を使用した場合に行われる動作とは、違うことに注意していただきたい。
後者の場合は、すでに存在するコピー先ファイルは一度もオープンされず、
むしろ無条件で削除されるのである。@option{--remove-destination} の説明も参照すること。

このオプションは、@option{--interactive} や @option{-i}
オプションとは無関係である。どちらも他方の効果を無効にすることはない。

@option{--no-clobber} や @option{-n} オプションを使用している場合、このオプションは無視される。

@item -H
@opindex -H
コマンドラインの引数がシンボリックリンクを指定している場合には、
シンボリックリンクそのものではなく、それが指しているファイルをコピーする。
とは言え、再帰的にディレクトリ・ツリーをたどっているときにシンボリックに出会った場合は、
そのまま (つまり、シンボリックリンクとして) コピーする。

@item -i
@itemx --interactive
@opindex -i
@opindex --interactive
ディレクトリ以外のファイルをコピーする際に、コピー先ファイルがすでに存在していると、
プロンプトを出して、ファイルを上書きしてよいかどうか、ユーザに問い合わせる。
@option{-i} オプションは、@option{-n} オプションが前にあるとき、それを無効にする。

@item -l
@itemx --link
@opindex -l
@opindex --link
コピー元がディレクトリ以外の場合、コピーする代わりに、ハードリンクを作成する。

@item -L
@itemx --dereference
@opindex -L
@opindex --dereference
コピー元がシンボリックリンクの場合は、その参照先をコピーする。
また、このオプションを使った場合、@command{cp} はシンボリックリンクを作ることができない。
たとえば、コピー元のディレクトリ・ツリー中に (通常ファイルに対する)
シンボリックリンクがあると、コピー先のディレクトリ・ツリーには、通常ファイルとしてコピーされることになる。

@item -n
@itemx --no-clobber
@opindex -n
@opindex --no-clobber
存在するファイルを上書きしない。@option{-n} オプションは、@option{-i}
オプションが前にあるとき、それを無効にする。このオプションと @option{-b}
(@option{--backup}) オプションは、どちらか一方しか指定できない。

@item -P
@itemx --no-dereference
@opindex -P
@opindex --no-dereference
@cindex symbolic links, copying
コピー元がシンボリックリンクの場合、それが指しているファイルをコピーするのではなく、
シンボリックリンクとしてコピーする。このオプションが作用を及ぼすのは、
コピー元のシンボリックリンクに対してだけであり、
コピー先に指定されたシンボリックリンクについては、可能なかぎり常に参照先がたどられる。

@item -p
@itemx --preserve[=@var{attribute_list}]
@opindex -p
@opindex --preserve
@cindex file information, preserving, extended attributes, xattr
コピー元ファイルの属性のうち、指定されたものをコピー先でも維持する。
@var{attribute_list} を指定する場合は、一つ以上の以下の文字列をコンマで区切ったリストでなければならない。

@table @samp
@item mode
ファイルのモードビット (訳注: 一般にアクセス権とか、許可属性と言われるもの)
やアクセス・コントロール・リストを維持する。
@item ownership
所有者とグループを維持する。ほとんどの最近のシステムでは、
ファイルの所有者を変更できるのは、しかるべき権限を持ったユーザだけである。
また、一般ユーザがファイルのグループを維持できるのは、
維持しようとするグループに、たまたまそのユーザが属しているときのみである。
@item timestamps
最終アクセス日時 (last access time) と最終更新日時 (last modification time)
を、可能ならば、維持する。古いシステムでは、対象となるファイルがシンボリックリンクの場合、
そうした属性を維持することができない。
それに対して、最近のシステムでは、たいていのものが @code{utimensat}
関数を用意しているので、シンボリックリンクの場合でも、日時関係の属性維持が可能である。
@item links
コピー元のファイル同士が (ハードリンクであれ、シンボリックリンクであれ)
リンクの関係にあるとき、コピー先の対応するファイル同士でも、その関係を維持する。
ただし、@option{-L} や @option{-H} と一緒に使った場合、
このオプションがシンボリックリンクをハードリンクに変更することがあるのに、
注意していただきたい。一例を挙げる。
@example
$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b
@end example
@noindent
コピー元に注目していただきたい。@file{b} は、通常ファイル @file{a} を指すシンボリックリンクである。
ところが、コピー先ディレクトリ @file{c/} の二つのファイルは、ハードリンクになっている。
@option{-a} は @option{--no-dereference} を意味するのだから、
シンボリックリンクがコピーされそうに思えるが、この場合は、後に続く
@option{-H} が、コマンドライン引数の参照をたどるように @command{cp}
に命じているので、@command{cp} には、同じ inode 番号を持った
2 個のファイルがコマンドラインで指定されているように見えるのである。
さらに、@option{-a} は @option{--preserve=links} オプションを意味してもいるので、
この働きによって、ハードリンクと認識された両ファイルの関係が、コピー先でも維持されることになるのである。

次のものは、@command{cp} の @option{-L} を使った場合の類似例である。
@smallexample
$ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b
74163295 a
74163295 b
@end smallexample

@item context
ファイルの SELinux セキュリティ・コンテキストを維持する。
それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。
@item xattr
ファイルの拡張属性を維持する。それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。
@command{cp} が xattr のサポートなしでビルドされている場合は、このオプションは無視される。
SELinux コンテキスト、ACL、ケーパビリティなどを xattr を使って実装している場合には、
そうした属性もこのオプションによって、明示的な指定がない場合でも維持される。
すなわち、@option{--preserve=mode} や @option{--preserve=context}
を指定しないでも維持されるわけだ。
@item all
ファイルの属性をすべて維持する。上記のすべてを指定するのと同じことだが、
SELinux セキュリティ・コンテキストや拡張属性の維持に失敗しても、
@command{cp} の終了ステータスが変わらないという点が異なっている。
@option{-a} とは違って、@samp{Operation not supported}
以外のすべての警告メッセージを出力する。
@end table

@var{attribute_list} なしで @option{--preserve} を使用するのは、
@option{--preserve=mode,ownership,timestamps} と同じことである。

このオプションを使わない場合、コピー先ファイルがすでに存在している場合は、
その許可属性は変更されない。一方、新しくファイルが作成される場合は、
対応するコピー元ファイルのモードを元にして、
そこから set-user-ID ビット、set-group-ID ビット、スティッキー・ビットを落としたものが、
各ファイルに付けられ、そしてさらに、オペレーティング・システムが
umask なり、デフォルトの ACL なりを適用する。
結果はより厳しいファイルモードになるかもしれない。 @xref{File permissions}.

@item --no-preserve=@var{attribute_list}
@cindex file information, preserving
指定された属性を維持しない。@var{attribute_list} の書式は、@option{--preserve}
の場合と同じである。

@item --parents
@opindex --parents
@cindex parent directories and @command{cp}
コピー先の各ファイル名を生成する際、出力先に指定されたディレクトリの末尾にスラッシュを付け、
その後ろにコピー元として指定されたファイル名を付け足すことによってそれを行う。
@command{cp} に渡す最後の引数は、実在するディレクトリの名前でなければならない。
一例を挙げる。

@example
cp --parents a/b/c existing_dir
@end example

@noindent
ファイル @file{a/b/c} を上記のコマンドでコピーすると、ファイル
@file{existing_dir/a/b/c} が出来る。
途中のディレクトリが存在していなければ、それも作成される。

@item -R
@itemx -r
@itemx --recursive
@opindex -R
@opindex -r
@opindex --recursive
@cindex directories, copying recursively
@cindex copying directories recursively
@cindex recursively copying directories
@cindex non-directories, copying as special files
ディレクトリを再帰的にコピーする。デフォルトでは、@option{--link} (@option{-l})
オプションが同時に使われていないかぎり、コピー元にあるシンボリックリンクの参照をたどることをしない。
@option{--archive} (@option{-a}), @option{-d}, @option{--dereference}
(@option{-L}), @option{--no-dereference} (@option{-P}), @option{-H}
などのオプションを参照。スペシャルファイルについては、
コピーする際に、コピー元ファイルと同じファイル型のコピー先ファイルを作成する。
@option{--copy-contents} を参照。シンボリックリンクやスペシャルファイルのコピーに
@option{-r} オプションを使用するのは、どのシステムでも通用することではない。
GNU 以外のシステムの中には、歴史的な理由から @option{-r} が、@option{-L} と
@option{--copy-contents} を同時に指定するのと等価になっているものもあるからだ。
また、シンボリックリンクをコピーするのに @option{-R} を使用するのも、@option{-P}
も併せて指定しないかぎり、どのシステムでも通用することではない。
デフォルトでシンボリックリンクの参照先をたどる実装が、POSIX で認められているからである。

@item --reflink[=@var{when}]
@opindex --reflink[=@var{when}]
@cindex COW
@cindex clone
@cindex copy on write
ファイルシステムがサポートしていれば、軽便コピー、すなわち、
書き込み時コピー(copy-on-write (COW) copy) を行う。
留意すべきは、これが成功した場合、コピー元とコピー先のファイルは、
どちらかに対して変更が加えられるまで、ディスクの同じデータブロックを共有しているということである。
従って、ディスク I/O エラーが起きて、片方のファイルのデータブロックが損傷を受ければ、
もう一方のファイルも同じ被害に会う。

@var{when} の値には、次のうちの一つが使える。

@table @samp
@item always
デフォルトの動作である。copy-on-write がサポートされていない場合は、
各ファイルについて失敗した旨を報告し、失敗を示すステータスで終了する。

@item auto
copy-on-write 操作がサポートされていない場合は、copy-on-write
をあきらめて、標準のコピー動作を行う。
@end table

このオプションは、@option{--link}, @option{--symbolic-link}
@option{--attributes-only}
オプションによって無効になるので、データをコピーする際の @command{cp}
のデフォルト動作の設定に使用することができる。
たとえば、次のエイリアスを使うと、@command{cp} は、ファイルシステムがサポートする範囲で、
ディスクスペースの使用を最少に留めるようになる。

@example
alias cp='cp --reflink=auto --sparse=always'
@end example

@item --remove-destination
@opindex --remove-destination
コピー先ファイルがすでに存在する場合、その各々についてオープンを試みる前に、削除する
(上述の @option{-f} と比較すること)。

@item --sparse=@var{when}
@opindex --sparse=@var{when}
@cindex sparse files, copying
@cindex holes, copying files with
@findex read @r{system call, and holes}
穴空きファイル (@dfn{sparse file}) とは、穴 (@dfn{holes}) を含むファイルである。
穴というのは、物理的なディスクブロック上には存在しないゼロバイトの連続で、
@samp{read} システムコールがそれを読む込むとき、ゼロの連続として扱うものである。
バイナリ・ファイルには、連続するゼロバイトがたくさん含まれていることが多いので、
この仕組みは、ディスクスペースを大いに節約してくれるし、動作速度の向上をもたらしてもくれる。
デフォルトで @command{cp} は、かなり大雑把な発見的手法を使って、
コピー元ファイルにある穴を検出し、対応するコピー先ファイルも穴空きファイルにする。
なお、穴空きファイルにできるのは、通常ファイルだけである。

@var{when} の値には、次のうちの一つが使える。

@table @samp
@item auto
デフォルトの動作である。すなわち、コピー元が穴空きファイルなら、
コピー先も穴空きファイルにしようとする。
ただし、コピー先ファイルがすでに存在していても、通常ファイル以外を指している場合には、
それを穴空きにしようとはしない。

@item always
たとえ、コピー元ファイルが穴空きファイルに見えなくても、十分に長いゼロバイトの連続があれば、
その各々に対応する穴をコピー先ファイルに設けようとする。この動作が役に立つのは、
コピー元ファイルが、穴空きファイルをサポートしていないファイルシステムにあるのに対し
(たとえば、SGI IRIX 5.3 以前の @samp{efs} ファイルシステム)、
コピー先ファイルは穴空きファイルをしっかりサポートするタイプのファイルシステムにある場合である。
穴を作ることができるのは、通常ファイルだけなので、コピー先が通常ファイル以外なら、
@command{cp} がそのファイルを穴空きにしようと試みることもない。

@item never
コピー先ファイルを穴空きにしない。
これは、@command{mkswap} コマンドで使用するファイルを作成するときに役に立つ。
そうしたファイルには、穴があってはならないからである。
@end table

@optStripTrailingSlashes

@item -s
@itemx --symbolic-link
@opindex -s
@opindex --symbolic-link
@cindex symbolic links, copying with
コピー元がディレクトリ以外の場合、コピーする代わりに、シンボリックリンクを作成する。
出力先ファイルをカレント・ディレクトリに作成する場合を除いて、
コピー元ファイルの名前は、すべて (@samp{/} で始まる) 絶対パス表記でなければならない。
シンボリックリンクをサポートしていないシステムでは、このオプションはエラーメッセージを出すだけである。

@optBackupSuffix

@optTargetDirectory

@optNoTargetDirectory

@item -u
@itemx --update
@opindex -u
@opindex --update
@cindex newer files, copying only
ディレクトリ以外のものをコピーする際、それがコピー先にも存在し、
しかもその更新日時 (modification time) がコピー元と同じか、より新しい場合、
コピーを行わない。コピー元からコピー先へタイムスタンプを引き継がせている場合には、
コピー元のタイムスタンプの精度を、コピー先のファイルシステム、
及びタイプスタンプの更新に使われるシステムコールの精度に落とした上で、比較を行う。
これは、同じコピー元とコピー先のファイルに対して @samp{cp -pu}
コマンドを何回か実行する場合に、余計なコピー作業が起きるのを避けるためである。
@option{--preserve=links} が一緒に指定されている場合は
(たとえば、@samp{cp -au} だとそうなる)、そちらが優先されることになる。
その結果、コピー元でファイルが処理される順番によっては、
コピー元のハードリンクを反映させるために、コピー先のより新しいファイルが置き換えられることもある。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
コピーを行う前に、コピーするファイル名を表示する。

@item -x
@itemx --one-file-system
@opindex -x
@opindex --one-file-system
@cindex file systems, omitting copying to different
あるファイルシステムでコピーを始めた場合、別のファイルシステムにあるサブディレクトリをスキップする。
ただし、マウントポイントのディレクトリはコピーされる。

@macro optContext
@item -Z
@itemx --context[=@var{context}]
@opindex -Z
@opindex --context
@cindex SELinux, setting/restoring security context
@cindex security context
@var{context} が指定されていない場合は、出力するファイルの SELinux
セキュリティ・コンテキストを、出力先におけるシステムのデフォルトのタイプに合わせて調整する。
これは、@command{restorecon} コマンドの動作に似ている。
このオプションの長い形式を使って、コンテキストを明示的に指定した場合、
そのコンテキストが設定されるのは、新しく作成されるファイルに対してのみである。
コンテキストを指定した場合に、SELinux と SMACK のどちらも無効になっていると、
警告メッセージを出す。
@end macro
@optContext このオプションと
@option{--preserve=context} オプションは、どちらか一方しか指定できない。
また、このオプションは @option{--preserve=all} や @option{-a} オプションに優先する。

@end table

@exitstatus


@node dd invocation
@section @command{dd}: ファイルの変換とコピー

@pindex dd
@cindex converting while copying a file

@command{dd} はファイルをコピーする (デフォルトでは、標準入力から標準出力へコピーする)。
その際、入出力のブロックサイズを変更することができる。
また、データ形式の変換を行いつつコピーすることもできる。

書式:

@example
dd [@var{operand}]@dots{}
dd @var{option}
@end example

指定できるオプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.  @command{dd} では、以下のオペランドが使える。
オペランドの書式の元になったのは、OS/360 の JCL (Job Control Language) の
DD 文 (Data Definition statement) である。

@table @samp

@item if=@var{file}
@opindex if
標準入力の代わりに、@var{file} から読み込む。

@item of=@var{file}
@opindex of
標準出力の代わりに、@var{file} に書き出す。@samp{conv=notrunc}
が指定されていない場合、@command{dd} は、出力を開始する前に、@var{file} を
0 バイトに (あるいは、@samp{seek=} で指定されたサイズに) 短縮する。

@item ibs=@var{bytes}
@opindex ibs
@cindex block size of input
@cindex input block size
入力ブロックサイズを @var{bytes} にする。@command{dd} が 1 ブロック @var{bytes}
バイトで読み込みを行うようになる。デフォルトは 512 バイトである。

@item obs=@var{bytes}
@opindex obs
@cindex block size of output
@cindex output block size
出力ブロックサイズを @var{bytes} にする。@command{dd} が 1 ブロック @var{bytes}
バイトで書き出しを行うようになる。デフォルトは 512 バイトである。

@item bs=@var{bytes}
@opindex bs
@cindex block size
入力、出力、両方のブロックサイズを @var{bytes} にする。@command{dd} が
1 ブロック @var{bytes} バイトで読み書きを行うようになり、@samp{ibs} や @samp{obs}
の指定は、あっても無効になる。なお、データ変換を行う @option{conv}
オプションが指定されていない場合は、入力は、それがブロックサイズより小さくても、
読み込まれるやいなや、出力にコピーされることになる。

@item cbs=@var{bytes}
@opindex cbs
@cindex block size of conversion
@cindex conversion block size
@cindex fixed-length records, converting to variable-length
@cindex variable-length records, converting to fixed-length
変換ブロックサイズを @var{bytes} にする。
可変長のレコードを固定長のレコードに変換するときや
(@option{conv=block})、その逆を行うとき
(@option{conv=unblock})、固定長レコードの長さとして @var{bytes} の値を使用する。

@item skip=@var{n}
@opindex skip
入力ファイルで @samp{ibs} バイトのブロックを @var{n} 個読み飛ばしてから、
コピーを行う。@samp{iflag=skip_bytes} が指定されている場合は、@var{n}
はブロック数ではなく、バイト数と見なされる。

@item seek=@var{n}
@opindex seek
出力ファイルで @samp{obs} バイトのブロックを @var{n} 個スキップしてから、
コピーを行う。@samp{oflag=seek_bytes} が指定されている場合は、 @var{n}
はブロック数ではなく、バイト数と見なされる。

@item count=@var{n}
@opindex count
入力ファイルの末尾まで全部ではなく、@samp{ibs} バイトのブロックを @var{n}
個だけ入力ファイルからコピーする。@samp{iflag=count_bytes}
が指定されている場合は、@var{n} はブロック数ではなく、バイト数と見なされる。
なお、次のことに注意してほしい。パイプから読み込んでいる場合などに時おり起きることだが、
入力からの読み込みがブロックの大きさに足りないことがある。そうした場合に
@samp{iflag=fullblock} が指定してあると、@samp{count=}
は、一杯になるまで読み込むブロックの個数を意味するようになる。
入力から読み込みを実行する回数という POSIX で規定されている伝統的な動作ではなくなるのだ。

@item status=@var{level}
@opindex status
通常では @samp{INFO} シグナルを受け取った時点や、@command{dd} が終了したときに、
転送情報が標準エラーに出力される。
@var{level} の指定によって、表示する情報の量を調節することができる。
指定された @var{level} のうち、最後のものが優先される。

@table @samp

@item none
@opindex none @r{dd status=}
情報メッセージや警告メッセージを標準エラーに全く表示しない。
エラーメッセージは通常どおり出力する。

@item noxfer
@opindex noxfer @r{dd status=}
最終的な転送速度や転送量の統計を表示しない。通常は、そうした情報がステータス表示の最後の行になる。

@item progress
@opindex progress @r{dd status=}
各入力ブロックを処理するとき、転送速度と転送量の統計を標準エラーに表示する。
転送量の統計は 1 行に表示され、最も頻繁な場合、1 秒ごとに出力されるが、
I/O 待ちが起きると、更新が遅れることがある。

@end table

@item conv=@var{conversion}[,@var{conversion}]@dots{}
@opindex conv
@var{conversion} 引数 (複数可) で指定されたようにファイルを変換する。
(コンマの前後にスペースを入れてはいけない。)

@var{conversion} には次のものが指定できる:

@table @samp

@item ascii
@opindex ascii@r{, converting to}
POSIX が規定している変換テーブルを使って、EBCDIC を ASCII に変換する。
変換テーブル中の 256 バイトのすべてについて、1 対 1 の変換が行われる。
このオプションを指定すると、@samp{conv=unblock} も指定されることになる。
入力はまず ASCII に変換され、その後で末尾のスペースが除去される。

@item ebcdic
@opindex ebcdic@r{, converting to}
ASCII を EBCDIC に変換する。これは @samp{ascii} 変換の逆の動作である。
このオプションを指定すると、@samp{conv=block} も指定されることになる。
末尾にスペースが追加されてから、EBCDIC に変換される。

@item ibm
@opindex alternate ebcdic@r{, converting to}
この指定の動作は @samp{conv=ebcdic} に似ている。
ただし、POSIX が規定しているもう一つの変換テーブルを使って、変換する点が違う。
こちらは 1 対 1 の変換ではないが、@samp{~}, @samp{[}, @samp{]}
について、よく使われる伝統的な慣行を反映している。

@samp{ascii}, @samp{ebcdic}, @samp{ibm} は、どれか一つしか指定できない。
こうしたオプションの一つを使う場合は、@samp{cbs=} も指定すべきである。

@item block
@opindex block @r{(space-padding)}
入力 1 行あたり、@samp{cbs} バイトを出力する。
入力中の改行はスペースに置き換え、@samp{cbs} バイトに足りない分はスペースで埋める。

@item unblock
@opindex unblock
@samp{cbs} バイトの大きさからなる各入力ブロックに対して、末尾にスペースがあれば、
それをすべて削除し、改行を追加する。

@samp{block} と @samp{unblock} は、どちらか一方しか指定できない。

@item lcase
@opindex lcase@r{, converting to}
大文字を小文字に変換する。

@item ucase
@opindex ucase@r{, converting to}
小文字を大文字に変換する。

@samp{lcase} と @samp{ucase} は、どちらか一方しか指定できない。

@item sparse
@opindex sparse
出力ブロックが NUL のみからなっているとき、それを書き出さずに、seek を試みる。
穴空きファイル (sparse file) をサポートしているシステムでは、
この動作は、出力ファイルを書き出しているときに、穴空きの出力を作成することになる。
このオプションを @samp{conv=notrunc} や @samp{oflag=append}
と一緒に使う際は、気をつけなければならない。@samp{conv=notrunc} が付いていると、
入力中の NUL ブロックに対応する位置にある、出力ファイル中の存在するデータは、
そのまま保持されることになる。@samp{oflag=append} を付けた場合は、
seek は行っても効果がない。なお、@samp{conv=sparse} では、
出力先がファイルではなく、デバイスの場合も、入力中の NUL ブロックはやはりコピーされない。
そんなわけで、このオプションが最も役に立つのは、仮想デバイスや、前もって
0 で初期化したデバイスに対してである。

@item swab
@opindex swab @r{(byte-swapping)}
@cindex byte-swapping
入力された全バイトを 2 個づつ組にして、前後を入れ替える。GNU の
@command{dd} は、他の @command{dd} とは違って、読み込むバイトが奇数個でも動作する。
最後のバイトは （入れ替えるものがないので) そのままコピーするのである。

@item sync
@opindex sync @r{(padding with ASCII NULs)}
すべての入力ブロックに対して @samp{ibs} の大きさになるまで、末尾をゼロバイトで埋める。
@samp{block} や @samp{unblock} と一緒に使用すると、ゼロバイトの代わりにスペースで埋める。

@end table

以下の @var{conversion} は、実のところファイルの扱いに関するフラグなので、内的な処理には影響を及ぼさない。

@table @samp
@item excl
@opindex excl
@cindex creating output file, requiring
出力ファイルがすでに存在する場合は、実行に失敗する。
言い換えれば、@command{dd} が出力ファイルを自分で作成しなければならないということである。

@item nocreat
@opindex nocreat
@cindex creating output file, avoiding
出力ファイルを作成しない。言い換えれば、出力ファイルは前もって存在していなければならないということだ。

@samp{excl} と @samp{nocreat} は、どちらか一方しか指定できない。

@item notrunc
@opindex notrunc
@cindex truncating output file, avoiding
出力ファイルに対して短縮操作をしない (訳注: @samp{of=@var{file}} の項を参照)。

@item noerror
@opindex noerror
@cindex read errors, ignoring
読み込みエラーがあっても、作業を続行する。

@item fdatasync
@opindex fdatasync
@cindex synchronized data writes, before finishing
コマンドを終了する直前に、出力データを同期させる。
すなわち、出力データをディスクに実際に書き込む。

@item fsync
@opindex fsync
@cindex synchronized data and metadata writes, before finishing
コマンドを終了する直前に、出力データだけでなく、メタデータも同期させる。
すなわち、出力データとメタデータをディスクに実際に書き込む。

@end table

@item iflag=@var{flag}[,@var{flag}]@dots{}
@opindex iflag
引数 @var{flag} によって指定されたフラグを使って、入力ファイルにアクセスする。
(コンマの前後にスペースを入れてはいけない。)

@item oflag=@var{flag}[,@var{flag}]@dots{}
@opindex oflag
引数 @var{flag} によって指定されたフラグを使って、出力ファイルにアクセスする。
(コンマの前後にスペースを入れてはいけない。)

フラグには次のものがある。どのオペレーティング・システムでも、
すべてのフラグが使えるわけではない。

@table @samp

@item append
@opindex append
@cindex appending to the output file
追加モードで書き込む。従って、何か別のプロセスが問題のファイルに書き出している場合でも、
@command{dd} の書き込みは、書き込むたびに、そのファイルの今現在の内容に追加されることになる。
このフラグは出力に対してしか意味がない。なお、このフラグを
@samp{of=@var{file}} オペランドと組み合わせて使うのなら、
@samp{conv=notrunc} も一緒に指定した方がよい。
さもないと、出力ファイルは、追加書き込みが始まる前に、短縮操作を受けることになる。

@item cio
@opindex cio
@cindex concurrent I/O
データに対してコンカレント I/O (CIO) モードを使用する。
このモードでは、ダイレクト I/O を行いつつ、同じファイルに対するすべての
I/O は順番に行わなければならないという POSIX の要件は無視する。
一つのファイルを CIO モードと標準的な方法の両方で同時にオープンすることはできない。

@item direct
@opindex direct
@cindex direct I/O
データに対してダイレクト I/O を使用し、バッファ・キャッシュを介さないようにする。
カーネルが read バッファや write バッファのサイズに制限をかけていることがあるのに注意していただきたい。
たとえば、出力先のファイルシステムが ext4 で、カーネルが linux
ベースの場合、出力バッファのサイズが 512 の倍数でなければ、@samp{oflag=direct}
を指定すると、@code{EINVAL} で書き込みに失敗することになる。

@item directory
@opindex directory
@cindex directory I/O

ファイルがディレクトリでなければ、実行に失敗する。
ほとんどのオペレーティング・システムがディレクトリに対する I/O
を許していない。従って、このフラグが役に立つ機会はめったにない。

@item dsync
@opindex dsync
@cindex synchronized data reads
データに対して同期 I/O を使用する。出力ファイルについては、
このフラグは、各書き込みごとに出力データをディスクに実際に書き込ませる。
入力ファイルについてこのフラグが意味を持つかもしれないのは、
読み込んでいるのがリモートのファイルであり、
それが何か他のプロセスによって同期的に書き込まれているときである。
メタデータ (たとえば、最終アクセス日時や最終更新日時) は、必ずしも同期されない。

@item sync
@opindex sync
@cindex synchronized data and metadata I/O
データとメタデータに対して同期された I/O を使用する。

@item nocache
@opindex nocache
@cindex discarding file cache
システムの持つファイルのデータ・キャッシュを廃棄するよう要求する。
count=0 の場合は、ファイルのキャッシュされたデータ全体を指定することになる。
それ以外の場合は、ファイルのキャッシュのうち、処理の対象になった部分だけが捨てられる。
また、count=0 のとき、キャッシュの廃棄に失敗すると、
その旨メッセージが表示され、終了ステータスに反映する。

念のために言っておくと、
ストレージへの書き込みがまだ終了していないデータが、キャッシュから捨てられることはない。
そこで、下記の用例で ``sync'' オプションを使っていることに注目していただきたい。
@samp{nocache} フラグの効率を最大にするために使用しているのである。

用例をいくつか挙げておく。

@example
# ファイル全体のキャッシュを捨てるように指示する。
dd if=ifile iflag=nocache count=0

# ファイル全体のキャッシュを確実に捨てる。
dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0

# ファイル中の一部分のキャッシュを捨てる。
dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null

# read-ahead キャッシュのみを使って、データを転送する。
# @samp{direct} フラグの項も参照すること。
dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
@end example

@item nonblock
@opindex nonblock
@cindex nonblocking I/O
ノンブロッキング I/O を使用する。

@item noatime
@opindex noatime
@cindex access time
ファイルのアクセス日時を更新しない。古いシステムの中には、
エラーや警告も出さずに、このフラグを無視するものがある。
そこで、このフラグを使用する前に、有効かどうか、お手元のファイルで試してみるとよい。

@item noctty
@opindex noctty
@cindex controlling terminal
入力 (または、出力) ファイルを @command{dd} の制御端末にしない。
このフラグは、そのファイルが端末でなければ、効果がない。
このフラグが全く効果を持たないホストが、たくさんある
(たとえば、GNU/Linux ホストがそうである)。

@item nofollow
@opindex nofollow
@cindex symbolic links, following
シンボリックリンクをたどらない。

@item nolinks
@opindex nolinks
@cindex hard links
ファイルに複数のハードリンクがあれば、実行に失敗する。

@item binary
@opindex binary
@cindex binary I/O
バイナリ I/O を使用する。このフラグは、バイナリ I/O とテキスト I/O
を区別する非標準的なプラットフォームでしか効果がない。

@item text
@opindex text
@cindex text I/O
テキスト I/O を使用する。このフラグが標準的なプラットフォームで効果がないのは、
@samp{binary} と同様である。

@item fullblock
@opindex fullblock
各ブロックが一杯になるまで入力から読み込む。@code{read} システムコールは、
入力がブロックの分量に足りない場合、早めに戻ってくることがある。
そうした場合に、@code{read} の呼び出しを繰り返して、ブロックの残りを埋めようとする。
このフラグは、@code{iflag} でのみ使用できる。
このフラグが役に立つのは、たとえばパイプと組み合わせて使うときである。
パイプとの組み合わせでは、入力からの読み込みがブロックの大きさに足りないことがあるからだ。
そうした場合に、@samp{count=} の引数が、読み込み動作の回数ではなく、
読み込むブロック数だと確実に解釈されるようにするには、このフラグが必要になる。

@item count_bytes
@opindex count_bytes
@samp{count=} オペランドをブロック数ではなく、バイト数の指定と見なす。
そうすることで、I/O ブロックサイズの倍数ではない長さが、指定できるようになるわけだ。
このフラグは @code{iflag} でしか使用できない。

@item skip_bytes
@opindex skip_bytes
@samp{skip=} オペランドをブロック数ではなく、バイト数の指定と見なす。
そうすることで、I/O ブロックサイズの倍数ではないオフセットが、指定できるようになるわけだ。
このフラグは @code{iflag} でしか使用できない。

@item seek_bytes
@opindex seek_bytes
@samp{seek=} オペランドをブロック数ではなく、バイト数の指定と見なす。
そうすることで、I/O ブロックサイズの倍数ではないオフセットが、指定できるようになるわけだ。
このフラグは @code{oflag} でしか使用できない。

@end table

以上のフラグは、すべてのシステムでサポートされているわけではなく、
サポートされていないシステムで使用しようとすると、@samp{dd} に拒否される。
標準入力から読み込んでいる場合や、標準出力に書き出している場合は、
@samp{nofollow} や @samp{noctty} フラグは指定するべきではない。
また、他のフラグ (たとえば @samp{nonblock}) は、
対象となるファイルのファイル・ディスクリプタに対する他のプロセスの動作に、@command{dd}
が終了した後までも、影響を及ぼすかもしれない。

@end table

@cindex multipliers after numbers
上記中の数値を表す文字列  (@var{n} や @var{bytes}) には、乗数を示す文字を後ろに付けることができる。
すなわち、@samp{b}=512, @samp{c}=1, @samp{w}=2, @samp{x@var{m}}=@var{m}
といった文字である (訳注: 最後のものは、10xM という表記は 10M と書くのと同じだということ)。
あるいは、@samp{k}=1024 のような、ブロックサイズに付ける標準の接尾辞の一つを続けてもよい
(@pxref{Block size})。

@samp{bs=}, @samp{ibs=}, @samp{obs=}, "@samp{cbs=} を使って指定するブロックサイズは、
大きすぎない方がよい。数メガバイトを越える値は、一般的に言って無駄だし、
(ギガバイト @dots{} エクサバイトを使ったときのように) 全く逆効果だったり、
エラーの元になったりする。

データのオフセット位置やサイズが I/O ブロックサイズの倍数ではない場合に、
そうしたデータを処理するには、@samp{skip_bytes}, @samp{seek_bytes},
@samp{count_bytes} といったフラグを使用すればよい。あるいは、@command{dd}
を別々に呼び出すという伝統的な手法を使用することもできる。
一例を挙げると、以下のシェルコマンドは、1 ブロック を 512 KiB
にして、ディスクとテープの間でデータをコピーしている。
ただし、ディスクの先頭にある 4 KiB のラベルについては、保存も復元も行っていない。

@example
disk=/dev/rdsk/c0t1d0s2
tape=/dev/rmt/0

# ラベル以外のすべてをディスクからテープへコピーする。
(dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape

# テープからディスクへ書き戻す。ただし、ディスクのラベルには手を
# 付けない。
(dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk
@end example

@cindex ddrescue
@cindex disks, failing
壊れかけたディスクについては、様々なおまけ機能が付いたツールが他にあり、
そうしたものを使えば、ディスクが本当にダメになってしまう前に、できるだけ多くのデータを救済することが容易になる。
たとえば、@uref{http://www.gnu.org/software/ddrescue/, GNU @command{ddrescue}
がその一つだ}。
しかしながら、場合によっては、そうしたツールが使えないこともあるし、
管理者にとって @command{dd} を操作する方が安心できるということもある。
そうした場合は、簡単なレスキュー方法として、@command{dd} を以下の例で示すように実行すればよい。
@samp{conv=noerror,sync} オプションを使っているのは、リードエラーがあっても続行し、
読み込めなかった部分 (bad read) を NUL で埋めるためである。
また、@samp{iflag=fullblock} は、ショートリードに対する用心だ
(そうしたことが磁気ディスクを使っているデバイスで起きたことは、これまでにないけれど)。

@example
# 壊れかけたディスクのパーティションから (マウントしていない
# パーティションだ！) データを救済する。
dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
@end example

実行中の @command{dd} のプロセスに @samp{INFO} シグナルを送ると
(それが使えないシステムでは、@samp{USR1} シグナルを送る)、
@command{dd} は入出力の統計情報を標準エラーに書き出し、それからコピー作業を続行する。
以下の例では、@command{dd} をバックグラウンドで実行し
5GB のデータのコピーを行っている。@command{kill} コマンドが実行されると、
@command{dd} は実行途中の入出力統計を表示する。
そして、正常に作業を完了するか、@code{SIGINT} シグナルによって中断されたとき、
最終的な統計情報を出力する。

@example
# シェルが子プロセスである dd をうっかり終了させてしまうことが
# 絶対にないように、USR1 シグナルを「無視する」にしておく。
# なお、SIGINFO が利用できる場合は、これをやる必要はない。
trap '' USR1

# シグナルを受けることが引き鉄になって、ショートリードが起きるかも
# しれない。それを避けるために、dd を iflag=fullblock で実行する。
dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!

# 1 秒ごとに統計情報を出力する。
while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
@end example

上記のスクリプトの出力は、次のようなフォーマットになる。

@example
3441325+0 records in
3441325+0 records out
3441325000 bytes (3.4 GB, 3.2 GiB) copied, 1.00036 s, 3.4 GB/s
5000000+0 records in
5000000+0 records out
5000000000 bytes (5.0 GB, 4.7 GiB) copied, 1.44433 s, 3.5 GB/s
@end example

@samp{status=progress} オプションを付けると、転送統計を表す上記の最後の行が定期的に更新される。

@vindex POSIXLY_CORRECT
@samp{INFO} シグナルが存在しないシステムでは、 環境変数 @env{POSIXLY_CORRECT}
が設定されていないかぎり、@command{dd} は @samp{INFO} の代わりに @samp{USR1} に反応する。

@exitstatus


@node install invocation
@section @command{install}: ファイルをコピーし属性をセットする

@pindex install
@cindex copying files and setting attributes

@command{install} はファイルをコピーするとき、ファイルのモードビット
(訳注: 一般にアクセス権とか、許可属性と言われるもの) をセットし、可能ならば、
所有者やグループも設定する。

書式:

@example
install [@var{option}]@dots{} [-T] @var{source} @var{dest}
install [@var{option}]@dots{} @var{source}@dots{} @var{directory}
install [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
install [@var{option}]@dots{} -d @var{directory}@dots{}
@end example

@itemize @bullet
@item
ファイル名を二つ指定すると、@command{install} は最初のファイルを
2 番目のファイルにコピーする。

@item
@option{--target-directory} (@option{-t}) オプションを指定した場合や、
あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
@option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
@command{install} は各 @var{source} ファイルを指定されたディレクトリに、@var{source}
の名前でコピーする。

@item
@option{--directory} (@option{-d}) を指定すると、@command{install} は各
@var{directory} を作成する。
このとき、親ディレクトリが存在しなければ、それも作成する。
作成される親ディレクトリのモードは、@option{-m} オプションの指定や現在の umask
にかかわりなく、@samp{u=rwx,go=rx} (755) になる。
親ディレクトリの set-user-ID ビットや set-group-ID ビットの継承については、
次の節を参照していただきたい。@xref{Directory Setuid and Setgid}.
@end itemize

@cindex Makefiles, installing programs in
@command{install} は @command{cp} に似ているが、コピー先ファイルの属性を自由に設定できる点が違う。
@command{install} は通常、Makefile の中で、プログラムを目標のディレクトリにコピーするために使用される。
@command{install} では、ファイルをそれ自身にコピーすることはできない。

@cindex extended attributes, xattr
@command{install} が拡張属性 (xattr) を保存することはない。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@optBackup

@item -C
@itemx --compare
@opindex -C
@opindex --compare
インストール元とインストール先の対応するファイルを比較し、
インストール先にあるファイルがインストール元と内容が同じで、
しかも、所有者、グループ、許可属性、場合によっては SELinux
コンテキストについて、そのどれもが指定されているものと同一であるときは、
インストール先ファイルを全く変更しない。
このオプションは、@option{--user}, @option{--group}, @option{--mode}
オプションと併せて使うのが最善である。そういうものを指定しない場合、
@command{install} コマンドが、(たとえば、ディレクトリに
setgid が付いていることや、POSIX のデフォルトの ACL を顧慮しないせいで)、
インストールされるファイルがデフォルトで持つはずの属性を不正確に決めてしまうかもしれないのだ。
そんなことがあると、無駄なコピーが行われたり、
属性が正しいデフォルト値に設定されなかったりといった不都合が生じかねない。

@item -c
@opindex -c
無視する。Unix の古いバージョンの  @command{install} との互換性のために
ある。

@item -D
@opindex -D
@var{dest} の指定中に存在していない親ディレクトリがあれば、
それを作成してから、@var{source} を @var{dest} にコピーする。
@option{-D} とともに明示的に @option{--target-directory=@var{dir}}
を指定した場合も、やはり出力先のディレクトリ階層が確実に存在するようになる。

@item -d
@itemx --directory
@opindex -d
@opindex --directory
@cindex directories, creating with given attributes
@cindex parent directories, creating missing
@cindex leading directories, creating missing
まず、存在していない親ディレクトリがあれば作成し、それにデフォルトの属性を与える。
それから、指定された各ディレクトリを作成し、所有者、グループ、許可属性を、
コマンドラインで指定されたとおりに、またはデフォルトの値に設定する。

@item -g @var{group}
@itemx --group=@var{group}
@opindex -g
@opindex --group
@cindex group ownership of installed files, setting
インストールするファイルやディレクトリの所有グループを @var{group} にする。
デフォルトでは、プロセスの現在のグループになる。
@var{group} は、グループ名でも、グループの ID 番号でもよい。

@item -m @var{mode}
@itemx --mode=@var{mode}
@opindex -m
@opindex --mode
@cindex permissions of installed files, setting
インストールするファイルやディレクトリのモードビットを @var{mode} にする。
@var{mode} の指定は、@samp{a=} (誰にもアクセスを許さない) を基点として行い、
8 進数でも、@command{chmod} で使うようなシンボリックモードでもよい
(@pxref{File permissions})。デフォルトのモードは、
@samp{u=rwx,go=rx,a-s} である。すなわち、所有者には読み、書き、実行を許可し、
グループとその他のユーザには読みと実行のみを許可、
set-user-ID と set-group-ID は無効にする。このデフォルトは、@samp{755}
と全く同じではない。なぜなら、デフォルトの方は、ディレクトリについて
set-user-ID や set-group-ID を引き継がず、無効にしているからである。
@xref{Directory Setuid and Setgid}. 

@item -o @var{owner}
@itemx --owner=@var{owner}
@opindex -o
@opindex --owner
@cindex ownership of installed files, setting
@cindex appropriate privileges
@vindex root @r{as default owner}
@command{install} が適切な権限を持っている場合に
(つまり、root 権限で実行されている場合に)、インストールするファイルやディレクトリの所有者を
@var{owner} にする。デフォルトでは @code{root} になる。@var{owner}
の指定は、ユーザ名でも、ユーザの ID 番号でもよい。

@item --preserve-context
@opindex --preserve-context
@cindex SELinux
@cindex security context
ファイルやディレクトリの SElinux セキュリティ・コンテキストを引き継ぐ。
ファイルやディレクトリすべてのセキュリティ・コンテキストを引き継げなかった場合は、
終了ステータスが 1 になる。SElinux が無効になっているときは、警告を出し、
このオプションを無視する。

@item -p
@itemx --preserve-timestamps
@opindex -p
@opindex --preserve-timestamps
@cindex timestamps of installed files, preserving
インストール先各ファイルの最終アクセス日時 (last access time) と最終更新日時
(last modification time) を、対応するインストール元各ファイルのそれぞれの日時に合わせる。
このオプションを付けずにインストールした場合、各ファイルの最終アクセス日時と最終更新日時は、
両方ともインストールした日時になる。インストール先ファイルの最終更新日時を、
最後にインストールした日付ではなく、最後にビルドした日付の記録として使用したい場合、
このオプションは便利である。

@item -s
@itemx --strip
@opindex -s
@opindex --strip
@cindex symbol table information, stripping
@cindex stripping symbol table information
インストールされるバイナリの実行ファイルからシンボル・テーブルを取り除く。

@item --strip-program=@var{program}
@opindex --strip-program
@cindex symbol table information, stripping, program
バイナリからシンボル・テーブルを取り除くために使用するプログラムを指定する。

@optBackupSuffix

@optTargetDirectory @option{-D} オプションも指定すると、
ディレクトリの存在が保証される。

@optNoTargetDirectory

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
コピーを行う前に、コピーするファイル名を表示する。

@optContext このオプションと @option{--preserve-context}
オプションは、どちらか一方しか指定できない。
(@var{context} を省略できるのは、coreutils-8.22 から)


@end table

@exitstatus


@node mv invocation
@section @command{mv}: ファイルの移動 (名前の変更) を行う

@pindex mv

@command{mv} は、ファイル (やディレクトリ) の移動、または名前の変更を行う。

書式:

@example
mv [@var{option}]@dots{} [-T] @var{source} @var{dest}
mv [@var{option}]@dots{} @var{source}@dots{} @var{directory}
mv [@var{option}]@dots{} -t @var{directory} @var{source}@dots{}
@end example

@itemize @bullet
@item
ファイル名を二つ指定すると、@command{mv} は最初のファイルを 2 番目のファイルに移動する。

@item
@option{--target-directory} (@option{-t}) オプションを指定した場合や、
あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
@option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
@command{mv} は各 @var{source} ファイルを指定されたディレクトリに、@var{source}
の名前で移動する。
@end itemize

@command{mv} はいかなるタイプのファイルでも、
一つのファイルシステムから別のファイルシステムへ移動させることができる。
fileutils パッケージのバージョン @code{4.0} 以前では、@command{mv}
がファイルシステム間を移動させることができたのは、通常ファイルだけだった。
それに対して、現在の @command{mv} では、
たとえば、スペシャル・デバイスファイルを含むディレクトリ階層の全体を、
あるパーティションから別のパーティションへ移動させることが可能になっている。
@command{mv} は、まず @code{cp -a} が使用するのと同じコードを使って、
指定されたディレクトリやファイルをコピーし、その後で (コピーに成功した場合は) コピー元を削除する。
コピーに失敗した場合は、移動先のパーティションにすでにコピーした部分を消去することになる。
仮に、あるパーティションから別のパーティションに、3 個のディレクトリをコピーしようとして、
最初のディレクトリのコピーには成功したものの、2 番目のディレクトリのコピーに失敗したとしよう。
その場合、最初のディレクトリは、移動先のパーティションに残るが、2 番目と
3 番目のディレクトリは、元のパーティションに残ることになる。

@cindex extended attributes, xattr
@command{mv} は拡張属性 (xattr) を常にコピーしようとする。
この拡張属性は、SELinux コンテキストや ACL、ケーパビリティであってもよい。
拡張属性のコピーに失敗したときは、@samp{Operation not supported}
以外のすべての警告が出力される。

@cindex prompting, and @command{mv}
移動先ファイルがすでに存在し、それが普通なら書き込みのできないものである場合、
標準入力が端末であり、@option{-f} や @option{--force} オプションが指定されていなければ、
@command{mv} はプロンプトを出して、ファイルを置き換えるかどうか、ユーザに問い合わせる
(ファイルの書き込み権限がなくても、自分がそのファイルの所有者であったり、
そのディレクトリの書き込み権限を持っていたりすることは、ありえることである)。
答えが肯定でなければ、そのファイルはスキップされる。

警告: 名前変更の対象 (または、移動元) がディレクトリへのシンボリックリンクかもしれないときは、
その名前を指定する際に、末尾にスラッシュを付けてはいけない。
さもないと、@command{mv} の動作は内部で使っている rename
システムコール次第なので、全く予想外のことが起きるかもしれないのだ。
Linux ベースの最近のカーネルを使っているシステムでは、@code{errno=ENOTDIR}
で実行に失敗する。しかし、他のシステムでは (少なくとも、FreeBSD 6.1 や
Solaris 10 では)、シンボリックリンクではなく、リンクが参照しているディレクトリの名前の方を、
警告なしで変更するのである。 @xref{Trailing slashes}.

注意: @command{mv} が移動先にあるディレクトリを置き換えるのは、そのディレクトリが空のときだけである。
移動先にある名前の衝突する (訳注: 要するに移動元ディレクトリと同名の) ディレクトリにファイルがあるときは、
「ディレクトリが空ではない」旨のメッセージを出して、そのディレクトリをスキップする。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@optBackup

@item -f
@itemx --force
@opindex -f
@opindex --force
@cindex prompts, omitting
移動先のファイルを消去する前に、プロンプトを出してユーザに問い合わせることをしない。
@macro mvOptsIfn
@option{-i}, @option{-f}, @option{-n} オプションを同時に指定している場合は、
最後に指定したもののみが効果を持つ。
@end macro
@mvOptsIfn

@item -i
@itemx --interactive
@opindex -i
@opindex --interactive
@cindex prompts, forcing
ファイルの許可属性に関係なく、存在する各移動先ファイルを上書きするかどうかを、プロンプトを出してユーザに問い合わせる。
答えが肯定でなければ、そのファイルをスキップする。@mvOptsIfn

@item -n
@itemx --no-clobber
@opindex -n
@opindex --no-clobber
@cindex prompts, omitting
存在するファイルを上書きしない。@mvOptsIfn
このオプションは、@option{-b} や @option{--backup} オプションと一緒には使えない。

@item -u
@itemx --update
@opindex -u
@opindex --update
@cindex newer files, moving only
ディレクトリ以外のものを移動する際、それが移動先にも存在し、しかもその更新日時
(modification time) が移動元と同じか、より新しい場合には、移動を行わない。
移動が別のファイルシステムに向かって行われる場合、
タイムスタンプの比較は、移動元のタイムスタンプを移動先のファイルシステム、
及びタイムスタンプの更新に使われるシステムコールの精度に落とした上で行われる。
これは、同じ移動元と移動先に対して、@samp{mv -u} コマンドが何回か実行される場合に、
コピー作業が繰り返されるのを避けるためである。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
移動する前に各ファイルの名前を表示する。

@optStripTrailingSlashes

@optBackupSuffix

@optTargetDirectory

@optNoTargetDirectory

@item -Z
@itemx --context
@opindex -Z
@opindex --context
@cindex SELinux, restoring security context
@cindex security context
このオプションは @command{restorecon} と似た働きをする。
すなわち、移動先における SELinux セキュリティ・コンテキストを、
移動先のファイルやそこに作られる各ディレクトリに対する、システムのデフォルトのタイプに合わせて調整する。

@end table

@exitstatus


@node rm invocation
@section @command{rm}: ファイルやディレクトリを削除する

@pindex rm
@cindex removing files or directories

@command{rm} は、指定された各ファイルを削除する。
デフォルトでは、ディレクトリの削除は行わない。

書式:

@example
rm [@var{option}]@dots{} [@var{file}]@dots{}
@end example

@cindex prompting, and @command{rm}
@option{-I} または @option{--interactive=once} オプションが指定されている場合に、
削除するファイルが 4 個以上あるか、あるいは @option{-r}, @option{-R},
@option{--recursive} などのオプションが指定されていると、@command{rm}
はプロンプトを出して、作業を最後まで行うかどうか、ユーザに問い合わせる。
答えが肯定でなければ、コマンド全体が中止になる。

それ以外の場合でも、削除するファイルが書き込み不可で、標準入力が端末、しかも
@option{--force} (@option{-f}) オプションが指定されていない場合や、@option{-i}
または @option{--interactive=always} オプションが指定されている場合には、@command{rm}
はプロンプトを出して、そのファイルを削除するかどうか、ユーザに問い合わせる。
答えが肯定でなければ、そのファイルをスキップする。

ファイル名の最後の構成要素 (訳注: ファイル名 (いわゆるパス名) の最後の / より後ろの部分)
が @file{.} や @file{..} であるファイルを削除しようとしても、@command{rm}
はそれを実行せず、ユーザに問い合わせることもない。これは POSIX が要求している動作である。

警告: @command{rm} を使って、ファイルを削除しても、たいていの場合、そのファイルの内容を復元することが可能である。
ファイルの内容が間違いなく復元不可能であるとの、より一層の保証が欲しいのなら、
@command{shred} コマンドの使用をお考えになるとよい。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -d
@itemx --dir
@opindex -d
@opindex --dir
@cindex directories, removing
指定されたディレクトリが空ならば、それを削除する。

@item -f
@itemx --force
@opindex -f
@opindex --force
指定したファイルが存在しなかったり、削除の対象を一つも指定しなかったりしても、
問題にしない (訳注: 言い換えれば、エラーにならない)。
また、ユーザに対する問い合わせも全く行わない。
@option{--interactive} (@option{-i}) オプションが前にあっても、それを無視する。

@item -i
@opindex -i
プロンプトを出して、各ファイルを削除するかどうか、ユーザに問い合わせる。
答えが肯定でなければ、そのファイルをスキップする。
@option{--force} (@option{-f}) オプションが前にあっても、それを無視する。

@item -I
@opindex -I
4 個以上のファイルが指定された場合や、再帰的な削除が要求された場合に、
プロンプトを出して、コマンドを続行するかどうか、ユーザに一度だけ尋ねる。
@option{--force} (@option{-f}) オプションが前にあっても、それを無視する。
@option{--interactive=once} と同じである。

@item --interactive [=@var{when}]
@opindex --interactive
問い合わせのプロンプトをいつ出すかを指定する。@var{when} には以下の一つを指定できるが、なくてもよい。
@itemize @bullet
@item never
@vindex never @r{interactive option}
- 問い合わせを全くしない。
@item once
@vindex once @r{interactive option}
- 4 個以上のファイルが指定された場合や、再帰的な削除が要求された場合に、
一度だけ問い合わせをする。@option{-I} と同じ。
@item always
@vindex always @r{interactive option}
- 削除されるすべてのファイルに対して問い合わせをする。@option{-i} と同じ。
@end itemize
@option{--interactive} に @var{when} を指定しないのは、@option{--interactive=always}
と同じである。

@item --one-file-system
@opindex --one-file-system
@cindex one file system, restricting @command{rm} to
ディレクトリ階層を再帰的に削除する際に、
コマンドラインで引数として指定したディレクトリが存在するファイルシステムとは別のファイルシステム上にある、
いかなるディレクトリも削除しない。

@cindex bind mount
このオプションが役に立つのは、ビルド用の ``chroot'' ディレクトリ階層を削除する場合である。
通常、そうしたディレクトリ階層に重要なデータは含まれていない。
しかしながら、普段使っているスタートアップ・ファイルを利用しやすくするために、
そうしたディレクトリ階層に @file{/home} を bind-mount するのは、珍しいことではない。
問題は、@file{/home} のアンマウントを忘れやすいことである。
アンマウントをやり忘れたまま、@command{rm -rf} を使って、通常使い捨てにする
chroot 環境を削除しようとすると、@file{/home} 以下にあるすべてまで削除してしまうことになる。
@option{--one-file-system} オプションを使えば、@command{rm} は警告を出した上で、
他のファイルシステムにあるディレクトリをスキップしてくれる。
当然ながら、@file{/home} と chroot 環境が同じファイルシステムにある場合は、
このオプションを使っても、@file{/home} が助かるわけではない。

@item --preserve-root
@opindex --preserve-root
@cindex root directory, disallow recursive destruction
@option{--recursive} オプションと一緒に使った場合、ルートディレクトリ
(@file{/}) を削除しようとした時点で、実行に失敗する。これがデフォルトの動作である。
@xref{Treating / specially}.

(訳注: 確かに @option{--preserve-root} が有効になっていれば、@code{rm -rf /}
とした場合に、ルートディレクトリが保護されることになる。
だが、@code{rm -rf /*} とした場合には、あまり役に立たない。なぜなら、@file{/*}
は、@file{/bin}, @file{/usr}, @file{/home}
などに展開されるが、そうしたディレクトリの消去は、@option{--preserve-root}
によっては止められないからである。)

@item --no-preserve-root
@opindex --no-preserve-root
@cindex root directory, allow recursive destruction
再帰的に削除を行う際、@file{/} を特別扱いしない。
コンピュータ上にあるすべてのファイルを本当に削除したい場合以外、
このオプションの使用はお勧めできない。 @xref{Treating / specially}.

@item -r
@itemx -R
@itemx --recursive
@opindex -r
@opindex -R
@opindex --recursive
@cindex directories, removing (recursively)
コマンドラインにリストされたディレクトリとその中身を再帰的に削除する。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
削除を行う前に、各ファイルの名前を表示する。

@end table

@cindex files beginning with @samp{-}, removing
@cindex @samp{-}, removing files beginning with
よくある質問の一つに、名前が @samp{-} で始まるファイルを削除するには、どうしたらよいか、
というものがある。GNU の @command{rm} では、@code{getopt}
を使用して引数の解析を行っているあらゆるプログラムと同様、@samp{--}
オプションを使って、以下の引数はすべてオプションではない、と示すことが可能になっている。
カレントディレクトリにある @file{-f} というファイルを削除するには、
次のどちらかをタイプすればよい。

@example
rm -- -f
@end example

@noindent
あるいは、

@example
rm ./-f
@end example

@opindex - @r{and Unix @command{rm}}
Unix の @command{rm} プログラムが、この用途に @samp{-} を 1 個だけ使っていたのは、
@code{getopt} の標準シンタックスが開発される以前のことである。

@exitstatus


@node shred invocation
@section @command{shred}: セキュリティを向上させたファイルの削除

@pindex shred
@cindex data, erasing
@cindex erasing data

@command{shred} はデバイスやファイルを上書きして、
非常に高価な装置を使用しても、データの復元ができないようにする。

通常、ファイルを削除しても (@pxref{rm invocation})、データが実際に消去されるわけではない。
単に、ファイルが格納されている場所をリストしたインデックスが破棄されるだけであり、
そうすることで、そのデータの格納場所が再利用可能になるのである。
世の中には、インデックスの再構築を試みる復元ソフト (undelete utilities)
というものが存在する。そうしたものは、ファイルの存在したスペースが再利用されていなければ、
ファイルを復元することができるのだ。

頻繁に使われているシステムで、ディスクがほとんど一杯になっている場合、
スペースは数秒のうちに再利用されるかもしれない。だが、それを確実に知る方法は全くない。
また、他人に見られては困るデータがあったところで、
見られても構わないデータでそのファイルを上書きしてしまえば、
復元は絶対不可能だと考えたいかもしれない。

しかしながら、そういうことをした後でも、ディスクを研究所に持ち込んで、
高感度の (そして高価な) 装置を山ほど使用すれば、
上書きされたデータの下にある元のデータのかすかな「痕跡 (echoes)」を検出することが可能なのだ。
もし、データがたった一回しか上書きされていなかったら、それはさほど難しいことでもない。

データを復元できないように消去する最善の方法は、
それが載っているメディアを酸で破壊するとか、熱で溶かすとかすることである。
フロッピーディスクのような廉価なリムーバブル・メディアの場合、それがよく使われる方法だ。
だが、ハードディスクは高価だし、熱で溶かすのも難しい。
そこで、@command{shred} ユーティリティは、物質的な破壊以外の方法で、
同様の効果を実現しようとするのである。

そのためには、元のデータに与える損傷を最大にするように選ばれたデータパターンで繰り返し上書きするという方法が採られる。
この方法は、フロッピーディスクにも効果があるものの、パターンはハードディスクで最も効果を上げるように工夫されたものだ。
詳細については、ソースコードや、第 6 回 USENIX セキュリティ・シンポジウム
(San Jose, California, July 22--25, 1996) の議事録にある
Peter Gutmann の次の論文をご覧になっていただきたい。@*
@uref{http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html,
@cite{Secure Deletion of Data from Magnetic and Solid-State Memory}}

ここで心に銘記してしていただきたいのは、@command{shred} には非常に重要な前提があるということである。
すなわち、ファイルシステムはデータを、それが存在する場所で上書きするものでなければならない。
それは、こうした操作を行うときの伝統的な方法であるが、
最近のファイルシステムの設計には、この前提を満たさないものが多い。
そうした例外には、次のようなものがある。

@itemize @bullet

@item
ログ構造化 (log-structured) ファイルシステムや、ジャーナル化
(journaled) ファイルシステム。たとえば、ATX や Solaris
で提供されているもの。JFS, ReiserFS, XFS, Ext3 (@code{data=journal} モードの場合),
BFS, NTFS などが、「データ」のジャーナリングをするように設定されている場合もこれに当たる。

@item
データを冗長化して書き込んだり、一部の書き込みに失敗することがあっても、
動作し続けるファイルシステム。たとえば、RAID ベースのファイルシステム。

@item
Network Appliance の NFS サーバのように、スナップショットを作成するファイルシステム。

@item
NFS バージョン 3 のクライアントのように、一時領域にキャッシュを作るファイルシステム。

@item
圧縮ファイルシステム。
@end itemize

特に ext3 ファイルシステムについて言うと、上記の例外に当てはまるのは
(その結果、@command{shred} が限定された効果しか持たないのは)、@code{data=journal}
モードの場合だけである。これは、メタデータだけでなく、
ファイルデータもジャーナリングするモードだ。@code{data=ordered} (デフォルト)
と @code{data=writeback} の両モードでは、@command{shred} は通常どおり役に立つ。
ext3 のジャーナリング・モードを変更するには、mount のマニュアルに書いてあるように
(man mount)、@file{/etc/fstab} ファイルで問題のファイルシステムのマウントオプションに
@code{data=something} オプションを追加すればよい。

ファイルシステムがどういう動作をしているか、よくわからない場合は、
データをそれが存在する場所で上書きしていないと考えておいた方がよい。
すなわち、そのファイルシステムでは、通常ファイルに対する @command{shred}
の動作は、信頼できないということである。

一般的に言って、@command{shred} は、ファイルよりデバイスに対して使った方が信頼できる。
そうすれば、上に述べたファイルシステムの設計の問題を回避できるからだ。
しかしながら、@command{shred} のデバイスに対する使用も、必ずしも全面的に信頼できるわけではない。
たとえば、ほとんどのディスクが、バッドセクターを使用に割り当てる領域から外して、
アプリケーションから見えないようにしている。
そこで、バッドセクターに他人に見られたくないデータがある場合、@command{shred}
はそれを破壊できないことになる。

@command{shred} は、バックアップに対して何の対処も行おうとしないが、
バッドセクターの問題についても全く同様で、検知しようともしないし、通知しようともしない。
それでも、@command{shred} はファイルに対して行うより、デバイスに対して行う方が信頼できるので、
デフォルトでは、出力ファイルをサイズ 0 に短縮したり、削除したりしないようになっている。
このデフォルトは、ファイルよりデバイスに適した動作だ。
デバイスは一般に短縮できないし、削除するべきでもないからである。

最後になったが、バックアップやミラーの持つリスクも考慮した方がよい。
削除することのできないファイルのコピーが、ファイルシステムのバックアップやリモートのミラーに残っているかもしれないのだ。
そして、そうしたものが残っていれば、@command{shred}
で破壊したファイルを後日復元することが可能になる。
だから、後で @command{shred} を使って破棄したくなりそうなデータがある場合には、
そのバックアップやミラーがないことを確認すべきなのである。

@example
shred [@var{option}]@dots{} @var{file}[@dots{}]
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -f
@itemx --force
@opindex -f
@opindex --force
@cindex force deletion
必要ならば、ファイルの許可属性を無視して、上書きできるようにする。

@item -n @var{number}
@itemx --iterations=@var{number}
@opindex -n @var{number}
@opindex --iterations=@var{number}
@cindex iterations, selecting the number of
デフォルトで @command{shred} は、上書きを @value{SHRED_DEFAULT_PASSES} 回する。
時間を節約するために、回数を減らすこともできるし、
その方がよいと思えば、回数を増やすこともできる。
25 回上書きすると、プログラムが内部に持っている上書き用のパターンのすべてが、
少なくとも一回は使われたことになる。

@item --random-source=@var{file}
@opindex --random-source
@cindex random source for shredding
上書きに使用するランダムデータのソースとして @var{file} を使用する。
また、このランダムデータは、上書きパターンの順番を決めるのにも使用される。

@item -s @var{bytes}
@itemx --size=@var{bytes}
@opindex -s @var{bytes}
@opindex --size=@var{bytes}
@cindex size of file to shred
ファイルの最初の @var{bytes} バイトを shred 処理する。デフォルトは、
ファイル全体の shred である。@var{bytes} の後ろには、その何倍かを示すために
@samp{K}, @samp{M}, @samp{G} といった、サイズの指定を付けることができる。
 @xref{Block size}.

@item -u
@itemx --remove[=@var{how}]
@opindex -u
@opindex --remove
@opindex --remove=unlink
@opindex --remove=wipe
@opindex --remove=wipesync
@cindex removing files after shredding
shred 処理したファイルを (可能ならば) サイズ 0 に短縮し
(truncate)、その上で削除する。ファイルが複数のリンクを持っている場合に、
削除されるのは名前を指定されたリンクだけである。
ファイルの名前は、ファイルの内容ほど秘密性を必要としないことも多い。
そうした場合は、長い書式のオプションでサポートされている @var{how}
パラメータを付けることで、各ディレクトリエントリのより効率的な削除法を指定することができる。
@var{how} パラメータに @samp{unlink} を指定した場合は、標準の unlink 呼び出しをするだけだが、
@samp{wipe} を指定すると、unlink する前にファイル名を構成するバイトの難読化を行う。
@samp{wipesync} を指定した場合は、ファイル名を難読化するだけでなく、
それを 1 バイトづつディスクに sync することまで行う。
留意していただきたいのは、@samp{wipesync} はデフォルトの方法だが、
すべてのファイル名のすべての文字ごとに sync を行うことになるので、
負荷が重くなるかもしれないということである。
ファイル数が多い場合には、無視できない負荷になるかもしれない。
また、使用しているシステムがメタデータの同期アップデートを提供している場合には、
やらないでもよいことかもしれない。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
shred 処理が進行する間、更新される進行状態の情報のすべてを標準エラーに表示する。

@item -x
@itemx --exact
@opindex -x
@opindex --exact
デフォルトでは、@command{shred} は、
通常ファイルのサイズを、ファイルシステムのブロックサイズの倍数に切り上げて、
ファイルの最後のブロックの不使用領域まで完全に抹消する。
この領域には、システムによっては、たとえば、現在のシステムメモリの一部が入っているかもしれない。
この動作を抑制するには、@option{--exact} オプションを使用すればよい。
すなわち、デフォルトでは、1 ブロック 512 バイトのシステムで
10 バイトの通常ファイルを shred すると、結果として 512 バイトのファイルが出来上がる。
だが、このオプションを使えば、shred はファイルの見かけのサイズを増加させないのだ。

@item -z
@itemx --zero
@opindex -z
@opindex --zero
通常、@command{shred} は、最後の 1 回でもランダムデータを書き込む。
そんなファイルがハードディスクにあると、(たとえば、暗号化されたデータに見えて)
目立ってしまうのではないかと思うのなら、あるいは、単にそっちの方がもっとすっきりしていると思うのなら、
@option{--zero} オプションを指定して、もう一回、 すべて 0 ビットで上書きさせればよい。
これは、@option{--iterations} オプションで指定した上書き回数のほかに、もう一回ということである。

@end table

第 1 ドライブのフロッピーディスクに作成したファイルシステムを跡形もなく消し去るには、
次のコマンドを使えばよいだろう。このコマンドで ``1.44MB'' (実際には 1440 KiB)
のフロッピーを消去するには、約 20 分かかる。

@example
shred --verbose /dev/fd0
@end example

同様に、ハードディスクの選択したパーティションからすべてのデータを消去するには、
以下のコマンドを打ち込めばよい。

@example
shred --verbose /dev/sda5
@end example

最近のディスクでは、1 回の書き込みで十分なはずだ。
それならば、書き込みを 3 回行うデフォルトの 3 分の 1 の時間ですむ。

@example
# 擬似ランダムデータを 1 回書き込む。デフォルトより 3 倍速い。
shred --verbose -n1 /dev/sda5
@end example

念のため、少なくとも 1 回は擬似ランダムデータで上書きをした方がよい。
言い換えると、つい使いたくなっても、@samp{-n0 --zero} を使ってはいけない。
ディスク・コントローラの中には、すべてが 0 のブロックを書き込む際に、処理の最適化を行っているものがあり、
そのため、ブロック中のバイトすべてがクリアされない恐れがあるからである。
SSD の中には、まさにそういうことをするものがある。

@samp{-} という @var{file} は、標準出力を表している。
これの使い道は、削除したテンポラリ・ファイルを shred することである。
たとえば、次のようにだ。

@example
i=$(mktemp)
exec 3<>"$i"
rm -- "$i"
echo "Hello, world" >&3
shred - >&3
exec 3>&-
@end example

しかしながら、@samp{shred - >file} というコマンドを使っても、ファイルの内容を
shred することにはならない。なぜなら、シェルは @command{shred}
を呼び出す前に、ファイルをサイズ 0 に短縮 (truncate) してしまうからである。
@samp{shred file}、あるいは (Bourne 互換シェルをお使いなら) @samp{shred - 1<>file}
というコマンドを、代わりに使った方がよい。

@exitstatus


@node Special file types
@chapter 特殊なファイル型

@cindex special file types
@cindex file types, special

この章では、特殊なタイプのファイルを作成するコマンドの説明を行う (さらに @command{rmdir}
の説明もするが、これはディレクトリという特殊なファイル型の一つを削除するコマンドである)。

@cindex special file types
@cindex file types
Unix 系統のオペレーティング・システムでは、ほかのオペレーティング・システムと比べて、
特殊なファイル型というものが著しく少ないが、それでも普通のファイル
(@dfn{normal files}) がそうであるような、のっぺらぼうなバイトストリームとして、
何でもかんでも扱えさえすればよいというものではない。
たとえば、ファイルを作成したり、削除したりするとき、
システムはその情報を記録しなければならないが、それはディレクトリ (@dfn{directory})
--- これも特殊なタイプのファイルである --- に書き込まれる。
もし興味があれば、ディレクトリを普通のファイルのように読むこともできるが、
システムがシステムとしての役割を果たすためには、
ディレクトリはそのファイル内容であるバイトに、構造というか、何らかの秩序を持っていなければならない。
そういう意味で、ディレクトリは、「特殊な」タイプのファイルなのである。

ディレクトリ以外の特殊なファイル型としては、名前付きパイプ (FIFO)、
シンボリックリンク、ソケット、それに、いわゆるスペシャルファイル
(@dfn{special files}) がある。

@menu
* link invocation::     システムコール link を使って、ハードリンクを作成する
* ln invocation::       ファイル間のリンクを作成する
* mkdir invocation::    ディレクトリを作成する
* mkfifo invocation::   FIFO (名前付きパイプ) を作成する
* mknod invocation::    ブロック型やキャラクタ型のスペシャルファイルを作成する
* readlink invocation:: シムリンクの値、または正規化されたファイル名を表示する
* rmdir invocation::    空のディレクトリを削除する
* unlink invocation::   システムコール unlink を使って、ファイルを削除する

@end menu


@node link invocation
@section @command{link}: システムコール link を使って、ハードリンクを作成する

@pindex link
@cindex links, creating
@cindex hard links, creating
@cindex creating links (hard only)

@command{link} は、一度に 1 個のハードリンクを作成する。
これは、システムが提供する @code{link} 関数への必要最小のインターフェースである。
@xref{Hard Links, , , libc, The GNU C Library Reference Manual}.
従って、より一般に使われる @command{ln} コマンドのような、様々な付加機能をあえて備えていない
(@pxref{ln invocation})。

書式:

@example
link @var{filename} @var{linkname}
@end example

@var{filename} は、実在するファイルを指していなければならない。また、
@var{linkname} は、実在するディレクトリ中の実在しないファイルを指していなければならない。
@command{link} は、リンクを作成するために、@code{link (@var{filename}, @var{linkname})}
をコールするだけである。

GNU のシステムでは、このコマンドは、@samp{ln --directory
--no-target-directory @var{filename} @var{linkname}} と同様に振る舞う。
しかし、@option{--directory} や @option{--no-target-directory} は、POSIX
の規格にあるオプションではないので、@command{link} の方が、実用上より可搬性がある。

@var{filename} がシンボリックリンクの場合、
@var{linkname} がシンボリックリンクへのハードリンクになるか、
シンボリックリンクの参照先へのハードリンクになるかは、規定されていない。
どちらの動作を望むかをはっきり指定したければ、@command{ln -P} や @command{ln -L}
を使用するべきである。

@exitstatus


@node ln invocation
@section @command{ln}: ファイル間のリンクを作成する

@pindex ln
@cindex links, creating
@cindex hard links, creating
@cindex symbolic (soft) links, creating
@cindex creating links (hard or soft)

@cindex file systems and hard links
@command{ln} はファイル間のリンクを作成する。デフォルトではハードリンクを作成するが、
@option{-s} オプションを指定すると、シンボリックリンク (@dfn{soft} linkとも言う)
を作ることになる。

書式:

@example
ln [@var{option}]@dots{} [-T] @var{target} @var{linkname}
ln [@var{option}]@dots{} @var{target}
ln [@var{option}]@dots{} @var{target}@dots{} @var{directory}
ln [@var{option}]@dots{} -t @var{directory} @var{target}@dots{}
@end example

@itemize @bullet

@item
ファイル名を二つ指定すると、@command{ln} は 1 番目に対するリンクを
2 番目の名前で作成する。

@item
@var{target} のみを指定すると、@command{ln} はそのファイルに対するリンクをカレントディレクトリに作成する。

@item
@option{--target-directory} (@option{-t}) オプションを指定した場合や、
あるいはそれを指定しないでも、最後のファイルがディレクトリであり、しかも
@option{--no-target-directory} (@option{-T}) オプションを指定していない場合は、
@command{ln} は各 @var{target} ファイルに対するリンクを、
指定されたディレクトリに @var{target} の名前で作成する。

@end itemize

通常 @command{ln} は存在するファイルを削除しない。
既存のファイルを無条件で削除するには、@option{--force} (@option{-f}) オプションを使う。
また、ユーザに問い合わせた上で削除するには、@option{--interactive} (@option{-i})
オプションを使う。既存のファイルを、名前を変更して残すには、@option{--backup}
(@option{-b}) オプションを使用する。(訳注: ここで述べているのは、
存在するファイルの名前をリンクファイル名として使う場合の話である。)

@cindex hard link, defined
@cindex inode, and hard links
ハードリンク (@dfn{hard link}) というのは、存在するファイルが持つ別の名前である。
だから、リンクとオリジナルは、区別ができない。専門的な言い方をすると、両者は同じ
inode を共有するものである。inode には、ファイルに関する情報がすべて含まれているので、
全くのところ、inode こそファイルであると言っても、過言ではないほどだ。
たいていのシステムでは、ディレクトリに対するハードリンクの作成は禁じられている。
許可されているシステムでも、それができるのは、スーパーユーザだけである
(その場合でも、ファイルシステムにループが生じると、
ほかの様々なユーティリティ・プログラムで問題が起きるので、慎重に行わなければならない)。
なお、ハードリンクは、ファイルシステムの境界を越えることができない。
(もっとも、ハードリンクに対するこうした制限は、POSIX で規定されているわけではない。)

@cindex dereferencing symbolic links
@cindex symbolic link, defined
それに対して、シンボリックリンク (@dfn{symbolic link}、略称はシムリンク
@dfn{symlink}) は、特殊なファイル型の一つである
(すべてのカーネルがサポートしているわけではない。たとえば、System V release 3
やそれ以前のシステムにはシムリンクが存在しない)。
このファイル型では、リンクファイルは、実際には別のファイルを、名前を使って参照している。
ほとんどのファイル操作では (ファイルのオープン、読み込み、書き出しなど)、
シンボリックリンク・ファイルが渡されると、カーネルが自動的にリンクの参照を読み解いて
(@dfn{dereference})、リンクの参照先を操作の対象にする。ただし、操作によっては
(たとえば、ファイルの削除)、参照先ではなく、リンクファイルそのものを対象にするものもある。
シムリンクの所有者やグループは、リンクを通して行われるファイルアクセスに対して意味を持たないが、
削除制限ビットが立っているディレクトリからシンボリックリンクを削除する際には、かかわりを持ってくる。
GNU のシステムでは、シムリンクのモードには意味がなく、変更することもできない。
だが、BSD システムの中には、モードが変更でき、ファイル名の解決においてシムリンクをたどるかどうかに影響するものもある。
@xref{Symbolic Links,,, libc, The GNU C Library Reference Manual}.

シンボリックリンクの中身には、どんな文字列が含まれていてもよい。
シンボリックリンクに含まれる文字列が、実在するファイルの名前になっていないときは、
リンク切れ (@dfn{dangling symlink}) が生ずる。
リンク切れのシンボリックリンクを作成することは、禁止されているわけではない。
シムリンクの作成に絶対パスを使うか、相対パスを使うかには、それぞれ一長一短がある。
絶対パスのシムリンクは、リンクファイルの存在するディレクトリが移動しても、常に同じファイルを指す。
もっとも、そのシムリンクが複数のマシンから見えるような場合には
(たとえば、ネットワークでつながったファイルシステムにあるような場合には)、
リンクが指しているファイルは、必ずしも同じではないかもしれない。
相対パスのシンボリックリンクの方は、それが存在しているディレクトリからの相対パスで参照先が決まる。
そこで、リンクファイルがネットワークでつながっているマシンからアクセスされることがある場合に、
リンクと同じデバイス上に存在するファイルを、そのデバイスのマウントポイントが何という名前かを気にせずに指示することができて、
便利であることが多い。

相対パスのシムリンクをカレントディレクトリ以外の場所に作成すると、
そのシムリンクが実際に指しているファイルは、
同じ文字列がカレントディレクトリを基点として指しているファイルとは別のものになる。
そのため、ユーザの多くが、まずカレントディレクトリを変更して、
相対パスのシムリンクを作成する場所へ移動することを好んでいる。
そうすれば、タブ補完などのファイル名参照方法を用いて、
シムリンクに格納する参照先の適切な相対パスを見つけることができるからである。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@optBackup

@item -d
@itemx -F
@itemx --directory
@opindex -d
@opindex -F
@opindex --directory
@cindex hard links to directories
ユーザが適切な権限を持っていれば、
ディレクトリに対するハードリンクを作成しようとしても許可する。
とは言え、たぶんシステムによって禁止されているので、
たとえスパーユーザでも作成に失敗するだろう。

@item -f
@itemx --force
@opindex -f
@opindex --force
リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、それを削除する。

@item -i
@itemx --interactive
@opindex -i
@opindex --interactive
@cindex prompting, and @command{ln}
リンクの作成先に、作成するリンクファイルと同名のファイルがすでに存在していたら、
削除するかどうか、ユーザに問い合わせる。

@item -L
@itemx --logical
@opindex -L
@opindex --logical
@option{-s} オプションが有効になっていないとき、リンク対象として指定されたファイル
(訳注: 上記書式の @var{target}) がシンボリックリンクならば、
シンボリックリンクそのものではなく、シンボリックリンクが参照しているファイルへのハードリンクを作成する。

@item -n
@itemx --no-dereference
@opindex -n
@opindex --no-dereference
最後のオペランドがディレクトリに対するシンボリックリンクであるとき、それをディレクトリとして特別扱いしない
(訳注: すなわち、ディレクトリ内に @var{target} と同名でリンクを作ることはしない)。
むしろ、普通のファイルであるかのように扱う。

リンクの作成先として指定されたのが (ディレクトリに対するシムリンクではなく)
本物のディレクトリならば、曖昧なところは全くない。
そのディレクトリ内にリンクを作るだけの話だ。ところが、指定された作成先が、
ディレクトリに対するシムリンクの場合は、ユーザの要求を処理するのに、二つの行き方がある。
@command{ln} は、通常のディレクトリを扱う場合と全く同じように作成先を扱って、
そこにリンクを作成することができる。
あるいは、作成先をディレクトリではないもの、すなわち、他ならぬシムリンクと見なすことも可能だ。
後者の場合、@command{ln} は、新しいリンクを作成する前に、
そのシムリンクを消去するなり、バックアップするなりしなければならない。
@command{ln} のデフォルトは、作成先がディレクトリに対するシムリンクであっても、
ディレクトリと全く同様に扱うことである。

このオプションは、@option{--no-target-directory} (@option{-T})
の弱いバージョンである。従って、両方のオプションを指定した場合、こちらは効果がない。

@item -P
@itemx --physical
@opindex -P
@opindex --physical
@option{-s} オプションが有効になっていないとき、リンク対象として指定されたファイル
(訳注: 上記書式の @var{target}) がシンボリックリンクならば、
シンボリックリンクそのものへのハードリンクを作成する。
そういった動作をカーネルがサポートしていないプラットホームでは、このオプションを指定すると、
リンク対象のシンボリックリンクと全く同じ内容を持つシンボリックリンクが作成される。
このとき、シンボリックリンクの内容に手が加えられることは決してないので、
どちらのシンボリックリンクを使って行われるファイル名の解決も、
シンボリックリンクへのハードリンクが作成された場合と結局同じになる。

@item -r
@itemx --relative
@opindex -r
@opindex --relative
リンクファイルを置く場所を基点とする相対パスのシンボリックリンクを作成する。

用例:

@smallexample
ln -srv /a/file /tmp
'/tmp/file' -> '../a/file'
@end smallexample

相対パスのシンボリックリンクは、
それを置くディレクトリと参照先のファイル名を正規化した上で、それに基づいて作成される。
すなわち、そうしたファイル名中にあるすべてのシンボリックリンクは、実体に還元されることになるわけだ。
なお、@command{realpath} コマンドを使用すれば、
以下の例に示すように、相対パスを生成する際にもっと融通が利く
(訳注: たとえば、@command{realpath} を使うと、
ファイル名中のシンボリックリンクをシンボリックリンクのままにしておくこともできる)。
@xref{realpath invocation}.

@example
@verbatim
ln--relative() {
  test "$1" = --no-symlinks && { nosym=$1; shift; }
  target="$1";
  test -d "$2" && link="$2/." || link="$2"
  rtarget="$(realpath $nosym -m "$target" \
              --relative-to "$(dirname "$link")")"
  ln -s -v "$rtarget" "$link"
}
@end verbatim
@end example

@item -s
@itemx --symbolic
@opindex -s
@opindex --symbolic
ハードリンクではなく、シンボリックリンクを作る。
このオプションは、シンボリックリンクをサポートしていないシステムでは、
エラー・メッセージを表示するだけである。

@optBackupSuffix

@optTargetDirectory

@optNoTargetDirectory

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
リンクの作成に成功した後で、各ファイルの名前を表示する。

@end table

@cindex hard links to symbolic links
@cindex symbolic links and @command{ln}
@option{-L} と @option{-P} の両方を指定すると、最後に指定したものが効果を持つ。
さらに @option{-s} も指定した場合は、エラーや警告は出ないが、@option{-L} や
@option{-P} は無視される。@option{-L} と @option{-P}
のどちらのオプションも指定しない場合、@command{ln} のこの実装では、システムの
@code{link} 関数がシンボリックリンクに対するハードリンクをサポートしていれば
(たとえば、GNU のシステム)、デフォルトの動作は @option{-P} になる。
@code{link} 関数がシンボリックリンクをたどるものならば
(たとえば、BSD)、デフォルトの動作は @option{-L} である。

@exitstatus

用例:

@smallexample
悪い例:

# カレントディレクトリにあるファイル a を指す ../a というリンクを
# 作成する。実のところ役に立たない。../a が自分自身を指すリンクに
# なってしまうからだ。
ln -s a ..

よりよい例:

# 頭がこんがらかってしまわないように、シムリンクを作成する前に、
# リンクを作るディレクトリに移動する。
cd ..
ln -s adir/a .

悪い例:

# 絶対パスによるリンク対象の指定は、リンク対象の位置が変わると、
# 役に立たない。
ln -s $(pwd)/a /some/dir/

よりよい例:

# 相対パスによるリンク対象の指定は、リンクやその対象を含む
# ディレクトリが移動しても、両者の相対的な位置関係が変わらない
# かぎり、問題がない。また、ネットワークでつながったファイル
# システム間でも通用する。
ln -s afile anotherfile
ln -s ../adir/afile yetanotherfile
@end smallexample


@node mkdir invocation
@section @command{mkdir}: ディレクトリを作成する

@pindex mkdir
@cindex directories, creating
@cindex creating directories

@command{mkdir} は、指定された名前でディレクトリを作成する。

書式:

@example
mkdir [@var{option}]@dots{} @var{name}@dots{}
@end example

@command{mkdir} は、@var{name} で指定された各ディレクトリを、指定された順番で作成する。
@var{name} がすでに存在していると、エラーになり、その旨メッセージを出すが、
@var{name} がすでに存在していても、@option{-p} オプションが指定され、@var{name}
がディレクトリの場合は、エラーにならない。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -m @var{mode}
@itemx --mode=@var{mode}
@opindex -m
@opindex --mode
@cindex modes of created directories, setting
作成するディレクトリの許可属性ビットを @var{mode} に設定する。@var{mode} には
@command{chmod} と同じ書式を使用し、@samp{a=rwx} (すべてのユーザに、読み、書き、
実行を許可する) を基点とする。@xref{File permissions}. 

通常、ディレクトリには、作成された時点で、要求したとおりのファイル・モードビットが付く。
GNU の拡張として、@var{mode} で特殊モードビットも指定できるが、
その場合は、ディレクトリは存在しているが、特殊モードビットは要求どおりではないという、時間の隙間が生じるかもしれない。
ディレクトリの set-user-ID ビットと set-group-ID ビットが、
このオプションを使って変更しない場合にどのように継承されるかについては、
次の節を参照していただきたい。@xref{Directory Setuid and Setgid}.

@item -p
@itemx --parents
@opindex -p
@opindex --parents
@cindex parent directories, creating
各引数について、存在していない親ディレクトリがあれば、それを作成し、
その許可属性ビットを umask を基にして @samp{u+wx} になるように設定する。
親ディレクトリがすでに存在している場合は、このオプションは何もせず、
その許可属性ビットを変更することもない。

新たに作成するいかなる親ディレクトリの許可属性ビットも、@samp{u+wx}
を含むある一定の値に設定するには、@command{mkdir} を実行する前に、umask
を設定すればよい。たとえば、@samp{(umask u=rwx,go=rx; mkdir -p P/Q)}
というシェルコマンドで @file{P} という親ディレクトリを作れば、その許可属性ビットは
@samp{u=rwx,go=rx} になる。また、親ディレクトリに特殊モードビットも設定するには、
@command{chmod} を @command{mkdir} の後で実行すればよい。
新たに作成される親ディレクトリの set-user-ID ビットと
set-group-ID ビットがどのように継承されるかについては、
次の節を参照していただきたい。 @xref{Directory Setuid and Setgid}.

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
ディレクトリを作成するごとに、メッセージを表示する。@option{--parents}
と併せて使うと、大変便利である。

@optContext (@var{context} を省略できるのは、coreutils-8.22 から)

@end table

@exitstatus


@node mkfifo invocation
@section @command{mkfifo}: FIFO (名前付きパイプ) を作成する

@pindex mkfifo
@cindex FIFOs, creating
@cindex named pipes, creating
@cindex creating FIFOs (named pipes)

@command{mkfifo} は、指定された名前で FIFO (名前付きパイプ @dfn{named pipes}
とも言う) を作成する。

書式:

@example
mkfifo [@var{option}] @var{name}@dots{}
@end example

@dfn{FIFO} は特殊なファイル型の一つであり、
これを利用すると、独立したプロセスの間でデータのやりとりが可能になる。
片方のプロセスが FIFO を書き出し用にオープンし、もう一方のプロセスが読み込み用にオープンする。
そうすると、シェルなどにある普通の名前のない (anonymous) パイプを使ったときのように、
データを一方から他方へ流すことができるのである。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -m @var{mode}
@itemx --mode=@var{mode}
@opindex -m
@opindex --mode
@cindex modes of created FIFOs, setting
作成する FIFO の許可属性を @var{mode} にする。@var{mode} は @command{chmod}
で使用するのと同じシンボル表記であり、@samp{a=rw} (すべてのユーザに、
読み、書きを許可する) を基点として使う。@var{mode} で指定するのは、
ファイルの許可属性ビットのみにするべきである。 @xref{File permissions}.

@optContext (@var{context} を省略できるのは、coreutils-8.22 から)

@end table

@exitstatus


@node mknod invocation
@section @command{mknod}: ブロック型やキャラクタ型のスペシャルファイルを作成する。

@pindex mknod
@cindex block special files, creating
@cindex character special files, creating

@command{mknod} は、指定された名前で FIFO、キャラクター・スペシャルファイル、
ブロック・スペシャルファイルを作成する。

書式:

@example
mknod [@var{option}]@dots{} @var{name} @var{type} [@var{major} @var{minor}]
@end example

@cindex special files
@cindex block special files
@cindex character special files
これまでに使ってきた「特殊なファイル型 (``special file type'')」という言い回しとは違って、
「スペシャルファイル (@dfn{special file})」という用語には、Unix では技術的な意味が存在する。
すなわち、それは、データを生成したり、受け取ったりできるもののことである。
たいていの場合、それはハードウェアという物理的なものを指し、
たとえば、プリンタやディスクがそれに当たる。(なお、そうしたスペシャルファイルは、
通常、システムの設定時に作られる。) @command{mknod} は、
このタイプのファイルを作成するコマンドである。そうしたデバイスには、そこから一度に
1 文字 (a character) づつしか読むことのできないものもあれば、一度に 1 ブロックを
(すなわち、たくさんの character を) 読み込むことのできるものもある。
それ故、スペシャルファイルには、ブロック・スペシャルファイル
(@dfn{block special} files) とキャラクタ・スペシャルファイル
(@dfn{character special} files) があると言われるのである。

@c mknod is a shell built-in at least with OpenBSD's /bin/sh
@mayConflictWithShellBuiltIn{mknod}

@var{name} に続く引数では、作成するファイルのタイプを指定する。

@table @samp

@item p
@opindex p @r{for FIFO file}
FIFO を作成する

@item b
@opindex b @r{for block special file}
ブロック・スペシャルファイルを作成する

@item c
@c Don't document the 'u' option -- it's just a synonym for 'c'.
@c Do *any* versions of mknod still use it?
@c @itemx u
@opindex c @r{for character special file}
@c @opindex u @r{for character special file}
キャラクタ・スペシャルファイルを作成する

@end table

ブロック型やキャラクタ型のスペシャルファイルを作成する際には、
ファイルタイプに続いて、メージャー・デバイス番号とマイナー・デバイス番号を指定する必要がある。
メージャーやマイナーのデバイス番号が @samp{0x} や @samp{0X} で始まっていれば、
番号は 16 進数と見なされる。@samp{0} で始まっていれば 8 進数、それ以外の場合は
10 進数である。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -m @var{mode}
@itemx --mode=@var{mode}
@opindex -m
@opindex --mode
作成するファイルの許可属性を @var{mode} にする。@var{mode} は @command{chmod}
で使用するのと同じシンボル表記であり、@samp{a=rw} を基点として使う。
@var{mode} で指定するのは、ファイルの許可属性ビットのみにするべきである。
@xref{File permissions}.

@optContext (@var{context} を省略できるのは、coreutils-8.22 から)

@end table

@exitstatus


@node readlink invocation
@section @command{readlink}: シムリンクの値、または正規化されたファイル名を表示する

@pindex readlink
@cindex displaying value of a symbolic link
@cindex canonical file name
@cindex canonicalize a file name
@findex realpath

@command{readlink} には、二つの動作モードがある。

@table @samp

@item Readlink モード

このモードでは、@command{readlink} は、指定されたシンボリックリンクの値を表示する。
引数がシンボリックの名前以外だったときは、何も出力せず、0 以外の終了コードで終了する。

@item Canonicalize (正規化) モード

このモードでは、@command{readlink} は、指定されたファイルの絶対パスによる名前を表示する。
その絶対パスには、@file{.} や @file{..} といった構成要素や重複するパスの区切り
(@file{/})、シンボリックリンクは含まれない。

@end table

@example
readlink [@var{option}]@dots{} @var{file}@dots{}
@end example

デフォルトでは、@command{readlink} は readlink モードで動作する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -f
@itemx --canonicalize
@opindex -f
@opindex --canonicalize
canonicalize モードで動かす。ファイル名を構成する要素のうち、
最後の要素以外のどれかが、存在しなかったり、利用できなかったりすると、
@command{readlink} は何も出力せず、0 以外の終了コードで終了する。
引数の末尾のスラッシュは無視される。

@item -e
@itemx --canonicalize-existing
@opindex -e
@opindex --canonicalize-existing
canonicalize モードで動かす。ファイル名を構成する要素に、
存在しなかったり、利用できなかったりするものがあれば、@command{readlink}
は何も出力せず、 0 以外の終了コードで終了する。
ファイル名のの末尾にスラッシュを付けると、その名前はディレクトリであるという指定になる。

@item -m
@itemx --canonicalize-missing
@opindex -m
@opindex --canonicalize-missing
canonicalize モードで動かす。ファイル名を構成する要素に、
存在しなかったり、利用できなかったりするものがあれば、@command{readlink}
はそれをディレクトリと見なす。

@item -n
@itemx --no-newline
@opindex -n
@opindex --no-newline
@var{file} が 1 個しか指定されなかったときは、出力の区切り文字
(訳注: 通常は改行) を表示しない。複数の @var{file}
とともに、このオプションが指定されたときは、警告メッセージを出す。

@item -s
@itemx -q
@itemx --silent
@itemx --quiet
@opindex -s
@opindex -q
@opindex --silent
@opindex --quiet
ほとんどのエラーメッセージを出さないようにする。デフォルトで ON になっている。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
エラーメッセージを表示する。

@optZero

@end table

@command{readlink} ユーティリティが初めて登場したのは、OpenBSD 2.1 だった。

@command{realpath} コマンドをオプションなしで使うと、canonicalize モードの
@command{readlink} と同じ動作をする。

@exitstatus


@node rmdir invocation
@section @command{rmdir}: 空のディレクトリを削除する

@pindex rmdir
@cindex removing empty directories
@cindex directories, removing empty

@command{rmdir} は、空のディレクトリを削除する。

書式:

@example
rmdir [@var{option}]@dots{} @var{directory}@dots{}
@end example

引数 @var{directory} が実在する空のディレクトリを指していない場合、エラーになる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item --ignore-fail-on-non-empty
@opindex --ignore-fail-on-non-empty
@cindex directory deletion, ignoring failures
ディレクトリの削除に失敗しても、その理由が単にディレクトリが空ではないせいならば、
その失敗を無視する。

@item -p
@itemx --parents
@opindex -p
@opindex --parents
@cindex parent directories, removing
@var{directory} を削除するとき、@var{directory} を構成する各要素の削除を試みる。
そこで、たとえば、@samp{rmdir -p a/b/c} は、@samp{rmdir a/b/c a/b a} と同じになる。
従って、そうしたディレクトリのどれかが空ではないことが判明すると、動作に失敗する。
動作に失敗しても、エラーメッセージを出して失敗のステータスで終了しないようにするには、
@option{--ignore-fail-on-non-empty} オプションを使えばよい。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
@cindex directory deletion, reporting
@var{directory} の削除に成功するごとに、その旨メッセージを出す。

@end table

空ではないディレクトリを (再帰的に) 削除する方法については、@command{rm}
コマンドの説明を参照していただきたい。@xref{rm invocation}. 

@exitstatus


@node unlink invocation
@section @command{unlink}: システムコール unlink を使って、ファイルを削除する

@pindex unlink
@cindex removing files or directories (via the unlink syscall)

@command{unlink} は、指定された 1 個のファイル名の削除を行う。
これは、システムが提供する @code{unlink} 関数への必要最小のインターフェースである。
@xref{Deleting Files, , , libc, The GNU C Library Reference Manual}.
従って、より一般に使われる @command{rm} コマンドのような、様々な付加機能をあえて備えていない
(@pxref{rm invocation})。

書式:

@example
unlink @var{filename}
@end example

システムによっては、@code{unlink} を使って、ディレクトリの名前を削除できるものもある。
また、それができるのは、特権を持ったユーザだけであるシステムもある。
GNU のシステムでは、@code{unlink} は、ディレクトリの名前を全く削除できない。

@command{unlink} コマンドは、@option{--help} と @option{--version} オプションを認識する。
名前が @samp{-} で始まるファイルを削除するには、名前の前に @samp{./} を付ければよい。
たとえば、@samp{unlink ./--help} のようにだ。

@exitstatus


@node Changing file attributes
@chapter ファイルの属性変更

@cindex changing file attributes
@cindex file attributes, changing
@cindex attributes, file

ファイルについては、内容と名前とファイル型 (@pxref{Special file types})
で、すべてが尽くされるわけではない。ファイルには、他の情報も存在する。
たとえば、所有者 (ユーザ ID)、グループ (グループ ID)、アクセス権
(そのファイルに対して、所有者、グループに属するユーザ、それ以外の一般ユーザは、
それぞれ何ができるのか)、様々なタイムスタンプ、といった情報も存在するのである。
そうしたものは、一まとめにして、ファイルの属性 (@dfn{attributes}) と呼ばれている。

以下のコマンドは、ファイルの属性を変更する。

@menu
* chown invocation::         ファイルの所有者やグループを変更する。
* chgrp invocation::         ファイルのグループを変更する。
* chmod invocation::         アクセス権を変更する。
* touch invocation::         ファイルのタイムスタンプを変更する。
@end menu


@node chown invocation
@section @command{chown}: ファイルの所有者やグループを変更する

@pindex chown
@cindex file ownership, changing
@cindex group ownership, changing
@cindex changing file ownership
@cindex changing group ownership

@command{chown} は、指定された各 @var{file} の所有者や所有グループを
@var{new-owner} に変更する。所有者とグループを、存在する参照用ファイル
(reference file) のそれと同じものに変更することもできる。

書式:

@example
chown [@var{option}]@dots{} @{@var{new-owner} | --reference=@var{ref_file}@}@c
 @var{file}@dots{}
@end example

@var{new-owner} では、新しい所有者やグループを以下のような形で指定する
(@samp{:} の前後に空白を入れてはいけない)。

@example
[@var{owner}] [ : [@var{group}] ]
@end example

細かく説明しよう。

@table @var
@item owner
@var{owner} (ユーザ名、またはユーザ ID 番号) だけが指定されている場合は、
そのユーザが指定された各ファイルの所有者になる。ファイルのグループは変化しない。

@item owner@samp{:}group
@var{owner} の後に、コロンと @var{group} (グループ名、またはグループ ID 番号)
が、間に空白をはさまずに続く場合は、ファイルの所有グループも
(@var{group} に) 変更される。

@item owner@samp{:}
@var{owner} の後ろにコロンがあるのみで、グループ名が続かない場合は、
そのユーザがファイルの所有者になり、ファイルのグループは、@var{owner}
のログイン・グループに変更される。

@item @samp{:}group
コロンとそれに続く @var{group} のみが指定され、所有者が省略されている場合は、
ファイルのグループだけが変更される。この場合、@command{chown}
は、@command{chgrp} と同じ動作をするわけだ。

@item @samp{:}
コロンのみが指定されている場合や、@var{new-owner} に何も指定されていない場合は、
所有者もグループも変更されない。

@end table

@var{owner} や @var{group} にユーザ ID 番号やグループ ID 番号を使用する場合は、
番号の頭に @samp{+} を付ければ、ID 番号だと明示することができる。
@xref{Disambiguating names and IDs}.

古めのスクリプトの中には、区切りの印として @samp{:} ではなく、@samp{.}
を今だに使っているものがあるかもしれない。POSIX 1003.1-2001 (@pxref{Standards conformance})
では、これに対するサポートを要求していないが、
後方互換のために、GNU の @command{chown} では、曖昧さが生じないかぎり、@samp{.}
の使用をサポートしている。とは言え、新しく書くスクリプトでは、@samp{.}
の使用を避けるべきである。他のシステムでも使えるとはかぎらないし、
また、@var{owner@samp{.}group} という全体が、名前に @samp{.}
を含むユーザを指していたりすると、不都合が生じるからだ。

@macro chownGroupRestrictions
ユーザがグループを任意のものに変更できるか、それとも、
グループの設定はユーザがその一員であるグループにのみ制限されるという、
より可搬性のある動作になっているかは、システム次第である。
@end macro
@chownGroupRestrictions

@command{chown} コマンドを実行すると、set-user-ID ビットや set-group-ID
ビットが消えてしまうことがある。そうしたことが起きるかどうかは、
裏で動いている @code{chown} システムコールのポリシーや機能次第であり、
従って、システムによるファイルモードの変更が、@command{chown}
コマンドのコントロール外になることがあるのだ。
しかるべき特権を持ったユーザが実行した場合や、問題のビットが実行権とは関係のない何か別の機能
(たとえば、強制ロック) を表している場合などでは、@command{chown}
コマンドを実行しても、そうしたビットが変わらないかもしれない。
どうなるかよくわからない場合は、裏で動いているシステムの動作を調べるとよい。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --changes
@opindex -c
@opindex --changes
@cindex changed owners, verbosely describing
所有者の変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。

@item -f
@itemx --silent
@itemx --quiet
@opindex -f
@opindex --silent
@opindex --quiet
@cindex error messages, omitting
所有者を変更できないファイルがあっても、エラーメッセージを出さない。

@item --from=@var{old-owner}
@opindex --from
@cindex symbolic links, changing owner
@var{file} が @var{old-owner} で指定された属性を現在持っているときにのみ、
その所有者を変更する。@var{old-owner} の書式は、上記の @var{new-owner} と同じである。
このオプションは、ファイルの不正使用が可能になる時間を大幅に狭めるという点で、
主としてセキュリティの見地から役に立つ。
一例を挙げると、この種のオプションを使わない場合、ユーザの ID
番号の変更を、そのユーザのファイルに反映させるために、@code{root}
は次のようなコマンドを実行するかもしれない。

@smallexample
find / -user OLDUSER -print0 | xargs -0 chown -h NEWUSER
@end smallexample

しかし、これは危険なことである。なぜなら、@command{find}
が存在するファイルの所有者を検査するときと、@command{chown}
が実際に実行されるときとの間に時間差があり、それはかなり大きいかもしれないからだ。
この時間差を小さくする方法の一つは、ファイルが見つかるごとに、@command{chown}
を実行することだろう。

@example
find / -user OLDUSER -exec chown -h NEWUSER @{@} \;
@end example

しかし、動作の対象になるファイルがたくさんあると、この方法は非常に時間がかかる。
@option{--from=@var{old-owner}} オプションを使う方が、
万全とまでは言えないにしても、より安全である (時間差がさらに小さくなるので)。

@example
chown -h -R --from=OLDUSER NEWUSER /
@end example

@item --dereference
@opindex --dereference
@cindex symbolic links, changing owner
@findex lchown
シンボリックリンクそのものを動作の対象とせず、リンクが指しているものを動作の対象にする。
これがデフォルトである。

@item -h
@itemx --no-dereference
@opindex -h
@opindex --no-dereference
@cindex symbolic links, changing owner
@findex lchown
シンボリックリンクが指しているものではなく、シンボリックリンクそのものを動作の対象にする。
このモードは、システムコール @code{lchown} に依存している。
システムコール @code{lchown} を提供していないシステムでは、
コマンドラインで指定されたファイルがシンボリックリンクだと、@command{chown} は実行に失敗する。
なお、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会っても、
デフォルトでは診断メッセージを表示しない。ただし、@option{--verbose}
を指定している場合は別なので、そちらの説明も参照していただきたい。

@item --preserve-root
@opindex --preserve-root
@cindex root directory, disallow recursive modification
ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
@option{--recursive} オプションを指定していない場合、このオプションは効果がない。
@xref{Treating / specially}.

@item --no-preserve-root
@opindex --no-preserve-root
@cindex root directory, allow recursive modification
@option{--preserve-root} オプションが前にあれば、その効果を無効にする。
@xref{Treating / specially}.

@item --reference=@var{ref_file}
@opindex --reference
各 @var{file} の所有者とグループを @var{ref_file} のそれと同じものに変更する。
@var{ref_file} がシンボリックリンクの場合は、シンボリックリンクの所有者とグループではなく、
リンクが指しているファイルの所有者とグループを使用する。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
処理したすべてのファイルについてメッセージを表示する。システムコール @code{lchown}
を持っていないシステムで、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会った場合、
@option{--no-dereference} が有効になっていれば、
「シンボリックリンクもその参照先も変更しない」というメッセージを出す。

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
@cindex recursively changing file ownership
ディレクトリとその中身の所有者を再帰的に変更する。

@choptH @xref{Traversing symlinks}.

@choptL @xref{Traversing symlinks}.

@choptP @xref{Traversing symlinks}.

@end table

@exitstatus

用例:

@smallexample
# /u の所有者を "root" に変更する。
chown root /u

# 同様だが、グループも "staff" に変更する。
chown root:staff /u

# /u 及び、それ以下にあるファイルの所有者を "root" に変更する。
chown -hR root /u
@end smallexample


@node chgrp invocation
@section @command{chgrp}: ファイルの所有グループを変更する

@pindex chgrp
@cindex group ownership, changing
@cindex changing group ownership

@command{chgrp} は、指定された各 @var{file} の所有グループを @var{group}
に変更する (@var{group} は、グループ名でもグループ ID 番号でもよい)。
所有グループを、存在する参照用ファイル (reference file)
のグループと同じものに変更することもできる。 @xref{chown invocation}.

書式:

@example
chgrp [@var{option}]@dots{} @{@var{group} | --reference=@var{ref_file}@}@c
 @var{file}@dots{}
@end example

@var{group} にグループ ID 番号を使用する場合は、番号の頭に @samp{+} を付ければ、
ID 番号だと明示することができる。 @xref{Disambiguating names and IDs}.

@chownGroupRestrictions

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --changes
@opindex -c
@opindex --changes
@cindex changed files, verbosely describing
グループの変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。

@item -f
@itemx --silent
@itemx --quiet
@opindex -f
@opindex --silent
@opindex --quiet
@cindex error messages, omitting
グループを変更できないファイルがあっても、エラーメッセージを出さない。

@item --dereference
@opindex --dereference
@cindex symbolic links, changing owner
@findex lchown
シンボリックリンクそのものを動作の対象とせず、リンクが指しているものを動作の対象にする。
これがデフォルトである。

@item -h
@itemx --no-dereference
@opindex -h
@opindex --no-dereference
@cindex symbolic links, changing group
@findex lchown
シンボリックリンクが指しているものではなく、シンボリックリンクそのものを動作の対象にする。
このモードは、システムコール @code{lchown} に依存している。
システムコール @code{lchown} を提供していないシステムでは、
コマンドラインで指定されたファイルがシンボリックリンクだと、@command{chgrp} は実行に失敗する。
なお、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会っても、
デフォルトでは診断メッセージを表示しない。ただし、@option{--verbose}
を指定している場合は別なので、そちらの説明も参照していただきたい。

@item --preserve-root
@opindex --preserve-root
@cindex root directory, disallow recursive modification
ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
@option{--recursive} オプションを指定していない場合、このオプションは効果がない。
@xref{Treating / specially}.

@item --no-preserve-root
@opindex --no-preserve-root
@cindex root directory, allow recursive modification
@option{--preserve-root} オプションが前にあれば、その効果を無効にする。
@xref{Treating / specially}.

@item --reference=@var{ref_file}
@opindex --reference
各 @var{file} のグループを @var{ref_file} のグループと同じものに変更する。
@var{ref_file} がシンボリックリンクの場合は、
シンボリックリンクのグループではなく、リンクが指しているファイルのグループを使用する。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
処理したすべてのファイルについてメッセージを表示する。システムコール @code{lchown}
を持っていないシステムで、再帰的にディレクトリ階層をたどっている際にシンボリックリンクに出会った場合、
@option{--no-dereference} が有効になっていれば、
「シンボリックリンクもその参照先も変更しない」というメッセージを出す。

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
@cindex recursively changing group ownership
ディレクトリとその中身の所有グループを再帰的に変更する。

@choptH @xref{Traversing symlinks}.

@choptL @xref{Traversing symlinks}.

@choptP @xref{Traversing symlinks}.

@end table

@exitstatus

用例:

@smallexample
# /u のグループを "staff" に変更する。
chgrp staff /u

# /u 及び、それ以下にあるファイルのグループを "staff" に変更する。
chgrp -hR staff /u
@end smallexample


@node chmod invocation
@section @command{chmod}: アクセス権を変更する

@pindex chmod
@cindex changing access permissions
@cindex access permissions, changing
@cindex permissions, changing access

@command{chmod} は、名前を指定したファイルのアクセス権を変更する。

書式:

@example
chmod [@var{option}]@dots{} @{@var{mode} | --reference=@var{ref_file}@}@c
 @var{file}@dots{}
@end example

@cindex symbolic links, permissions of
@command{chmod} コマンドがシンボリックリンクのアクセス権を変更することはない。
@command{chmod} システムコールがシンボリックリンクのアクセス権を変更できないからである。
シンボリックリンクのアクセス権が利用されることは全くないので、この制限は問題にならない。
とは言え、コマンドラインで指定された @var{file}
が、シンボリックリンクだということはあるだろうが、そうした場合、@command{chmod}
は、指定された各シンボリックリンクが参照しているファイルのアクセス権を変更する。
それに対して、ディレクトリを再帰的にたどっている最中にシンボリックリンクに出会った場合は、
@command{chmod} はそれを無視することになる。

@command{chmod} の実行に成功したとき、通常ファイルの set-group-ID ビットが消えることがあるが、
それは、ファイルのグループ ID が、@command{chmod} を実行したユーザの実効グループ ID
や、補助グループ ID の一つに一致しなかった場合である。
もっとも、そのユーザがしかるべき特権を持っている場合には、
set-group-ID ビットが消えることはない。また、制限事項が他にも存在して、
指定した @var{mode} 中や @var{ref_file} の、set-user-ID ビットや set-group-ID
ビットが無視されることもある。そうした動作は、裏で動いている @code{chmod}
システムコールのポリシーや機能次第なのだ。どうなるかよくわからない場合には、
裏で動いているシステムの動作を調べればよい。

@var{mode} には、ファイルの新しいモードビット (訳注: すなわち、アクセス権)
を指定する。詳細については、「ファイルの許可属性」の章を参照していただきたい
(@pxref{File permissions})。@var{mode} を指定するとき、@var{mode}
をどうしても @samp{-} で始めたいのなら、前に @option{--} を置いた方がよい。
たとえば、@samp{chmod -- -w file} のようにだ。
とは言え、たいていの場合、@samp{chmod a-w file} の方が望ましい。
なお、@command{chmod -w file} (@option{--} がない) が
@samp{chmod a-w file} と別の動作になる場合には、警告が出る。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --changes
@opindex -c
@opindex --changes
アクセス権の変更が実際に行われた各 @var{file} について、何を実行したかを詳しく表示する。

@item -f
@itemx --silent
@itemx --quiet
@opindex -f
@opindex --silent
@opindex --quiet
@cindex error messages, omitting
アクセス権が変更できないファイルがあっても、エラーメッセージを出さない。

@item --preserve-root
@opindex --preserve-root
@cindex root directory, disallow recursive modification
ルートディレクトリ (@file{/}) を再帰的に変更しようとした時点で、実行に失敗する。
@option{--recursive} オプションを指定していない場合、このオプションは効果がない。
@xref{Treating / specially}.

@item --no-preserve-root
@opindex --no-preserve-root
@cindex root directory, allow recursive modification
@option{--preserve-root} オプションが前にあれば、その効果を無効にする。
@xref{Treating / specially}.

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
すべての @var{file} について、何を実行し、何を実行しなかったかを詳しく
表示する。

@item --reference=@var{ref_file}
@opindex --reference
各 @var{file} のモードを @var{ref_file} のそれと同じものに変更する。
@xref{File permissions}.  @var{ref_file} がシンボリックリンクの場合は、
シンボリックリンクのモードではなく、リンクが参照しているファイルのモードを使用する。

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
@cindex recursively changing access permissions
ディレクトリとその中身のアクセス権を再帰的に変更する。

@end table

@exitstatus


@node touch invocation
@section @command{touch}: ファイルのタイムスタンプを変更する

@pindex touch
@cindex changing file timestamps
@cindex file timestamps, changing
@cindex timestamps, changing file

@command{touch} は指定されたファイルのアクセス日時 (access time) や更新日時
(modification time) を変更する。

書式:

@example
touch [@var{option}]@dots{} @var{file}@dots{}
@end example

@cindex empty files, creating
引数 @var{file} に存在しないファイルを指定すると、空のファイルが作成される。
ただし、@option{--no-create} (@option{-c}) や @option{--no-dereference}
(@option{-h}) が有効な場合は、ファイルは作成されない。

引数 @var{file} が @samp{-} という文字列の場合は、特別な扱いをする。@command{touch}
は、標準出力に結びついているファイルの日時を変更するのである。

@cindex clock skew
@command{touch} は、デフォルトではファイルのタイムスタンプを現在の日時にセットする。
@command{touch} はオペランドを左から右へと順番に処理するので、
生成されたタイムスタンプが、前後のオペランドで一致しないこともある。
また、「現在」とはいつかを決めるのは、プラットフォーム次第である。
ネットワーク・ファイルシステムを使用しているプラットフォームでは、
オペレーティング・システムとファイルシステムとで別のクロックを使用していることも珍しくない。
@command{touch} は通常、デフォルトではファイルシステムのクロックを使用するので、
クロックのずれのために、生成されたファイルのタイムスタンプが、
あるプログラムにとっては「未来」に見えたり、「過去」に見えたりすることがある。

@cindex file timestamp resolution
@command{touch} コマンドは、ファイルのタイムスタンプを、
ユーザが指定した日時よりも精度が高くならない範囲で、表現できる最も精密な値にセットする。
この値がユーザが指定した日時と違うことがあるが、それにはいくつかの理由がある。
第一に、ユーザが指定した日時が、サポートされている精度を越えていることがある。
第二に、ファイルシステムが、日時のタイプによって別の精度を使っていることがある。
第三に、ファイルのタイムスタンプが、オペレーティング・システムのタイムスタンプとは別の精度を使っていることがある。
第四に、オペレーティング・システムでタイムスタンプの更新に使用される基本データ型が、
さらに違う精度を採用していることがある。そんなわけで、理屈の上では、
たとえば、ファイルシステムでは、アクセス日時には 10 マイクロ秒の精度を、更新日時には
100 ナノ秒の精度を使用し、オペレーティング・システムの方では、現在の時刻にはナノ秒の精度を、
@command{touch} がファイルのタイムスタンプを任意の値に設定するために使う基本データ型には、
マイクロ秒の精度を使用している、そういうこともありえるのである。

@cindex permissions, for changing file timestamps
タイムスタンプを現在の時刻にセットする場合には、
ユーザが所有していないファイルでも、書き込み権限さえ持っていれば、@command{touch}
はそのタイムスタンプを変更することができる。
しかし、現在の時刻以外にセットするには、ユーザはそのファイルを所有していなければならない。
古いシステムの中には、制限がさらに厳しいものもある。
たとえば、アクセス日時と更新日時の両方を現在の時刻にセットするとき以外、
対象となるファイルを所有していなければならないといった具合だ。

@command{touch} が提供するオプションを使えば、ファイルの 2 種類の日時 ---
最終アクセス日時と最終更新日時 --- を変更することができるが、
標準の日時には、実はそのほかに 3 番目のものがある。すなわち、inode の変更日時
(inode change time) だ。これは、ファイルの @code{ctime} と呼ばれることが多い。
inode の変更日時は、ファイルのメタ情報が最後に変更された日時を表している。
メタ情報の変更のよくある例の一つは、ファイルのアクセス権の変更である。
アクセス権の変更では、ファイルにアクセスするわけではないので、atime (アクセス日時)
は変化しないし、またファイルの内容を変更するわけでもないので、mtime (更新日時)
も変化しない。しかし、ファイルそのものに関する何ものかが変化しているわけであり、
それはどこかに記録されなければならない。まさにそれが、inode の ctime フィールドの役割なのだ。
たとえば、バックアップ・プログラムが、ファイルのアクセス権に変更があった場合も含めて、
ファイルのコピーを最新に保つことができるようにするには、ctime が不可欠である。
ファイルの ctime は変更するが、他の日時には影響を及ぼさない別の操作には、ファイル名の変更がある。
なお、いかなる場合であれ、通常の操作では、ユーザが ctime
フィールドを自分で指定する値に変更することはできない。
オペレーティングシステムやファイルシステムの中には、4 番目の日時をサポートしているものもある。
すなわち、作成日時 (birth time) であり、ファイルが最初に作られた日時だ。
名前からして当然だが、このタイムスタンプが変更されることはない。

@vindex TZ
タイムスタンプは、タイムゾーンのルールに従うが、そのルールを指定しているのは、環境変数 @env{TZ} である。
@env{TZ} が設定されていない場合は、システムのデフォルトのルールに従う。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ},
libc, The GNU C Library Reference Manual}.
なお、UTC のタイムスタンプを使えば、夏 (冬) 時間への移行時の曖昧さを避けることができる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -a
@itemx --time=atime
@itemx --time=access
@itemx --time=use
@opindex -a
@opindex --time
@opindex atime@r{, changing}
@opindex access @r{time, changing}
@opindex use @r{time, changing}
アクセス日時のみ変更する。

@item -c
@itemx --no-create
@opindex -c
@opindex --no-create
存在しないファイルについて警告を出さず、ファイルの作成もしない。

@item -d @var{time}
@itemx --date=@var{time}
@opindex -d
@opindex --date
@opindex time
現在の日時の代わりに @var{time} を使用する。@var{time} には、月の名前、
タイムゾーン、@samp{am} や @samp{pm}、@samp{yesterday} なども使うことができる。
たとえば、@option{--date="2004-02-27 14:19:13.489392193 +0530"} とすると、
UTC より 5 時間 30 分東のタイムゾーンで、2004 年 2 月 27 日 午後
2 時 19 分 13 秒 から 489,392,193 ナノ秒経過した瞬間を指定することになる。
@xref{Date input formats}.  精度の高いタイムスタンプをサポートしていないファイルシステムでは、
精度の超過分は単に無視される。

@item -f
@opindex -f
@cindex BSD @command{touch} compatibility
何もしない。BSD 版の @command{touch} との互換性のためにある。

@item -h
@itemx --no-dereference
@opindex -h
@opindex --no-dereference
@cindex symbolic links, changing time
@findex lutimes
シンボリックリンクが参照しているファイルではなく、シンボリックリンクのタイムスタンプの変更を試みる。
このオプションを使用した場合、空のファイルは作成されないが、
ファイルが存在しないという警告まで出ないようにするには、@option{-c} オプションも併せて使用する必要がある。
すべてのシステムが、シンボリックリンクのタイムスタンプの変更をサポートしているわけではない。
なぜならば、POSIX 2008 までは、下層で動いているシステムに対して、
そうした動作のサポートを要求していなかったからだ。
また、システムによっては、シンボリックリンクは、調べるだけでアクセス日時が変わってしまうので、
変更の結果が後々まで残って観察できるのは、更新日時だけだというものもある。
なお、このオプションを @option{-r} オプションと一緒に使用すると、
参照するタイムスタンプが、リンクが指しているファイルからではなく、
シンボリックリンクから取得される。

@item -m
@itemx --time=mtime
@itemx --time=modify
@opindex -m
@opindex --time
@opindex mtime@r{, changing}
@opindex modify @r{time, changing}
更新日時 (modification time) のみ変更する。

@item -r @var{file}
@itemx --reference=@var{file}
@opindex -r
@opindex --reference
現在の日時の代わりに、参照ファイル @var{file} の日時を使用する。
このオプションを @option{--date=@var{time}} (@option{-d @var{time}})
オプションと組み合わせて使うと、@var{time} が相対時間で指定されている場合は、参照ファイル
@var{file} の日時がその基点となるが、それ以外の場合は、@var{file} の日時は無視される。
たとえば、@samp{-r foo -d '-5 seconds'} は、@file{foo} のタイムスタンプより
5 秒前のタイムスタンプを指定している。
@var{file} がシンボリックリンクの場合は、@option{-h} が同時に有効になっていないかぎり、
参照するタイムスタンプは、シンボリックリンクの参照先から取得される。

@item -t [[@var{cc}]@var{yy}]@var{mmddhhmm}[.@var{ss}]
@cindex leap seconds
現在の日時の代わりに、@option{-t} オプションの引数を使用する
(引数の構成は、4 桁または 2 桁の年 (省略可)、月、日、時、分、秒 (秒も省略可)
である)。年が 2 桁のみ指定された場合、0 @dots{} 68 の範囲の年ならば、
@var{cc} は 20 であり、69 @dots{} 99 の範囲の年では、@var{cc} は 19 である。
年が全く指定されない場合は、引数は今年の日付だと解釈される。
閏秒に対応している例外的なシステムでは、@var{ss} が @samp{60} のこともありえる。

@end table

@vindex _POSIX2_VERSION
POSIX 1003.1-2001 以前のシステムでは、@command{touch}
は次のような旧式の書式をサポートしている。すなわち、@option{-d}, @option{-r},
@option{-t} オプションのいづれによってもタイムスタンプが指定されていず、しかも、2 個以上の
@var{file} が指定されていて、最初の @var{file} が
@samp{@var{mmddhhmm}[@var{yy}]} の形を持ち、それが
(@var{yy} が存在するなら、それを先頭に移せば) @option{-t}
オプションに対する有効な引数と見なすことができる場合に、その引数の表している年度が
1969--1999 の範囲にあるならば、その引数をファイル名ではなく、
他のファイルに適用する日時と解釈する、というものである。
この旧式の動作は、環境変数 @env{_POSIX2_VERSION} によってコントロールすることができるが
(@pxref{Standards conformance})、移植を考慮したスクリプトでは、
動作がこの環境変数に依存するコマンドの使用は避けるべきである。
たとえば、二通りの解釈ができる @samp{touch 12312359 main.c}
を使うより、@samp{touch ./12312359 main.c} や @samp{touch -t 12312359 main.c}
を使用した方がよい。

@exitstatus


@node Disk usage
@chapter ディスク使用量

@cindex disk usage

データをいくらでも無限に入れることのできるディスクはない。
この章で説明するコマンドには、使用しているディスク容量や利用可能なディスク容量を報告するもの、
それ以外のファイル情報やファイルステータス情報を報告するもの、
それに、バッファの内容をディスクに書き込むものがある。

@menu
* df invocation::            ファイルシステムのディスク使用量を報告する。
* du invocation::            ファイルのディスク使用量を概算する。
* stat invocation::          ファイルやファイルシステムのステータスを報告する。
* sync invocation::          キャッシュされた書き込みを永続的な記憶装置に同期する。
* truncate invocation::      ファイルサイズの短縮・伸長を行う。
@end menu


@node df invocation
@section @command{df}: ファイルシステムのディスク使用状態を報告する

@pindex df
@cindex file system disk usage
@cindex disk usage by file system

@command{df} は、ファイルシステムごとに、使用されているディスク容量と利用可能なディスクス容量を報告する。

書式:

@example
df [@var{option}]@dots{} [@var{file}]@dots{}
@end example

引数を指定しないと、@command{df} は、現在マウントされているすべてのファイルシステム
(ファイルシステムのタイプを問わない) について、使用されているディスク容量と、利用可能なディスク容量を報告する。
引数が指定されている場合は、引数として指定された各 @var{file} が存在するファイルシステムについて報告する。

通常、ディスク容量は 1024 バイトを 1 単位として表示するが、この動作は変更することができる
(@pxref{Block size})。なお、小数点以下は切り上げて整数にする。

bind マウントについては、引数が指定されていない場合に @command{df} が表示するのは、
そのデバイスに関する統計情報のうち、ファイルシステムのリスト中で
(すなわち、@var{mtab} 中で) マウントポイントの名前が最も短いものに関する情報のみである。
すなわち、@option{-a} オプションが指定されていないときは、情報が重複するエントリは表示しない。

同じ理屈で、ダミーの擬似デバイスについては、
そのマウントポイントに対する別のマウントエントリが存在し、
それが実在のブロックデバイスのものであり、しかもデバイス番号が同じ場合、
@command{df} は擬似デバイスのマウントエントリの方は省略する。
たとえば、ブート初期に作成される擬似ファイルシステムの @samp{rootfs} は、
実際のルートデバイスがすでにマウントされていれば、デフォルトでは表示されない。

@cindex disk device file
@cindex device file, disk
引数 @var{file} がスペシャルファイルに還元され、
そのスペシャルファイル上に存在するファイルシステムが現在マウントされている場合、
@command{df} が表示するのは、そのファイルシステムの利用可能な容量であって、
デバイス・ノードが存在するファイルシステムの利用可能な容量ではない。また、GNU の
@command{df} は、マウントされていないファイルシステムのディスク使用量を測定しようとはしない。
なぜなら、ほとんどのファイルシステムにおいて、そういうことを行うには、
ファイルシステムの構造について他と全く共通性のない詳しい情報が必要だからである。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -a
@itemx --all
@opindex -a
@opindex --all
@cindex ignore file systems
一覧表示に、ダミーのファイルシステム、重複するファイルシステム、アクセスできないファイルシステムも含める。
そうしたものは、デフォルトでは省略されるのである。
ダミーのファイルシステムというのは、@samp{/proc} のような特殊用途の擬似ファイルシステムがその典型であり、
ストレージと結びついていないものだ。
重複するファイルシステムとは、ローカルやリモートのファイルシステムで、
ローカルのファイル階層の別の場所にもマウントされているものや、bind マウントされたものである。
アクセスできないファイルシステムとは、マウントされているが、
その後そのマウントポイントに他のファイルシステムが二重にマウントされたものや、
あるいは、マウントポイントのパーミッションなど、他の理由でアクセスできなくなっているものを言う。

@item -B @var{size}
@itemx --block-size=@var{size}
@opindex -B
@opindex --block-size
@cindex file system sizes
@var{size} によって単位の大きさを変更してから、サイズを表示する (@pxref{Block size})。
たとえば、@option{-BG} と指定すれば、1,073,741,824 バイトを 1 単位として、サイズを表示する。

@optHumanReadable

@item -H
@opindex -H
@option{--si} オプションと同じである。

@item -i
@itemx --inodes
@opindex -i
@opindex --inodes
@cindex inode usage
ブロックの使用量ではなく、inode の使用情報を一覧表示する。
inode (index node の略称) には、ファイルの所有者、許可属性、タイムスタンプ、
ディスク上の位置といった、ファイルに関する情報が含まれている。

@item -k
@opindex -k
@cindex kibibytes for file system sizes
デフォルトのブロックサイズがどうなっていようと、1 ブロック 1024
バイトでサイズを表示する (@pxref{Block size})。このオプションは
@option{--block-size=1K} に等しい。

@item -l
@itemx --local
@opindex -l
@opindex --local
@cindex file system types, limiting output to certain
一覧表示するのをローカルのファイルシステムに限定する。
デフォルトでは、リモートのファイルシステムも表示される。

@item --no-sync
@opindex --no-sync
@cindex file system space, retrieving old data more quickly
使用量に関するデータを取得する前に @code{sync} システムコールを実行しない。
そのため、多数のディスクを搭載しているシステムでは、@command{df}
の実行速度が目に見えて向上するが、システムによっては
(特に SunOS では)、出力結果がほんの少し古いものになるかもしれない。
これがデフォルトの動作である。

@item --output
@itemx --output[=@var{field_list}]
@opindex --output
@var{field_list} で定義した出力フォーマットを使用する。@var{field_list}
を省略した場合は、すべてのフィールドを表示する。
後者の場合、列の順序は、以下に挙げているフィールドの説明の順序と同じである。

@option{--output} オプションは、@option{-i}, @option{-P}, @option{-T}
のどのオプションとも一緒に使うことができない。

@var{field_list} は、@command{df} の出力に含まれることになる、コンマで区切った列のリストであり、
このリストによって出力する列の順序を制御することができる。
従って、各フィールドは任意の場所に置くことができるが、一度しか使うことができない。

@var{field_list} で使える有効なフィールドの名前は、次のものである。
@table @samp
@item source
マウントポイントにマウントする対象。たいていはデバイス。
@item fstype
ファイルシステムのタイプ。

@item itotal
inode の総数。
@item iused
使用 inode 数。
@item iavail
使用可能な inode 数。
@item ipcent
@var{iused} を @var{itotal} で割ったパーセント表示。

@item size
ブロックの総数。
@item used
使用ブロック数。
@item avail
使用可能なブロック数。
@item pcent
@var{used} を @var{size} で割ったパーセント表示。

@item file
ファイル名をコマンドラインで指定した場合、そのファイル名。
@item target
マウントポイント。
@end table

ブロックや inode の統計情報を表すフィールドは、他の場合と同じく、
@option{-h} のような数値の大きさを調整するオプションの影響を受ける。

@var{field_list} の定義は、複数の @option{--output}
オプションを使用して、分割しても構わない。

@example
#!/bin/sh
# TARGET (すなわち、マウントポイント) に続けて、そのブロックや 
# inode の使用状態をパーセントで表示する。
df --out=target --output=pcent,ipcent

# 表示できるすべてのフィールドを表示する。
df --o
@end example


@item -P
@itemx --portability
@opindex -P
@opindex --portability
@cindex one-line output format
@cindex POSIX output format
@cindex portable output format
@cindex output format, portable
POSIX の出力形式を使用する。デフォルトの形式に似ているが、次の点で異なっている。

@enumerate
@item
各ファイルシステムついての情報が、常にぴったり 1 行で表示され、
マウントされるデバイスが、それのみで 1 行を占めることがない。
そのため、マウントされるデバイスの名前の長さが 20 字を越えると
(たとえば、ネットワーク・マウントの場合にそういうことがありそうだ)、
各項目の列がずれることになる。

@item
ヘッダ行の項目名が、POSIX に準拠したものになる。

@item
デフォルトのブロックサイズや出力の書式が、環境変数
@env{DF_BLOCK_SIZE}, @env{BLOCK_SIZE}, @env{BLOCKSIZE} の影響を受けなくなる。
とは言え、デフォルトのブロックサイズについては、
@env{POSIXLY_CORRECT} の影響だけは、やはり受ける。すなわち、
@env{POSIXLY_CORRECT} が設定されていれば、ブロックサイズは
512 バイトであり、さもなければ 1024 バイトである。 @xref{Block size}.
@end enumerate

@optSi

@item --sync
@opindex --sync
@cindex file system space, retrieving current data more slowly
使用量に関するデータを取得する前に `sync' システムコールを実行する。
システムによっては (特に SunOS では)、そうすることでより最近の結果が得られるが、
一般的に言って、このオプションを使用すると、@command{df} の実行速度がかなり低下する。
ファイルシステムをたくさんマウントしている場合や、
作業が頻繁に行われているファイルシステムでは、とりわけ遅くなる。

@item --total
@opindex --total
@cindex grand total of disk size, usage and available space
すべての引数を処理した後で、全引数についての総計を表示する。
このオプションを使用すれば、ディスクの容量、使用した量、使用可能な量について、
リストされているすべてのデバイスを合わせた合計を知ることができる。
引数が一つも指定されていない場合は、@command{df}
は使用可能な容量の合計に無関係なファイルシステムを除外しようとして、できるだけのことをする。
重複するリモート・ファイルシステムを計算に入れないといったことをするのである。

総計の行において @command{df} は @var{source} の列に @samp{"total"} と表示し、
@var{target} の列に @samp{"-"} という文字を表示する (訳注: @var{source},
@var{target} などの列については、@option{--output} の説明を参照していただきたい)。
@var{source} の列が存在しない場合は、@var{target} の列が存在すれば、
@command{df} は @var{target} の列に @samp{"total"} と表示する。

@item -t @var{fstype}
@itemx --type=@var{fstype}
@opindex -t
@opindex --type
@cindex file system types, limiting output to certain
一覧表示するファイルシステムを @var{fstype} というタイプに限定する。
@option{-t} オプションを複数回使うことによって、複数のタイプのファイルシステムを指定することができる。
デフォルトでは、いかなるタイプのファイルシステムも除外しない。

@item -T
@itemx --print-type
@opindex -T
@opindex --print-type
@cindex file system types, printing
各ファイルシステムのタイプを表示する。このとき表示されるタイプは、
@option{-t} や @option{-x} オプションを使って、一覧表示に含めたり、
一覧表示から除外したりできるタイプと同じものである。
すなわち、表示されるタイプは何であれ、システムによってサポートされているということだ。
以下に、よく見受けられるタイプの名前をいくつか挙げておく
(当然ながら、ここに挙げるものがすべてではない)。

@table @samp

@item nfs
@cindex NFS file system type
NFS ファイルシステム。すなわち、ネットワーク越しにほかのマシンからマウントしているファイルシステム。
このタイプ名は、あらゆるシステムで共通して使われているようである。

@item ext2@r{, }ext3@r{, }ext4@r{, }xfs@r{, }btrfs@dots{}
@cindex Linux file system types
@cindex local file system types
@opindex ext2 @r{file system type}
@opindex ext3 @r{file system type}
@opindex ext4 @r{file system type}
@opindex xfs @r{file system type}
@opindex btrfs @r{file system type}
ローカルでマウントしているハードディスクのファイルシステム。
(ローカルのマウントでは、システムが複数のタイプをサポートしていることもある。
たとえば、Linux がそうだ。)

@item iso9660@r{, }cdfs
@cindex CD-ROM file system type
@cindex DVD file system type
@cindex ISO9660 file system type
@opindex iso9660 @r{file system type}
@opindex cdfs @r{file system type}
CD や DVD ドライブのファイルシステム。HP-UX は @samp{cdfs} を使用し、
ほかのシステムのほとんどは @samp{iso9660} を使用している。

@item ntfs@r{,}fat
@cindex NTFS file system
@cindex DOS file system
@cindex MS-DOS file system
@cindex MS-Windows file system
@opindex ntfs @r{file system file}
@opindex fat @r{file system file}
MS-Windows や MS-DOS で使用されるファイルシステム。

@end table

@item -x @var{fstype}
@itemx --exclude-type=@var{fstype}
@opindex -x
@opindex --exclude-type
一覧表示するファイルシステムを @var{fstype} というタイプ以外のものに限定する。
@option{-x} オプションを複数回使うことによって、複数のタイプのファイルシステムを除外することができる。
デフォルトでは、いかなるタイプのファイルシステムも除外しない。

@item -v
無視される。System V 版の @command{df} との互換のためにある。

@end table

@command{df} がインストールされるのは、利用可能なマウントテーブルを持つシステムだけである。
従って、移植を考慮したスクリプトは、その存在を当てにしない方がよい。

@exitstatus 実行に失敗しても、全く何も出力されないこともある。
そういうときに、たとえば、ディレクトリ @var{dir} が @samp{ext3} や
@samp{reiserfs} というタイプのファイルシステム上にあるかどうかを調べるには、
@samp{df -t ext3 -t reiserfs @var{dir}} といったコマンドを実行して、
終了ステータスを検査すればよい。

ファイルシステムのタイプを判断するには、ファイルシステムのリスト
(@var{mtab}) が必要になる。従って、実行の失敗には、
ファイルシステムのリストを読み込むことができないときに、ファイル名を示す引数とともに
@option{-a}, @option{-l}, @option{-t}, @option{-x}
といったオプションが一つ以上使われた場合が含まれる。


@node du invocation
@section @command{du}: ファイルのディスク使用量を概算する

@pindex du
@cindex file space usage
@cindex disk usage for files

@command{du} は、指定した一連のファイルのディスク使用量を報告する。
引数がディレクトリの場合は、サブディレクトリごとのディスク使用量も報告する。

書式:

@example
du [@var{option}]@dots{} [@var{file}]@dots{}
@end example

引数を指定しないと、@command{du} は、カレントディレクトリのディスク使用量を報告する。
通常、ディスク使用量は 1024 バイトを 1 単位として表示するが、
この動作は変更することができる (@pxref{Block size})。
なお、小数点以下は、切り上げて整数にする。

2 個以上のハードリンクが同一のファイルを指している場合は、そのうちの
1 個のみが計算の対象になる。引数 @var{file} の順番によって、どのリンクが計算の対象になるかが変わってくるので、
引数の順番を変更すると、@command{du} が出力する数値や項目が変化するかもしれない。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@optNull

@item -a
@itemx --all
@opindex -a
@opindex --all
ディレクトリだけでなく、すべてのファイルについて使用量を表示する。

@item --apparent-size
@opindex --apparent-size
ディスクの使用量ではなく、見かけのサイズを表示する。
ファイルの見かけのサイズとは、通常ファイルに対して @code{wc -c}、
あるいは、もっと普通に @code{ls -l --block-size=1} や @code{stat --format=%s}
を実行したときに返されるバイト数である。
たとえば、@samp{zoo} という単語を改行を付けずに書き込んだファイルなら、
当然ながら、見かけのサイズは 3 になる。
だが、そうした小さなファイルも、そのファイルが存在するファイルシステムのタイプと設定次第で、
0 から 16 KiB、あるいは、それ以上のディスクスペースを占有するかもしれないのだ。
もっとも、穴空きファイル (sparse file) の場合は事情が別である。たとえば、

@example
dd bs=1 seek=2GiB if=/dev/null of=big
@end example

@noindent
上記のコマンドで作成した穴空きファイルは、見かけのサイズこそ 2 GiB
だが、最近のほとんどのシステムでは、実際に使用するディスクスペースは、
ほとんど 0 である。

@item -B @var{size}
@itemx --block-size=@var{size}
@opindex -B
@opindex --block-size
@cindex file sizes
@var{size} によって単位の大きさを変更してから、サイズを表示する (@pxref{Block size})。
たとえば、@option{-BG} と指定すれば、1,073,741,824 バイトを 1 単位として、サイズを表示する。

@item -b
@itemx --bytes
@opindex -b
@opindex --bytes
@code{--apparent-size --block-size=1} と同じ。

@item -c
@itemx --total
@opindex -c
@opindex --total
@cindex grand total of disk space
すべての引数を処理した後で、全引数からなる総計を表示する。
このオプションを使用すれば、指定したファイルやディレクトリについてディスク使用量の合計を知ることができる。

@item -D
@itemx --dereference-args
@opindex -D
@opindex --dereference-args
コマンドラインで引数に指定されたシンボリックリンクの参照を行う。
コマンドライン引数以外のシンボリックリンクには影響がない。
このオプションは、@file{/usr/tmp} のような、
シンボリックリンクであることが多いディレクトリのディスク使用量を調べるときに、重宝である。

@item -d @var{depth}
@itemx --max-depth=@var{depth}
@opindex -d @var{depth}
@opindex --max-depth=@var{depth}
@cindex limiting output of @command{du}
ディレクトリ階層の基点 (訳注: 要するに、コマンドラインで指定されたディレクトリ)
から最大 @var{DEPTH} 段階下がったところまでにある各ディレクトリについて、
ディスク使用量の合計を表示する (@option{--all}
オプションが付いているときは、ファイルについても表示する)。
基点自体は段階 0 なので、@code{du --max-depth=0} は @code{du -s}
と同じことになる。

@c --files0-from=FILE
@filesZeroFromOption{du,, @ @option{--total} (@option{-c}) オプションを使用した結果}

@item -H
@opindex -H
@option{--dereference-args} (@option{-D}) と同じである。

@optHumanReadable

@item --inodes
@opindex --inodes
@cindex inode usage, dereferencing in @command{du}
ブロックの使用状態ではなく、inode の使用状態をリストする。
このオプションが役に立つのは、多くのファイルを収納しているために、
ファイルシステムの inode スペースを大量に消費しているディレクトリを探すときである
(@command{df} の @option{--inodes} オプションも参照すること)。
このオプションは、@option{-a}, @option{-c}, @option{-h}, @option{-l},
@option{-s}, @option{-S}, @option{-t}, @option{-x}
といったオプションと組み合わせて使ってもよい。
しかし、ブロックサイズ関係の他のオプション、たとえば、@option{-b}, @option{-m},
@option{--apparent-size} などを渡しても、無視される。

@item -k
@opindex -k
@cindex kibibytes for file sizes
デフォルトのブロックサイズがどうなっていようと、1 ブロック 1024
バイトでサイズを表示する (@pxref{Block size})。このオプションは
@option{--block-size=1K} に等しい。

@item -L
@itemx --dereference
@opindex -L
@opindex --dereference
@cindex symbolic links, dereferencing in @command{du}
シンボリックリンクの参照を行う (リンク自体のディスク使用量ではなく、
リンクが指しているファイルやディレクトリの使用量を表示する)。

@item -l
@itemx --count-links
@opindex -l
@opindex --count-links
@cindex hard links, counting in @command{du}
すべてのファイルを計算に入れる。
すなわち、(ハードリンクとして) 前に現れたことがあっても、計算に入れる。

@item -m
@opindex -m
@cindex mebibytes for file sizes
デフォルトのブロックサイズを変更し、1 ブロック 1,048,576
バイトのブロック数でサイズを表示する (@pxref{Block size})。
このオプションは、@option{--block-size=1M} と同じである。

@item -P
@itemx --no-dereference
@opindex -P
@opindex --no-dereference
@cindex symbolic links, dereferencing in @command{du}
@command{du} が出会った各シンボリックリンクについて、シンボリック自体の使用ディスクスペースを計算する。

@item -S
@itemx --separate-dirs
@opindex -S
@opindex --separate-dirs
通常、(@option{--summarize} オプションを使用しない場合の)
@command{du} の出力において、@var{d} というディレクトリ名の隣に表示されるサイズは、
@var{d} 以下にあるすべてのエントリのサイズの合計に、
@var{d} 自体のサイズを加えたものである。それに対して、@option{--separate-dirs}
オプションを指定すると、@var{d} というディレクトリ名に対して報告されるサイズは、
いかなるサブディレクトリのサイズも含まないものになる。

@optSi

@item -s
@itemx --summarize
@opindex -s
@opindex --summarize
各引数についてその合計ディスク使用量のみを表示する (訳注: すなわち、
引数がディレクトリの場合、そのサブディレクトリごとの情報まで表示しない)。

@item -t @var{size}
@itemx --threshold=@var{size}
@opindex -t
@opindex --threshold
指定された @var{size} を目安にして、表示する対象を取捨する。@var{size} は、
通常モードではディスク使用量を指し (@pxref{Block size})、@option{--inodes}
オプションと組み合わせた場合は inode 使用数を指す。
(訳注: ディスク使用量の目安として使う場合、@var{size} の単位は、デフォルトではバイトである。
もちろん、K, M, G などの接尾辞を付けることもできる。)

@var{size} が正の数ならば、@command{du} はサイズがそれ以上である対象のみを表示する。

@var{size} が負の数ならば、@command{du} はサイズがそれ以下である対象のみを表示する。

GNU の @command{find} を使えば、特定のサイズのファイルを見つけることができる。
それに対して、@command{du} の @option{--threshold} を使うと、
ディレクトリも指定サイズに基づいて篩い分けることができるのである。

@option{--threshold} オプションは、@option{--apparent-size}
オプションと組み合わせることができるのに留意していただきたい。
その場合は、見かけのサイズに基づいて表示対象を絞り込むことになる。

@option{--threshold} オプションは、@option{--inodes} オプションと組み合わせることもできる。
その場合は、inode 数に基づいて表示対象を絞り込むことになる。

200 メガバイト以上のサイズを持つディレクトリを捜すには、
@option{--threshold} オプションを次のように使えばよいだろう。

@example
du --threshold=200MB
@end example

見かけのサイズが 500 バイト以下のディレクトリやファイルを捜すには
(@option{-a} を使っていることに注意)、@option{--threshold} を次のように使えばよい。

@example
du -a -t -500 --apparent-size
@end example

ルートファイルシステム上にあるディレクトリで、20000 以上の inode
を使用しているものを、/ 以下のディレクトリ階層で捜すには、
@option{--threshold} を次のように使えばよい。

@example
du --inodes -x --threshold=20000 /
@end example


@item --time
@opindex --time
@cindex last modified dates, displaying in @command{du}
ディレクトリやそのサブディレクトリに存在するファイルについて表示する際に、
その最終更新日時 (modification time) も表示する。

(訳注: 一つ留意していただきたいことがある。ディレクトリのタイムスタンプについては、
そのディレクトリ以下にあるファイルのうち (そのディレクトリ直下のファイルとはかぎらない)、
最終更新日時がもっとも新しいファイルのタイムスタンプと同一のものが表示される。
すなわち、ディレクトリのタイムスタンプは、@samp{ls -l} で表示されるものとは違うことがあるわけだ。
このオプションや、そのバリエーションである次の二つのオプションは、
あるディレクトリ以下を最後に使用したのはいつかを知るのに便利である。)

@item --time=ctime
@itemx --time=status
@itemx --time=use
@opindex --time
@opindex ctime@r{, show the most recent}
@opindex status time@r{, show the most recent}
@opindex use time@r{, show the most recent}
ディレクトリ以下にあるファイルについて表示する際に、最終更新日時ではなく、
最終ステータス変更日時 (inode 中の @samp{ctime}) を表示する。

(訳注: 原文でもこの三つのオプションを等価なものとして並べているが、
訳者としては、@option{--time=use} と等価なのは、@option{--time=ctime} ではなく、
@option{--time=atime} ではないかと思う。ご自分で確かめていただきたい。)

@item --time=atime
@itemx --time=access
@opindex --time
@opindex atime@r{, show the most recent}
@opindex access time@r{, show the most recent}
ディレクトリ以下にあるファイルについて表示する際に、最終更新日時ではなく、
最終アクセス日時 (inode 中の @samp{atime}) を表示する。

@item --time-style=@var{style}
@opindex --time-style
@cindex time style
タイムスタンプを @var{style} 形式で表示する。このオプションは、@option{--time}
オプションと併せて指定したときにのみ効果がある。@var{style} は以下の一つでなければならない。

@table @samp
@item +@var{format}
@vindex LC_TIME
@var{format} を使って、タイムスタンプを表示する。その場合、@var{format}
は、@command{date} コマンドの書式引数と同じように解釈される (@pxref{date invocation})。
たとえば、@option{--time-style="+%Y-%m-%d %H:%M:%S"} と指定すると、
@command{du} の表示するタイムスタンプは、
@samp{2002-03-30 23:45:56} のようになる。@command{date} の場合と同様、
@var{format} の解釈は、@env{LC_TIME} ロケール・カテゴリの影響を受ける。

@item full-iso
タイムスタンプを省略なしで表示する。
すなわち、ISO 8601 の日付、時刻、タイムゾーンという構成要素を
nanosecond (10 億分の 1 秒) の精度で使用するわけだ。
一例を挙げると、@samp{2002-03-30 23:45:56.477817180 -0700}
といった表示になる。この形式は、@samp{+%Y-%m-%d %H:%M:%S.%N %z} と同じである。

@item long-iso
ISO 8601 の日付と時刻の構成要素を分の単位まで表示する。たとえば、
@samp{2002-03-30 23:45}。このタイムスタンプは、@samp{full-iso} タイム
スタンプより短く、日常作業にはたいてい十分である。この形式は
@samp{+%Y-%m-%d %H:%M} と同じである。

@item iso
タイムスタンプに ISO 8601 書式の日付を表示する。たとえば、
@samp{2002-03-30} といった具合である。この形式は、@samp{+%Y-%m-%d} と同じである。
@end table

@vindex TIME_STYLE
@option{--time-style} オプションのデフォルト値は、
環境変数 @env{TIME_STYLE} を使って指定することができる。
@env{TIME_STYLE} が設定されていない場合、デフォルトの形式は @samp{long-iso} である。
@command{ls} と共通の @env{TIME_STYLE} を使えるようにするため、
@samp{+} で始まる @env{TIME_STYLE} の値が、改行を含んでいる場合は、
改行以後の文字は無視されることになる。
また、@env{TIME_STYLE} の値が @samp{posix-} で始まる場合、@samp{posix-} は無視される。
さらに、@env{TIME_STYLE} の値が @samp{locale} の場合、@env{TIME_STYLE} は無視される。

@item -X @var{file}
@itemx --exclude-from=@var{file}
@opindex -X @var{file}
@opindex --exclude-from=@var{file}
@cindex excluding files from @command{du}
@option{--exclude} に似ているが、除外するパターンを @var{file} から 1 行につき
1 パターン読み込む点が違う。@var{file} が @samp{-} なら、パターンを標準入力から読み込む。

@item --exclude=@var{pattern}
@opindex --exclude=@var{pattern}
@cindex excluding files from @command{du}
再帰的な処理を行っているとき、@var{pattern} にマッチするサブディレクトリやファイルをスキップする。
たとえば、@code{du --exclude='*.o'} と指定すると、名前が @samp{.o}
で終わるファイルを除外することになる。

@item -x
@itemx --one-file-system
@opindex -x
@opindex --one-file-system
@cindex one file system, restricting @command{du} to
処理される引数が存在するファイルシステムとは別のファイルシステムにあるディレクトリをスキップする。

@end table

@cindex NFS mounts from BSD to HP-UX
BSD システムでは、HP-UX システムから NFS マウントしているファイルについて、
@command{du} は正確な値の半分のサイズを報告する。逆に、HP-UX システムでは、
BSD システムから NFS マウントしているファイルについて、@command{du}
は正確な値の 2 倍のサイズを報告する。これは HP-UX にある欠陥のせいであり、
HP-UX の @command{du} プログラムも、そのとばっちりを受けているのである。

@exitstatus


@node stat invocation
@section @command{stat}: ファイルやファイルシステムの状態を報告する

@pindex stat
@cindex file status
@cindex file system status

@command{stat} は指定されたファイルに関する情報を表示する。

書式:

@example
stat [@var{option}]@dots{} [@var{file}]@dots{}
@end example

オプションなしで実行すると、@command{stat}
は指定されたファイルについてすべての情報を報告する。また、@command{stat}
を使って、指定されたファイルが存在しているファイルシステムの情報を報告させることもできる。
ファイルがリンクの場合は、リンクが指しているファイルについて情報を提供させることも可能だ。

@mayConflictWithShellBuiltIn{stat}

@table @samp

@item -L
@itemx --dereference
@opindex -L
@opindex --dereference
@cindex symbolic links, dereferencing in @command{stat}
@command{stat} がシンボリックリンクを処理する方法を変更する。
このオプションを付けると、@command{stat} は、引数中の各シンボリックリンクが参照しているファイルを操作の対象にする。
このオプションがないと、@command{stat} が対象にするのは、引数のシンボリックリンクそのものになる。

@item -f
@itemx --file-system
@opindex -f
@opindex --file-system
@cindex file systems
指定されたファイルそのものについての情報ではなく、
そのファイルが存在しているファイルシステムについての情報を報告する。
このオプションを指定すると、自動的に @option{-L} オプションも指定される。

@item -c
@itemx --format=@var{format}
@opindex -c
@opindex --format=@var{format}
@cindex output format
デフォルトの書式の代わりに、@var{format} を使用する。
@var{format} の末尾には自動的に改行が付けられるので、
下記のようなコマンドを 2 個以上の @var{file} オペランドに対して実行すると、
各オペランドあたり 1 行の出力を生じることになる。
@example
$ stat --format=%d:%i / /usr
2050:2
2057:2
@end example

@item --printf=@var{format}
@opindex --printf=@var{format}
@cindex output format
デフォルトの書式の代わりに、@var{format} を使用する。@option{--format}
に似ているが、バックスラッシュ・エスケープを解釈して変換する。
また、行末に自動的に改行を付けることもしない。そこで、改行がしたければ、
@var{format} 中で @samp{\n} を指定する必要がある。
@option{--printf} を使って @file{/} と @file{/usr} のデバイス番号と
inode 番号を表示するには、こんなふうにする。
@example
$ stat --printf='%d:%i\n' / /usr
2050:2
2057:2
@end example

@item -t
@itemx --terse
@opindex -t
@opindex --terse
@cindex terse output
情報を簡潔な形式で表示する。他のプログラムで解析するときに都合がよい。

下記の二つのコマンドの出力は全く同じである。また、下記の @option{--format}
は、デフォルトの出力書式が (もっと詳細な形で) 表示する項目とほぼ同じものを指定している。
もっとも、SELinux セキュリティ・コンテキストが有効になっている場合には、
このフォーマット文字列の末尾に、もう一つ @samp{%C} を付け加えることになるだろうが。
@example
$ stat --format="%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %W %o" ...
$ stat --terse ...
@end example

@option{--file-system} モードのときの簡潔形式の出力を上と同じように説明的に表現すると、
@example
$ stat -f --format="%n %i %l %t %s %S %b %f %a %c %d" ...
$ stat -f --terse ...
@end example
@end table

@option{--format} や @option{--printf} の @var{format} 中で、
ファイルに対して使用できる書式指定子には以下のものがある。

@itemize @bullet
@item %a - 8 進数で表現したアクセス権 (printf のフラグ @samp{#} と @samp{0} に留意)
@item %A - 人間にわかりやすい形式で表現したアクセス権
@item %b - 割り当てられているブロック数 (@samp{%B} を参照)
@item %B - @samp{%b} の報告で使われる 1 ブロックのバイト数
@item %C - ファイルの SELinux セキュリティ・コンテキスト (取得できる場合)
@item %d - 10 進数で表現したデバイス番号
@item %D - 16 進数で表現したデバイス番号
@item %f - 16 進数で表現した Raw モード
@item %F - ファイルの種類
@item %g - 所有グループの ID 番号
@item %G - 所有グループ名
@item %h - ハードリンク数
@item %i - Inode 番号
@item %m - マウントポイント (下記の説明を参照)
@item %n - ファイル名
@item %N - 引用符で囲んだファイル名。シンボリックリンクなら、参照先も表示 (下記参照）
@item %o - I/O 転送サイズの最適値の提案
@item %s - ファイル全体の大きさ。サイズはバイト数
@item %t - 16 進数で表現したメジャー・デバイス番号 (下記参照)
@item %T - 16 進数で表現したマイナー・デバイス番号 (下記参照)
@item %u - 所有者のユーザ ID 番号
@item %U - 所有者のユーザ名
@item %w - ファイルの作成日時 (the birth time)。不明の場合は @samp{-} を表示
@item %W - Unix 紀元からの秒数で表したファイルの作成日時、または @samp{0}
@item %x - 最終アクセス日時 (atime)
@item %X - Unix 紀元からの秒数で表した最終アクセス日時
@item %y - 最終データ更新日時 (mtime)
@item %Y - Unix 紀元からの秒数で表した最終データ更新日時
@item %z - 最終ステータス変更日時 (ctime)
@item %Z - Unix 紀元からの秒数で表した最終ステータス変更日時
@end itemize

@samp{%a} という書式はファイルのモードを 8 進数で表示するので、
printf の @samp{#} と @samp{0} フラグを使って、出力の先頭のゼロ埋めをコントロールするとよい。
たとえば、先頭を 0 で埋めて、表示を少なくとも 3 桁にし、それより大きい数値も、
8 進数であることをはっきりさせるには、@samp{%#03a} を使えばよい。

@samp{%N} の書式は、環境変数 @env{QUOTING_STYLE} によって設定することができる。
その環境変数が設定されていない場合、デフォルトの値は、@samp{shell-escape}
である。使用できるクォーティングスタイルには、以下のものがある。
@quotingStyles

@samp{%t} や @samp{%T} という書式指定子は、stat(2) 構造体の st_rdev メンバ
に対応するものであり、従って、キャラクタ・スペシャルファイルや
ブロック・スペシャルファイルに対してしか動作が定義されていない。
システムやファイルタイプによっては、st_rdev が他のものを表現する
ために使われていることもありえる。

@samp{%W}, @samp{%X}, @samp{%Y}, @samp{%Z} では、ピリオドに続けて精度を書くことで、
小数点以下何桁まで表示するかを指定することができる。たとえば、@samp{%.3X}
と指定すると、最終アクセス日時がミリ秒の精度で出力される。ピリオド
だけ指定して、精度を省略すると、@command{stat} は 9 桁を使用する。従って、
@samp{%.X} は @samp{%.9X} と同じことになるわけだ。なお、余分な精度を捨てる際、
タイムスタンプは負の無限大方向に切り下げられる (訳注: 平たく言うと、
タイムスタンプのような正の数値の場合、指定された桁数より下の部分は切り捨てられるということ。
以下の例を参照)。

@example
0 で埋める:
  $ stat -c '[%015Y]' /usr
  [000001288929712]
スペースで位置を揃える:
  $ stat -c '[%15Y]' /usr
  [     1288929712]
  $ stat -c '[%-15Y]' /usr
  [1288929712     ]
精度指定:
  $ stat -c '[%.3Y]' /usr
  [1288929712.114]
  $ stat -c '[%.Y]' /usr
  [1288929712.114951834]
@end example

@samp{%m} によって表示されるマウントポイントは、@command{df}
によるマウントポイントの出力とほぼ同じである。ただし、以下の点で異なっている。
@itemize @bullet
@item
stat はデフォルトでは、シムリンクの参照を行わない
(そのためには、@option{-L} を指定する必要がある)。
@item
引数としてデバイスノードが指定された場合、
stat はファイルシステムのリスト中にそのノードを捜し求めたりはせず、
デバイスノードそのものを動作の対象にする
(訳注: すなわち、そのデバイス上に存在するファイルシステムのマウントポイントではなく、
デバイスノードそのもののマウントポイントを表示する)。
@item
@cindex bind mount
bind マウントされているファイルについては、
stat はそのファイルが載っているデバイスの最初のマウントポイントではなく、
bind マウントで指定された別名 (訳注: 原文は alias。@samp{mount --bind olddir newdir}
における newdir のことか) の方を出力する。出力に変化がなくなるまで、
再帰的に stat を呼び出せば、現在ベースになっているマウントポイントを知ることができる。

(訳注: 訳者には意味不明。「現在ベースになっているマウントポイント
(the current base mount point)」が、上記訳注の newdir のことなら、
stat を再帰的に呼び出すまでもない。@samp{stat -c "%m" newdir/@var{FILE}} は、
newdir を表示する。また the current base mount point が「根底にある
(すなわち、デバイスを最初にマウントした) マウントポイント」のことなら、
stat を再帰的に呼び出しても、それを突き止めることはできない。
ひょっとすると、書式指定子に @samp{%m} が追加された coreutils-8.6 から
coreutils-8.20 あたりまでの stat を
linux-2.6 時代の古いカーネルと組み合わせて使ったときの動作を言っているのかもしれない。
その場合は、@samp{stat -c "%m" newdir/@var{FILE}} は上記の olddir を出力するようだ。
従って、そうした組み合わせでは、stat を再帰的に実行することで、
最初にデバイスをマウントしたときのマウントポイントを知ることができる。)
@end itemize

ファイルシステムの情報をリストする際には (すなわち、@option{--file-system}
(@option{-f}) 使用時には)、書式指定子の別の一群を使わなければならない。

@itemize @bullet
@item %a - スーパーユーザ以外にも利用できる未使用ブロック数
@item %b - ファイルシステムの総データブロック数。
@item %c - ファイルシステムの総 inode 数
@item %d - ファイルシステムの未使用 inode 数
@item %f - ファイルシステムの未使用ブロック数
@item %i - 16 進数で表現したファイルシステム ID
@item %l - ファイル名の最大長
@item %n - ファイル名
@item %s - ブロックサイズ (高速転送用)
@item %S - 基本ブロックサイズ (ブロック計算用)
@item %t - 16 進数で表現したファイルシステムのタイプ
@item %T - 人間にわかりやすい形式で表現したファイルシステムのタイプ
@end itemize

@vindex TZ
タイムスタンプは、タイムゾーンのルールに従って表示されるが、
そのルールを指定しているのは、環境変数 @env{TZ} である。
@env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
The GNU C Library Reference Manual}.

@exitstatus


@node sync invocation
@section @command{sync}: キャッシュされた書き込みを永続的な記憶装置に同期する

@pindex sync
@cindex synchronize disk and memory
@cindex Synchronize cached writes to persistent storage

@command{sync} は、メモリ中のファイルやファイルシステムを永続的な記憶装置に同期する。

書式:

@example
sync [@var{option}] [@var{file}]@dots{}
@end example

@cindex superblock, writing
@cindex inodes, written buffered
@command{sync} は、メモリ中にバッファされているデータがあれば、それをディスクに書き出す。
そうした書き出しには、スーパーブロックの変更、inode の変更、遅延読み書きを含むことができる (が、それだけに止まらない)。
この機能はカーネルによって実装されていなければならない。@command{sync}
プログラムは、システムコールの @code{sync}, @code{syncfs}, @code{fsync},
@code{fdatasync} を実行する以外、何もしないのである。

@cindex crashes and corruption
カーネルは、(比較的遅い) ディスクの読み書きをできるだけしないで済ますために、
メモリにデータを保持している。このことによって、動作速度が向上するが、
コンピュータがクラッシュした場合、データが失われたり、
ファイルシステムが壊れたりという結果が生じかねない。@command{sync} コマンドは、
カーネルに命じて、メモリ上にあるデータを永続的な記憶装置に書き出させるのである。

引数を指定すると、デフォルトでは指定されたファイルのみが
fsync(2) システムコールを使って同期されることになる。

1 個以上のファイルを指定した場合は、以下のオプションを使って同期方法を変更することができる。
使用できるオプションについては、次の章も参照していただきたい。
@ref{Common options}.

@table @samp
@item -d
@itemx --data
@opindex --data
fdatasync(2) を使用して、ファイルのデータと、ファイルシステムの整合性を維持するのに必要なメタデータのみを同期する。

@item -f
@itemx --file-system
@opindex --file-system
指定したファイルが存在するファイルシステムに対して I/O 待ちになっているすべてのデータを
syncfs(2) システムコールを使用して、同期する。
注意していただきたいが、たとえば @samp{/dev/sda} といったデバイスノードを引数として渡すときは、
このオプションを普通は指定しないはずである。
そんなことをすると、@samp{/dev/sda} で参照されるファイルシステムではなく、
デバイスノードが存在するファイルシステムの同期が行われてしまうからだ。
また、システムによっては、個々のデバイスノードやファイルを引数として渡すのと、全く引数を使用しないのとでは、
同期のあり方が違うかもしれないことにも気をつけていただきたい。
すなわち、fsync(2) に渡される引数がある場合は、書き込みバリア (write barrier)
が使われることによって、引数を指定しなかったときに使用されるグローバルな sync(2) よりも、
より確実な保証をもたらすかもしれないのである。
@end table

@exitstatus


@node truncate invocation
@section @command{truncate}: ファイルサイズの短縮・伸長を行う

@pindex truncate
@cindex truncating, file sizes

@command{truncate} は、各 @var{file} のサイズを指定したサイズにまで短縮したり、引き伸ばしたりする。

書式:

@example
truncate @var{option}@dots{} @var{file}@dots{}
@end example

@cindex files, creating
@var{file} が存在していないときは、作成する。

@cindex sparse files, creating
@cindex holes, creating files with
@var{file} が指定したサイズより大きい場合は、データのサイズを越える部分は失われる。
@var{file} が指定したサイズより小さい場合は、ファイルは引き伸ばされ、
引き伸ばされた部分は、ゼロバイト (ASCII NUL) の連続に見えるようになる
(引き伸ばされた部分は、穴空きファイル (sparse file) の穴になる)。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --no-create
@opindex -c
@opindex --no-create
ファイルが存在しない場合は、作成しない。

@item -o
@itemx --io-blocks
@opindex -o
@opindex --io-blocks
@var{size} をバイト数ではなく、@var{file} を構成する I/O ブロック数と見なす。

@item -r @var{rfile}
@itemx --reference=@var{rfile}
@opindex -r
@opindex --reference
@var{rfile} のサイズを基準に、各 @var{file} のサイズを揃える。

@item -s @var{size}
@itemx --size=@var{size}
@opindex -s
@opindex --size
各 @var{file} のサイズを @var{size} にする。@option{--io-blocks}
が指定されていない場合、@var{size} はバイト数である。
@multiplierSuffixesNoBlocks{size}

@var{size} の前に以下の記号の一つを置くと、現在のサイズを元にして、各 @var{file}
のサイズを調節することができる。
@example
@samp{+}  => @var{size} だけ増やす
@samp{-}  => @var{size} だけ減らす
@samp{<}  => 最大でも @var{size} までにする
@samp{>}  => 最小でも @var{size} はあるようにする
@samp{/}  => @var{size} の倍数に切り下げる
@samp{%}  => @var{size} の倍数に切り上げる
@end example

@end table

@exitstatus


@node Printing text
@chapter テキストの表示

@cindex printing text, commands for
@cindex commands for printing text

この章では、テキスト文字列を表示するコマンドについて説明する。

@menu
* echo invocation::          テキストを 1 行表示する。
* printf invocation::        データを整形して表示する。
* yes invocation::           中断されるまで文字列を表示する。
@end menu


@node echo invocation
@section @command{echo}: テキストを 1 行表示する

@pindex echo
@cindex displaying text
@cindex printing text
@cindex text, displaying
@cindex arbitrary text, displaying

@command{echo} は、指定された @var{string} を標準出力に書き出す。その際、各 @var{string}
の間に 1 個のスペースを置き、行末に改行を付け加える。

書式:

@example
echo [@var{option}]@dots{} [@var{string}]@dots{}
@end example

@mayConflictWithShellBuiltIn{echo}

このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。
また、通常は特別な引数として使われる @samp{--} は、特別な意味を持たず、
他のいかなる @var{string} とも同じように扱われる。

@table @samp
@item -n
@opindex -n
出力の末尾に改行を付けない。

@item -e
@opindex -e
@cindex backslash escapes
各 "@var{string} の中に以下に挙げるバックスラッシュでエスケープした文字があると、
それを解釈して変換する。

@table @samp
@item \a
警告 (ベル)
@item \b
バックスペース
@item \c
この位置より後を出力しない
@item \e
エスケープ
@item \f
フォームフィード (form feed)
@item \n
改行 (newline)
@item \r
復帰 (carriage return)
@item \t
水平タブ
@item \v
垂直タブ
@item \\
バックスラッシュ
@item \0@var{nnn}
8 進数 @var{nnn} (0 桁から 3 桁までの 8 進数) で表される
8 ビットの値に対応する文字。@var{nnn} が 9 ビットの値だと、9 ビット目
(最上位ビット) は無視される。
@item \@var{nnn}
8 進数 @var{nnn} (1 桁から 3 桁までの 8 進数) で表される
8 ビットの値に対応する文字。@var{nnn} が 9 ビットの値だと、9 ビット目
(最上位ビット) は無視される。
@item \x@var{hh}
16 進数 @var{hh} (1 または 2 桁の 16 進数) で表される 8 ビットの値に対応する文字。
@end table

@item -E
@opindex -E
@cindex backslash escapes
各 @var{string} の中にあるバックスラッシュ・エスケープの解釈をしない。
これがデフォルトである。@option{-e} と @option{-E}
の両方が指定されている場合は、後で指定した方が効果を持つ。

@end table

@vindex POSIXLY_CORRECT
環境変数 @env{POSIXLY_CORRECT} が指定されている場合に、@command{echo}
の最初の引数が (単独の) @option{-n} 以外だと、@command{echo}
はそうした引数をオプションとして扱わずに、形がオプションに似た引数として出力する。
たとえば、@code{echo -ne hello} は、単なる @samp{hello}
ではなく、@samp{-ne hello} を出力する。

POSIX では、いかなるオプションのサポートも要求していない。また、
POSIX では、@var{string} がバックスラッシュを含む場合や、最初の引数が @option{-n}
の場合に、@command{echo} がどう振る舞うかは、実装側で決めることになっている。
従って、他のシステムで使うことも考慮したプログラムで、行末の改行を省略したり、
制御文字やバックスラッシュ・エスケープを出力したりする必要があるのならば、
@command{echo} の代わりに @command{printf} コマンドを使用することを考えてもよい。
@xref{printf invocation}.

@exitstatus


@node printf invocation
@section @command{printf}: データを整形して表示する

@pindex printf
@command{printf} は、テキストを整形して表示する。

書式:

@example
printf @var{format} [@var{argument}]@dots{}
@end example

@command{printf} は、文字列 @var{format} を表示する。
その際、C の @samp{printf} 関数とほとんど同じやり方で、@samp{%} 書式指定子と
@samp{\} エスケープシーケンスを解釈して、数値や文字列の引数
(上記書式の @var{argument}) を整形する。詳細については、次の項目を参照すること。
@xref{Output Conversion Syntax,, @command{printf} format directives,
libc, The GNU C Library Reference Manual}.
C の関数との相違点については、以下の箇条書きのとおりである。

@mayConflictWithShellBuiltIn{printf}

@itemize @bullet

@item
@var{format} 引数は、指定された @var{argument} のすべてを変換するのに必要なだけ、繰り返し使用される。
たとえば、@samp{printf %s a b} というコマンドは、@samp{ab} を出力する。

@item
@var{argument} の指定がない場合は、文脈が文字列と数値のどちらを期待しているかによって、
空文字列、または 0 を指定したものと見なされる。
たとえば、@samp{printf %sx%d} というコマンドは、@samp{x0} を表示する。

@item
@kindex \c
@samp{\c} というエスケープシーケンスが追加されている。@samp{\c} より後の部分を、
@command{printf} は出力しない。たとえば、@samp{printf 'A%sC\cD%sF' B E}
というコマンドは、@samp{ABC} を表示する。

@item
16 進数エスケープシーケンス @samp{\x@var{hh}} は、最大でも 2 桁である。
桁数に制限のない C と、その点が違う。たとえば、@samp{printf '\x07e'}
というコマンドは、2 バイトを表示するが (訳注: \x07 (ベル) と e)、
C の @samp{printf ("\x07e")} という文の方は、1 バイトしか表示しない。

@item
@kindex %b
追加された書式指定子 @samp{%b} は、対応する引数文字列中に
@samp{\} エスケープシーケンスがある場合、それを @var{format}
文字列中にあるときと同じように解釈・変換して、引数文字列を表示する。
ただし、引数中の 8 進数エスケープシーケンスは @samp{\0@var{ooo}} の形を取る。
@var{ooo} は 0 から 3 桁の 8 進数である。@samp{\@var{ooo}} が
9 ビットの値ならば、9 ビット目 (訳注: すなわち最上位ビット) は無視される。
@samp{%b} に精度も指定すると、変換した文字列の先頭から何バイトを表示するかが、それによって決まる。

@item
@kindex %q
追加された書式指定子 @samp{%q} は、対応する引数文字列を、
たいていのシェルで入力として再利用できる形で表示する。
非表示文字は POSIX が提唱している @samp{$''} の書式でエスケープされ、
シェルのメタ文字は適切にクォートされる。これは、@command{ls --quoting=shell-escape}
の出力と同じ書式である。

@item
数値の引数は、単独の C の定数でなければならない。前に @samp{+} や @samp{-}
が付いていてもよい。たとえば、@samp{printf %.4d -3} は、@samp{-0003} を出力する。

@item
@vindex POSIXLY_CORRECT
数値が期待される引数の先頭文字が @samp{"} や @samp{'} である場合、
その引数の値は、引用符の直後に来る文字の数値である
(訳注: すなわち、一般には、その文字の ASCII コードが出力される)。
その後にさらに文字が続く場合は、環境変数 @env{POSIXLY_CORRECT}
が設定されていれば、ただ単に無視され、設定されていなければ、警告が出される。
一例を挙げておくと、@samp{printf "%d" "'a"} は、ASCII
文字セットを使用しているホストでは、@samp{97} を出力する。
ASCII における @samp{a} の数値は、10 進数表記で 97 だからだ。

@end itemize

@vindex LC_NUMERIC
引数が浮動小数点数の場合は、小数部の前にはピリオドを置かなければならない。
ただし、表示は、現在のロケールの @env{LC_NUMERIC} カテゴリのルールに合わせたものになる。
たとえば、小数点を表す文字がコンマのロケールでは、@samp{printf %g 3.14}
というコマンドは、@samp{3,14} を出力するが、@samp{printf %g 3,14}
というコマンドはエラーになる。 @xref{Floating point}.

@kindex \@var{ooo}
@kindex \x@var{hh}
@command{printf} は、@var{format} 中の @samp{\@var{ooo}} を
(@var{ooo} が 1 から 3 桁の 8 進数ならば) 表示すべき 1 バイトを指定している
8 進数と見なす。また、@samp{\x@var{hh}} を (@var{hh} が 1 から 2 桁の
16 進数ならば) 表示すべき 1 文字を指定している 16 進数だと解釈する。
ただし、注意していただきたいが、@samp{\@var{ooo}} が 255 より大きな
10 進数に相当するときは、@command{printf} は 9 ビット目を無視する。
従って、たとえば、@samp{printf '\400'} は @samp{printf '\0'} と同じである。

@kindex \uhhhh
@kindex \Uhhhhhhhh
@cindex Unicode
@cindex ISO/IEC 10646
@vindex LC_CTYPE
@command{printf} は、ISO C 99 で導入された 2 種類のキャラクタ・シンタクス
(訳注: ここでは、コードポイントによる文字の指定法) を解釈することができる。
一つは、Unicode (ISO/IEC 10646) の文字を 16 ビットで表すための @samp{\u}
であり、4 桁の 16 進数 @var{hhhh} で指定する。もう一つは、Unicode の文字を
32 ビットで表すための @samp{\U} で、こちらは 8 桁の 16 進数 @var{hhhhhhhh}
で指定する。@command{printf} は Unicode の文字を出力するに当たって、
@env{LC_CTYPE} のロケールに従う。なお、U+0000@dots{}U+009F と
U+D800@dots{}U+DFFF の範囲にある Unicode の文字は、U+0024 ($),
U+0040 (@@), U+0060 (`) を除いて、このシンタクスでは指定することができない。

@samp{\u} や @samp{\U} を処理するには、フル装備の @code{iconv} の能力が必要である。
glibc 2.2 以降を採用しているシステムでは、そうした能力は使えるようになっている。
coreutils パッケージをインストールする前に、@code{libiconv}
をインストールしている場合も同様だ。どちらにも当てはまらない場合は、@samp{\u}
や @samp{\U} は、変換されずに、そのままの形で表示される。

オプションとして指定できるのは、単独の @option{--help} か @option{--version}
だけである。 @xref{Common options}.  オプションはオペランドの前に置かなければならない。

Unicode のキャラクタ・シンタクスを使えば、
ロケールに縛られないやり方で文字列が書けて、便利である。
たとえば、次のようにすれば、

@example
$ env printf '\u20AC 14.95'
@end example

@noindent
ユーロ通貨記号を含む文字列が、ユーロ記号をサポートするすべてのロケール
(ISO-8859-15, UTF-8 など) で正しく出力されることになる。同様に、

@example
$ env printf '\u4e2d\u6587'
@end example

@noindent
とすれば、漢字の文字列が、すべての中国語のロケール (GB2312, BIG5,
UTF-8 など) で正しく表示される。

上記の例では、@command{printf} コマンドを @command{env}
経由で呼び出していることに注目していただきたい。
これは、シェルのエイリアスや組み込み関数ではなく、
シェルのサーチパスを使って見つけたプログラムを、確実に実行するためである。

文字列がもっと長い場合でも、各文字に対応する 16 進数コードを一つ一つ捜す必要はない。
ASCII 文字に \u エスケープ・シーケンスを混ぜる書き方は、JAVA
のソースファイルで使用されるエンコーディング (JAVA source file encoding)
としても知られているが、GNU の recode コマンド 3.5c
以降を使用すれば、任意の文字列をこのエンコーディングに変換することができるのだ。
以下に示すのは、1 個の短文を、ロケールの如何に縛られずにその短文を出力するシェルスクリプトに変換する方法である。

@smallexample
$ LC_CTYPE=zh_TW.big5 /usr/local/bin/printf \
    '\u4e2d\u6587\n' > sample.txt
  #
  # 訳注: もちろん、漢字入力の可能な LANG=zh_TW.big5 (あるいは、
  #       ja_JP.eucJP や ja_JP.utf8) の環境なら、コマンドラインで
  #       直接 printf '中文\n' と打ち込んでもよい。その方が、
  #       「各文字に対応する 16 進数コードを一つ一つ捜す必要はない」
  #       という上記の説明に、例としてはふさわしいだろう。
  #       LANG=ja_JP.eucJP の場合、下のコマンドは、当然ながら、
  #       recode eucJP..JAVA になる。LANG=ja_JP.utf8 なら、
  #       recode UTF8..JAVA だ。
  #
$ recode BIG5..JAVA < sample.txt \
    | sed -e "s|^|/usr/local/bin/printf '|" -e "s|$|\\\\n'|" \
    > sample.sh
@end smallexample

@exitstatus


@node yes invocation
@section @command{yes}: 中断されるまで文字列を表示する

@pindex yes
@cindex repeated output of a string

@command{yes} は、コマンドラインで指定された引数を、空白で区切り、
末尾に改行を付けて、意図的に中断されるまで (訳注: たとえば @kbd{CTRL-C}
で中断されるまで) 延々と表示する。引数が指定されていない場合は、@samp{y}
の後ろに改行を付けて、中断されるまで延々と表示する。

書き込みエラーがあると、@command{yes} はステータス @samp{1} で終了する。

指定できるオプションは、単独の @option{--help} か @option{--version} だけである。
@samp{-} で始まる引数を出力するには、その引数の前に @option{--} を置けばよい。
たとえば、@samp{yes -- --help} というようにだ。@xref{Common options}.


@node Conditions
@chapter 条件

@cindex conditions
@cindex commands for exit status
@cindex exit status commands

この章で説明するのは、その出力よりも終了ステータスの方が主として役に立つコマンドである。
従って、こうしたコマンドは、シェルの @code{if} 文の条件として、
あるいは、パイプラインの最後のコマンドとして使用されることが多い。

@menu
* false invocation::         何もせず、実行失敗のステータスを返す。
* true invocation::          何もせず、正常終了する。
* test invocation::          ファイルタイプのチェックや値の比較を行う。
* expr invocation::          式を評価する。
@end menu


@node false invocation
@section @command{false}: 何もせず、実行失敗のステータスを返す

@pindex false
@cindex do nothing, unsuccessfully
@cindex failure exit status
@cindex exit status of @command{false}

@command{false} は、実行に失敗したこと (@dfn{failure})
を示す終了ステータス 1 を返す以外、何もしない。
従って、シェルスクリプト中の、実行に失敗するコマンドが必要な場所で、
仮のコマンドとして使用することができる。
最近のほとんどのシェルでは、@command{false} は組み込みコマンドになっているので、
スクリプト中で @samp{false} を使う際に使用しているのは、ここで説明している
@samp{false} ではなく、たぶん組み込みコマンドの方である。

@command{false} は、@option{--help} と @option{--version} オプションを認識する。

このバージョンの @command{false} は、C のプログラムとして実装されている。
従って、シェルスクリプトによる実装より安全かつ高速であり、
アカウントを無効化するための安全なダミー・シェルとして使用することができる。

注意していただきたいが、@command{false} は、@option{--help} や
@option{--version} を付けて実行した場合でも
(このマニュアルで説明している他のすべてのプログラムとは違って)、
実行失敗のステータスで終了する。

移植を考慮したプログラムでは、@command{false} の終了ステータスを
1 だと決めてかからない方がよい。GNU 以外のホストでは、終了ステータスが
1 より大きいこともあるからだ。


@node true invocation
@section @command{true}: 何もせず、正常終了する

@pindex true
@cindex do nothing, successfully
@cindex no-op
@cindex successful exit
@cindex exit status of @command{true}

@command{true} は、実行に成功したこと (@dfn{success})
を示す終了ステータス 0 を返す以外、何もしない。
従って、シェルスクリプト中の、実行に成功するコマンドが必要な場所で、
仮のコマンドとして使用することができる。とは言え、シェルの組み込みコマンド
@code{:} (コロン) の方が、同じことをより高速に実行してくれるかもしれない。
最近のほとんどのシェルでは、@command{true} は組み込みコマンドになっているので、
スクリプト中で @samp{true} を使う際に使用しているのは、ここで説明している
@samp{true} ではなく、たぶん組み込みコマンドの方である。

@command{true} は、@option{--help} と @option{--version} オプションを認識する。

もっとも、@command{true} を 0 以外のステータスで終了させることも可能だということも、
心に留めておいていただきたい。@option{--help} や @option{--version}
を使用したとき、標準出力がすでにクローズされていたり、
I/O エラーを引き起こすようなファイルにリダイレクトしたりすると、そういうことが起きる。
たとえば、Bourne 互換のシェルを使用して、次のようにするときだ。

@example
$ ./true --version >&-
./true: write error: Bad file number
$ ./true --version > /dev/full
./true: write error: No space left on device
@end example

このバージョンの @command{true} は、C のプログラムとして実装されている。
従って、シェルスクリプトによる実装より安全かつ高速であり、
アカウントを無効化するための安全なダミー・シェルとして使用することができる。

@node test invocation
@section @command{test}: ファイルタイプのチェックや値の比較を行う

@pindex test
@cindex check file types
@cindex compare values
@cindex expression evaluation

@command{test} は、条件式 @var{expression} の評価次第で、0 (真) または 1 (偽)
のステータスを返す。式を構成する各部分は、独立した引数でなければならない。

@command{test} は、ファイルのステータスを検査することができる。
また、文字列を扱う演算子や、数値を比較するための演算子も備えている。

@command{test} には、@samp{test} で始める書式のほかに、一対の角カッコを使用するもう一つの書式がある。
たとえば、@samp{test -d /} の代わりに、@samp{[ -d / ]}
と書いてもよい。角カッコは、独立した引数でなければならない
(訳注: すなわち、他の引数と空白で分離されていなければならない)。
だから、たとえば、@samp{[-d /]} では、望みの結果を得られないことになる。
@samp{test @var{expression}} と @samp{[ @var{expression} ]}
は、同じ意味なので、以下では前者の書式についてのみ解説する。

書式:

@example
test @var{expression}
test
[ @var{expression} ]
[ ]
[ @var{option}
@end example

@mayConflictWithShellBuiltIn{test}

@var{expression} を省略した場合、@command{test} は、偽を返す。
@var{expression} が引数 1 個だけだった場合、@command{test}
は、その引数が空 (null) ならば、偽を返し、さもなければ、真を返す。
引数には、@samp{-d}, @samp{-1}, @samp{--}, @samp{--help}, @samp{--version}
といった、他のほとんどのプログラムでなら、オプションとして扱われるものも含めて、
どんな文字列でも指定することができる。そこで、ヘルプやバージョン情報を取得するには、
@samp{[ --help} や @samp{[ --version} という形でコマンドを実行する必要がある。
この場合、いつもと違って、閉じカッコは付けない。 @xref{Common options}.

@cindex exit status of @command{test}
終了ステータス:

@display
0: 式が真の場合。
1: 式が偽の場合。
2: エラーが起きた場合。
@end display

@menu
* File type tests::          ファイルタイプのテスト (-[gkruwxOG])。
* Access permission tests::  アクセス許可のテスト (-[gkruwxOG])。
* File characteristic tests::  ファイル特性のテスト (-e -s -nt -ot -ef)。
* String tests::             文字列のテスト (-z -n = == !=)。
* Numeric tests::            数値のテスト (-eq -ne -lt -le -gt -ge)。
* Connectives for test::     @command{test} の論理結合演算子 (! -a -o)。
@end menu


@node File type tests
@subsection ファイルタイプのテスト

@cindex file type tests

以下のオプションは、ある特定のファイルタイプか否かの検査を行う。
(Unix では、あらゆるものがファイルだ。だが、ファイルならみんな同じだというわけではない！)

@table @samp

@item -b @var{file}
@opindex -b
@cindex block special check
@var{file} が存在し、ブロック・スペシャルデバイスならば、真。

@item -c @var{file}
@opindex -c
@cindex character special check
@var{file} が存在し、キャラクタ・スペシャルデバイスならば、真。

@item -d @var{file}
@opindex -d
@cindex directory check
@var{file} が存在し、ディレクトリならば、真。

@item -f @var{file}
@opindex -f
@cindex regular file check
@var{file} が存在し、通常ファイルならば、真。

@item -h @var{file}
@itemx -L @var{file}
@opindex -L
@opindex -h
@cindex symbolic link check
@var{file} が存在し、シンボリックリンクならば、真。
ファイル関係の他のすべてのテストとは違って、このテストでは、@var{file}
がシンボリックリンクの場合、リンクの参照を行わない。

@item -p @var{file}
@opindex -p
@cindex named pipe check
@var{file} が存在し、名前付きパイプならば、真。

@item -S @var{file}
@opindex -S
@cindex socket check
@var{file} が存在し、ソケットならば、真。

@item -t @var{fd}
@opindex -t
@cindex terminal check
@var{fd} が端末と結びついているファイルディスクリプタならば、真。

@end table


@node Access permission tests
@subsection アクセス許可のテスト

@cindex access permission tests
@cindex permission tests

以下のオプションは、特定のアクセス許可について検査をする。

@table @samp

@item -g @var{file}
@opindex -g
@cindex set-group-ID check
@var{file} が存在し、set-group-ID ビットが立っていれば、真。

@item -k @var{file}
@opindex -k
@cindex sticky bit check
@var{file} が存在し、@dfn{sticky} ビットが立っていれば、真

@item -r @var{file}
@opindex -r
@cindex readable file check
@var{file} が存在し、読み出しが許可されていれば、真。

@item -u @var{file}
@opindex -u
@cindex set-user-ID check
@var{file} が存在し、set-user-ID ビットが立っていれば、真。

@item -w @var{file}
@opindex -w
@cindex writable file check
@var{file} が存在し、書き込みが許可されていれば、真。

@item -x @var{file}
@opindex -x
@cindex executable file check
@var{file} が存在し、実行が許可されていれば (ディレクトリの場合は、検索が許可されていれば)、真。

@item -O @var{file}
@opindex -O
@cindex owned by effective user ID check
@var{file} が存在し、その所有者が test コマンド実行者の実効ユーザ ID
と同じならば、真。

@item -G @var{file}
@opindex -G
@cindex owned by effective group ID check
@var{file} が存在し、そのグループが test コマンド実行者の実効グループ ID
と同じならば、真。

@end table

@node File characteristic tests
@subsection ファイル特性のテスト

@cindex file characteristic tests

以下のオプションは、ファイルの他の特性を検査する。

@table @samp

@item -e @var{file}
@opindex -e
@cindex existence-of-file check
@var{file} が存在すれば、真。

@item -s @var{file}
@opindex -s
@cindex nonempty file check
@var{file} が存在し、サイズが 0 よりも大きければ、真。

@item @var{file1} -nt @var{file2}
@opindex -nt
@cindex newer-than file check
@var{file1} が @var{file2} より (更新日時 (modification date) で比較して)
新しいか、あるいは、@var{file1} が存在して、@var{file2} が存在しなければ、真。

@item @var{file1} -ot @var{file2}
@opindex -ot
@cindex older-than file check
@var{file1} が @var{file2} より (更新日時で比較して) 古いか、あるいは、@var{file2}
が存在して、@var{file1} が存在しなければ、真。

@item @var{file1} -ef @var{file2}
@opindex -ef
@cindex same file check
@cindex hard link check
@var{file1} と @var{file2} が同じデバイス番号と同じ inode 番号を持っていれば、
言い換えれば、両者が互いのハードリンクならば、真。

@end table


@node String tests
@subsection 文字列のテスト

@cindex string tests

以下のオプションは、文字列の特性を検査する。シェルに対して引数 @var{string}
を引用符で保護する必要があるかもしれない。たとえば、こんなふうにだ。

@example
test -n "$V"
@end example

こうした引用符は、@samp{$V} が空だったり、特殊文字を含んでいたりする場合に、
意図に反した引数が @command{test} に渡ることを防いでいる。

@table @samp

@item -z @var{string}
@opindex -z
@cindex zero-length string check
@var{string} の長さが 0 ならば、真。

@item -n @var{string}
@itemx @var{string}
@opindex -n
@cindex nonzero-length string check
@var{string} の長さが 0 でなければ、真。

@item @var{string1} = @var{string2}
@opindex =
@cindex equal string check
両文字列が等しければ、真。

@item @var{string1} == @var{string2}
@opindex ==
@cindex equal string check
両文字列が等しければ、真 (= と同じ意味)。

@item @var{string1} != @var{string2}
@opindex !=
@cindex not-equal string check
両文字列が等しくなければ、真。

@end table


@node Numeric tests
@subsection 数値のテスト

@cindex numeric tests
@cindex arithmetic tests

数値間の関係を調べる演算子を挙げる。引数は、数字のみで表現される整数か
(負数も使用できる)、@w{@code{-l @var{string}}} という特別な式でなければならない。
後者は @var{string} の長さとして評価される。

(訳注: 要するに、普通は 10 進数の整数を引数として取るということ。
@command{expr} コマンドとは違って、@command{test} では @samp{+2} といった表現も可能だ。)

@table @samp

@item @var{arg1} -eq @var{arg2}
@itemx @var{arg1} -ne @var{arg2}
@itemx @var{arg1} -lt @var{arg2}
@itemx @var{arg1} -le @var{arg2}
@itemx @var{arg1} -gt @var{arg2}
@itemx @var{arg1} -ge @var{arg2}
@opindex -eq
@opindex -ne
@opindex -lt
@opindex -le
@opindex -gt
@opindex -ge
こうした二項算術演算子は、それぞれ次の場合に真を返す。上から順に、
@var{arg1} が @var{arg2} と比べて、等しい場合、等しくない場合、より小さい場合、
より小さいか等しい場合、より大きい場合、より大きいか等しい場合。

@end table

例を挙げる。

@example
test -1 -gt -2 && echo yes
@result{} yes
test -l abc -gt 1 && echo yes
@result{} yes
test 0x100 -eq 1
@error{} test: integer expression expected before -eq
@end example


@node Connectives for test
@subsection @command{test} の論理結合演算子

@cindex logical connectives
@cindex connectives, logical

@command{test} 内蔵のこうした論理結合演算子より、
シェルの論理基本演算子を使用した方がよいことに留意していただきたい。
と言うのは、式が、パラメータの展開によっては、曖昧になることがあるからである。

たとえば、次の式は、@samp{$1} が @samp{'!'} であり、@samp{$2} が空文字列
@samp{''} だと、曖昧になる (訳注: '!' が文字列か否定演算子か、曖昧だということだろう)。

@example
test "$1" -a "$2"
@end example

だから、以下のように書いた方がよい。

@example
test "$1" && test "$2"
@end example

シェルの論理基本演算子では、作業の簡略化による利益も得られる。
それは、ファイルの属性のテストを何度もやる場合には、かなりのものになるかもしれない。

@table @samp

@item ! @var{expr}
@opindex !
@var{expr} が偽ならば、真。@samp{!} は @var{expr} のどの部分よりも優先順位が低い。
@samp{!} は二項式の左に指定する必要があることに注意していただきたい。
すなわち、@samp{1 '!' -gt 2} ではなく、@samp{'!' 1 -gt 2} である。
なお、@samp{!} はシェルの特殊文字であることが多いので、クォートした方が間違いがない。


@item @var{expr1} -a @var{expr2}
@opindex -a
@cindex logical and operator
@cindex and operator
@var{expr1} と @var{expr2} の両方が真ならば、真。
@samp{-a} は左結合であり、@samp{-o} よりも優先順位が高い。

@item @var{expr1} -o @var{expr2}
@opindex -o
@cindex logical or operator
@cindex or operator
@var{expr1} と @var{expr2} のどちらかが真ならば、真。
@samp{-o} は左結合である。

@end table


@node expr invocation
@section @command{expr}: 式を評価する

@pindex expr
@cindex expression evaluation
@cindex evaluation of expressions

@command{expr} は、式を評価して、結果を標準出力に書き出す。式の各構成要素
(token) は、独立した引数でなければならない。

オペランド (演算対象) は、整数か文字列である。整数は、1 個以上の
10 進数の数字から構成され、先頭に @samp{-} が付いていてもよい。@command{expr} は、
オペランドの位置にあるものが何であれ、それを整数、または、文字列に変換する。
どちらになるかは、それに対して行われる演算次第である。

@command{expr} そのものに対しては、文字列をクォートする必要がない。
だが、シェルにとって特別な意味がある、たとえば空白のような文字を保護するためには、
文字列を引用符で囲むなどの方法でクォートする必要があるかもしれない。
とは言え、クォートされているかどうかに関わりなく、文字列のオペランドは、
丸カッコ 1 個であってはならないし、@code{+} のような @command{expr}
の演算子の一つであるべきでもない。すなわち、シェルに対してクォートするだけでは、
エラーを引き起こすことなく、任意の文字列 @code{$str} を @command{expr}
に渡すことはできないのだ。この問題を回避する方法の一つは、GNU の拡張である
@code{+} 演算子 (訳注: この @code{+} は、算術演算子の @code{+}
ではなく、直後に来る引数が文字列であることを示す文字列演算子である) を使用することだ
(たとえば、@code{+ "$str" = foo} といった具合に)。もっと移植性のある方法は、
@code{@w{" $str"}} という先頭に空白を入れた表現を使用し、
式の残りの部分でもそれに合わせて、先頭のスペースを考慮に入れるようにすることである
(たとえば、@code{@w{" $str" = " foo"}} のように)。

負の整数や、@samp{-} で始まる文字列を @command{expr} の
1 番目の引数として渡すべきではない。オプションと間違われかねないからだ。
それを避けるためには、カッコでくくればよい (訳注: たとえば、
@code{expr \( -1 + 1 \)})。また、移植を考慮したスクリプトでは、
文字列のオペランドに、形が整数と同じになってしまうものを使うべきではない。
こちらは、先頭にスペースを入れる上記の方法で回避できる。

@cindex parentheses for grouping
演算子には、記号としてオペランドとオペランドの間に置くものもあれば、
キーワードとしてオペランドの前に付けるものもある。
丸カッコは、おなじみのやり方で、グループ化に使用できる。
ただし、丸カッコや、演算子の多くは、シェルによって評価されないように、
クォートしなければならない。

GNU MP ライブラリ対応でビルドされた場合、@command{expr}
は任意精度演算を使用する。そうでない場合は、ネイティブな算術型を使用するので、
算術オーバーフローのために実行に失敗することがあるかもしれない。

指定できるオプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.  オプションはオペランドの前に置かなければならない。

@cindex exit status of @command{expr}
終了ステータス:

@display
0: 式が null でも 0 でもない場合。
1: 式が null または 0 の場合。
2: 式が無効な場合。
3: 内部エラーが起きた場合 (例: 算術オーバーフロー)。
@end display

@menu
* String expressions::       文字列式 (+ : match substr index length)。
* Numeric expressions::      数式 (+ - * / %)。
* Relations for expr::       論理結合と関係表現 (| & < <= = == != >= >)。
* Examples of expr::         用例。
@end menu


@node String expressions
@subsection 文字列式

@cindex string expressions
@cindex expressions, string

@command{expr} は、パターンマッチなどの文字列演算子をサポートしている。
文字列演算子の優先順位は、算術演算子や関係演算子よりも高い
(算術/関係演算子については後述する)。

@table @samp

@item @var{string} : @var{regex}
@cindex pattern matching
@cindex regular expression matching
@cindex matching patterns
パターンマッチを行う。まず、左右の項を文字列に変換し、右項を、先頭に
@code{^} が暗黙のうちに付いている正規表現と見なす (@code{grep}
風の基本正規表現)。それから、その正規表現と左項がマッチするかどうかを調べる。

マッチが成功した場合、@var{regex} 中でカッコ (@samp{\(} と @samp{\)})
を使用していれば、@code{:} 演算子は、そのカッコ内の部分表現にマッチした
@var{string} 中の部分文字列を返す。カッコを使っていなければ、返すのはマッチした文字数である。

マッチに失敗した場合、@code{:} 演算子は、@var{regex} 中でカッコ (@samp{\(} と @samp{\)})
を使用していれば、空文字列を、さもなければ、0 を返す。

@kindex \( @r{regexp operator}
最初の @samp{\( @dots{} \)} のペアだけが、返り値に関係する。
二番目以降のカッコのペアには、正規表現の演算子をグループ化する働きしかない。

@kindex \+ @r{regexp operator}
@kindex \? @r{regexp operator}
@kindex \| @r{regexp operator}
正規表現では、@code{\+}, @code{\?}, @code{\|} は演算子であり、それぞれ、
1 個以上にマッチする、あってもなくてもよい、候補のうちのどちらか、を意味している。
ところが、SunOS などの @command{expr} では、こうした記号を通常の文字として扱っている
(POSIX は、どちらの動作も認めている)。正規表現の文法については次のものが詳しい。
@xref{Top, , Regular Expression Library, regex, Regex}.
実例をいくつか、「@command{expr} の使用例」に挙げておいた。
@ref{Examples of expr}.

@item match @var{string} @var{regex}
@findex match
パターンマッチを行う別の方法。これは、@w{@samp{@var{string} : @var{regex}}} と同じ
である。

@item substr @var{string} @var{position} @var{length}
@findex substr
@var{string} の部分文字列を返す。部分文字列は、@var{position}
の位置から始まり、最長でも @var{length} の長さである。@var{position} と
@var{length} のどちらかが、負数や 0 だったり、数値以外だったりする場合は、空文字列を返す。

@item index @var{string} @var{charset}
@findex index
@var{charset} 中の文字が最初に見つかった @var{string} 中の位置を返す。
@var{string} 中に @var{charset} 中のどの文字も見つからなかった場合は、0 を返す。

@item length @var{string}
@findex length
@var{string} の長さを返す。

@item + @var{token}
@kindex +
たとえ、@var{token} が @code{match} のようなキーワードや、 @code{/}
のような演算子であっても、@var{token} を文字列として解釈する。
これを使用すると、@code{expr length + "$x"} や @code{expr + "$x" : '.*/\(.\)'}
を実行したとき、@code{$x} の値が (たとえば) たまたま @code{/} や
@code{index} であっても、適切な動作をさせることができる。
この演算子は、GNU の拡張である。移植を考慮したシェルスクリプトでは、
@code{+ "$token"} ではなく、@code{@w{" $token"} : @w{' \(.*\)'}}
を使うべきである。

@end table

@command{expr} にキーワードを文字列として解釈させるためには、クォート演算子
(訳注: 上で述べている @code{+} 演算子) を使用しなければならない。


@node Numeric expressions
@subsection 数式

@cindex numeric expressions
@cindex expressions, numeric

@command{expr} は、以下に挙げる通常の算術演算子を、昇順の優先順位で、サポートしている。
こうした算術演算子は、前節で述べた文字列演算子より優先順位が低く、
次節で述べる関係演算子より優先順位が高い。

@table @samp

@item + -
@kindex +
@kindex -
@cindex addition
@cindex subtraction
加算と減算。左右の項は両方とも整数に変換される。整数に変換できない場合は、エラーになる。

@item * / %
@kindex *
@kindex /
@kindex %
@cindex multiplication
@cindex division
@cindex remainder
乗算、除算、剰余演算。左右の項は両方とも整数に変換される。整数に変換できない場合は、エラーになる。

@end table


@node Relations for expr
@subsection @command{expr} の関係表現

@cindex connectives, logical
@cindex logical connectives
@cindex relations, numeric or string

@command{expr} は、通常の論理結合や関係表現をサポートしている。
そうした演算子は、前の節で述べた文字列演算子や算術演算子より優先順位が低い。
論理結合や関係表現の演算子を、優先順位の低いものから高いものへ順に並べておく。

@table @samp

@item |
@kindex |
@cindex logical or operator
@cindex or operator
左項が null でも 0 でもなければ、左項を返す。左項が null または
0 の場合は、右項が null でも 0 でもなければ、右項を返す。両項とも
null または 0 の場合は、0 を返す。左項が null でも 0 でもない場合、
右項の評価は行われない。

@item &
@kindex &
@cindex logical and operator
@cindex and operator
両項とも null でも 0 でもなければ、左項を返し、それ以外の場合は、0
を返す。左項が null または 0 の場合、右項の評価は行われない。

@item < <= = == != >= >
@kindex <
@kindex <=
@kindex =
@kindex ==
@kindex >
@kindex >=
@cindex comparison operators
@vindex LC_COLLATE
両項を比較し、関係が真ならば、1 を返し、偽の場合は、0 を返す。
@code{==} は @code{=} と同じ意味である。@command{expr} は、まず両項を整数に変換し、
数値としての比較を試みる。左右どちらかの項の変換に失敗した場合は、
@env{LC_COLLATE} のロケールで指定されている、文字の照合順を使用して、
辞書的な比較を行う。

@end table


@node Examples of expr
@subsection @command{expr} の使用例

@cindex examples of @command{expr}
シェルのメタ文字をクオートする例も含めて、用例をいくつか挙げておく。

Bourne 互換シェルで、シェル変数 @code{foo} に 1 を加える。

@example
foo=$(expr $foo + 1)
@end example

変数 @code{$fname} に格納されているファイル名から、ディレクトリではない部分を取り出して、表示する。
@code{$fname} に @code{/} が含まれていなくてもよい。

@example
expr $fname : '.*/\(.*\)' '|' $fname
@end example

次の例で @code{\+} は演算子である (訳注: 細かいことを言うと、@command{grep}
流の基本正規表現の演算子。ちなみに、最後の例の @code{+} は、@command{expr}
の文字列演算子である)。

@example
expr aaa : 'a\+'
@result{} 3
@end example

@example
expr abc : 'a\(.\)c'
@result{} b
expr index abcdef cz
@result{} 3
expr index index a
@error{} expr: syntax error
expr index + index a
@result{} 0
@end example


@node Redirection
@chapter リダイレクション

@cindex redirection
@cindex commands for redirection

Unix のシェルは、いくつかの形式のリダイレクション (@dfn{redirection})
--- コマンドの入力元や出力先を変更する手段 --- をたいてい用意している。
しかし、ある一つの便利なリダイレクションは、シェルではなく、独立したコマンドによって行われる。
この章では、そのコマンドについて説明する。

@menu
* tee invocation::           出力を複数のファイルやプロセスにリダイレクトする。
@end menu


@node tee invocation
@section @command{tee}: 出力を複数のファイルやプロセスにリダイレクトする

@pindex tee
@cindex pipe fitting
@cindex destinations, multiple output
@cindex read from stdin and write to stdout and files

@command{tee} コマンドは、標準入力を標準出力にコピーするとともに、
引数として指定されたファイル (複数可) にもコピーする。
これは、あるデータをパイプに送るだけでなく、同時にそのコピーを保存したい場合に、便利である。

書式:

@example
tee [@var{option}]@dots{} [@var{file}]@dots{}
@end example

書き出し先のファイルがまだ存在していなければ、作成する。
書き出し先のファイルがすでに存在している場合は、@option{-a}
オプションを使用しないかぎり、ファイルに前からあったデータは上書きされる。

GNU coreutils の従来のバージョンでは (v5.3.0 - v8.23)、
@var{file} として @samp{-} を指定すると、@command{tee}
は入力のコピーをもう一つ標準出力に書き出していた。
しかし、二重になった出力は、あまり役に立つものではなかったので、
現在では POSIX の規格に従い、そこではっきりと規定されているように、
@samp{-} をそういう名前のファイルとして取り扱うようになっている。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp
@item -a
@itemx --append
@opindex -a
@opindex --append
指定されたファイルの末尾に標準入力を追加する。すなわち、ファイルを上書きしない。

@item -i
@itemx --ignore-interrupts
@opindex -i
@opindex --ignore-interrupts
割り込みシグナルを無視する。

@item -p
@itemx --output-error[=@var{mode}]
@opindex -p
@opindex --output-error
出力にエラーがあったときの動作を調整する。
長い形式のオプションを使えば、下記の @var{mode} から動作を選択することができる。

@table @samp
@item warn
パイプを含めて、出力のオープンや書き出しでエラーが起きると、警告メッセージを出す。
エラー発生後もまだオープンされているファイルやパイプがあれば、それに対する書き込みは続行される。
出力のいづれかにエラーがあれば、終了ステータスは失敗を示す。

@item warn-nopipe
これが、@var{mode} が指定されないときや、短い形式の @option{-p}
が使用されたときのデフォルトの @var{mode} である。
パイプ以外について、出力のオープンや書き出しでエラーが起きると、警告メッセージを出す。
エラー発生後もまだオープンされているファイルやパイプがあれば、それに対する書き込みは続行される。
パイプ以外の出力にエラーがあれば、終了ステータスは失敗を示す。

@item exit
パイプを含めて、出力のオープンや書き出しでエラーが起きると、終了する。

@item exit-nopipe
パイプ以外について、出力のオープンや書き出しでエラーが起きると、終了する。
@end table

@end table

大量のデータの転送を行いながら、同時にそのデータのサマライズも行いたい、
改めてデータを読み直すようなことはしたくない。@command{tee} は、そういうときに便利である。
たとえば、DVD イメージをダウンロードしているとき、
その場ですぐ、署名やチェックサムを確認したくなることがよくある。
単に次のようにするのは、効率が悪い。

@example
wget http://example.com/some.iso && sha1sum some.iso
@end example

上記コマンドの問題点の一つは、ただでさえ時間のかかる SHA1 の計算に取りかかる前に、
ダウンロードが完了するのを待たなければならないことだ。
たぶん、さらに問題なのは、上記のやり方では、
DVD イメージを改めて読み直さなければならないことだろう
(一度目の読み込みは、ネットワークから)。

こうした作業を行う効率的な方法は、ダウンロードと SHA1 の計算を同時に、
交互に実行することである。そうすれば、プロセス全体が平行してスムーズに進むので、
無駄な時間を使わずに、チェックサムが手に入る。

@example
# ちょっと凝った方法。プロセス置換の実例をご覧に入れるため。
wget -O - http://example.com/dvd.iso \
  | tee >(sha1sum > dvd.sha1) > dvd.iso
@end example

こうすれば、@command{tee} は、出力を目当てのファイルに書き出すだけでなく、パイプにも書き出す。
そして、後者では、@command{sha1sum} を実行し、最終的なチェックサムを
@file{dvd.sha1} という名前のファイルに保存することになる。

しかし、気をつけていただきたい。上記の例は、プロセス置換 (@dfn{process substitution})
と呼ばれる最近のシェルの機能を当てにしている (上記の@samp{>(command)}
という構文のことである。@xref{Process Substitution,,
Process Substitution, bash, The Bash Reference Manual}.)。
そのため、@command{zsh}, @command{bash}, @command{ksh}
ではうまく動作するが、@command{/bin/sh} では動作しない。
従って、こうしたコードをシェルスクリプトで使用するときは、スクリプトの先頭に
@samp{#!/bin/bash} などと書くことを忘れてはいけない。

次のことにも気をつけていただきたい。プロセス置換のいづれかが
(あるいは、パイプに渡された標準出力が)、
データをすべて処理し尽くす前に終了してしまうことがあるかもしれない。
そうした場合に、@command{tee} が入力の処理を続行して、
それを残っている出力先に渡すことができるようにするには、
@option{-p} オプションが必要になる。

上記の例は、書き出しを 1 個のファイルと 1 個のプロセスに行っているだけだ。
その程度なら、もっと普通の、もっと移植性のある使い方をした方がずっとよい。

@example
wget -O - http://example.com/dvd.iso \
  | tee dvd.iso | sha1sum > dvd.sha1
@end example

@command{tee} が二つのプロセスに書き込むように、この例を拡張して、MD5 と
SHA1 のチェックサムを平行して計算させることもできる。
その場合は、プロセス置換が必要になる。

@example
wget -O - http://example.com/dvd.iso \
  | tee >(sha1sum > dvd.sha1) \
        >(md5sum > dvd.md5) \
  > dvd.iso
@end example

このテクニックは、パイプから入ってくるデータの圧縮したコピーを作りたいときにも、役に立つ。
@samp{du -ak} の出力するディスク使用量のデータを要約して、
グラフィカルに表示するツールを考えていただきたい。
ディレクトリ階層が膨大だと、@samp{du -ak} は実行に長い時間がかかるだろうし、
いともたやすくテラバイトのデータを作成してくれるだろう。
そこで、@samp{du} コマンドをむやみに再実行することはやりたくない。
また、圧縮されていない出力を保存しておきたくもない。

これを効率の悪い方法でやると、@command{du} の出力全部の圧縮を済ませるまで、
GUI ツールを起動することすらできない。

@example
du -ak | gzip -9 > /tmp/du.gz
gzip -dc /tmp/du.gz | xdiskusage -a
@end example

@command{tee} とプロセス置換を使えば、GUI ツールを直ちに起動できるし、
圧縮ファイルの展開も全くやらないですむ。

@example
du -ak | tee >(gzip -9 > /tmp/du.gz) | xdiskusage -a
@end example

最後にもう一つ。常に 2 種類以上の圧縮した tar アーカイブ (tarball)
を一度に作ることにしている場合は、より効率のよいやり方ができるかもしれない。
たとえば、@code{make dist} が @command{gzip} と @command{bzip2} の両方で圧縮した
tar アーカイブを作成するような場合だ。@command{automake} が生成する @file{Makefile}
のルールは、たいてい、こんなふうにコマンドを連続して実行することで、
圧縮した tar アーカイブを二つ作成している (少し単純化してある)。

@example
tardir=your-pkg-M.N
tar chof - "$tardir" | gzip  -9 -c > your-pkg-M.N.tar.gz
tar chof - "$tardir" | bzip2 -9 -c > your-pkg-M.N.tar.bz2
@end example

しかしながら、アーカイブの作成・圧縮の対象になっているディレクトリ階層が、
数メガバイトより大きい場合は --- 使用しているシステムがマルチプロセッサを搭載し、
メモリがふんだんにある場合はなおさらそうだが --- ディレクトリの中身を 1 回だけ読み込み、
圧縮プログラムを平行して走らせることで、ずっと効率のよい仕事ができる。

@example
tardir=your-pkg-M.N
tar chof - "$tardir" \
  | tee >(gzip -9 -c > your-pkg-M.N.tar.gz) \
  | bzip2 -9 -c > your-pkg-M.N.tar.bz2
@end example

プロセス置換が表示する出力をさらに処理したいとしよう。
もし、そうしたプロセスがアトミックな書き出しをしているならば
(すなわち、一度の書き出しが、システムの PIPE_BUF サイズよりも小さければ)、
そういうことも次のような構文で可能である。

@example
tardir=your-pkg-M.N
tar chof - "$tardir" \
  | tee >(md5sum --tag) > >(sha256sum --tag) \
  | sort | gpg --clearsign > your-pkg-M.N.tar.sig
@end example

@exitstatus


@node File name manipulation
@chapter ファイル名操作

@cindex file name manipulation
@cindex manipulation of file names
@cindex commands for file name manipulation

この章では、ファイル名操作に使うコマンドについて説明する。

@menu
* basename invocation::      ファイル名からディレクトリと接尾辞を取り除く。
* dirname invocation::       ファイル名から最後の要素を取り除く。
* pathchk invocation::       ファイル名の有効性や可搬性を検査する。
* mktemp invocation::        テンポラリファイルやディレクトリを作成する。
* realpath invocation::      ファイル名を展開して表示する。
@end menu


@node basename invocation
@section @command{basename}: ファイル名からディレクトリと接尾辞を取り除く

@pindex basename
@cindex strip directory and suffix from file names
@cindex directory, stripping from file names
@cindex suffix, stripping from file names
@cindex file names, stripping directory and suffix
@cindex leading directory components, stripping

@command{basename} は、@var{name} の先頭にディレクトリ部分があれば、それを取り除く。

書式:

@example
basename @var{name} [@var{suffix}]
basename @var{option}@dots{} @var{name}@dots{}
@end example

@var{suffix} が指定されていて、それが @var{name} の末尾と同一ならば、
@var{suffix} の部分も @var{name} から取り除かれる。
気をつけていただきたいが、ファイル名の末尾のスラッシュは、接尾辞のマッチングに先立って除去されるので、
@var{suffix} にスラッシュが含まれていると、指定に効果がないことになる。
@command{basename} は、結果を標準出力に表示する。

@c This test is used both here and in the section on dirname.
@macro basenameAndDirname
@command{basename} と @command{dirname} は合わせて設計されており、もし @samp{ls "$name"}
が成功するならば、@samp{cd "$(dirname "$name")"; ls "$(basename "$name")"}
というコマンドの連続も成功するようになっている。
これは、ファイル名の末尾に改行が付いている場合を除いて、あらゆる場合にうまく行く。
@end macro
@basenameAndDirname

POSIX によれば、@var{name} が空の場合や @samp{//} の場合に、結果がどうなるかは、
実装側で決めてよいことになっている。前者の場合、GNU の @command{basename} は、空文字列を返す。
後者の場合、@var{//} と @var{/} とが別のものであるプラットフォームでは、結果は
@samp{//} になり、全く区別しないプラットフォームでは、結果は @samp{/} になる。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp

@item -a
@itemx --multiple
@opindex -a
@opindex --multiple
複数の引数を受け付ける。すべての引数は @var{name} として処理される。
このオプションを使用する場合、@var{suffix} を指定するならば、@option{-s}
オプションを使わなければならない。

@item -s @var{suffix}
@itemx --suffix=@var{suffix}
@opindex -s
@opindex --suffix
末尾にある @var{suffix} を除去する。このオプションを指定すると
@option{-a} オプションも指定したことになる。

@optZero

@end table

@exitstatus

用例:

@smallexample
# "sort" を出力する。
basename /usr/bin/sort

# "stdio" を出力する。
basename include/stdio.h .h

# "stdio" を出力する。
basename -s .h include/stdio.h

# "stdio", "stdlib" の順に出力する。
basename -a -s .h include/stdio.h include/stdlib.h
@end smallexample


@node dirname invocation
@section @command{dirname}: ファイル名から最後の要素を取り除く

@pindex dirname
@cindex directory components, printing
@cindex stripping non-directory suffix
@cindex non-directory suffix, stripping

@command{dirname} は、各 @var{name} からスラッシュで区切られた最後の要素を取り除いて、
残りのすべてを表示する。その際、最後の要素の左右どちらにあるスラッシュも除去される。
@var{name} を構成する文字列にスラッシュが一つも含まれない場合、
@command{dirname} は (カレントディレクトリを意味する) @samp{.} を表示する。

書式:

@example
dirname [@var{option}] @var{name}@dots{}
@end example

@var{name} は実在するファイル名でなくても構わないが、実在するファイル名ならば、
この操作によって、最後の要素それ自体がディレクトリである場合も含めて、
最後の要素が存在するディレクトリが、利用できる形で表示される。

@basenameAndDirname

POSIX によれば、@var{name} が @samp{//} の場合に、結果がどうなるかは、
実装側で決めてよいことになっている。
GNU の @command{dirname} について言うと、@var{//} と @var{/}
とが別のものであるプラットフォームでは、結果は @samp{//} になり、
全く区別しないプラットフォームでは、結果は @samp{/} になる。

このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.

@table @samp

@optZero

@end table

@exitstatus

用例:

@smallexample
# "/usr/bin" を出力する。
dirname /usr/bin/sort
dirname /usr/bin//.//

# "dir1", "dir2" の順に出力する。
dirname dir1/str dir2/str

# "." を出力する。
dirname stdio.h
@end smallexample


@node pathchk invocation
@section @command{pathchk}: ファイル名の有効性や可搬性を検査する

@pindex pathchk
@cindex file names, checking validity and portability
@cindex valid file names, checking for
@cindex portable file names, checking for

@command{pathchk} は、ファイル名が有効かどうか、可搬性があるかどうかを検査する。

書式:

@example
pathchk [@var{option}]@dots{} @var{name}@dots{}
@end example

@command{pathchk} は各 @var{name} に対して、以下の条件のどれかが真ならば、
エラーメッセージを出す。

@enumerate
@item
@var{name} 中の実在するディレクトリの一つが、検索 (実行) 許可を持っていない。
@item
@var{name} の長さが、オペレーティング・システムによってサポートされている最大長を越えている。
@item
@var{name} の構成要素の一つの長さが、
それが存在することになるファイルシステムによってサポートされている最大長を越えている。
@end enumerate

実在しないファイル名を指定しても、エラーにはならない。
その名前のファイルが、上記の条件内で作成可能であればよい。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp

@item -p
@opindex -p
実際に使用しているファイルシステムに基づいて検査を行うのではなく、
以下の条件を調べて、そのどれかが真ならば、エラーメッセージを出す。

@enumerate
@item
ファイル名が空である。

@item
ファイル名に、どのシステムでもファイル名に使用できる文字として
POSIX が規定している文字セット以外の文字が含まれている。
すなわち、ASCII 英数字、@samp{.}、@samp{_}、@samp{-}、@samp{/}
以外の文字が使用されている。

@item
ファイル名の長さや、その構成要素の一つの長さが、
POSIX の規格で可搬性のために最小限サポートしなければならないとされている長さを越えている。
@end enumerate

@item -P
@opindex -P
ファイル名が空だったり、@samp{-} で始まる構成要素を含んでいたりすると、エラーメッセージを出す。

@item --portability
@opindex --portability
ファイル名が POSIX に準拠しているすべてのホストで使えるものでなければ、エラーメッセージを出す。
このオプションは、@samp{-p -P} と同じことである。

@end table

@cindex exit status of @command{pathchk}
終了ステータス:

@display
0: 指定されたすべてのファイル名が検査のすべてにパスした場合。
1: それ以外。
@end display

@node mktemp invocation
@section @command{mktemp}: テンポラリファイルやディレクトリを作成する

@pindex mktemp
@cindex file names, creating temporary
@cindex directory, creating temporary
@cindex temporary files and directories

@command{mktemp} は、テンポラリファイルやテンポラリディレクトリの作成を行う。

書式:

@example
mktemp [@var{option}]@dots{} [@var{template}]
@end example

@command{mktemp} は、@var{template} を基にして、
安全なテンポラリファイルやディレクトリを作成し、その名前を表示する。
@var{template} を指定する場合、その最後の構成部分に少なくとも
3 個の連続する @samp{X} が含まれていなければならない。@var{template}
を省略した場合は、@samp{tmp.XXXXXXXXXX} というテンプレートが使用され、
@option{--tmpdir} オプションが暗黙のうちに指定されることになる。
@var{template} 中の @samp{X} が連続する最後の部分は、英数字で置き換えられる。
従って、大文字小文字を区別するファイルシステムなら、テンプレートに連続する
@var{n} 個の @samp{X} が含まれていると、作成されるファイル名には、
62 の @var{n} 乗とおりの可能性があることになる。

昔のスクリプトでは、テンポラリファイルを作成する際、そのプログラム名にプロセス ID
(@samp{$$}) を拡張子として付けで済ますのが習慣だった。
しかし、この命名法は、名前の推測が容易であり、従って、競合状態を起こしやすいという弱点がある。
攻撃者としては、テンポラリファイルに使われそうな名前でシンボリックリンクを作っておけばよい。
そうすれば、スクリプトが未使用のファイルだと考えて、テンポラリファイルのファイルハンドルを開いたとき、
実際にはすでに存在しているファイルの更新をしているということになる。
同じ命名法を使ってディレクトリを作成するのは、もう少し安全である。
作成しようとするディレクトリがすでに存在していると、@command{mkdir}
は実行に失敗するからだ。とは言え、こちらもサービス不能化攻撃
(denial of service attacks) を可能にしてしまうわけで、やはり良策とは言えない。
それ故、新しいスクリプトでは @command{mktemp} コマンドを使用するべきである。
そうすれば、生成されるファイル名が確実に予測不可能になるので、
実行中のスクリプトがテンポラリファイルの名前を知っているというまさにその事実が、
ファイルを作成したのはそのスクリプトであり、他のユーザによってそのファイルが変更されることはありえないと、間違いなく示すことになる。

ファイルを作成する場合、作成されるファイルには現在のユーザに対する読み込みと書き出しの許可が付くが、
グループやその他のユーザに対しては、いかなる許可も付かない。
現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。

用例をいくつか挙げてみる (ただし、注意していただきたいが、
お手元でこの通り実行しても、おそらくファイル名は違ったものになるはずだ)。

@itemize @bullet

@item
カレントディレクトリにテンポラリファイルを作成する。
@example
$ mktemp file.XXXX
file.H47c
@end example

@item
一般的な拡張子を付けて、テンポラリファイルを作成する。
@example
$ mktemp --suffix=.txt file-XXXX
file-H08W.txt
$ mktemp file-XXXX-XXXX.txt
file-XXXX-eI9L.txt
@end example

@item
ユーザが環境変数 @env{TMPDIR} で指定しているディレクトリを基点として、
その下に安全な FIFO を作成する。@env{TMPDIR} が設定されていない場合は、
@file{/tmp} ではなく、カレントディレクトリを基点として使用する。
肝腎な点は、@command{mktemp} は FIFO を作成しないが、FIFO
を置くことができる安全なディレクトリなら作成できるということである。
ディレクトリや FIFO を作成することができなかったときは、シェルを終了する。
@example
$ dir=$(mktemp -p "$@{TMPDIR:-.@}" -d dir-XXXX) || exit 1
$ fifo=$dir/fifo
$ mkfifo "$fifo" || @{ rmdir "$dir"; exit 1; @}
@end example

@item
可能ならば、テンポラリファイルを作成して使用するが、作成に失敗しても、
エラーメッセージを出さない。ファイルは、環境変数 @env{TMPDIR}
が設定されていれば、そこで指名されているディレクトリに作られるが、
設定されていなければ、@file{/tmp} に作られる。
@example
$ file=$(mktemp -q) && @{
>   # $file をこのブロックの内側でのみ使用することにすれば、
>   # 安全である。$file を引用符で囲んでいるのは、$TMPDIR が、
>   # 従って、$file が、ホワイトスペースを含んでいるかも
>   # しれないからだ。
>   echo ... > "$file"
>   rm "$file"
> @}
@end example

@item
擬似ランダム文字発生装置として動作する
(カレントディレクトリの内容によって影響を受けるので、完全にランダムではない)。
セキュリティホールを避けたいならば、生成された名前を使って、ファイルを作ってはいけない。
@example
$ mktemp -u XXX
Gb9
$ mktemp -u XXX
nzC
@end example

@end itemize

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -d
@itemx --directory
@opindex -d
@opindex --directory
ファイルではなく、ディレクトリを作成する。
作成されるディレクトリには現在のユーザに対して、読み、書き、検索の許可が付くが、
グループやその他のユーザに対しては、いかなる許可も付かない。
現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。

@item -q
@itemx --quiet
@opindex -q
@opindex --quiet
ファイルやディレクトリの作成に失敗しても、エラーメッセージを出さない。
終了ステータスは、ファイルが作成されたかどうかをやはり反映する。

@item -u
@itemx --dry-run
@opindex -u
@opindex --dry-run
既存のファイルの名前と重ならないテンポラリファイル用の名前を生成するが、
ファイルシステムの内容を変更することはない (訳注: 要するに、
テンポラリファイル名を生成表示するだけで、実際にファイルを作成することはないということ)。
このコマンドの出力を使って、新しいファイルを作るのは、本質的に安全ではない。
名前の生成とその使用との間には、時間差があり、
その間に他のプロセスが同じ名前でオブジェクトを作成することもありえるからである。

@item -p @var{dir}
@itemx --tmpdir[=@var{dir}]
@opindex -p
@opindex --tmpdir
@var{template} をディレクトリ @var{dir} を基点とする相対パスとして扱う。
@var{dir} が指定されていない場合や (ロングオプションの @option{--tmpdir}
でのみ可能)、空文字列の場合は、環境変数 @env{TMPDIR} が設定されていれば、
その値を使用し、設定されていなければ、@samp{/tmp} を使用する。
このオプションを指定する場合、 @var{template} は絶対パスであってはならない。
とは言え、@var{template} にスラッシュが含まれていても構わないが、
その場合、途中にあるディレクトリはすでに存在していなければならない。

@item --suffix=@var{suffix}
@opindex --suffix
@var{template} の末尾に @var{suffix} を追加する。@var{suffix}
はスラッシュを含んでいてはならない。@option{--suffix} を指定する場合、
@var{template} は @samp{X} で終わっていなければならない。
@option{--suffix} が指定されていない場合は、@var{template}
中の最後の @samp{X} の位置を調べることで、@var{suffix} としてふさわしいものを推測する。
このオプションが存在するのは、デフォルトの @var{template} を使用しているとき、
@samp{X} で始まる @var{suffix} を付けられるようにするためである。

@item -t
@opindex -t
@var{template} を、環境変数 @env{TMPDIR} が設定されていれば、
その値であるディレクトリ直下の 1 個のファイルとして扱う。
@env{TMPDIR} が設定されていなければ、@option{-p} で指定されるディレクトリ直下、
それ以外の場合は、@samp{/tmp} 直下になる。なお、@var{template}
にスラッシュが含まれていてはならない。このオプションは非推奨である。
@option{-t} なしで @option{-p} を使う方が (@env{TMPDIR}
よりコマンドラインの指定を優先するという点で) デフォルトの動作として優れているし、
(途中のディレクトリも指定できるという点で) 柔軟性も上だからである。

@end table

@cindex exit status of @command{mktemp}
終了ステータス:

@display
0: ファイルが作成された場合。
1: それ以外。
@end display


@node realpath invocation
@section @command{realpath}: ファイル名を展開して表示する

@pindex realpath
@cindex file names, canonicalization
@cindex symlinks, resolution
@cindex canonical file name
@cindex canonicalize a file name
@pindex realpath
@findex realpath

@command{realpath} は、すべてのシンボリックリンクを展開し、
@samp{/./} や @samp{/../} に対する参照を解決する。
さらに、余分な @samp{/} 文字の削除も行う。デフォルトでは、
指定したファイル名のうち、最後の要素以外のすべての要素が実在していなければならない。

書式:

@example
realpath [@var{option}]@dots{} @var{file}@dots{}
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -e
@itemx --canonicalize-existing
@opindex -e
@opindex --canonicalize-existing
指定されたファイル名中のすべての構成要素が実在することを確認する。
存在しなかったり、利用できなかったりする要素があると、@option{-q}
オプションが指定されていないかぎり、@command{realpath}
はエラーメッセージを出し、0 以外の終了コードで終了する。
ファイル名の末尾にスラッシュを付けると、その名前はディレクトリであるという指定になる。

@item -m
@itemx --canonicalize-missing
@opindex -m
@opindex --canonicalize-missing
指定されたファイル名中に存在しなかったり、使用できなかったりする構成要素があれば、
それをディレクトリとして処理する。

@item -L
@itemx --logical
@opindex -L
@opindex --logical
指定されたファイル名中にあるシンボリックリンクの展開を行うが、
シンボリックリンクに @samp{..} という要素が後続している場合は、
シンボリックリンクを展開するより前に、そちらを先に処理する。
(訳注: 例を挙げた方が、わかりやすいだろう。@samp{symlink-directory/../..}
といったファイル名が与えられた場合、symlink-directory
というシンボリックリンクそのものの親ディレクトリの親ディレクトリに展開するということ。
次項の注と比較していただきたい。)

@item -P
@itemx --physical
@opindex -P
@opindex --physical
指定されたファイル名中にあるシンボリックリンの展開を行う際、
シンボリックリンクに @samp{..} という要素が後続している場合も、
シンボリックリンクを展開してから、@samp{..} の処理を行う。
こちらがデフォルトの動作モードである。(訳注: すなわち、
@samp{symlink-directory/../..} といったファイル名が与えられた場合、
シンボリックリンクの参照先の親ディレクトリの親ディレクトリに展開する。)

@item -q
@itemx --quiet
@opindex -q
@opindex --quiet
指定されたファイル名についてエラーメッセージを出力しない。

@item --relative-to=@var{file}
@opindex --relative-to
@cindex relpath
オプション引数に指定したファイルを基点とする相対パスとして、
ファイル名を展開する。このオプションは、ファイルの存在に関して
@option{-m} や @option{-e} オプションを認識することに注意していただきたい。

@item --relative-base=@var{base}
@opindex --relative-base
このオプションは @option{--relative-to} と一緒に使うこともでき、
その場合は、操作対象の @var{file} が @var{base} 以下のディレクトリに存在するときにのみ、
相対パス名を表示するように、@option{--relative-to} の出力に制限を課す。
@var{file} が @var{base} 以下のディレクトリに存在しないときは、
出力は絶対パスのファイル名になる。@option{--relative-to} を指定しなかった場合、
@var{base} 以下のディレクトリに存在するファイルは、@var{base}
を基点とする相対パスで表示される。@option{--relative-to} も指定するなら、
そのディレクトリは @var{base} の下位ディレクトリでなければならず、
さもないと、このオプションは効果を持たない。このオプションは、ファイルの存在に関して
@option{-m} や @option{-e} オプションを認識することに注意していただきたい。
例を挙げよう。

@example
realpath --relative-to=/usr /tmp /usr/bin
@result{} ../tmp
@result{} bin
realpath --relative-base=/usr /tmp /usr/bin
@result{} /tmp
@result{} bin
@end example

@item -s
@itemx --strip
@itemx --no-symlinks
@opindex -s
@opindex --strip
@opindex --no-symlinks
シンボリックリンクの展開を行わない。すなわち、@samp{/./} や @samp{/../}
の参照の解決と、余分な @samp{/} 文字の削除だけを行う。
@option{-m} オプションと組み合わせた場合、@command{realpath}
は与えられたファイル名に対して操作を行うだけであり、
その各要素が存在しているかどうか、実在のファイルに当たってみることはない。

@optZero

@end table

@cindex exit status of @command{realpath}
終了ステータス:

@display
0: すべてのファイル名が問題なく表示できた場合。
1: それ以外。
@end display


@node Working context
@chapter 作業環境

@cindex working context
@cindex commands for printing the working context

この章では、現在作業中の環境を表示したり、変更したりするコマンドを説明する。
ここで環境というのは、カレントディレクトリ、端末の設定などである。
次章で取り上げるユーザ関係のコマンドも参照していただきたい。

@menu
* pwd invocation::           現在作業中のディレクトリを表示する。
* stty invocation::          端末の諸特性を表示・変更する。
* printenv invocation::      環境変数を表示する。
* tty invocation::           標準入力に接続している端末のファイル名を表示する。
@end menu


@node pwd invocation
@section @command{pwd}: 現在作業中のディレクトリを表示する

@pindex pwd
@cindex print name of current directory
@cindex current working directory, printing
@cindex working directory, printing


@command{pwd} は、カレントディレクトリの名前を表示する。

書式:

@example
pwd [@var{option}]@dots{}
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp
@item -L
@itemx --logical
@opindex -L
@opindex --logical
環境変数 @env{PWD} の値が、@samp{.} や @samp{..}
を含まないカレントディレクトリの絶対パス名であっても、
シンボリックリンクは含んでいるかもしれない。
その場合は、その値をそのまま出力する。それ以外の場合は、デフォルトの
@option{-P} オプションと同じ処理を行う。

@item -P
@itemx --physical
@opindex -P
@opindex --physical
カレントディレクトリについて、参照を完全に解決した名前を表示する。
すなわち、表示される名前のすべての要素が、本物のディレクトリの名前になり、
シンボリックリンクは一つも含まれない。
@end table

@cindex symbolic links and @command{pwd}
@option{-L} と @option{-P} のオプションが両方とも指定されている場合は、
最後に指定された方が優先される。どちらのオプションも指定されない場合は、
環境変数  @env{POSIXLY_CORRECT} が設定されていないかぎり、この実装では、
@option{-P} がデフォルトとして使用される。

@mayConflictWithShellBuiltIn{pwd}

@exitstatus


@node stty invocation
@section @command{stty}: 端末の諸特性を表示・変更する

@pindex stty
@cindex change or print terminal settings
@cindex terminal settings
@cindex line settings of terminal

@command{stty} は、たとえばボーレート (baud rate) のような、端末の諸特性を表示、
または変更する。

書式:

@example
stty [@var{option}] [@var{setting}]@dots{}
stty [@var{option}]
@end example

tty ラインの設定 (訳注: 上記書式の @var{setting}) を一つも指定しない場合、
@command{stty} は、ボーレートと (それをサポートしているシステムでは)
ライン制御規則番号 (line discipline number)、それに、ライン設定のうち
@samp{stty sane} によって設定される値から変更のあるものを表示する。
デフォルトでは、モードの取得や設定は、標準入力に結びついている tty ラインに対して行うが、
これは @option{--file} オプションによって変更することができる。

@command{stty} では、以下で述べるように、オプションではないたくさんの引数が使える。
そうした引数は、端末ライン運用の様々な面を変更する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp
@item -a
@itemx --all
@opindex -a
@opindex --all
現在のすべての設定を人間に読みやすい形で表示する。
このオプションを指定したときには、ラインの設定はできない。

@item -F @var{device}
@itemx --file=@var{device}
@opindex -F
@opindex --file
標準入力に結びついている tty ラインを操作の対象にする代わりに、
@var{device} で指定されたファイル名を使ってオープンするラインを操作の対象にする。
このオプションが必要なのは、POSIX 準拠の tty をオープンするには、
@code{O_NONDELAY} フラグを使う必要があるからだ。
そうしないと、POSIX 準拠の tty は、@code{clocal} フラグがセットされていない場合に、
キャリア検出線 (carrier detect line) が活発化するまで、ブロッキングを起こす。
そんなわけで、デバイスのオープンは、いつも通りのやり方で
(訳注: たとえば、@samp{stty < /dev/ttyS1} といった形で)
シェルにやらせておけばよい、というわけには必ずしも行かないのである。

@item -g
@itemx --save
@opindex -g
@opindex --save
@cindex machine-readable @command{stty} output
現在の設定を別の @command{stty} コマンドを使って再現する際に、
その引数として使えるような形で、現在のすべての設定を表示する。
このオプションを指定したときには、ラインの設定はできない。

@end table

設定の多くは、前に @samp{-} を付けることで OFF にすることができる。
以下では、そうした引数については、説明中に「無効化できる」と記しておいた。
説明そのものは、有効にする場合について、すなわち、@samp{-} で OFF にしない場合について述べている
(「無効にした場合」とはっきりことわっている場合は、もちろん別である)。

設定の中には、すべての POSIX 準拠システムで利用できるとはかぎらないものもある。
そうしたものは、拡張機能を使用しているからだ。
以下では、そうした引数については、説明中に「非 POSIX」と記しておいた。
非 POSIX のシステムであっても、そうした設定が使えないことがあるかもしれないが、
あらゆる場合について書いておくことは、不可能である。とりあえず、試してみていただきたい。

@command{stty} がインストールされるのは、POSIX ターミナルインターフェースを備えたシステムだけである。
従って、移植を考慮したスクリプトでは、非 POSIX システムに @command{stty}
コマンドが存在することを当てにしない方がよい。

@exitstatus

@menu
* Control::                  制御関係の設定
* Input::                    入力に関する設定
* Output::                   出力に関する設定
* Local::                    ローカル設定
* Combination::              組み合わせ設定
* Characters::               特殊文字
* Special::                  特殊設定
@end menu


@node Control
@subsection 制御関係の設定

@cindex control settings
制御関係の設定:

@table @samp
@item parenb
@opindex parenb
@cindex two-way parity
出力にパリティビットを生成し、入力にもパリティビットがあるものと期待する。
無効化できる。

@item parodd
@opindex parodd
@cindex odd parity
@cindex even parity
パリティを奇数に設定する。無効化できる (この設定の場合、@samp{-}
の前置は偶数パリティを意味する)。

@item cmspar
@opindex cmspar
@cindex constant parity
@cindex stick parity
@cindex mark parity
@cindex space parity
"stick" (mark/space) パリティを使用する。
parodd が設定されている場合、このパリティビットは常に 1 である。
parodd が設定されていない場合、このパリティビットは常に 0 だ。
非 POSIX。無効化できる。

@item cs5
@itemx cs6
@itemx cs7
@itemx cs8
@opindex cs@var{n}
@cindex character size
@cindex eight-bit characters
キャラクタ・サイズを 5, 6, 7, 8 ビットにする。

@item hup
@itemx hupcl
@opindex hup[cl]
最後のプロセスが tty をクローズするとき、ハングアップ・シグナルを送る。
無効化できる。

@item cstopb
@opindex cstopb
@cindex stop bits
1 キャラクタにつき 2 個のストップビットを使用する。無効化できる
(この設定の場合、@samp{-} の前置は 1 個のストップビット使用を意味する)。

@item cread
@opindex cread
入力の受信を許可する。無効化できる。

@item clocal
@opindex clocal
@cindex modem control
モデムのコントロール・シグナルを無効にする。無効化できる。

@item crtscts
@opindex crtscts
@cindex hardware flow control
@cindex flow control, hardware
@cindex RTS/CTS flow control
RTS/CTS フロー制御を有効にする。非 POSIX。無効化できる。

@item cdtrdsr
@opindex cdtrdsr
@cindex hardware flow control
@cindex flow control, hardware
@cindex DTR/DSR flow control
DTR/DSR フロー制御を有効にする。非 POSIX。無効化できる。
@end table


@node Input
@subsection 入力に関する設定

@cindex input settings
以下の設定は、端末から受け取るデータに対する操作を制御する。

@table @samp
@item ignbrk
@opindex ignbrk
@cindex breaks, ignoring
ブレーク (break) 文字を無視する。無効化できる。

@item brkint
@opindex brkint
@cindex breaks, cause interrupts
ブレークが割り込みシグナルを発生するようにする。無効化できる。

@item ignpar
@opindex ignpar
@cindex parity, ignoring
パリティエラーのある文字を無視する。無効化できる。

@item parmrk
@opindex parmrk
@cindex parity errors, marking
パリティエラーをマークする (その印として 255, 0 (0xFF, 0x00) という
2 文字の連続を使う)。無効化できる。

@item inpck
@opindex inpck
入力のパリティチェックを有効にする。無効化できる。

@item istrip
@opindex istrip
@cindex eight-bit input
入力文字の高位ビット (8 番目のビット) をクリアする。無効化できる。

@item inlcr
@opindex inlcr
@cindex newline, translating to return
改行文字 (newline) を復帰文字 (carriage return) に変換する。無効化できる。

@item igncr
@opindex igncr
@cindex return, ignoring
復帰文字を無視する。無効化できる。

@item icrnl
@opindex icrnl
@cindex return, translating to newline
復帰文字を改行文字に変換する。無効化できる。

@item iutf8
@opindex iutf8
@cindex input encoding, UTF-8
入力文字が UTF-8 で符号化されていると見なす。無効化できる。

@item ixon
@opindex ixon
@kindex C-s/C-q flow control
@cindex XON/XOFF flow control
XON/XOFF フロー制御を有効にする (すなわち、@kbd{Ctrl-S}/@kbd{Ctrl-Q}
を有効にする)。無効化できる。

@item ixoff
@itemx tandem
@opindex ixoff
@opindex tandem
@cindex software flow control
@cindex flow control, software
システムの入力バッファが一杯になりかけたら、@code{stop} 文字を送り、
バッファがほぼ空に戻ったら、@code{start} 文字を送るようにする。
無効化できる。

@item iuclc
@opindex iuclc
@cindex uppercase, translating to lowercase
大文字を小文字に変換する。非 POSIX。無効化できる。
ilcuc は実装されていないことに注意していただきたい。
そんなものを有効にしたら、ほとんどの (小文字である) Unix のコマンドが、
打ち込めなくなってしまうからだ。

@item ixany
@opindex ixany
どんな文字でも出力を再開できるようにする (これを無効にすると、start
文字のみが出力を再開する)。非 POSIX。無効化できる。

@item imaxbel
@opindex imaxbel
@cindex beeping at input buffer full
入力バッファが一杯のとき、文字を受け取ると、入力バッファをフラッシュせずに、
ビープ音を鳴らすようにする。非 POSIX。無効化できる。
@end table


@node Output
@subsection 出力に関する設定

@cindex output settings
以下の設定は、端末に送るデータに対する操作を制御する。

@table @samp
@item opost
@opindex opost
出力に対して後処理 (postprocess) を行う
(訳注: すなわち、以下に列挙するようなことをする)。無効化できる。

@item olcuc
@opindex olcuc
@cindex lowercase, translating to output
小文字を大文字に変換する。非 POSIX。無効化できる。
(ouclc は現在のところ、実装されていないことに注意。)

@item ocrnl
@opindex ocrnl
@cindex return, translating to newline
復帰文字 (carriage return) を改行文字 (newline) に変換する。
非 POSIX。無効化できる。

@item onlcr
@opindex onlcr
@cindex newline, translating to crlf
改行文字を復帰文字 + 改行文字に変換する。非 POSIX。無効化できる。

@item onocr
@opindex onocr
行頭に復帰文字を出力しない。非 POSIX。無効化できる。

@item onlret
@opindex onlret
改行が復帰として動作する。非 POSIX。無効化できる。

@item ofill
@opindex ofill
@cindex pad instead of timing for delaying
時間で間合いを計る代りに、充填文字 (埋め草文字) を何字か送ることで、遅延を行う。
非 POSIX。無効化できる。(訳注: 遅延というのは、端末側の処理が済むまで、データの送出を遅らせること)。

@item ofdel
@opindex ofdel
@cindex pad character
充填文字として ASCII NUL 文字ではなく、ASCII DEL 文字を使う。
非 POSIX。無効化できる。

@item nl1
@itemx nl0
@opindex nl@var{n}
改行 (newline) 用の遅延方式。非 POSIX。

@item cr3
@itemx cr2
@itemx cr1
@itemx cr0
@opindex cr@var{n}
復帰 (carriage return) 用の遅延方式。非 POSIX。

@item tab3
@itemx tab2
@itemx tab1
@itemx tab0
@opindex tab@var{n}
水平タブ用の遅延方式。非 POSIX。

@item bs1
@itemx bs0
@opindex bs@var{n}
バックスペース用の遅延方式。非 POSIX。

@item vt1
@itemx vt0
@opindex vt@var{n}
垂直タブ用の遅延方式。非 POSIX。

@item ff1
@itemx ff0
@opindex ff@var{n}
改ページ (form feed) 用の遅延方式。非 POSIX。
@end table


@node Local
@subsection ローカル設定

@cindex local settings

@table @samp
@item isig
@opindex isig
特殊文字 @code{interrupt}, @code{quit}, @code{suspend} を有効にする。無効化できる。

@item icanon
@opindex icanon
特殊文字 @code{erase}, @code{kill}, @code{werase}, @code{rprnt}
を有効にする。無効化できる。

@item iexten
@opindex iexten
POSIX にない特殊文字を有効にする。無効化できる。

@item echo
@opindex echo
入力した文字をエコーする。無効化できる。

@item echoe
@itemx crterase
@opindex echoe
@opindex crterase
@code{erase} 文字を「バックスペース、スペース、バックスペース」としてエコーする。無効化できる。

@item echok
@opindex echok
@cindex newline echoing after @code{kill}
@code{kill} 文字に続けて、改行文字をエコーする。無効化できる。

@item echonl
@opindex echonl
@cindex newline, echoing
他の文字のエコーを行わないない場合でも、改行文字はエコーする。
無効化できる。

@item noflsh
@opindex noflsh
@cindex flushing, disabling
特殊文字 @code{interrupt} や @code{quit} の後で、フラッシュを行わない。無効化できる。

@item xcase
@opindex xcase
@cindex case translation
@code{icanon} が設定されているとき、小文字を表す文字の頭に
@samp{\} を付けることで、大文字の入出力を可能にする。非 POSIX。無効化できる。
(訳注: たとえば、大文字しか使えない端末で、ただの @samp{A} なら小文字の
a を意味し、@samp{\A} なら大文字の A を意味するようにすること。
次節「組み合わせ設定」の lcase と termios(3) の XCASE の説明を参照。)

@item tostop
@opindex tostop
@cindex background jobs, stopping at terminal write
端末に書き込もうとしているバックグラウンドジョブを止める。
非 POSIX。無効化できる。

@item echoprt
@itemx prterase
@opindex echoprt
@opindex prterase
削除した文字を @samp{\} と @samp{/} で囲んで、逆順にエコーする。非 POSIX。
無効化できる。(訳注: プリンタ端末で使用する設定らしい。)

@item echoctl
@itemx ctlecho
@opindex echoctl
@opindex ctlecho
@cindex control characters, using @samp{^@var{c}}
@cindex hat notation for control characters
制御文字をそのまま表示するのではなく、ハット記法 (@samp{^@var{c}}) でエコーする。
非 POSIX。無効化できる。

@item echoke
@itemx crtkill
@opindex echoke
@opindex crtkill
行上の各文字を削除することで、特殊文字 @code{kill} のエコーを行う際、
@code{echoctl} や @code{echok} の設定ではなく、@code{echoprt} や
@code{echoe} の設定が指示するところに従う。非 POSIX。無効化できる。

@item extproc
@opindex extproc
@samp{LINEMODE} を有効にする。@samp{LINEMODE}
を使用すれば、各文字のエコーを遅延の大きいリンクを通して行わないで済む。
@uref{ftp://ftp.rfc-editor.org/in-notes/rfc1116.txt, Internet RFC 1116}
も参照していただきたい。非 POSIX。無効化できる。

@item flusho
@opindex flusho
出力を破棄する。この設定は、現在のところ GNU/Linux システムでは無視されることに注意。
非 POSIX。無効にできる。
@end table


@node Combination
@subsection 組み合わせ設定

@cindex combination settings
組み合わせ設定:

@table @samp
@item evenp
@opindex evenp
@itemx parity
@opindex parity
@code{parenb -parodd cs7} に相当する。無効化できる。無効化した場合、
@code{-parenb cs8} と同じになる。

@item oddp
@opindex oddp
@code{parenb parodd cs7} に相当する。無効化できる。無効化した場合、
@code{-parenb cs8} と同じになる。

@item nl
@opindex nl
@code{-icrnl -onlcr} に相当する。無効化できる。無効化した場合、@code{icrnl
-inlcr -igncr onlcr -ocrnl -onlret} と同じになる。

@item ek
@opindex ek
特殊文字 @code{erase} と @code{kill} をデフォルトの値に戻す。

@item sane
@opindex sane
以下の設定に相当する。

@c This is too long to write inline.
@example
cread -ignbrk brkint -inlcr -igncr icrnl
icanon iexten echo echoe echok -echonl -noflsh
-ixoff -iutf8 -iuclc -ixany imaxbel -xcase -olcuc -ocrnl
opost -ofill onlcr -onocr -onlret nl0 cr0 tab0 bs0 vt0 ff0
isig -tostop -ofdel -echoprt echoctl echoke -extproc
@end example

@noindent
さらに、すべての特殊文字をそのデフォルトの値に設定する。

@item cooked
@opindex cooked
@code{brkint ignpar istrip icrnl ixon opost isig icanon} に相当する。
さらに、特殊文字 @code{eof} と @code{eol} が @code{min} 及び @code{time}
と同じ文字になっていれば、@code{eof} と @code{eol} をデフォルトの値に設定する。
無効化できる。無効化した場合は、@code{raw} と同じになる。

@item raw
@opindex raw
以下の設定に相当する。

@example
-ignbrk -brkint -ignpar -parmrk -inpck -istrip
-inlcr -igncr -icrnl -ixon -ixoff -icanon -opost
-isig -iuclc -ixany -imaxbel -xcase min 1 time 0
@end example

@noindent
無効化できる。無効化した場合は、@code{cooked} と同じになる。

@item cbreak
@opindex cbreak
@option{-icanon} と同じである。無効化できる。
無効化した場合は、@code{icanon} と同じになる。

@item pass8
@opindex pass8
@cindex eight-bit characters
@code{-parenb -istrip cs8} に相当する。無効化できる。無効化した場合は、
@code{parenb istrip cs7} と同じになる。

@item litout
@opindex litout
@option{-parenb -istrip -opost cs8} に相当する。無効化できる。
無効化した場合は、@code{parenb istrip opost cs7} と同じになる。

@item decctlq
@opindex decctlq
@option{-ixany} と同じである。非 POSIX。無効化できる。

@item tabs
@opindex tabs
@code{tab0} と同じである。非 POSIX。無効化できる。無効化した場合は、
@code{tab3} と同じになる。

@item lcase
@itemx LCASE
@opindex lcase
@opindex LCASE
@code{xcase iuclc olcuc} に相当する。非 POSIX。無効化できる。
(この設定は、大文字しか扱えない端末で使用する。)

@item crt
@opindex crt
@code{echoe echoctl echoke} に相当する。

@item dec
@opindex dec
@code{echoe echoctl echoke -ixany intr ^C erase ^? kill ^U} に相当する。
@end table


@node Characters
@subsection 特殊文字

@cindex special characters
@cindex characters, special

特殊文字のデフォルトの値は、システムによって様々である。
特殊文字を設定するには、@samp{name value} という書式を用いる。
この name に何が指定できるかは、以下に列挙するが、value には、文字そのもの、
ハット記法 (@samp{^@var{c}})、整数のいづれかを指定することができる。
整数は、@samp{0x} で始まっていれば 16 進数、@samp{0} で始まっていれば
8 進数、それ以外の数字なら 10 進数と見なされる。

@cindex disabling special characters
@kindex u@r{, and disabling special characters}
GNU の stty では、値に @code{^-} や @code{undef} を指定すると、
その特殊文字を無効にする。(これは、Ultrix の @command{stty}
と互換性がない。そこでは、特殊文字を無効にするには @samp{u}
という値が使用されるのだ。GNU の @command{stty} は、@samp{u}
という値を特別扱いしない。すなわち、その特殊文字として @key{U}
を設定するだけである。)

@table @samp

@item intr
@opindex intr
割り込み (interrupt) シグナルを送る。

@item quit
@opindex quit
中止 (quit) シグナルを送る。

@item erase
@opindex erase
直前にタイプした文字を削除する。

@item kill
@opindex kill
現在行を削除する。

@item eof
@opindex eof
ファイル終端 (end of file) 文字を送る (入力を終了する)。

@item eol
@opindex eol
行を終端する。

@item eol2
@opindex eol2
行を終端する別の文字。非 POSIX。

@item discard
@opindex discard
@opindex flush
出力を廃棄するか否かをトグルで切り替える文字。非 POSIX。

@item swtch
@opindex swtch
シェルの別の層 (a different shell layer) に切り換える。非 POSIX。

@item status
@opindex status
info シグナルを送る。現在のところ Linux ではサポートされていない。非 POSIX。

@item start
@opindex start
停止している出力を再開する。

@item stop
@opindex stop
出力を停止する。

@item susp
@opindex susp
端末からの停止シグナル (terminal stop signal, SIGTSTP) を送る。

@item dsusp
@opindex dsusp
入力をフラッシュしてから、端末からの停止シグナルを送る。非 POSIX。

@item rprnt
@opindex rprnt
現在行を表示し直す。非 POSIX。

@item werase
@opindex werase
直前にタイプした単語 (word) を削除する。非 POSIX。

@item lnext
@opindex lnext
次にタイプする文字が特殊文字であっても、タイプしたとおりの文字として入力する。
非 POSIX。(訳注: たとえば、lnext が ^V の場合、^V^D
と続けてタイプすると、^D を入力終了の印としてではなく、^D
という文字そのものとして入力できるということ。)
@end table


@node Special
@subsection 特殊設定

@cindex special settings

@table @samp
@item min @var{n}
@opindex min
@option{-icanon} が設定されている際、time の値として指定されている時間が経過するまでの間に、
1 回分の読み込みの条件を満たす最少限の文字数を設定する。

@item time @var{n}
@opindex time
@option{-icanon} が設定されている際、最小限の文字数が読み込まれなかった場合に、
読み込みが時間切れになるまでの時間を 10 分の 1 秒単位で設定する。

@item ispeed @var{n}
@opindex ispeed
入力速度を @var{n} に設定する。

@item ospeed @var{n}
@opindex ospeed
出力速度を @var{n} に設定する。

@item rows @var{n}
@opindex rows
端末の行数は @var{n} 行だと、tty カーネルドライバに伝える。非 POSIX。

@item cols @var{n}
@itemx columns @var{n}
@opindex cols
@opindex columns
端末の横幅は @var{n} 桁だと、カーネルに伝える。非 POSIX。

@item drain
@opindex drain
@cindex nonblocking @command{stty} setting
保留になっている出力が送出されるのを待ち、その後で設定を適用する。
GNU の @command{stty} では、デフォルトで有効になっている。
システムが、シリアルな伝送ができない状態になっているかもしれない場合には、
このオプションを無効にするとよい。
たとえば、@code{ixon} (ソフトウェアによるフロー制御)
が有効になっている場合に、システムが @samp{DC3} 文字を受け取っていたりすると
(訳注: @samp{DC3} は device control 3、すなわち ASCII 0x13、@samp{^S})、
@code{-drain} の指定なしでは、@command{stty} はブロッキングを起こすだろう。
無効化できる。非 POSIX。

@item size
@opindex size
@vindex LINES
@vindex COLUMNS
端末の行数と桁数を表示する。これは、端末が持っていると、カーネルが考えている行数と桁数である。
(カーネルで行数や桁数をサポートしていないシステムでは、通常その代わりに、環境変数
@env{LINES} や @env{COLUMNS} が使用される。
それに対して、GNU の @command{stty} は、そうした環境変数について何も知らない。)
非 POSIX。

@item line @var{n}
@opindex line
ライン制御規則 (line discipline) @var{n} を使用する。非 POSIX。

@item speed
@opindex speed
端末速度を表示する。

@item @var{n}
@cindex baud rate, setting
入出力の速度を @var{n} に設定する。@var{n} には次の一つが使える。0 50 75 110
134 134.5 150 200 300 600 1200 1800 2400 4800 9600 19200 38400
@code{exta} @code{extb}。@code{exta} は 19200 と同じであり、@code{extb} は 38400
と同じである。GNU/Linux を含む多くのシステムが、もっと早い速度をサポートしている。
@command{stty} は、システムがサポートしているならという条件で、次の速度もサポートしている。
57600 115200 230400 460800 500000 576000 921600 1000000 1152000
1500000 2000000 2500000 3000000 3500000 4000000。
なお、0 は、@option{-clocal} が設定されている場合に、ラインを切断する。
@end table


@node printenv invocation
@section @command{printenv}: 環境変数のすべて、あるいは一部を表示する

@pindex printenv
@cindex printing all or some environment variables
@cindex environment variables, printing

@command{printenv} は、環境変数の値を表示する。

書式:

@example
printenv [@var{option}] [@var{variable}]@dots{}
@end example

@var{variable} が一つも指定されていない場合、@command{printenv}
はすべての環境変数の値を表示する。@var{variable} が指定されている場合は、
その変数それぞれについて、設定されていれば値を表示し、設定されていなければ何も表示しない。

このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.

@table @samp

@optNull

@end table

@cindex exit status of @command{printenv}
終了ステータス:

@display
0: 指定されているすべての変数が見つかった。
1: 指定されている変数のうちに、見つからなかったものがある。
2: 書き込みエラーが生じた。
@end display


@node tty invocation
@section @command{tty}: 標準入力に接続している端末のファイル名を表示する

@pindex tty
@cindex print terminal file name
@cindex terminal file name, printing

@command{tty} は、自分の標準入力に接続している端末のファイル名を表示する。
標準入力が端末ではない場合は、@samp{not a tty} というメッセージを出す。

書式:

@example
tty [@var{option}]@dots{}
@end example

このプログラムでは、以下のオプションが使える。参照: @ref{Common options}.

@table @samp

@item -s
@itemx --silent
@itemx --quiet
@opindex -s
@opindex --silent
@opindex --quiet
何も表示しない。終了ステータスを返すだけ。

@end table

@cindex exit status of @command{tty}
終了ステータス:

@display
0: 標準入力が端末である。
1: 標準入力が端末ではない。
2: 指定した引数が正しくない。
3: 書き込みエラーが生じた。
@end display


@node User information
@chapter ユーザ情報

@cindex user information, commands for
@cindex commands for printing user information

この章では、ユーザ関係の情報を表示するコマンドの説明をする。
誰がログインしているか、どんなグループに所属しているか、などである。

@menu
* id invocation::        ユーザの ID を表示する。
* logname invocation::   現在のログイン名を表示する。
* whoami invocation::    実効ユーザ ID を表示する。
* groups invocation::    ユーザが所属しているグループ名を表示する。
* users invocation::     現在ログインしている全ユーザのログイン名を表示する。
* who invocation::       現在誰がログインしているかを表示する。


@end menu


@node id invocation
@section @command{id}: ユーザの ID を表示する

@pindex id
@cindex real user and group IDs, printing
@cindex effective user and group IDs, printing
@cindex printing real and effective user and group IDs

@command{id} は、指定されたユーザについて情報を表示する。
ユーザが指定されていない場合は、@command{id} を実行しているプロセスについて情報を表示する。

書式:

@example
id [@var{option}]@dots{} [@var{user}]
@end example

@var{user} にはユーザ ID (番号) とユーザ名のどちらも使えるが、ID が頭に
@samp{+} を付けて指定されていないかぎり、まずユーザ名として検索が行われる。
@xref{Disambiguating names and IDs}.

@vindex POSIXLY_CORRECT
デフォルトで表示するのは、実ユーザ ID、実グループ ID、実効ユーザ ID
(実ユーザ ID と違う場合)、実効グループ ID (実グループID と違う場合)、
それに、補助 (supplemental) グループ ID である。
さらに、SELinux が有効になっていて、環境変数 @env{POSIXLY_CORRECT}
が設定されていない場合は、@samp{context=@var{c}} も表示する。
この @var{c} はセキュリティ・コンテキストである。

表示される各数値には、それが何であるかを示す文字列が前に付き、
対応するユーザ名やグループ名がカッコで囲まれて後ろに続く。

オプションを指定すると、@command{id} は上で述べた情報のうち、一部のみを表示する。
参照: @ref{Common options}.

@table @samp
@item -g
@itemx --group
@opindex -g
@opindex --group
グループ ID のみ表示する。

@item -G
@itemx --groups
@opindex -G
@opindex --groups
グループ ID と補助グループ ID のみ表示する。

@item -n
@itemx --name
@opindex -n
@opindex --name
ID 番号の代りに、ユーザ名やグループ名を表示する。@option{-u}, @option{-g}, @option{-G}
の一つを指定する必要がある。

@item -r
@itemx --real
@opindex -r
@opindex --real
実効ユーザや実効グループの ID ではなく、実ユーザや実グループの ID を表示する。
@option{-u}, @option{-g}, @option{-G} のどれか一つを指定する必要がある。

@item -u
@itemx --user
@opindex -u
@opindex --user
ユーザ ID のみ表示する。

@item -Z
@itemx --context
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
現プロセスのセキュリティ・コンテキストのみを表示する。
たいていの場合、それは、親プロセスから継承したユーザのセキュリティ・コンテキストである。
SELinux と SMACK のどちらも有効になっていない場合は、
警告メッセージを出し、終了ステータスを 1 にする。

@item -z
@itemx --zero
@opindex -z
@opindex --zero
出力する項目を NUL 文字で区切る。
このオプションは、デフォルトのフォーマットを使用しているときは、使うことができない。

用例:
@example
$ id -Gn --zero
users <NUL> devs <NUL>
@end example

@end table

@macro primaryAndSupplementaryGroups{cmd,arg}
プロセスの基本 (primary) グループや 補助 (supplementary) グループは、
通常その親プロセスから継承され、ログイン後ずっと変わらないのが普通だ。
従って、ログイン後にグループ・データベースを変更しても、
現在のログインセッションが続いている間は、@command{\cmd\} コマンドはその変更を反映しない。
しかし、\arg\を指定して @command{\cmd\} を実行した場合は、
ユーザ・データベースやグループ・データベースの参照が改めて行われるので、
変更した結果が表示されることになる。
@end macro
@primaryAndSupplementaryGroups{id,引数にユーザの名前}

@exitstatus

@node logname invocation
@section @command{logname}: 現在のログイン名を表示する

@pindex logname
@cindex printing user's login name
@cindex login name, printing
@cindex user name, printing

@flindex utmp
@command{logname} は、自分を呼び出しているユーザの名前を、システムが管理しているファイル
(たいていは @file{/var/run/utmp} か @file{/etc/utmp})
で調べて表示し、ステータス 0 で終了する。
自分を呼び出しているプロセスのエントリが存在しない場合は、
エラーメッセージを出し、ステータス 1 で終了する。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@exitstatus


@node whoami invocation
@section @command{whoami}: 実効ユーザ ID を表示する

@pindex whoami
@cindex effective user ID, printing
@cindex printing the effective user ID

@command{whoami} は、現在の実効ユーザ ID に対応するユーザ名を表示する。
@samp{id -un} コマンドと同じことである。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@exitstatus


@node groups invocation
@section @command{groups}: ユーザが所属しているグループ名を表示する

@pindex groups
@cindex printing groups a user is in
@cindex supplementary groups, printing

@command{groups} は、@var{username} が指定されていれば、指定された各ユーザの基本
(primary) グループ名と補助 (supplementary) グループ名を表示し、
ユーザ名が指定されていなければ、現在のプロセスの基本グループ名と補助グループ名を表示する。
複数の名前が指定されている場合は、
各ユーザの名前がグループのリストの前に置かれ、両者の間はコロンで区切られる。

書式:

@example
groups [@var{username}]@dots{}
@end example

グループのリストは、@samp{id -Gn} コマンドの出力と同じである。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@primaryAndSupplementaryGroups{groups,ユーザのリスト}

@exitstatus

@node users invocation
@section @command{users}: 現在ログインしている全ユーザのログイン名を表示する

@pindex users
@cindex printing current usernames
@cindex usernames, printing current

@cindex login sessions, printing users with
@command{users} は、目下使用しているホストに現在ログインしている全ユーザのユーザ名のリストを、
空白で区切って 1 行に表示する。
ユーザ名はログインセッションごとに表示されるので、
あるユーザが複数のログインセッションを行っていれば、
そのユーザの名前はログインセッションの数だけ出力に現れることになる。

書式:

@example
users [@var{file}]
@end example

@flindex utmp
@flindex wtmp
引数 @var{file} の指定がない場合、@command{users} はシステムが管理するファイル
(たいていは @file{/var/run/utmp} か @file{/etc/utmp})
からログインしているユーザの情報を引き出す。引数 @var{file}
が指定されている場合は、代りにそのファイルを使用する。@file{/var/log/wtmp}
が使われることが多い。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@command{users} コマンドがインストールされるのは、POSIX 準拠の @code{<utmpx.h>}
インクルードファイル、またはそれに相当するものが存在するプラットフォームだけである。
従って、移植を考慮したスクリプトでは、非 POSIX
のプラットフォームにも @command{users} コマンドが存在することを当てにしない方がよい。

@exitstatus


@node who invocation
@section @command{who}: 現在誰がログインしているかを表示する

@pindex who
@cindex printing current user information
@cindex information, about current users

@command{who} は、現在ログインしているユーザについての情報を表示する。

書式:

@example
@command{who} [@var{option}] [@var{file}] [am i]
@end example

@cindex terminal lines, currently used
@cindex login time
@cindex remote hostname
オプション以外の引数が一つもない場合、@command{who}
は現在ログインしている各ユーザについて、次の情報を表示する。
ログイン名、端末ライン、ログイン日時、それにリモート・ホスト名か X ディスプレー名。

@flindex utmp
@flindex wtmp
オプション以外の引数を一つだけ指定すると、@command{who}
はそれを、ログインしたユーザを記録しているファイルの名前として、
システムが管理しているデフォルトのファイル (たいていは @file{/var/run/utmp} か
@file{/etc/utmp}) の代りに使用する。@command{who} に引数として @file{/var/log/wtmp}
を渡して、これまでに誰がログインしたかを調べるのはよくあることである。

@opindex am i
@opindex who am i
オプション以外の引数を二つ指定すると、@command{who}は、
自分を実行しているユーザの情報のみを (自分が接続している標準入力からユーザの見当を付けて)、
ホスト名を前に付けて表示する。渡される二つの引数は、全体として
@samp{who am i} になるように、@samp{am i} とするのが慣例である。 

@vindex TZ
タイムスタンプは、タイムゾーンのルールに従って表示されるが、
そのルールを指定しているのは、環境変数 @env{TZ} である。
@env{TZ} が設定されていない場合は、システムのデフォルトのルールに従って表示される。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
The GNU C Library Reference Manual}.

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -a
@itemx --all
@opindex -a
@opindex --all
@samp{-b -d --login -p -r -t -T -u} と同じである。

@item -b
@itemx --boot
@opindex -b
@opindex --boot
システムをブートした直近の日時を表示する。

@item -d
@itemx --dead
@opindex -d
@opindex --dead
終了したプロセスに関する情報を表示する。

@item -H
@itemx --heading
@opindex -H
@opindex --heading
最初の行に各列の見出しを表示する。

@item -l
@itemx --login
@opindex -l
@opindex --login
現在システムがログインの窓口としてユーザを待ち受けているプロセスに関する情報のみを表示する。
ユーザ名は常に @samp{LOGIN} である。

@item --lookup
@opindex --lookup
utmp で見つかったホスト名について DNS を検索して正規名を得ようとする。
これがデフォルトになっていないのは、インターネットに自動ダイアルアップで接続しているシステムでは、
深刻な遅滞を招きかねないからである。

@item -m
@opindex -m
@samp{who am i} と同じである。

@item -p
@itemx --process
@opindex -p
@opindex --process
init によって生み出されたプロセスのうち、現在活動中のものをリストする。

@item -q
@itemx --count
@opindex -q
@opindex --count
ログインしているユーザのログイン名と人数のみを表示する。他のすべてのオプションを無効にする。

@item -r
@itemx --runlevel
@opindex -r
@opindex --runlevel
init プロセスの現在のランレベルを表示する (たぶん、直前のランレベルも)。

@item -s
@opindex -s
無視する。他の版の @command{who} との互換性のためにある。

@item -t
@itemx --time
@opindex -t
@opindex --time
システムクロックを最後に変更した日時を表示する。

@item -u
@opindex -u
@cindex idle time
ログイン日時の後ろに、ユーザが何時間何分端末を使用していないかを (idle 状態かを) 表示する。
@samp{.} は、ユーザがここ 1 分以内に端末操作をしたことを意味する。
@samp{old} は、ユーザが 24 時間以上端末を使用していないということである。

@item -w
@itemx -T
@itemx --mesg
@itemx --message
@itemx --writable
@opindex -w
@opindex -T
@opindex --mesg
@opindex --message
@opindex --writable
@cindex message status
@pindex write@r{, allowed}
ログイン名の後ろに、ユーザのメッセージ受け入れ状態を示す 1 文字を表示する。

@display
@samp{+} @code{write} によるメッセージを受け入れる。
@samp{-} @code{write} によるメッセージを拒否する。
@samp{?} 端末デバイスが見つからない。
@end display

@end table

@command{who} コマンドがインストールされるのは、POSIX 準拠の @code{<utmpx.h>}
インクルードファイル、またはそれに相当するものが存在するプラットフォームだけである。
従って、移植を考慮したスクリプトでは、非 POSIX
のプラットフォームにも @command{who} コマンドが存在することを当てにしない方がよい。

@exitstatus


@node System context
@chapter システム関連

@cindex system context
@cindex context, system
@cindex commands for system context

この章では、システム全体に関わる情報を表示したり、変更したりするコマンドを説明する。

@menu
* date invocation::          システムの日付や時刻を表示、設定する。
* arch invocation::          マシンのハードウェア名を表示する。
* nproc invocation::         プロセッサの数を表示する。
* uname invocation::         システムについて情報を表示する。
* hostname invocation::      システム名を表示、設定する。
* hostid invocation::        数値によるホストの識別名を表示する。
* uptime invocation::        システムの連続稼働時間と負荷を表示する。
@end menu

@node date invocation
@section @command{date}: システムの日付や時刻を表示、設定する

@pindex date
@cindex time, printing or setting
@cindex printing the current time

書式:

@example
date [@var{option}]@dots{} [+@var{format}]
date [-u|--utc|--universal] @c this avoids a newline in the output
[ MMDDhhmm[[CC]YY][.ss] ]
@end example

@vindex LC_TIME
@command{date} を @var{format} 引数なしで起動すると、
デフォルトの書式を指定して起動するのと同じことになる。
デフォルトの書式は、@env{LC_TIME} ロケール・カテゴリによって様々である。
デフォルトの C ロケールの場合、その書式は @samp{'+%a %b %e %H:%M:%S %Z %Y'}
なので、出力は @samp{Thu Mar @ 3 13:47:51 PST 2005} のような形になる。

@vindex TZ
通常 @command{date} は、環境変数 @env{TZ} が指示しているタイムゾーンのルールを使用し、
@env{TZ} が設定されていないときは、システムのデフォルトのルールを使用する。
@xref{TZ Variable,, Specifying the Time Zone with @env{TZ}, libc,
The GNU C Library Reference Manual}.

@findex strftime @r{and @command{date}}
@cindex time formats
@cindex formatting times
@samp{+} で始まる引数を指定すると、@command{date} は現在の日付と時刻を
(あるいは、後述する @option{--date} オプションで指定した日付と時刻を)、
その引数によって定義された書式で表示する。書式を指定するこの引数は、@code{strftime}
関数のそれとほぼ同じである。なお、@samp{%} で始まる変換指定子を除いて、
書式文字列中の文字は、変更されずにそのまま表示される。
変換指定子については、次節以降で説明する。

@exitstatus

@menu
* Time conversion specifiers:: 時刻関係の変換指定子 %[HIklMNpPrRsSTXzZ]。
* Date conversion specifiers:: 日付関係の変換指定子 %[aAbBcCdDeFgGhjmuUVwWxyY]。
* Literal conversion specifiers:: 文字変換指定子 %[%nt]。
* Padding and other flags::    0 や空白による空き埋め、その他。
* Setting the time::           システムクロックの変更。
* Options for date::           現在の日時以外の指定など。
@detailmenu
* Date input formats::         日付文字列の指定法。
@end detailmenu
* Examples of date::           用例。
@end menu

@node Time conversion specifiers
@subsection 時刻関係の変換指定子

@cindex time conversion specifiers
@cindex conversion specifiers, time

@command{date} の時刻関係の変換指定子

@table @samp
@item %H
時 (@samp{00}@dots{}@samp{23})
@item %I
時 (@samp{01}@dots{}@samp{12})
@item %k
時。一桁のときは、0 ではなく、空白で埋める (@samp{ 0}@dots{}@samp{23})。
@samp{%_H} と同じ。これは GNU の拡張である。
@item %l
時。一桁のときは、0 ではなく、空白で埋める (@samp{ 1}@dots{}@samp{12})。
@samp{%_I} と同じ。これは GNU の拡張である。
@item %M
分 (@samp{00}@dots{}@samp{59})
@item %N
ナノ秒 (@samp{000000000}@dots{}@samp{999999999})。これは GNU の拡張である。
@item %p
現在のロケールで @samp{AM} や @samp{PM} に相当するもの。空白になるロケールも多い。
正午は @samp{PM} として、真夜中は @samp{AM} として扱う。
@item %P
@samp{%p} と同様だが、小文字を使う。これは GNU の拡張である。
@item %r
現在のロケールによる 12 時間表記の時刻 (例: @samp{11:11:04 PM})
@item %R
24 時間表記の時と分。@samp{%H:%M} と同じ。
@item %s
@cindex epoch, seconds since
@cindex seconds since the epoch
@cindex beginning of time
@cindex leap seconds
ジ・エポック (the epoch、Unix 紀元)、すなわち 1970-01-01 00:00:00 UTC
からの経過秒数。閏秒のサポートを利用できない場合、閏秒は計算に入れない。
用例については、「@command{date} の用例」を見ること。
@xref{%s-examples}. これは GNU の拡張である。
@item %S
@cindex leap seconds
秒 (@samp{00}@dots{}@samp{60})。閏秒がサポートされている場合、@samp{60}
になることがある。
@item %T
24 時間表記の時、分、秒。@samp{%H:%M:%S} と同じ。
@item %X
現在のロケールによる時刻表示 (例: @samp{23:13:48})
@item %z
@w{RFC 2822/ISO 8601} 形式の数値によるタイムゾーン (たとえば、@samp{-0600} や
@samp{+0530})。タイムゾーンが特定できない場合は、空になる。
この値は、環境変数 @env{TZ} によって指定されたタイムゾーンのルールを使用することで、
現在の日時に対応した、数値によるタイムゾーンを正しく反映する
(訳注: 要するに、夏時間、冬時間が存在する地帯では、それを反映するということ)。
操作の対象となる日時は (もしそうしたければ、その日時におけるタイムゾーンのルールも)、
@option{--date} オプションによって変更することができる。
@item %:z
@w{RFC 3339/ISO 8601} 形式の、@samp{:} を使用する数値によるタイムゾーン
(たとえば、@samp{-06:00} や @samp{+05:30})。
タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
@item %::z
@samp{:} を使用する数値によるタイムゾーンで、もっとも近い秒まで表示する
(たとえば、@samp{-06:00:00} や @samp{+05:30:00})。
タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
@item %:::z
@samp{:} を使用する数値によるタイムゾーンで、時間の精度を必要最小限で済ます
(たとえば、@samp{-06}, @samp{+05:30}, @samp{-04:56:02})。
タイムゾーンが特定できない場合は、空になる。これは GNU による拡張である。
@item %Z
アルファベットによるタイムゾーンの略称 (たとえば、@samp{EDT})。
タイムゾーンが特定できない場合は、空になる。タイムゾーンがどのようにして特定されるか
(訳注: たとえば、アメリカ東部なら、EST (冬時間) と EDT (夏時間)
のどちらが選ばれるか) については、@samp{%z} を参照すること。
@end table


@node Date conversion specifiers
@subsection 日付関係の変換指定子

@cindex date conversion specifiers
@cindex conversion specifiers, date

@command{date} の日付関係の変換指定子。

@table @samp
@item %a
現在のロケールによる曜日の省略形 (例: @samp{Sun})
@item %A
現在のロケールによる曜日の省略しない表現。長さは不定 (例: @samp{Sunday})
@item %b
現在のロケールによる月名の省略形 (例: @samp{Jan})
@item %B
現在のロケールによる月名の省略しない表現。長さは不定 (例: @samp{January})
@item %c
現在のロケールによる日付と時刻 (例: @samp{Thu Mar @ 3 23:05:25 2005})
@item %C
世紀。@samp{%Y} に似ているが、下二桁を省略している。たとえば、@samp{%Y} が
@samp{2000} ならば、@samp{%C} は @samp{20}、@samp{%Y} が @samp{-001} ならば、@samp{%C}
は @samp{-0}
である。通例、少なくとも 2 個の文字からなるが、2 個以上のこともありえる。
@item %d
その月の何日目か (例: @samp{01})
@item %D
日付。@samp{%m/%d/%y} と同じ
@item %e
その月の何日目か。一桁のときは、0 ではなく、空白で埋める。@samp{%_d}
と同じ。
@item %F
ISO 8601 形式の完全な日付。@samp{%Y-%m-%d} と同じ。
日付の形式にこれを選ぶのは、好判断である。標準的な形式だし、年度が 0000@dots{}9999
の範囲にある通常の場合に、ソートしやすい。
@item %g
ISO 週番号に対応する年度表示だが、世紀の部分を省略している
(その結果、@samp{00} から @samp{99} の範囲になる)。
これは普通 @samp{%y} と同じ形式、同じ値になるが、ISO 週番号 (@samp{%V} 参照)
が前年、または翌年に属する場合は、そちらの年度が代りに使用される点が異なる。
@item %G
ISO 週番号に対応する年度表示。これは普通 @samp{%Y} と同じ形式、同じ値になるが、
ISO 週番号 (@samp{%V} 参照) が前年、または翌年に属する場合は、
そちらの年度が代りに使用される点が異なる。通常、これが役に立つのは、
@samp{%V} も一緒に使用するときだけである。たとえば、@samp{%G-%m-%d}
という書式は、ISO 週番号による年度と普段使用する月や日を組み合わせているので、
たぶん指定の仕方を間違えている。
@item %h
@samp{%b} と同じ。
@item %j
その年の何日目か (@samp{001}@dots{}@samp{366})
@item %m
月 (@samp{01}@dots{}@samp{12})
@item %q
四半期 (@samp{1}@dots{}@samp{4})
@item %u
その週の何日目か (@samp{1}@dots{}@samp{7})。@samp{1} は月曜日に当たる。
@item %U
日曜日を週の最初の日とする、その年の週番号 (@samp{00}@dots{}@samp{53})。
新しい年の最初の日曜日より前の日々は、第 0 週に属する。
@item %V
ISO 週番号。すなわち、月曜日を週の最初の日とする、その年の週番号
(@samp{01}@dots{}@samp{53})。1 月 1 日を含む週が、新しい年の日々を
4 日以上含む場合は、その週が第 1 週であると見なされる。
そうでない場合は、その週は前年の第 53 週であり、翌週が第 1 週になる。
(ISO 8601 の規格を参照。)
@item %w
その週の何日目か (@samp{0}@dots{}@samp{6})。0 は日曜日に当たる。
@item %W
月曜日を週の最初の日とする、その年の週番号 (@samp{00}@dots{}@samp{53})。
最初の月曜日より前の新しい年の日々は、第 0 週に属する。
@item %x
現在のロケールによる日付の表示 (例: @samp{12/31/99})
@item %y
年度の下二桁 (@samp{00}@dots{}@samp{99})
@item %Y
年度。通例、少なくとも 4 文字だが、もっと多いこともある。@samp{0000} 年は
@samp{0001} の前年であり、@samp{-001} 年は @samp{0000} の前年である。
@end table


@node Literal conversion specifiers
@subsection 文字変換指定子

@cindex literal conversion specifiers
@cindex conversion specifiers, literal

日付や時刻以外の @command{date} の変換指定子。

@table @samp
@item %%
1 個の % という文字
@item %n
改行
@item %t
水平タブ
@end table


@node Padding and other flags
@subsection 空き埋めなどのフラグ

@cindex numeric field padding
@cindex padding of numeric fields
@cindex fields, padding numeric

特に指定がないかぎり、@command{date} は通常、数値の入るフィールドの空きを
0 で埋める。従って、たとえば、数値による月名は常に二桁の数字として出力される。
しかし、ジ・エポック (Unix 紀元) 以来の経過秒数では、空きを埋めることはしない。
この秒数には決まった長さがないからである。

GNU の拡張として、以下に挙げるフラグの一つを @samp{%} の後ろに置くことができる
(指定するしないは自由)。

@table @samp
@item -
(ハイフン) フィールドの空き埋めをしない。出力が人間に見せるためのものである場合に、役に立つ。
@item _
(アンダースコア、下線) 空白で空き埋めをする。
出力を一定の文字数にする必要があるが、0 で埋めたのでは見にくいという場合に、役に立つ。
@item 0
(ゼロ) 変換指定子が普通なら空白で埋める場合にも、ゼロで空き埋めをする。
@item ^
可能なら、大文字を使う。
@item #
可能なら、反対の文字を使う。通常大文字のフィールドは小文字になり、
小文字のフィールドは大文字になる。
@end table

@noindent
空き埋めの例をいくつか挙げておく。

@example
date +%d/%m -d "Feb 1"
@result{} 01/02
date +%-d/%-m -d "Feb 1"
@result{} 1/2
date +%_d/%_m -d "Feb 1"
@result{}  1/ 2
@end example

これも GNU の拡張だが、フィールドの幅を 10 進数で指定することができる
(数字は、上記のフラグがあれば、その後ろに置く)。
そのフィールドの出力の加工前の長さが、幅として指定した文字数より短い場合は、
右詰めにして、指定サイズにまで空き埋めした結果が書き出される。たとえば、@samp{%9B}
は、右詰めにした月の名前を 9 文字分のフィールドに表示する。

上記のフラグやフィールド幅の指定の後ろに、修飾子 (modifier) を付けることもできる
(指定するしないは自由)。修飾子には、次のものがある。

@table @samp
@item E
現在のロケールが持つもう一つの日時表記を使用する。この修飾子は、@samp{%c},
@samp{%C}, @samp{%x}, @samp{%X}, @samp{%y}, @samp{%Y} に対して使用できる。
たとえば、日本語ロケールで @samp{%Ex} とすれば、元号による日付を表示するだろう。

@item O
現在のロケールが持つもう一つの数字表記を使用する。
この修飾子は、数値を表す変換指定子にしか使用できない。
@end table

書式が修飾子をサポートしていても、もう一つの表記が利用できない場合、
修飾子は無視される。


@node Setting the time
@subsection システムクロックの設定

@cindex setting the time
@cindex time setting
@cindex appropriate privileges

@samp{+} で始まらない引数を指定すると、@command{date} は、(以下で述べるように)
その引数で指定した日時にシステムクロックを設定する。
システムクロックを設定するには、しかるべき権限が必要である。リブート後も変更を維持するには、
システムクロックに合わせてハードウェアクロックも更新する必要があるかもしれないことに注意していただきたい。
ご使用のシステムでは、ハードウェアクロックの更新は、自動的に行われないかもしれないからだ。

引き数の構成要素は、すべて数字でなければならない。それは以下の意味を持っている。

(訳注: 念のため、この章の冒頭にあるシステムクロック設定用の書式を再掲しておく。
date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ])

@table @samp
@item MM
何月
@item DD
(何月の) 何日
@item hh
何時
@item mm
何分
@item CC
年度の上二桁 (省略可)
@item YY
年度の下二桁 (省略可)
@item ss
何秒 (省略可)
@end table

注意していただきたいが、@option{--date} や @option{--set} オプションは、
ここで述べている書式の引数と組み合わせて使うことができない。
@option{--universal} オプションは、ここで述べている書式の引数と一緒に使うことができるが、
その場合は、指定されている日時が現在地のタイムゾーンではなく、協定世界時
(UTC) に準じているのを示すことになる。


@node Options for date
@subsection @command{date} のオプション

@cindex @command{date} options
@cindex options for @command{date}

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -d @var{datestr}
@itemx --date=@var{datestr}
@opindex -d
@opindex --date
@cindex parsing date strings
@cindex date strings, parsing
@cindex arbitrary date strings, parsing
@opindex yesterday
@opindex tomorrow
@opindex next @var{day}
@opindex last @var{day}
現在の日時の代りに、日付文字列 @var{datestr} で指定した日時を表示する。
@var{datestr} には、よく使われる書式なら、ほとんどどんな書式でも使うことができる。
月の名前、タイムゾーン、@samp{am} や @samp{pm}、@samp{yesterday}
といった単語、などを含んでいてもよい。たとえば、@option{--date="2004-02-27
14:19:13.489392193 +0530"} は、UTC よりも東 5 時間 30 分のタイムゾーンで
2004 年 2 月 27 日 午後 2 時 19 分 13 秒から 489,392,193
ナノ秒経過した瞬間を指定している。@*
注意: 現在のところ、入力は、ロケールに依存しない書式でなければならない。
たとえば、以下の例の LC_TIME=C は、多くのロケールで正しい日時を再表示させるために必要である。
@example
date -d "$(LC_TIME=C date)"
@end example
参照: @xref{Date input formats}.

@item --debug
@opindex --debug
@cindex debugging date strings
@cindex date strings, debugging
@cindex arbitrary date strings, debugging
解析した日時について説明し、現在のタイムゾーンを表示し、
間違えた使い方をしている疑いがあれば、警告を出す。

@item -f @var{datefile}
@itemx --file=@var{datefile}
@opindex -f
@opindex --file
ファイル @var{datefile} の各行を @option{-d}
の場合と同じように解析して、生成された日付と時刻を表示する。
@var{datefile} が @samp{-} ならば、標準入力を使用する。
処理する日付がたくさんある場合に、このオプションは重宝である。
何故ならば、@command{date} コマンドを何度も起動するときのシステムのオーバーヘッドは、
馬鹿にならないことがあるからだ。

@item -I[@var{timespec}]
@itemx --iso-8601[=@var{timespec}]
@opindex -I[@var{timespec}]
@opindex --iso-8601[=@var{timespec}]
ISO 8601 の書式、@samp{%Y-%m-%d} を使って、日付を表示する。

引数 @var{timespec} では、日付の後ろに時刻をどの単位まで追加するかを指定する。
以下の一つを指定することができる。
@table @samp
@item date
日付のみを表示する。@var{timespec} を省略した場合のデフォルト。

@item hours
日付にその日の何時かを追加する。

@item minutes
何時何分まで追加する。

@item seconds
何時何分何秒まで追加する。

@item ns
何時何分何秒何ナノ秒まで追加する。
@end table

時刻の部分まで表示するときは、@samp{%:z} の書式でタイムゾーンも付ける。
@macro dateParseNote
この書式は、使用しているロケールが何であるかを問わず、@option{--date} (@option{-d})
や @option{--file} (@option{-f}) オプションに対する入力として、常に適切である。
@end macro
@dateParseNote

@item -r @var{file}
@itemx --reference=@var{file}
@opindex -r
@opindex --reference
現在の日付と時刻の代りに、@var{file} の内容を最後に更新した (the last
modification) 日付と時刻を表示する。

@item -R
@itemx --rfc-822
@itemx --rfc-2822
@opindex -R
@opindex --rfc-822
@opindex --rfc-2822
日付と時刻を @samp{%a, %d %b %Y %H:%M:%S %z} という書式を使用し、
C ロケールで評価して表示する。従って、月や曜日の省略形は常に英語になる。
一例を挙げると、こんな表示である。

@example
Fri, 09 Sep 2005 13:51:39 -0700
@end example

この書式は、@uref{ftp://ftp.rfc-editor.org/in-notes/rfc2822.txt, Internet RFC
2822}
と @uref{ftp://ftp.rfc-editor.org/in-notes/rfc822.txt, RFC 822} に従っている。
インターネットの E メールに関する現在と以前の規格である。

@item --rfc-3339=@var{timespec}
@opindex --rfc-3339=@var{timespec}
@uref{ftp://ftp.rfc-editor.org/in-notes/rfc3339.txt, Internet RFC 3339}
が規定している書式を使用して、日付を表示する。この書式は、ISO 8601
の書式のサブセットだが、日付と時刻を区切るのに、@samp{T}
という文字ではなく、空白を使うことをアプリケーションに許しているという相違点がある。
@dateParseNote

引数 @var{timespec} では、時刻をどこまで表示するかを指定する。
以下の一つを指定することができる。

@table @samp
@item date
年から始まる日付だけを表示する。たとえば、@samp{2005-09-14}。
これは、@samp{%Y-%m-%d} という書式と等価である。

@item seconds
年から始まる日付と秒までの時刻を表示し、両者の間は空白で区切る。
一例を挙げると、@samp{2005-09-14 00:56:06+05:30}。出力の末尾には、
協定世界時からの時差が付く。例の場合、@samp{+05:30} は、地方時が
UTC より 5 時間 30 分進んでいることを意味している。
これは、@samp{%Y-%m-%d %H:%M:%S%:z} という書式と等価である。

@item ns
@samp{seconds} と似ているが、ナノ秒まで表示する。
一例を挙げると、@samp{2005-09-14 00:56:06.998458565+05:30}。
これは、@samp{%Y-%m-%d %H:%M:%S.%N%:z} という書式と等価である。

@end table

@item -s @var{datestr}
@itemx --set=@var{datestr}
@opindex -s
@opindex --set
日付と時刻を @var{datestr} に設定する。上記の @option{-d} を参照。
前節「システムクロックの設定」 も参照すること。@ref{Setting the time}.

@item -u
@itemx --utc
@itemx --universal
@opindex -u
@opindex --utc
@opindex --universal
@cindex Coordinated Universal Time
@cindex UTC
@cindex Greenwich Mean Time
@cindex GMT
@cindex leap seconds
@vindex TZ
環境変数 @env{TZ} が、文字列 @samp{UTC0} に設定されているかのように、
処理に協定世界時 (UTC, Coordinated Universal Time) を使用する。
協定世界時は、歴史的な理由から「グリニッジ標準時 (GMT)」と呼ばれることもよくある。
一般にシステムは閏秒を無視するので、日時は正真の UTC ではなく、UTC の近似値になる。
@end table


@node Examples of date
@subsection @command{date} の使用例

@cindex examples of @command{date}

用例をいくつか挙げてみる。前節の @option{-d} オプションの説明も参照していただきたい。

@itemize @bullet

@item
一昨日の日付を表示する。

@example
date --date='2 days ago'
@end example

@item
今から 3 ヶ月と 1 日後の日付けを表示する。

@example
date --date='3 months 1 day'
@end example

@item
今年のクリスマスは年の初めから何日目かを表示する。

@example
date --date='25 Dec' +%j
@end example

@item
今日が何月何日かを、省略しない月の名前で表示する。

@example
date '+%B %d'
@end example

しかし、月の最初の 9 日間では、@samp{%d} は空きを 0 で埋めた
2 桁のフィールドに展開されるので、この結果はご希望のものとは違うかもしれない。
たとえば、@samp{date -d 1may '+%B %d'} の出力は、@samp{May 01} になるのだ。

@item
月のうちの 1 桁の日々に対して、先頭に 0 を付けずに日付を表示したいのなら、
(GNU の拡張である) @samp{-} フラグを使用すれば、空き埋めを全くしないようにすることができる。

@example
date -d 1may '+%B %-d'
@end example

@item
現在の日付と時刻を、non-GNU 版の @command{date}
の多くでシステムクロックを設定するときに要求される書式で表示する。

@example
date +%m%d%H%M%Y.%S
@end example

@item
システムクロックを 2 分進める。

@example
date --set='+2 minutes'
@end example

@item
日付を RFC 2822 の書式で表示するためには、@samp{date --rfc-2822}
を使用する。ここに示すのは、出力の一例である。

@example
Fri, 09 Sep 2005 13:51:39 -0700
@end example

@anchor{%s-examples}
@item
日付を表す文字列をジ・エポック (the epoch、Unix 紀元、すなわち、
1970-01-01 00:00:00 UTC) からの経過秒数に変換するには、@option{--date}
オプションを @samp{%s} 書式と組み合わせて使用する。
これは、データを日付によってソートしたり、グラフ化したり、比較したりする際に、便利である。
次のコマンドは、ジ・エポックから 2 分経ったときの、ジ・エポックからの経過秒数を出力する。

@example
date --date='1970-01-01 00:02:00 +0000' +%s
120
@end example

日付を表す文字列でタイムゾーン情報を指定しない場合、@command{date}
は、コンピュータが認識しているタイムゾーンを使用して、その文字列を解釈する。
たとえば、使用しているコンピュータのタイムゾーンが、マサチューセッツ州のケンブリッジのものならば、
それは UTC より 5 時間遅れているので、次のようになる。

@example
# 現在地のタイムゾーンを使用
date --date='1970-01-01 00:02:00' +%s
18120
@end example

@item
日付の付いたデータをソートしたり、グラフ化したりしているとしよう。
その日付の加工前の値は、ジ・エポックからの経過秒数で表されているかもしれない。
だが、@samp{946684800} といった日付を見て、
「ああ、イギリスのグリニッジの 2000 年の最初の 0 秒だね」と、
さりげなく言える人は、めったにいない。

@example
date --date='2000-01-01 UTC' +%s
946684800
@end example

なお、上と同じ結果は、@option{--utc} (@option{-u}) オプションを使っても得られ、
その場合は、日付を表す文字列で @samp{UTC} を省略することができる。
とは言え、@option{--utc} を使う方法は、@samp{%s} を始め、多くの書式文字列では、
日付文字列で @samp{UTC} を使うのと同じ結果をもたらすものの、
協定世界時からの時差が 0 ではないタイムゾーンでは、
@samp{%z} のようなタイムゾーンによって値が変わってくる書式文字列に対しては、
異なる結果をもたらすことになるだろう。

@example
date -u --date=2000-01-01 +%s
946684800
@end example

こうした秒数という扱いにくいデータをもっと読みやすい形に変換し直すには、
次のようなコマンドを使う。

@smallexample
# 現在地のタイムゾーンを使用
date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z"
1999-12-31 19:00:00 -0500
@end smallexample

coreutils 5.3.0 以来使用できるようになった @samp{@@}
という表記に頼っても構わないなら、上記のコマンドを短くすることができる
(参照: @ref{Seconds since the Epoch})。

@smallexample
date -d @@946684800 +"%F %T %z"
1999-12-31 19:00:00 -0500
@end smallexample

UTC の日付や時刻を出力した方がよいことも多い。

@smallexample
date -u -d '1970-01-01 946684800 seconds' +"%Y-%m-%d %T %z"
2000-01-01 00:00:00 +0000
@end smallexample

@item
@cindex leap seconds
閏秒は秒数計算に入れないのが一般的だが、例外的なシステムもある。
閏秒は予測できないものなので、閏秒を計算に入れる例外的なシステムでは、
秒数による計算と未来の日時との対応は信頼性に欠ける。

一般的なシステムと例外的なシステムの両者が、2012-06-30 23:59:60 UTC
の閏秒をどのように処理しているかを以下に示す。

@example
# 一般的なシステムは閏秒を無視する:
date --date='2012-06-30 23:59:59 +0000' +%s
1341100799
date --date='2012-06-30 23:59:60 +0000' +%s
date: invalid date '2012-06-30 23:59:60 +0000'
date --date='2012-07-01 00:00:00 +0000' +%s
1341100800
@end example

@example
# 例外的なシステムは閏秒をカウントする:
date --date='2012-06-30 23:59:59 +0000' +%s
1341100823
date --date='2012-06-30 23:59:60 +0000' +%s
1341100824
date --date='2012-07-01 00:00:00 +0000' +%s
1341100825
@end example

@end itemize


@node arch invocation
@section @command{arch}: マシンのハードウェア名を表示する

@pindex arch
@cindex print machine hardware name
@cindex system information, printing

@command{arch} は、マシンのハードウェア名を表示する。@samp{uname -m} と同じことである。

書式:

@example
arch [@var{option}]
@end example

このプログラムでは、共通オプションしか使用できない。@ref{Common options}.

@command{arch} は、デフォルトではインストールされない。
従って、移植を考慮したスクリプトでは、@command{arch} コマンドが存在することを当てにしない方がよい。

@exitstatus


@node nproc invocation
@section @command{nproc}: 利用できるプロセッサの個数を表示する

@pindex nproc
@cindex Print the number of processors
@cindex system information, printing

カレントプロセスが利用できるプロセシング・ユニットの個数を表示する。
それは、稼働しているプロセッサの数より少ないかもしれない。
そうした情報が取得できない場合は、搭載されているプロセッサの数を表示する。
環境変数 @env{OMP_NUM_THREADS} が設定されている場合は、
その変数が、返される値を決めることになる。なお、結果は必ず 0 より大きくなる。

書式:

@example
nproc [@var{option}]
@end example

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item --all
@opindex --all
システムに搭載されているプロセッサの数を表示する。
それは、稼働しているプロセッサや、カレントプロセスが利用できるプロセッサの数より多いかもしれない。
このオプションを付けた場合、環境変数 @env{OMP_NUM_THREADS} は考慮されない。

@item --ignore=@var{number}
@opindex --ignore
可能ならば、@var{number} 個のプロセシング・ユニットを除外する。

@end table

@exitstatus


@node uname invocation
@section @command{uname}: システムについて情報を表示する

@pindex uname
@cindex print system information
@cindex system information, printing

@command{uname} は、自分がその上で実行されているマシンとオペレーティング・システムについて情報を表示する。
オプションが一つも指定されない場合は、@option{-s} オプションが指定されたかのように振る舞う。

書式:

@example
uname [@var{option}]@dots{}
@end example

複数のオプションや @option{-a} オプションが指定された場合、選択された情報は次の順番で表示される。

@example
@var{kernel-name} @var{nodename} @var{kernel-release} @var{kernel-version}
@var{machine} @var{processor} @var{hardware-platform} @var{operating-system}
@end example

個々の情報が空白を含んでいることがある。そうした場合、出力のどこからどこまでが、
ある情報に当たるかを判断することは難しい。以下の例で @var{release}
に当たるのは、@samp{2.2.18 #4 SMP Tue Jun 5 11:24:08 PDT 2001} の部分である。

(訳注: @var{release} が @var{kernel-release} のことならば、それに相当するのは
@samp{2.2.18} だけである。#4 から 2001 までは @var{kernel-version}。
原文は両者を合わせて、@var{release} と言っているのかもしれない。
なお、以下の例はちょっと古い。最近の @command{uname -a} では、@option{-a}
オプションの説明にあるように、unknown の部分は表示されないはずである。)

@smallexample
uname -a
@result{} Linux dumdum 2.2.18 #4 SMP Tue Jun 5 11:24:08 PDT 2001 i686@c
 unknown unknown GNU/Linux
@end smallexample


このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -a
@itemx --all
@opindex -a
@opindex --all
以下の情報をすべて表示する。ただし、プロセッサ・タイプとハードウェア・プラットホームは、unknown ならば省略する。

@item -i
@itemx --hardware-platform
@opindex -i
@opindex --hardware-platform
@cindex implementation, hardware
@cindex hardware platform
@cindex platform, hardware
ハードウェア・プラットホームの名前を表示する (ハードウェア実装と呼ばれることもある)。
その情報が取得できない場合は、@samp{unknown} と表示する。
このオプションは、(GNU/Linux ディストリビューション同士の間ですら)
可搬性がない。

@item -m
@itemx --machine
@opindex -m
@opindex --machine
@cindex machine type
@cindex hardware class
@cindex hardware type
マシンのハードウェア名を表示する (ハードウェア・クラスとかハードウェア・タイプと呼ばれることもある)。

@item -n
@itemx --nodename
@opindex -n
@opindex --nodename
@cindex hostname
@cindex node name
@cindex network node name
ネットワークノードのホスト名を表示する。

@item -p
@itemx --processor
@opindex -p
@opindex --processor
@cindex host processor type
プロセッサ・タイプを表示する (命令セット体系、the instruction
set architecture、ISA などと呼ばれることもある)。
その情報が取得できない場合は、@samp{unknown} と表示する。
このオプションは、(GNU/Linux ディストリビューション同士の間ですら)
可搬性がない。

@item -o
@itemx --operating-system
@opindex -o
@opindex --operating-system
@cindex operating system name
オペレーティング・システムの名前を表示する。

@item -r
@itemx --kernel-release
@opindex -r
@opindex --kernel-release
@cindex kernel release
@cindex release of kernel
カーネルのリリース名を表示する。

@item -s
@itemx --kernel-name
@opindex -s
@opindex --kernel-name
@cindex kernel name
@cindex name of kernel
カーネル名を表示する。POSIX 1003.1-2001 では (@pxref{Standards
conformance})、これを「オペレーティング・システムの実装」と呼んでいる。
POSIX の仕様には、カーネルという概念がないからである。
カーネル名は、@option{-o} や  @option{--operating-system}
オプションで表示されるオペレーティング・システム名と同じかもしれないし、
違うかもしれない。オペレーティング・システムによって、
基盤となっているカーネルと名前が同じものもあれば (FreeBSD, HP-UX など)、
違うものもある (GNU/Linux, Solaris など) からである。

@item -v
@itemx --kernel-version
@opindex -v
@opindex --kernel-version
@cindex kernel version
@cindex version of kernel
カーネルのバージョンを表示する。

@end table

@exitstatus


@node hostname invocation
@section @command{hostname}: システムの名前を表示、または設定する

@pindex hostname
@cindex setting the hostname
@cindex printing the hostname
@cindex system name, printing
@cindex appropriate privileges

@command{hostname} は、引数なしで実行すると、使用しているホストシステムの名前を表示する。
引数を一つ付けて実行すると、指定した文字列を使用しているホストの名前として設定する。
ホストの名前を設定するには、しかるべき権限が必要である。

書式:

@example
hostname [@var{name}]
@end example

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@command{hostname} は、デフォルトではインストールされない。
また、coreutils 以外のパッケージにも @command{hostname} コマンドを提供するものがある。
従って、移植を考慮したスクリプトでは、@command{hostname}
コマンドが存在することや、上記通りの動作をすることを当てにしない方がよい。

@exitstatus


@node hostid invocation
@section @command{hostid}: 数値によるホストの識別名を表示する

@pindex hostid
@cindex printing the host identifier

@command{hostid} は、使用しているホストの数値による識別名を 16 進数で表示する。
このコマンドは引数を取らない。使用できるオプションは、@option{--help} と
@option{--version} だけである。@xref{Common options}.

たとえば、筆者が使っているシステムの一つでは、次のように表示される。

@example
$ hostid
1bac013d
@end example

たまたまこのシステムでは、識別名の 32 ビットの数値が、システムのインターネット・アドレスと密接な関係を持っているが、
いつでもそうとはかぎらない。

@command{hostid} がインストールされるのは、@code{gethostid} 関数が存在するシステムだけである。
従って、移植を考慮したスクリプトでは、@command{hostid} の存在を当てにしない方がよい。

@exitstatus

@node uptime invocation
@section @command{uptime}: システムの連続稼働時間と負荷を表示する

@pindex uptime
@cindex printing the system uptime and load

@command{uptime} は、現在の時刻、システムの連続稼働時間、ログインしているユーザの数、
それに現在の平均負荷 (load average) を表示する。

引数を指定すると、ユーザが何人ログインしているかを知るために読み込むファイルとして、その引数が使用される。
引数を指定しない場合は、システムのデフォルトが使用される
(@command{uptime --help} を実行すれば、デフォルトの設定がわかる)。

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

たとえば、以下の例は、筆者が使っているシステムの一つで、ちょうど今表示されたものだ。

@example
$ uptime
 14:07  up   3:35,  3 users,  load average: 1.39, 1.15, 1.04
@end example

細かいことを言うと、平均負荷の計算方法は、システムによっていくらか異なっている。
あるシステムでは、ここ 1 分間、5 分間、15 分間の、実行可能状態のプロセスの平均数として計算されるが、
別のシステムでは、割り込み不可能なスリープ状態のプロセスも含めている
(すなわち、ディスク I/O を待っているプロセスだ)。
Linux のカーネルは、割り込み不可能なプロセスを含める方である。

@command{uptime} がインストールされるのは、
ブート日時を取得するための下部構造を備えているプラットフォームだけである。
また、coreutils 以外のパッケージにも、@command{uptime} コマンドを提供しているものがある。
従って、移植を考慮したスクリプトでは、@command{uptime} コマンドが存在することや、
上記通りの動作をすることを当てにしない方がよい。

@exitstatus

@node SELinux context
@chapter SELinux コンテキスト

@cindex SELinux context
@cindex SELinux, context
@cindex commands for SELinux context

この章では、SELinux コンテキスト関係の操作を行うコマンドを説明する。

@menu
* chcon invocation::     ファイルの SELinux コンテキストを変更する
* runcon invocation::    指定された SELinux コンテキストでコマンドを実行する
@end menu

@node chcon invocation
@section @command{chcon}: ファイルの SELinux コンテキストを変更する

@pindex chcon
@cindex changing security context
@cindex change SELinux context

@command{chcon} は、指定されたファイルの SELinux セキュリティ・コンテキストを変更する。

書式:

@smallexample
chcon [@var{option}]@dots{} @var{context} @var{file}@dots{}
chcon [@var{option}]@dots{} [-u @var{user}] [-r @var{role}] [-l @var{range}]@c
 [-t @var{type}] @var{file}@dots{}
chcon [@var{option}]@dots{} --reference=@var{rfile} @var{file}@dots{}
@end smallexample

各 @var{file} の SELinux セキュリティ・コンテキストを @var{context} に変更する。
@option{--reference} オプションを使用した場合は、
各 @var{file} のセキュリティ・コンテキストを @var{rfile} のそれに変更する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item --dereference
@opindex --dereference
シンボリックリンクそのものではなく、リンクが指しているものを操作の対象にする。
これがデフォルトである。

@item -h
@itemx --no-dereference
@opindex -h
@opindex --no-dereference
@cindex no dereference
参照先のファイルではなく、シンボリックリンクそのものを操作の対象にする。

@item --reference=@var{rfile}
@opindex --reference
@cindex reference file
@var{context} の値を直接指定する代わりに、@var{rfile} のセキュリティ・コンテキストを使用する。

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
ファイルやディレクトリに対して再帰的に動作する。

@item --preserve-root
@opindex --preserve-root
@option{--recursive} オプションと一緒に使ったとき、ルートディレクトリ (@file{/})
に対して再帰的に動作することを拒否する。 @xref{Treating / specially}.

@item --no-preserve-root
@opindex --no-preserve-root
@option{--recursive} オプションと一緒に使ったとき、ルートディレクトリ (@file{/})
を特別扱いしない。こちらがデフォルトの動作である。 @xref{Treating / specially}.

@choptH @xref{Traversing symlinks}.

@choptL @xref{Traversing symlinks}.

@choptP @xref{Traversing symlinks}.

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
@cindex diagnostic
処理したすべてのファイルについてメッセージを表示する。

@item -u @var{user}
@itemx --user=@var{user}
@opindex -u
@opindex --user
操作対象のセキュリティ・コンテキストのユーザを @var{user} にする。

@item -r @var{role}
@itemx --role=@var{role}
@opindex -r
@opindex --role
操作対象のセキュリティ・コンテキストのロールを @var{role} にする。

@item -t @var{type}
@itemx --type=@var{type}
@opindex -t
@opindex --type
操作対象のセキュリティ・コンテキストのタイプを @var{type} にする。

@item -l @var{range}
@itemx --range=@var{range}
@opindex -l
@opindex --range
操作対象のセキュリティ・コンテキストのセキュリティ・レベルの範囲を @var{range} にする。

@end table

@exitstatus

@node runcon invocation
@section @command{runcon}: 指定された SELinux コンテキストでコマンドを実行する。

@pindex runcon
@cindex run with security context


@command{runcon} は、指定された SELinux セキュリティ・コンテキストでファイルを実行する。

書式:
@smallexample
runcon @var{context} @var{command} [@var{args}]
runcon [ -c ] [-u @var{user}] [-r @var{role}] [-t @var{type}]@c
 [-l @var{range}] @var{command} [@var{args}]
@end smallexample

セキュリティ・コンテキストのすべてを @var{context} で指定して、@var{command}
を実行する。あるいは、現在の、または遷移後のセキュリティ・コンテキストのうち、
ユーザ、ロール、タイプ、レベルの一つ以上を変更して、@var{command} を実行する。

@option{-c}, @option{-u}, @option{-r}, @option{-t}, @option{-l}
のどのオプションも指定されていない場合は、最初の引数が完全なコンテキストとして使用される。
@var{command} の後ろに続く引数があれば、それはそのコマンドに対する引数と見なされる。

@var{context} と @var{command} のどちらも指定されていない場合は、
現在のセキュリティ・コンテキストを表示する。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -c
@itemx --compute
@opindex -c
@opindex --compute
セキュリティ・コンテキストの変更を行う前に、プロセスの遷移によるコンテキストを求める。

@item -u @var{user}
@itemx --user=@var{user}
@opindex -u
@opindex --user
操作対象のセキュリティ・コンテキストのユーザを @var{user} にする。

@item -r @var{role}
@itemx --role=@var{role}
@opindex -r
@opindex --role
操作対象のセキュリティ・コンテキストのロールを @var{role} にする。

@item -t @var{type}
@itemx --type=@var{type}
@opindex -t
@opindex --type
操作対象のセキュリティ・コンテキストのタイプを @var{type} にする。

@item -l @var{range}
@itemx --range=@var{range}
@opindex -l
@opindex --range
操作対象のセキュリティ・コンテキストのセキュリティ・レベルの範囲を @var{range} にする。

@end table

@cindex exit status of @command{runcon}
終了ステータス:

@display
126: @var{command} が見つかったが、起動できなかった。
127: @command{runcon} そのものの実行に失敗した。あるいは、@var{command} が
     見つからなかった。
それ以外は、@var{command} の終了ステータス。
@end display

@node Modified command invocation
@chapter コマンド実行条件の変更

@cindex modified command invocation
@cindex invocation of commands, modified
@cindex commands for invoking other commands

この章で説明するコマンドは、他のコマンドを現在の条件とは違った条件で実行するものである。
たとえば、環境を変更して実行する、別のユーザとして実行するといったコマンドだ。

(訳注:　「別のユーザとして実行する」というのは、@command{chroot}
の @option{--userspec} オプションを指していると考えられなくもないが、
元々は @command{su} コマンドのことを言っていたのだと思う。
@command{su} も以前はこの章で説明されていたが、現在では coreutils
に収録されていない。)

@menu
* chroot invocation::        ルート・ディレクトリを変更する。
* env invocation::           環境変数を変更する。
* nice invocation::          niceness を変更する。
* nohup invocation::         ハングアップ・シグナルで終了しない。
* stdbuf invocation::        標準ストリームのバッファリングを変更する。
* timeout invocation::       タイムリミット付きで実行する。
@end menu


@node chroot invocation
@section @command{chroot}: ルートディレクトリを変更して、コマンドを実行する

@pindex chroot
@cindex running a program in a specified root directory
@cindex root directory, running a program in a specified

@command{chroot} は、指定されたディレクトリをルートディレクトリにして、コマンドを実行する。
多くのシステムでは、この操作を行うことができるのはスーパーユーザだけである。
@footnote{もっとも、システムによっては (たとえば、FreeBSD がそうだが)、
特定の一般ユーザが @code{chroot} システムコールを使用できるように設定できるものもある。
従って、そうしたユーザは @command{chroot} コマンドを実行できるわけだ。
また、Cygwin では、どんなユーザでも @command{chroot} コマンドを実行できる。
MS-Windows が chroot 関数をサポートしていないため、
内部で使用する関数が特権とは無関係だからである。
なお、@var{newroot} が元の @file{/} ディレクトリと同じ場合、@command{chroot}
コマンドは @code{chroot} システムコールを使わないで済まそうとする。
これは、非特権ユーザにもそうしたことが許されているシステムとの一貫性を保つためである。}

書式:

@example
chroot @var{option} @var{newroot} [@var{command} [@var{args}]@dots{}]
chroot @var{option}
@end example

通常、ファイル名の検索は、ディレクトリ構造の根 (ルート、root)、すなわち
@file{/} を起点として行われる。@command{chroot} はこのルートを @var{newroot}
ディレクトリ (実在するディレクトリでなければならない) に変更し、
さらに、作業ディレクトリを @file{/} に変更して、最後に @var{command}
を、@var{args} の指定があれば @var{args} を付けて実行する。
@var{command} が指定されていない場合、デフォルトのコマンドは、環境変数
@env{SHELL} の値か、@env{SHELL} が設定されていなければ、@command{/bin/sh} であり、
それが @option{-i} オプションを付けて、呼び出される。
@var{command} は シェルの組み込みコマンドであってはならない
(@pxref{Special built-in utilities})。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp

@item --groups=@var{groups}
@opindex --groups
このオプションを使えば、新しいプロセスが使用する補助 @var{groups}
を変更することができる。グループのリストの各項目 (名前でも ID 番号でもよい)
は、コンマで区切られていなければならない。
@option{--userspec} オプションで自動的に行われる補助グループの照合をしないようにするには、
@samp{--groups=''} を使用すればよい。

@item --userspec=@var{user}[:@var{group}]
@opindex --userspec
デフォルトでは、@var{command} は呼び出し側のプロセスと同じ資格情報を使って実行されるが、
このオプションを使えば、@var{command} を別の @var{user}
の資格で実行することができる。別の基本 @var{group} を指定することも可能だ。
@var{user} が指定された場合、補助グループは、そのユーザについてシステムが設定しているリストと同じものになる。
ただし、@option{--groups} オプションによって置き換えられる場合は別だ。

@item --skip-chdir
@opindex --skip-chdir
ルートディレクトリを @var{newroot} に変更した後で
(すなわち chroot 環境中で)、作業ディレクトリを @file{/}
に変更したくなかったら、このオプションを使えばよい。
このオプションが使用できるのは、@var{newroot} が元の @file{/}
ディレクトリと同じときだけであり、従って、役に立つのは、
@option{--groups} や "@option{--userspec} と一緒に使い、
元の作業ディレクトリに留まっていたい場合がほとんどである。

@end table

@option{--userspec} や @option{--groups} オプションによって行われるユーザ名やグループ名の照合は、
chroot 環境の外側と内側の両方で行われるが、chroot 環境の内側で成功した照合が優先される。
ユーザやグループの指定で ID 番号を使うつもりならば、数字の前に @samp{+}
を付ければ、名前を ID 番号に還元するステップが行われないで済む。
@xref{Disambiguating names and IDs}.

chroot を使う上でよくある問題を避けることができるように、
ちょっとした情報をいくつか挙げておく。まず簡単なことから言うと、@var{command}
は、静的にリンクしたバイナリを指すようにした方がよい。
もし、動的にリンクした実行ファイルを使用するのならば、
共有ライブラリが新しいルートディレクトリ以下の適切な場所に存在するように、
前もって準備しておく必要があるだろう。

たとえば、静的にリンクした @command{ls} の実行ファイルを作成して、
@file{/tmp/empty} に置けば、root ユーザとして次のようなコマンドを実行することができる。

@example
$ chroot /tmp/empty /ls -Rl /
@end example

出力はこんなふうになるだろう。

@example
/:
total 1023
-rwxr-xr-x 1 0 0 1041745 Aug 16 11:17 ls
@end example

もし、動的にリンクした実行ファイル、たとえば @command{bash} を使いたいならば、
まず @samp{ldd bash} を実行して、どんな共有オブジェクトファイルが必要かを調べることだ。
それから、@command{bash} 自体のバイナリをコピーするだけでなく、@samp{ldd bash}
でリストされたファイルも、新しいルートディレクトリになるディレクトリ以下のしかるべき場所にコピーしておく。
さらに、実行ファイルが何か他のファイルも必要としているなら
(たとえば、データファイル、ステータスファイル、デバイスファイルなど)、
それも適切な場所にコピーする。

@command{chroot} がインストールされるのは、@code{chroot} 関数を持つシステムだけである。
従って、移植を考慮したスクリプトでは、@command{chroot} が存在することを当てにしない方がよい。

@cindex exit status of @command{chroot}
終了ステータス:

@display
125: @command{chroot} そのものの実行に失敗した。
126: @var{command} は見つかったが、起動できなかった。
127: @var{command} が見つからなかった。
それ以外は、@var{command} の終了ステータス。
@end display


@node env invocation
@section @command{env}: 変更した環境でコマンドを実行する

@pindex env
@cindex environment, running a program in a modified
@cindex modified environment, running a program in a
@cindex running a program in a modified environment

@command{env} は、環境を変更して、コマンドを実行する。

書式:

@example
env [@var{option}]@dots{} [@var{name}=@var{value}]@dots{} @c
[@var{command} [@var{args}]@dots{}]
env
@end example

@samp{@var{variable}=@var{value}} という形のオペランドは、環境変数 @var{variable} の値を
@var{value} に設定する。@var{value} は空っぽでも構わない (@samp{@var{variable}=})。
変数の値を空に設定 (set) するのは、変数を破棄 (unset) するのとは別のことである。
こうしたオペランドは、左から右へ評価されるので、二つのオペランドが同じ変数を対象にしている場合、前のものは無視される。

環境変数名は、空でもよいし、@samp{=} と ASCII NUL 以外なら、どんな文字を含んでいても構わない。
とは言え、変数名は、アンダースコア、数字、ASCII 文字のみから構成し、
数字以外の文字で始めるようにした方が、賢明である。
それ以外の名前だと、シェルなどのアプリケーションがうまく動作しないからだ。

@vindex PATH
@samp{=} という文字を含まない最初のオペランドが、起動するプログラムであり、
環境変数 @env{PATH} に従って、どこにあるかが検索される。
残っている引数があれば、すべてそのプログラムに引数として渡される。
起動するプログラムは、シェルの組み込みコマンドであってはならない
(@pxref{Special built-in utilities})。

@env{PATH} に対する変更は、@var{command} のありかを検索する前に有効になる。
そこで、@env{PATH} を短縮するときには、気をつけなければならない。
@env{PATH} を未定義にしたり、@file{/bin}
のような重要なディレクトリを外したりすると、変更前と同じ動作にならないかもしれないからだ。

めったにないことだが、プログラムの名前に @samp{=} という文字が含まれている場合、
それを変数の指定と区別する唯一の方法は、@var{command} として仲介的なコマンドを使用し、
その @var{args} として問題のあるプログラム名を渡すことである。
たとえば、@file{./prog=} が現在の @env{PATH} 中に存在する実行ファイルだとしよう。

@example
env prog= true 
  # 環境変数 prog を空に設定して 'true' を実行する。
env ./prog= true 
  # 環境変数 ./prog を空に設定して 'true' を実行する。
env -- prog= true 
  # 環境変数 prog を空に設定して 'true' を実行する。
env sh -c '\prog= true' 
  # 'true' を引数にして 'prog=' を実行する。
env sh -c 'exec "$@@"' sh prog= true 
  # これも 'prog=' を実行する。
@end example

@cindex environment, printing

環境変数の設定の後にコマンド名が指定されていない場合は、生成された環境が表示される。
これは、@var{command} に @command{printenv} を指定するのと同じことである。

以下に例をいくつか挙げる。@command{env} に渡される環境は、@samp{LOGNAME=rms},
@samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks} からなっているものとする。

@itemize @bullet

@item
現在の環境を出力する。
@example
$ env | LC_ALL=C sort
EDITOR=emacs
LOGNAME=rms
PATH=.:/gnubin:/hacks
@end example

@item
環境を削減して、@command{foo} を実行する。@command{foo} が見つからないといけないので、
@env{PATH} だけは元のまま残している。
@example
env - PATH="$PATH" foo
@end example

@item
@samp{LOGNAME=rms}, @samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks}
からなる環境で @command{foo} を実行する。
@command{foo} には、シェルの組み込みコマンドではなく、
ファイルシステム中で見つかった実行ファイルが必ず使用される。
@example
env foo
@end example

@item
@samp{LOGNAME=foo}, @samp{EDITOR=emacs}, @samp{PATH=.:/gnubin:/hacks},
@samp{DISPLAY=gnu:0}
からなる環境で、@command{nemacs} を実行する。
@example
env DISPLAY=gnu:0 LOGNAME=foo nemacs
@end example

@item
プログラム @command{/energy/--} の実行を試みる (パスの検索でそれしか出てこないようにしている)。
@command{--} というコマンドが存在する場合、環境は、@samp{LOGNAME=rms} と
@samp{PATH=/energy} だけになり、引数には、@samp{e=mc2},
@samp{bar}, @samp{baz} が使われる。
@example
env -u EDITOR PATH=/energy -- e=mc2 bar baz
@end example

@end itemize


このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp

@optNull

@item -u @var{name}
@itemx --unset=@var{name}
@opindex -u
@opindex --unset
変数 @var{name} が環境中にあれば、それを環境から削除する。

@item -
@itemx -i
@itemx --ignore-environment
@opindex -
@opindex -i
@opindex --ignore-environment
継承した環境を無視し、空っぽの環境から始める。

@end table

@cindex exit status of @command{env}
終了ステータス:

@display
0:   @var{command} が指定されなかったので、環境を出力した。
125: @command{env} そのものの実行に失敗した。
126: @var{command} は見つかったが、起動できなかった。
127: @var{command} が見つからなかった。
それ以外は、@var{command} の終了ステータス。
@end display


@node nice invocation
@section @command{nice}: niceness を変更して、コマンドを実行する

@pindex nice
@cindex niceness
@cindex scheduling, affecting
@cindex appropriate privileges

@command{nice} はプロセスの @dfn{niceness} を表示したり、niceness を変更してコマンドを実行したりする。
@dfn{niceness} は、プロセスがシステム中でどの程度優先的にスケジュールされるかに影響を及ぼす。
(訳注: niceness を「スケジューリング優先度」と訳さない理由については、
三つほど下のパラグラフを御覧いただきたい。)

書式:

@example
nice [@var{option}]@dots{} [@var{command} [@var{arg}]@dots{}]
@end example

引数を指定しないと、@command{nice} は現在の niceness を表示する。引数に
@var{command} を指定した場合は、niceness を調整して、その @var{command} を実行する。
デフォルトでは、niceness が 10 増加する。

niceness の値は、最小が @minus{}20 で、最大が 19 である
(値が小さければ、プロセスの優先度が高くなり、使えるリソースも多くなるが、
その分、他のプロセスの動作が遅くなる。また、値が大きければ、プロセスの優先度が低くなり、
自分自身の動作は遅くなるが、実行中の他のプロセスの速度に与える影響は小さくなる)。
システムによっては、niceness の値の範囲がもっと広いものもあるし、
反対に、上下限の制限がもっときついものもある。サポートされている範囲を越えた niceness を指定すると、
サポートされている値の最小、または最大を使用しようとしているものと見なされる。

niceness をスケジューリング優先度 (scheduling priority) と混同してはならない。
後者は、様々なスレッドをどういう序列で実行するかの予定を組む際に、
その序列をアプリケーション側に決めさせるものである。
優先度とは違って、niceness はスケジューラに対する単なるアドバイスにすぎず、
スケジューラはそれを無視することができるのだ。また、用語について言うと、
POSIX は @command{nice} の動作を @dfn{nice value} という用語で定義している。
この nice value は、ある niceness と 最小の niceness との間の負ではない差である。
@command{nice} コマンドは POSIX に準拠しているものの、
この文書やエラーメッセージでは、従来の習慣との親和性を考慮して、
``niceness'' という言葉を使っている。

@var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
built-in utilities})。

@mayConflictWithShellBuiltIn{nice}

注意: 現在動作中のプロセスの @dfn{niceness} を変更するには、@command{renice}
コマンドを使う必要がある。

このプログラムでは、以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp
@item -n @var{adjustment}
@itemx --adjustment=@var{adjustment}
@opindex -n
@opindex --adjustment
コマンドの niceness を 10 ではなく、@var{adjustment} 増加する。
@var{adjustment} が負の数の場合、ユーザがしかるべき特権を持っていなければ、
@command{nice} は警告を発する。とは言え、警告を出すだけで、@var{adjustment}
として 0 が指定されたかのように振る舞う。

互換性を考慮して、@command{nice} は @option{-@var{adjustment}}
というオプションの古い書式もサポートしている。
だが、新しいスクリプトでは、@option{-n @var{adjustment}} の方を使うべきである。

@end table

@command{nice} がインストールされるのは、
POSIX の @code{setpriority} 関数を持っているシステムだけである。
従って、移植を考慮したシステムでは、非 POSIX のプラットフォームに
@command{nice} コマンドがあることを当てにしない方がよい。

@cindex exit status of @command{nice}
終了ステータス:

@display
0:   @var{command} が指定されなかったので、niceness を出力した。
125: @command{nice} そのものの実行に失敗した。
126: @var{command} が見つかったが、起動できなかった。
127: @var{command} が見つからなかった。
それ以外は、@var{command} の終了ステータス。
@end display

対話的ではないプログラムは、niceness を落として (訳注: すなわち、
niceness の値を増やして) 実行すると、都合のよいことがある。

@example
$ nice factor 4611686018427387903
@end example

@command{nice} は、現在の niceness を表示するので、@command{nice} を通して @command{nice}
を起動すれば、それがどんな動作をするか、目の当たりに見ることができる。

デフォルトの動作は、niceness を @samp{10} 増加することである。

@example
$ nice
0
$ nice nice
10
$ nice -n 10 nice
10
@end example

@var{adjustment} は、現在の niceness からいくら増減するかということである。
次の例では、最初の @command{nice} が、二番目の @command{nice} を
niceness 10 で実行し、二番目の @command{nice} は、niceness
をさらに 3 増やして、三番目の @command{nice} を実行している。

@example
$ nice nice -n 3 nice
13
@end example

サポートされている範囲より大きい niceness を指定するのは、
サポートされている最大値を指定するのと同じことである。

@example
$ nice -n 10000000000 nice
19
@end example

特権ユーザだけが niceness の値を下げて、プロセスを実行できる。

@example
$ nice -n -1 nice
nice: cannot set niceness: Permission denied
0
$ sudo nice -n -1 nice
-1
@end example


@node nohup invocation
@section @command{nohup}: ハングアップ・シグナルで終了しないコマンドを実行する

@pindex nohup
@cindex hangups, immunity to
@cindex immunity to hangups
@cindex logging out and continuing to run

@flindex nohup.out
@command{nohup} を使って、@var{command} を実行すると、
指定されたコマンドがハングアップ・シグナルを無視するようになる。
従って、そのコマンドは、ユーザがログアウトした後でも、バックグラウンドで実行を継続することができる。

書式:

@example
nohup @var{command} [@var{arg}]@dots{}
@end example

標準入力が端末の場合は、@command{nohup}
から実行されているコマンドが端末を使用していると、端末で行われるセッションが誤解しないように、
標準入力をリダイレクトする。
さらに、標準入力の代わりになるファイルのファイル・ディスクリプタを読み込み不可にする。
@command{nohup} から実行されているコマンドが、誤って標準入力から読み込を行おうとした場合に、
エラーメッセージを出すことができるようにするためである。
このリダイレクションは GNU の拡張である。
GNU 以外のホストでも使うことを考えているプログラムでは、GNU の拡張を当てにせず、
@samp{nohup @var{command} [@var{arg}]@dots{} 0>/dev/null} を使えばよい。

@flindex nohup.out
標準出力が端末の場合、コマンドの標準出力は、(訳注: カレントディレクトリの)
@file{nohup.out} というファイルに追加されて行く。
そのファイルに書き込めない場合は、@file{$HOME/nohup.out}
に追記されることになる。そのファイルにも書き込めない場合は、コマンドの実行が行われない。
@command{nohup} によって作成されるのが @file{nohup.out} であれ、
@file{$HOME/nohup.out} であれ、それは、ファイルの所有者にのみ読み書き可能なものになる。
現在の umask の設定の影響は受けない。

標準エラーが端末の場合、コマンドの標準エラー出力は、基本的には標準出力
(リダイレクトされているかもしれない) と同じファイル・ディスクリプタにリダイレクトされる。
ただし、標準出力がクローズされている場合には、標準エラーの端末への出力は、
リダイレクトされることなく、直接 @file{nohup.out} や @file{$HOME/nohup.out}
というファイルに追加される。どちらのファイルが使用されるかは、上述のとおりである。

コマンドの出力を @file{nohup.out} 以外のファイルに書き込みたければ、
リダイレクトすればよい。たとえば、@command{make} の出力を @file{make.log}
に書き込みたかったら、次のようにする。

@example
nohup make > make.log
@end example

@command{nohup} は、実行するコマンドを自動的にバックグラウンドに送ることをしない。
そこで、ユーザは、コマンドラインの末尾に @samp{&} を付けることで、
明示的にそれを行わなければならない。また、@command{nohup} は、@var{command}
の niceness を変更しない。niceness を変更したかったら、@command{nice}
を使って、@samp{nohup nice @var{command}} のように実行すればよい。

@var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
built-in utilities})。

指定できるオプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.  オプションはオペランドの前に置かなければならない。

@cindex exit status of @command{nohup}
終了ステータス:

@display
125: @env{POSIXLY_CORRECT} が設定されていない場合に、@command{nohup} そのものの
      実行に失敗した。
126: @var{command} は見つかったが、起動できなかった。
127: @var{command} が見つからなかった。 
それ以外の場合は、@var{command} の終了ステータス。
@end display

@env{POSIXLY_CORRECT} が設定されている場合は、@command{nohup}
そのものが実行に失敗したときの終了ステータスは、125 ではなく 127 になる。


@node stdbuf invocation
@section @command{stdbuf}: 入出力ストリームのバッファリングを変更して、コマンドを実行する

@pindex stdbuf
@cindex standard streams, buffering
@cindex line buffered

@command{stdbuf} を使用すると、プログラムと結びついている
3 種類の標準入出力ストリームに対して、そのバッファリング動作を変更することができる。

書式:

@example
stdbuf @var{option}@dots{} @var{command}
@end example

@var{command} は、次の条件を満たすプログラムの名前で始まっていなければならない。
@enumerate
@item
入出力に ISO C @code{FILE} ストリームを使用している (注意: プログラム @command{dd} や
@command{cat} は、これを使用していない)。

@item
自分で標準ストリームのバッファリングを調整していない
(注意: プログラム @command{tee} は、この部類に入らない)。
@end enumerate

後に続く引数があれば、@var{command} に引数として渡される。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item -i @var{mode}
@itemx --input=@var{mode}
@opindex -i
@opindex --input
標準入力ストリームのバッファリングを調整する。

@item -o @var{mode}
@itemx --output=@var{mode}
@opindex -o
@opindex --output
標準出力ストリームのバッファリングを調整する。

@item -e @var{mode}
@itemx --error=@var{mode}
@opindex -e
@opindex --error
標準エラーストリームのバッファリングを調整する。

@end table

@var{mode} には、以下のものを指定できる。

@table @samp

@item L
ストリームを行単位のバッファ・モードにする。このモードでは、改行が出力されることになるか、
あるいは、端末デバイスに結びついているストリームから入力が読み込まれるまで、データを溜めておく。
このオプションは、標準入力に対しては無効である。

@item 0
選択したストリームのバッファリングを無効にする。
このモードでは、データは即座に出力される。また、要求された量のデータしか入力から読み込まない。
入力と出力で動作が違うことに気をつけていただきたい。
なお、入力のバッファリングを無効にしても、ストリーム入力関数の応答性やブロッキング動作に影響することはない。
たとえば、@code{fread} は、要求した量より少ないデータを、下層で動いている
@code{read} が返してきても、@code{EOF} が来るか、エラーが起きるまで、
やはりブロッキングを行うのである。

@item @var{size}
バッファ一杯モード (fully buffered mode) で使用するバッファのサイズを指定する。
@multiplierSuffixesNoBlocks{size}

@end table

@command{stdbuf} がインストールされるのは、Executable and Linkable Format (ELF)
を使用し、@code{constructor} アトリビュートをサポートしているプラットフォームだけである。
従って、移植を考慮したスクリプトでは、@command{stdbuf}
が存在することを当てにしない方がよい。

@cindex exit status of @command{stdbuf}
終了ステータス:

@display
125: @command{stdbuf} そのものの実行に失敗した。
126: @var{command} は見つかったが、起動できなかった。
127: @var{command} が見つからなかった。
それ以外は、@var{command} の終了ステータス。
@end display


@node timeout invocation
@section @command{timeout}: タイムリミット付きでコマンドを実行する

@pindex timeout
@cindex time limit
@cindex run commands with bounded time

@command{timeout} は渡されたコマンドを実行し、
指定された時間が経過してもまだ実行が続いていたら、そのコマンドを終了させる。

書式:

@example
timeout [@var{option}] @var{duration} @var{command} [@var{arg}]@dots{}
@end example

@var{command} は、シェルの組み込みコマンドであってはならない (@pxref{Special
built-in utilities})。

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp
@item --preserve-status
@opindex --preserve-status
タイムアウトしたときに、タイムアウトであることを示す @command{timeout}
コマンドの終了ステータスではなく、@command{timeout} が管理している
@var{command} の終了ステータスを返す。このオプションは、管理される
@var{command} が無期限の続行時間をサポートしている場合に役に立つ。

@item --foreground
@opindex --foreground
独立したバックグラウンドのプログラム・グループを作成しない。
その結果、@command{timeout} に管理される @var{command} が、フォアグラウンドの
TTY を通常どおり使用できるようになる。
対話的シェルから直接実行されないコマンドの時間制限をきちんと行うには
(訳注: 言い換えれば、@command{timeout} コマンドをシェルスクリプト中で使用する場合には)、
この動作が必要になることがあり、次の二つの場合がそれに当たる。
@enumerate
@item
@var{command} が対話的であり、たとえば端末からの読み込みが必要な場合。
@item
端末から直接 @var{command} にシグナルを送ることができるようにしたい場合。
(たとえば、Ctrl-C を送るとか)。
@end enumerate

気をつけていただきたいが、この動作モードでは、@var{command}
の子プロセスは、いかなるものもタイムアウトすることがない。
また、SIGCONT シグナルが @var{command} に送られることもない。
フォアグラウンドプロセスでは、そういったことは普通必要がないからであり、
また、(たとえば、GDB のような) それ自身が他のプログラムを監視するモニターであるプログラムでは、
断続的なシグナル送出を起こしかねないからである。

@item -k @var{duration}
@itemx --kill-after=@var{duration}
@opindex -k
@opindex --kill-after
ここで指定した @var{duration} の経過後に、改めて @samp{KILL} シグナルを送り付けて、
監視対象の @var{command} を確実に終了させる。
このオプションを付けないと、選択したシグナルに @var{command}
を終了させる力がなかった場合に、@command{timeout} は @var{command} を殺すことができない。

@item -s @var{signal}
@itemx --signal=@var{signal}
@opindex -s
@opindex --signal
制限時間が来たとき、デフォルトの @samp{TERM} シグナルではなく、指定した
@var{signal} を @var{command} に送る。@var{signal} は @samp{HUP}
のような名前でもよく、番号でもよい。@xref{Signal specifications}.
@end table

@cindex time units
@var{duration} は浮動小数点数であり、後ろに単位を付けることもできる。
@display
@samp{s} 何秒 (デフォルト)
@samp{m} 何分
@samp{h} 何時間
@samp{d} 何日
@end display
@var{duration} が 0 だと、対象となるコマンドが時間切れなしになる。
実際の制限時間は、システムの制約を受けることに注意していただきたい。
秒以下の制限時間を指定するときは、とりわけそれを考慮に入れるべきである。

@cindex exit status of @command{timeout}
終了ステータス:

@display
124: @var{command} がタイムアウトした。
125: @command{timeout} そのものの実行に失敗した。 
126: @var{command} は見つかったが、起動できなかった。
127: @var{command} が見つからなかった。
137: @var{command} に KILL(9) シグナルを送った (128+9)
それ以外は、@var{command} の終了ステータス。
@end display


@node Process control
@chapter プロセス制御

@cindex processes, commands for controlling
@cindex commands for controlling processes

@menu
* kill invocation::          プロセスにシグナルを送る。
@end menu


@node kill invocation
@section @command{kill}: プロセスにシグナルを送る

@pindex kill
@cindex send a signal to processes

@command{kill} コマンドは、プロセスにシグナルを送る。
シグナルを送られたプロセスは、終了するか、
あるいは、シグナルを受け取った時点で他の何らかの形で反応する。
また、@command{kill} は、シグナルに関する情報を一覧表示する。

書式:

@example
kill [-s @var{signal} | --signal @var{signal} | -@var{signal}] @var{pid}@dots{}
kill [-l | --list | -t | --table] [@var{signal}]@dots{}
@end example

@mayConflictWithShellBuiltIn{kill}

@command{kill} コマンドの最初の書式では、すべての @var{pid} 引数に対してシグナルが送られる。
シグナルが指定されていない場合に送られるデフォルトのシグナルは、@samp{TERM} である。
@samp{0} という特別なシグナル番号は、有効なシグナルを表していないが、
引数 @var{pid} が指しているプロセスに対してシグナルを送ることが可能かどうかを、調べるために使うことができる。

@var{pid} が正の数なら、シグナルはプロセス ID が @var{pid} のプロセスに送られる。
@var{pid} が 0 なら、シグナルはカレントプロセスのプロセスグループに属するすべてのプロセスに送られる。
@var{pid} が @minus{}1 の場合、シグナルが送られるのは、
ユーザがシグナルを送る権限を持っているすべてのプロセスである。
@var{pid} が @minus{}1 より小さい場合は、@var{pid}
の絶対値に等しいプロセスグループに属するすべてのプロセスにシグナルが送られる。

@var{pid} が正の数ではない場合、システムプロセスに属するプロセス
(システムによって様々である) は、シグナルが送られるプロセスのリストから除外される。

最初の @var{pid} 引数として負の @var{pid} を使用したい場合は、その前に
@option{--} オプションを置くべきである。
とは言え、@samp{kill -@var{signal} -@var{pid}} という書式を使う場合は、
@option{--} は必要がない。これは、POSIX に対する一般的な拡張である。
そこで、次に挙げるコマンドは等価になる。

@example
kill -15 -1
kill -TERM -1
kill -s TERM -- -1
kill -- -1
@end example

最初の書式の @command{kill} コマンドは、すべての @var{pid} 引数が、
シグナルが送られたプロセスをそれぞれ少なくとも一つは指している場合に、
成功のステータスで終了する。

@command{kill} コマンドの二番目の書式では、シグナルに関する情報が表示される。
@option{-l} または @option{--list}、あるいは、@option{-t} または @option{--table}
オプションの指定は必須である。引数 @var{signal} を一つも指定しないと、
サポートされているすべてのシグナルがリストされる。@option{-l} や @option{--list}
の出力は、シグナル名のリストであり、1 行に一つづつ表示される。
ただし、引数 @var{signal} がすでにシグナル名である場合は、名前ではなく、シグナル番号の表示になる。
@option{-t} や @option{--table} の出力は、シグナル番号、シグナル名、その説明からなる表である。
この書式の @command{kill} コマンドは、引数として指定されたすべての
@var{signal} が有効なものであり、出力エラーがなかったとき、成功のステータスで終了する。

@command{kill} コマンドでは、@option{--help} や @option{--version} オプションも使用できる。
@xref{Common options}.

@var{signal} の指定には、@samp{HUP} のようなシグナル名や、@samp{1}のようなシグナル番号、
それに、シグナルによって終了させられるときのプロセスの終了ステータスを使うことができる
(訳注: 最後のものは、GNU coreutils の @command{kill}
コマンドでは使用できるが、シェルの組み込みコマンドのような、他の系統の
@command{kill} では使えないかもしれない)。
シグナル名は、標準的な形式でも、頭に @samp{SIG} を付けた形式でも構わない。
大文字小文字はどちらを使ってもよいが、@option{-@var{signal}}
という形式のオプションの場合は例外で、大文字を使わなければならない。
小文字を使うと、他のオプションとまぎらわしいからである。
サポートしているシグナル名とシグナル番号については、「2.5 シグナルの指定」を参照していただきたい。
@xref{Signal specifications}.

@node Delaying
@chapter 一時停止

@cindex delaying commands
@cindex commands for delaying

@c Perhaps @command{wait} or other commands should be described here also?

@menu
* sleep invocation::         指定された時間、停止する。
@end menu


@node sleep invocation
@section @command{sleep}: 指定された時間、停止する

@pindex sleep
@cindex delay for a specified time

@command{sleep} は、コマンドラインで引数として指定された値を合計した時間だけ停止する。

書式:

@example
sleep @var{number}[smhd]@dots{}
@end example

@cindex time units
各引数は数値であり、後ろに単位を付けてもよい。デフォルトの単位は秒である。
単位には、以下のものが指定できる。

@table @samp
@item s
秒
@item m
分
@item h
時
@item d
日
@end table

@command{sleep} の従来の実装では、@var{number} は整数でなければならず、
引数は接尾辞なしのものが 1 個しか認められていなかった。それに対して GNU の
@command{sleep} では、任意の浮動小数点数を複数個指定できる。 @xref{Floating point}.

オプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.

@c sleep is a shell built-in at least with Solaris 11's /bin/sh
@mayConflictWithShellBuiltIn{sleep}

@exitstatus


@node Numeric operations
@chapter 数値の操作

@cindex numeric operations
以下のプログラムは、数に関係した作業をする。

@menu
* factor invocation::        素因数を表示する。
* numfmt invocation::        数値を整形し直す。
* seq invocation::           連続する数を表示する。
@end menu


@node factor invocation
@section @command{factor}: 素因数を表示する

@pindex factor
@cindex prime factors

@command{factor} は、素因数を表示する。

書式:

@example
factor [@var{number}]@dots{}
factor @var{option}
@end example

@var{number} がコマンドラインで指定されていない場合、@command{factor}
は標準入力から数値を読み込む。
このとき、改行、タブ、空白で区切って複数の数値を入力することができる。

@command{factor} コマンドで使えるオプションは、いくつもない。

@table @samp
@item --help
簡単なヘルプメッセージを標準出力に表示し、それ以上の処理をせずに終了する。

@item --version
プログラムのバージョンを標準出力に表示し、それ以上の処理をせずに終了する。
@end table

メルセンヌ素数の 8 番目と 9 番目の積を素因数に分解するには、2.2 GHz
Athlon のシステムで、30 ミリセコンドの CPU 時間を要する。

@example
M8=$(echo 2^31-1|bc)
M9=$(echo 2^61-1|bc)
n=$(echo "$M8 * $M9" | bc)
/usr/bin/time -f %U factor $n
4951760154835678088235319297: 2147483647 2305843009213693951
0.03
@end example

同様に、8 番目のフェルマー数、@math{2^{256}+1} では、同じマシンで約 20 秒かかる。

大きな数の素因数分解は、そもそも大変な作業である。@command{factor} が使用している
Pollard-Brent rho アルゴリズムは、比較的小さな因数を持つ数値に対してとりわけ効率がよい。
もし、小さな因数を持たない大きな数値 (たとえば、二つの大きな素数の積からなる数値)
の素因数分解をなさりたいのなら、他の方法の方がずっとすぐれている。

@command{factor} が GNU MP を使用せずにビルドされている場合は、
単精度の算術しか利用できない。従って、大きな数値 (一般には @math{2^{128}} 以上)
には対応していない。単精度用のコードが使用しているアルゴリズムは、
比較的小さな数値を素因数に分解するためのものなのである。

@exitstatus


@node numfmt invocation
@section @command{numfmt}: 数値を整形し直す

@pindex numfmt

@command{numfmt} はさまざまな表記の数値を読み込んで、それを要求された形に整形し直す。
一番よく使うのは、数値を人間が読みやすい形に変換する場合や、
その逆を行う場合である (たとえば、@samp{4G} @expansion{} @samp{4,000,000,000})。

@example
numfmt [@var{option}]@dots{} [@var{number}]
@end example

@command{numfmt} は、コマンドラインで与えられた各 @var{number} を、
指定されたオプション (以下の節を参照) に従って変換する。
@var{number} の指定がない場合は、標準入力から数値を読み込む。
また、@command{numfmt} は、入力行中の特定のフィールドから数値を取り出すこともできる。
その場合、列が揃うようにパディング (訳注: フィールドの空き埋め) が行われていれば、
それも適切に維持する。

@exitstatus

終了ステータスについては追加情報がある。@option{--invalid} をご覧になっていただきたい。

@menu
* General options in numfmt::  一般オプション
* Possible UNITs::             使用できる UNIT
* Examples of using numfmt::   numfmt の使用例
@end menu

@node General options in numfmt
@subsection 一般オプション

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.

@table @samp

@item --debug
@opindex --debug
間違えた使い方をしている疑いがあるとき、それについて警告メッセージを
(標準エラーに) 表示する。

@item -d @var{d}
@itemx --delimiter=@var{d}
@opindex -d
@opindex --delimiter
文字 @var{d} を入力フィールドの区切りとして使用する (デフォルトはホワイトスペース)。
区切りにデフォルト以外の文字を使うと、自動的なパディングが行われなくなるのに注意していただきたい。

@item --field=@var{fields}
@opindex --field
@var{field} 番目の入力フィールドの数値を変換する (@var{field} のデフォルトは 1)。
@var{fields} では、@command{cut} と同じような範囲指定が使える。

@example
N    N 番目のフィールド、1 から数える
N-   N 番目のフィールドから行末まで
N-M  N 番目から M 番目のフィールドまで (両端を含む)
-M   行頭から M 番目のフィールドまで (両端を含む)
-    すべてのフィールド
@end example


@item --format=@var{format}
@opindex --format
浮動小数点数を表す printf 形式の @var{format} 文字列を出力の整形に使用する。
文字列 @var{format} には、1 個の @samp{%f} 変換指定子が含まれていなければならない。
なお、そうしたければ、@samp{'}, @samp{-}, @samp{0} といった修飾子や、
フィールド幅修飾子 (訳注: 数値)、精度修飾子を @samp{%f} に付けることもできる。
@samp{'} 修飾子は @option{--grouping} オプションを有効にし、@samp{-} 修飾子は
@option{--padding} オプションを左詰めで有効に、フィールド幅修飾子は
@option{--padding} オプションを右詰めで有効にする (訳注: @samp{-} 修飾子は、
数値であるフィールド幅修飾子と併せて用いなければならない)。
@samp{0} フィールド幅修飾子を使うと (@samp{-} も同時に指定されていなければ)、
指定された幅になるまで数値の前に 0 を付けることになる。
@samp{%.1f} のような精度指定は、入力データから引き出される精度や、@option{--to}
オプションを使用したときの、数値の大きさや桁数の自動調整 (auto-scaling)
によって決められた精度を上書きする。

@item --from=@var{unit}
@opindex --from
入力された数値の大きさや桁数を @var{unit} に従って自動調整 (auto-scaling)
する (訳注: 一例を挙げると、入力数値が @samp{1K} だったとき、@samp{--from=si}
が指定されていれば 1000 に変換し、@samp{--from=iec} が指定されていれば
1024 に変換する)。@var{unit} については、次節「使用できる UNIT」を参照していただきたい。
デフォルトでは数値の大きさや桁数の調節を行わない。
それはまた、入力数値に接尾辞 (たとえば、@samp{M}, @samp{G} など)
が付いていると、エラーになるということでもある。

@item --from-unit=@var{n}
@opindex --from-unit
入力の 1 単位の大きさを (すなわち、デフォルトの 1 に代えて使う大きさを)
指定する。入力する数値の 1 単位の大きさが、デフォルトの
1 以外の場合に、このオプションを使用するわけだ (たとえば、入力する数値の
@samp{10} が、1 単位 512 バイトの 10 単位を表している場合には、
@samp{--from-unit=512} を使用する)。
単位となる数値に接尾辞を付けると、@samp{--from=auto} の場合と同様に処理される。

@item --grouping
@opindex --grouping
現在のロケールの桁区切りルールに従って、出力する数値を数桁ごとに区切る
(たとえば、3 桁ごとの区切り記号は、たいてい @samp{.} (ドット) か
@samp{,} (コンマ) である)。ロケールが @samp{POSIX/C} の場合は、このオプションに効果はない。

@item --header[=@var{n}]
@opindex --header
@opindex --header=N
最初の @var{n} (デフォルトは 1) 行を、いかなる変換もせずに出力する。

@item --invalid=@var{mode}
@opindex --invalid
入力エラーに出会ったときのデフォルトの動作は、ステータスコード 2 で即座に終了することである。
@option{--invalid=@samp{abort}} は、このデフォルトの動作を明示的に指定することになる。
@var{mode} に @samp{fail} を指定すると、
変換エラーがあるごとに警告メッセージを表示して、ステータス 2 で終了する。
@var{mode} が @samp{warn} の場合は、変換エラーがあっても、ステータス 0
で終了する。@var{mode} が @samp{ignore} の場合は、ステータス 0
で終了するだけでなく、診断メッセージを出すことすらしない。

@item --padding=@var{n}
@opindex --padding
出力する数値が @var{n} 字分を占めるように、スペースを加えることでパディングを行う。
@var{n} が正の数の場合は、数値が右詰めになり、負の数の場合は、数値が左詰めになる。
デフォルトでは、数値は、入力行の幅に基づいて
(訳注: 詳しく言うと、入力各行の変換する数値のあるフィールドが固定幅の場合、
その幅を使用して) 自動的に揃えられる
(ただし、それが行われるのは、フィールドの区切り文字がデフォルトの場合だけである)。

@item --round=@var{method}
@opindex --round
@opindex --round=up
@opindex --round=down
@opindex --round=from-zero
@opindex --round=towards-zero
@opindex --round=nearest
数値の表現を変換するときに、@var{method} に従って、数値を丸める。@var{method}
には、@samp{up}, @samp{down}, @samp{from-zero} (デフォルト), @samp{towards-zero},
@samp{nearest} が使用できる。(訳注: @samp{up} は切り上げ、@samp{down} は切り下げ、
@samp{from-zero} はゼロから離れる方向へ、@samp{towards-zero} はゼロに近づく方向へ、
@samp{nearest} は四捨五入である。)

@item --suffix=@var{suffix}
@opindex --suffix
出力する数値に @samp{SUFFIX} を付ける。また、入力する数値に @samp{SUFFIX}
が付いていても、エラーにしない。

@item --to=@var{unit}
@opindex --to
出力する数値の大きさや桁数を @var{unit} に従って自動調整する。
@var{unit} については、次節「使用できる UNIT」を参照していただきたい。
デフォルトでは、数値の大きさや桁数の調節をしないので、
数値を構成するすべての数字が表示されることになる。

@item --to-unit=@var{n}
@opindex --to-unit
出力の 1 単位の大きさを (すなわち、デフォルトの 1 に代えて使う大きさを)
指定する。出力する数値の 1 単位の大きさが、デフォルトの
1 以外の場合に、このオプションを使用するわけだ (たとえば、1
ブロック 1KB のブロック数で @samp{4,000,000} バイトを表現するには、
@samp{--to=si --to-unit=1000} が使用できる)。
単位となる数値に接尾辞を付けると、@samp{--from=auto} の場合と同様に処理される。

@optZeroTerminated @newlineFieldSeparator

@end table

@node Possible UNITs
@subsection 使用できる @var{unit}

@option{--from=UNIT} や @option{--to=UNIT} で指定する @var{unit} には、
次のものを選択することができる。(訳注: @var{unit} の名前は、大文字ではなく、si, iec
などの小文字で指定すること。)

@table @var

@item none
数値の大きさや桁数の調整を行わない。入力する数値には、いかなる接尾辞も付けることができない。
従って、数値の直後に文字が続くとエラーになる。
出力する数値については、その数値を構成するすべての数字を表示する。

@item si
国際単位系 (International System of Units (SI)) の規格に従って、数値の大きさや桁数を自動調整する。
入力する数値には、以下の接尾辞の一つが使用できる。
出力する数値については、1000 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。

@example
@samp{K}  =>  @math{1000^1 = 10^3} (Kilo)
@samp{M}  =>  @math{1000^2 = 10^6} (Mega)
@samp{G}  =>  @math{1000^3 = 10^9} (Giga)
@samp{T}  =>  @math{1000^4 = 10^{12}} (Tera)
@samp{P}  =>  @math{1000^5 = 10^{15}} (Peta)
@samp{E}  =>  @math{1000^6 = 10^{18}} (Exa)
@samp{Z}  =>  @math{1000^7 = 10^{21}} (Zetta)
@samp{Y}  =>  @math{1000^8 = 10^{24}} (Yotta)
@end example

@item iec
International Electrotechnical Commission (IEC) の規格に従って、数値の大きさや桁数を自動調整する。
入力する数値では、以下の接尾辞の一つが使用できる。
出力する数値については、1024 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。

@example
@samp{K}  =>  @math{1024^1 = 2^{10}} (Kibi)
@samp{M}  =>  @math{1024^2 = 2^{20}} (Mebi)
@samp{G}  =>  @math{1024^3 = 2^{30}} (Gibi)
@samp{T}  =>  @math{1024^4 = 2^{40}} (Tebi)
@samp{P}  =>  @math{1024^5 = 2^{50}} (Pebi)
@samp{E}  =>  @math{1024^6 = 2^{60}} (Exbi)
@samp{Z}  =>  @math{1024^7 = 2^{70}} (Zebi)
@samp{Y}  =>  @math{1024^8 = 2^{80}} (Yobi)
@end example

@option{iec} を選択すると、接尾辞に (@samp{G} など)
1 文字の記号が使用されることになるが、これは規格に完全にかなってるとは言えない。
IEC の規格では (@samp{Gi} など) 2 字の記号を推奨しているからだ。
しかし、実際の使用では、1 文字の表記法が普通に使われている。
@option{iec-i} を指定した場合と比較していただきたい。

@item iec-i
International Electrotechnical Commission (IEC) の規格に従って、数値の大きさや桁数を自動調整する。
入力する数値では、以下の接尾辞の一つが使用できる。
出力する数値については、1024 以上の値は丸められて、以下の接尾辞の一つを付けて表示される。

@example
@samp{Ki}  =>  @math{1024^1 = 2^{10}} (Kibi)
@samp{Mi}  =>  @math{1024^2 = 2^{20}} (Mebi)
@samp{Gi}  =>  @math{1024^3 = 2^{30}} (Gibi)
@samp{Ti}  =>  @math{1024^4 = 2^{40}} (Tebi)
@samp{Pi}  =>  @math{1024^5 = 2^{50}} (Pebi)
@samp{Ei}  =>  @math{1024^6 = 2^{60}} (Exbi)
@samp{Zi}  =>  @math{1024^7 = 2^{70}} (Zebi)
@samp{Yi}  =>  @math{1024^8 = 2^{80}} (Yobi)
@end example

@option{iec-i} を選択すると、接尾辞に (@samp{Gi} など)
2 文字の記号が使用されることになる。これは、IEC の規格が推奨しているとおりだが、
実際の使用では、必ずしもよく使われているわけではない。@option{iec}
を指定した場合と、比較していただきたい。

@item auto
@samp{auto} は @option{--from} でしか使えない。これを選んだ場合、@samp{K},@samp{M},@samp{G},
@samp{T},@samp{P},@samp{E},@samp{Z},@samp{Y} といった接尾辞が付いていれば、
数値は SI の値と見なされる。接尾辞が
@samp{Ki},@samp{Mi},@samp{Gi},@samp{Ti},@samp{Pi},@samp{Ei},@samp{Zi},@samp{Yi}
などの場合は、
数値は IEC の値と見なされることになる。

@end table

@node Examples of using numfmt
@subsection @command{nunfmt} の使用例

1 個の数値を人間に読みやすい形に変換する (あるいは、その逆を行う)。
@example
$ numfmt --to=si 500000
500K

$ numfmt --to=iec 500000
489K

$ numfmt --to=iec-i 500000
489Ki

$ numfmt --from=si 1M
1000000

$ numfmt --from=iec 1M
1048576

# '--from=auto' を使用する。M=Mega, Mi=Mebi
$ numfmt --from=auto 1M
1000000
$ numfmt --from=auto 1Mi
1048576
@end example

@samp{SI} 表記を @samp{IEC} 表記に換算する (たとえば、ハードディスクの容量が、
メーカー表示では @samp{1TB} となっているが、実際に容量をチェックすると、
それより少ない場合)。

@example
$ numfmt --from=si --to=iec 1T
932G
@end example


ファイルやパイプから読み込んだ入力行にある、ある一つのフィールドを変換する
(ここに示す数例は、あくまでも説明のために作ったものである。実際には、@command{ls}
と @command{df} のどちらにも、人間に読みやすい形式でサイズを表示するための
@option{--human-readable} オプションが存在している)。

@example
# 3 番目のフィールド (ファイルサイズ) を SI 表記で表示する
$ ls -log | numfmt --field 3 --header --to=si | head -n4
-rw-r--r--  1     94K Aug 23  2011 ABOUT-NLS
-rw-r--r--  1    3.7K Jan  7 16:15 AUTHORS
-rw-r--r--  1     36K Jun  1  2011 COPYING
-rw-r--r--  1       0 Jan  7 15:15 ChangeLog
(訳注: 実際には、この一番下の行は表示されず、一番上に「total @dots{} 
といった行が現れるはずである。)

# 二番目のフィールド (サイズ) を IEC 表記で表示する
$ df --block-size=1 | numfmt --field 2 --header --to=iec | head -n4
File system   1B-blocks        Used  Available Use% Mounted on
rootfs             132G   104741408   26554036  80% /
tmpfs              794M        7580     804960   1% /run/shm
/dev/sdb1          694G   651424756   46074696  94% /home
@end example


出力は @option{--padding} や @option{--format} オプションを使って加工することができる。

@example
# フィールド幅が 10 字になるまで空白で埋める。右詰め表示。
$ du -s * | numfmt --to=si --padding=10
      2.5K config.log
       108 config.status
      1.7K configure
        20 configure.ac

# フィールド幅が 10 字になるまで空白で埋める。左詰め表示。
$ du -s * | numfmt --to=si --padding=-10
2.5K       config.log
108        config.status
1.7K       configure
20         configure.ac

# @option{--format} オプションを使用して、フィールド幅が 10 文字になるまで
# 空白で埋める。右詰め表示。
$ du -s * | numfmt --to=si --format="%10f"
      2.5K config.log
       108 config.status
      1.7K configure
        20 configure.ac

# @option{--format} オプションを使用して、フィールド幅が 10 文字になるまで
# 空白で埋める。左詰め表示。
$ du -s * | numfmt --to=si --padding="%-10f"
2.5K       config.log
108        config.status
1.7K       configure
20         configure.ac
@end example

桁区切りをサポートしているロケールでは、@option{--grouping} や @option{--format}
オプションを使って、数値を数桁ごとに区切ることができる。ロケールが
@samp{POSIX} や @samp{C} の場合は、桁区切りを指定しても、単に無視される。

@example
$ LC_ALL=C numfmt --from=iec --grouping 2G
2147483648

$ LC_ALL=en_US.utf8 numfmt --from=iec --grouping 2G
2,147,483,648

$ LC_ALL=ta_IN numfmt --from=iec --grouping 2G
2,14,74,83,648

$ LC_ALL=C numfmt --from=iec --format="==%'15f==" 2G
==     2147483648==

$ LC_ALL=en_US.utf8 numfmt --from=iec --format="==%'15f==" 2G
==  2,147,483,648==

$ LC_ALL=en_US.utf8 numfmt --from=iec --format="==%'-15f==" 2G
==2,147,483,648  ==

$ LC_ALL=ta_IN numfmt --from=iec --format="==%'15f==" 2G
== 2,14,74,83,648==
@end example


@node seq invocation
@section @command{seq}: 数列を表示する

@pindex seq
@cindex numeric sequences
@cindex sequence of numbers

@command{seq} は、数列を標準出力に表示する。

書式:

@example
seq [@var{option}]@dots{} @var{last}
seq [@var{option}]@dots{} @var{first} @var{last}
seq [@var{option}]@dots{} @var{first} @var{increment} @var{last}
@end example

@command{seq} は、@var{first} から @var{last} までの数を @var{increment} おきに表示する。
デフォルトでは、それぞれの数は 1 行に 1 個づつ表示される。
@var{increment} が指定されていない場合は、@var{first} が @var{last}
より大きい場合でも、デフォルトの @samp{1} が @var{increment} として使用される。
@var{first} のデフォルトもまた @samp{1} である。
従って、@code{seq 1} は @samp{1} を表示するが、@code{seq 0} や @code{seq 10 5}
は、何も出力しない。数列が終了するのは、現在の数値に @var{increment} を加えたら
@var{last} より大きくなってしまう時点である。だから、@code{seq 1 10 10}
は、@samp{1} しか表示しない。@var{increment} の値には @samp{0} を指定できない。
同じ数を繰り返し出力したかったら、@command{yes} コマンドを使うべきである。
また、@var{first}, @var{increment}, @var{last} の値は、@code{NaN}
(訳注: Not a Number) であってはならない。数値には浮動小数点数を指定することもできる。
@xref{Floating point}.

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp
@item -f @var{format}
@itemx --format=@var{format}
@opindex -f
@opindex --format
@cindex formatting of numbers in @command{seq}
すべての数を @var{format} を使用して表示する。@var{format} は、 @samp{printf}
形式の浮動小数点数の変換指定をただ一つ含むものでなければならない。
すなわち、@samp{%a}, @samp{%e}, @samp{%f}, @samp{%g}, @samp{%A},
@samp{%E}, @samp{%F}, @samp{%G} のいづれかである。
@samp{%} の後ろには 0 個以上のフラグを、@samp{-+#0 '} のうちから選んで置くことができる。
また、それに続けて、1 個以上の数字からなるフィールド幅を指定することもできるし、
さらにその後ろに、@samp{.} とそれに続く 0 個以上の数字からなる精度を指定することもできる。
@var{format} には、任意の数の @samp{%%} 変換指定が含まれていてもよい。
変換指定はすべて、@samp{printf} の場合と同じ意味を持っている。

デフォルトの表示形式は、@var{first}, @var{increment}, @var{last}
がどういう表記を使用しているかよって決まる。そのすべてが固定小数点の
10 進数表記を使用しているならば、デフォルトの表示形式は @samp{%.@var{p}f} になる。
この @var{p} には、出力する数値を過不足なく表現できる最小の精度が来る。
それ以外の場合、デフォルトの表示形式は @samp{%g} になる。

@item -s @var{string}
@itemx --separator=@var{string}
@opindex -s
@opindex --separator
@cindex separator for numbers in @command{seq}
数の区切りに @var{string} を使う。デフォルトは改行である。出力の最後には、必ず改行が付く。

@item -w
@itemx --equal-width
@opindex -w
@opindex --equal-width
すべての数を同じ桁数で表示する。先頭の空きは 0 で埋める。@var{first},
@var{increment}, @var{last} は、すべて固定小数点の 10 進数表記でなければならない
(他のやり方で先頭を埋めたければ、@option{--format} を使うこと)。

@end table

@option{-f} オプションを使えば、出力をもっときめ細かく制御することができる。

@example
$ seq -f '(%9.2E)' -9e5 1.1e6 1.3e6
(-9.00E+05)
( 2.00E+05)
( 1.30E+06)
@end example

出力を 16 進数の整数にしたかったら、@command{printf} を使って変換すればよい。

@example
$ printf '%x\n' $(seq 1048575 1024 1050623)
fffff
1003ff
1007ff
@end example

数のリストが非常に長くなる場合は、@command{xargs}
を使用すると、引数リストの長さに対するシステムの制限を回避することができる。

@example
$ seq 1000000 | xargs printf '%x\n' | tail -n 3
f423e
f423f
f4240
@end example

8 進数の出力を生成するには、printf に対して @code{%x} の代わりに、@code{%o}
フォーマットを使用すればよい。

ほとんどのシステムで @command{seq} は、少なくとも @math{2^{53}}
までの数値に対して整数の出力を生成することができる。それより大きい整数に対しては概算になる。
細かい点は、ご使用のシステムの浮動小数点の実装によって異なっている。
@xref{Floating point}.  @command{seq} が @math{2^{64}}
までの整数に対してなら、きちんと動作するが、
それより大きな整数に対しては、数値が不正確になることがあるというのは、よくある話である。

@example
$ seq 50000000000000000000 2 50000000000000000004
50000000000000000000
50000000000000000000
50000000000000000004
@end example

とは言え、負ではない整数を対象とし、インクリメントが 1 で、
フォーマット指定オプションはないという条件の元では、
@command{seq} は任意の大きな数値を表示できることも心に留めておいていただきたい。

@command{seq} でとんでもなく大きな桁の値を扱うときは、気をつけた方がよい。
さもないと、@command{seq} は内部で浮動小数点を使用しているので、結果を見てびっくりするかもしれない。
たとえば、x86 のプラットフォームでは、内部表現が 64 ビットの仮数部を使用しているが、
そこで次のコマンドを実行すると、

@example
seq 1 0.0000000000000000001 1.0000000000000000009
@end example

@command{seq} は 1.0000000000000000007 を二度出力し、1.0000000000000000008
をスキップする (訳注: 訳者の amd64 環境では、1.0000000000000000008
ではなく、1.0000000000000000006 をスキップする)。

@exitstatus


@node File permissions
@chapter ファイルの許可属性
@include perm-ja.texi

@include parse-datetime-ja.texi

@c              What's GNU?
@c              Arnold Robbins
@node Opening the software toolbox
@chapter ソフトウェアの道具箱

この章の初期のバージョンは、「GNU とは何か？ (@cite{What's GNU?})」という連載記事として
@cite{Linux Journal} 1994 年 6 月号に掲載された。
執筆者は Arnold Robbins である。
(@uref{http://www.linuxjournal.com/article.php?sid=2762})

@menu
* Toolbox introduction::     はじめに
* I/O redirection::          I/O リダイレクション
* The who command::          @command{who} コマンド
* The cut command::          @command{cut} コマンド
* The sort command::         @command{sort} コマンド
* The uniq command::         @command{uniq} コマンド
* Putting the tools together::  工具を組み合わせる
@end menu


@node Toolbox introduction
@unnumberedsec はじめに

今月の記事と GNU プロジェクトの関係は、周辺的なものにすぎない。お手元の
GNU/Linux システムの GNU ツールをいくつか取り上げて、
こんな使い方もありますよ、と述べている点で、関係があるにすぎないのだ。
今月の記事の真の狙いは、プログラムを開発したり、使用したりする上での、
「ソフトウェアは工具だ」という考え方を説明することである。

ソフトウェアは工具だという思想は、Unix が最初に設計され、開発されたときの重要で不可欠な考え方だった
(Linux も GNU も本質的には Unix のクローンである)。
残念なことに、最近ではインターネットや見栄えのよい GUI の勢いに押されて、
ソフトウェア工具論は流行らなくなっているようだ。
この思想は、様々な問題を解決するための強力な思考モデルを提供してくれるのだから、
まことに残念な話である。

スイス・アーミーナイフをズボンのポケットに (または、小物入れに)
入れて、持ち歩いている人は多い。スイス・アーミーナイフは持っていると重宝な道具だ。
それには、何本かのナイフ、ねじ回し、ピンセット、つまようじ、爪やすり、コルク抜き、
他にもたぶん、いろいろ付いているだろう。
日常のちょっとした雑用には、何にでも使える簡単な道具があれば済むのだから、
そうした用途にはまさにピッタリの道具である。

しかしながら、熟練した大工は、スイス・アーミーナイフを使って家を建てたりしない。
彼は、その代わりに道具箱を持っていて、そこには用途別の工具
--- のこぎり、金槌、ねじ回し、鉋など --- がぎっしり詰まっている。
しかも、彼は一つ一つの工具について、適材適所を心得ている。
ねじ回しの柄で釘を打ち込んだりすることは絶対にないのだ。

ベル研究所にいた Unix の開発者たちは、プロのプログラマやコンピュータ・サイエンスの専門家ばかりだった。
その彼らが、こういうことに気づいたのだ。
万能型のプログラムは、たった一つのプログラムを使えばよいので、
ユーザには受けがよいかもしれない。だが、いざ実際に作ってみると、そうしたプログラムは、

@enumerate a
@item
書くのが難しく、

@item
保守やデバッグが難しく、

@item
新しい状況に合わせて機能を拡張するのが難しい。
@end enumerate

むしろ彼らは、プログラムは用途別の工具であるべきだと痛感した。
要するに、個々のプログラムは、「一つの仕事をきちんとやってのければよい」。
それ以上でもそれ以下でもない。そういったプログラムは、
設計するのも、コードを書くのも、修正するのも、ずっと簡単である ---
たった一つのことしかしないからだ。

それだけではない。適切な仕組みを使って、プログラムを組み合わせると、
全体が部分の総和以上になることにも、彼らは気づいた。
ある用途専用のプログラムをいくつか組み合わせると、
どのプログラムもそのために作られたのではない、ある特定の作業をやってのけることができる。
それも、それ専用のプログラムを書かなければならない場合よりも、
はるかに迅速に、かつ簡単にやってのけられるのだ。この記事の以下では、そうした使用法の
(基本的な) 例をいくつか紹介する。(大事なことを一つ付記しておく。急がば回れだ。
必要になるかもしれないソフトウェア工具があれば、まずそれを作ること。
道具箱に適切な工具がまだない場合の話であるが。)

@node I/O redirection
@unnumberedsec I/O リダイレクション

シェルの入出力リダイレクションについて、基本的なこと、
とくに標準入力、標準出力、標準エラーがどういうものかを、読者はよく御存じだと思う。
要するに、標準入力とは、データの入力元、すなわち、データがそこからやって来る場所のことだ。
データの入力元が、ディスク上のファイルだろうと、キーボードだろうと、磁気テープだろうと、
それどころかパンチカード・リーダーだろうと、プログラムはそれを知る必要もなければ、気にかける必要もない。
同様に、標準出力とは、データの溜まる場所、データがそこに行く場所のことだ。
プログラムとしては、それがどこになろうと、知らなくてもよく、気にかけなくてもよい。
標準入力からデータを読み込み、それに対して何らかの処理を行い、標準出力に送り出すだけのプログラムを、
水道のパイプラインのフィルターになぞらえて、「フィルター (@dfn{filter})」と呼ぶ。

Unix のシェルでは、データのパイプラインを作るのはとてもやさしい。

@smallexample
program_to_create_data | filter1 | ... | filterN > final.pretty.data
@end smallexample

ここでは、まず最初に生のデータを作成している。
各フィルターがそのデータに対して何らかの変形を次々に行い、
最終的に、データが希望どおりの形になって、パイプラインから抜け出してくる。

標準入力と標準出力については、それでよい。
では、標準エラーはどこで登場し、どんな役割を果たすのだろうか？
上記パイプラインの @command{filter1} について考えてほしい。
データを読んでいるうちにエラーが起きたら、どうなるだろうか？
@command{filter1} がエラーメッセージを標準出力に書き出したら、
そのメッセージはパイプラインを下って @command{filter2} の入力に飲み込まれてしまう。
そうなると、ユーザはたぶんメッセージをまったく目にしないことになるだろう。
そこで、プログラムとしては、ユーザがエラーメッセージに気がついてくれるように、
それを送ることのできる場所が必要になる。それが、標準エラーなのであり、
標準エラーは通常、現在使用しているコンソールやウィンドウに結びついている。
プログラムの標準出力を使用中のスクリーン以外にリダイレクトしている場合でも、それは変わらない。

フィルター・プログラムが協力し合うためには、データのフォーマットについて互いに合意している必要がある。
最も素直で使いやすいフォーマットと言えば、何と言っても、行分けされたテキストだ。
そして、Unix のデータファイルは、たいていの場合、まさに、ASCII LF (Line Feed)
文字によって行分けされたバイトの連続なのである。なお、この LF 文字は、Unix
の文書では「改行 (newline)」と呼ばれる習慣になっている (C のプログラマにとっては
@code{\n} だ)。これこそ、すべての伝統的なフィルター・プログラムによって使用されて来たフォーマットである。
(昔のオペレーティング・システムの多くは、バイナリ・データを扱うための複雑な手段や専用のプログラムを備えていた。
だが、Unix は、ただ単にテキストエディタでデータを見たり編集できたりする方がはるかに簡単だという考えから、
そうした道具をずっと敬遠してきたのである。)

さて、前置きはこれくらいで十分だ。まず、道具のいくつかをざっと見てみよう。
その後で、そうした道具をおもしろいやり方で組み合わせる方法をご覧に入れる。
以下の解説では、当面の問題に関係のあるコマンドライン・オプションしか取り上げない。
いつでもそうすべきことだが、コマンドについて詳しいことを知りたかったら、
ご使用のシステムの文書を参照なさるとよい。

@node The who command
@unnumberedsec @command{who} コマンド

最初に取り上げるプログラムは、@command{who} コマンドだ。
これは単独で使うと、現在ログインしているユーザのリストを生成する (参照: @ref{who invocation})。
筆者がこの原稿を書いているのは、シングルユーザのシステムだが、数人のユーザがログインしていることにしよう。

@example
$ who
@print{} arnold   console Jan 22 19:57
@print{} miriam   ttyp0   Jan 23 14:19(:0.0)
@print{} bill     ttyp1   Jan 21 09:32(:0.0)
@print{} arnold   ttyp2   Jan 23 20:48(:0.0)
@end example

ここで @samp{$} はお馴染みのシェルプロンプトであり、筆者はそれに対して
@samp{who} と打ち込んだわけだ。三人のユーザがログインしており、筆者は二度ログインしている。
伝統的な Unix のシステムでは、ユーザ名はアルファベット
8 文字までということになっている。このちょっとした豆知識が、後で役に立つことになる。
@samp{who} の出力は悪くはない。だが、大しておもしろいデータでもない。

@node The cut command
@unnumberedsec @command{cut} コマンド

次に注目するプログラムは @command{cut} コマンドだ。
このコマンドは、入力されたデータから縦の列 (columns) やフィールドを切り出す
(参照: @ref{cut invocation})。そこで、@command{cut} に命じて、@file{/etc/passwd}
ファイルからログイン名とフルネームだけ表示させるといったことができる。
@file{/etc/passwd} には、七つのフィールドがあり、おのおのコロンで区切られている。

@example
arnold:xyzzy:2076:10:Arnold D. Robbins:/home/arnold:/bin/bash
@end example

1 番目と 5 番目のフィールドを取り出すには、次のように @command{cut} を使用する。

@example
$ cut -d: -f1,5 /etc/passwd
@print{} root:Operator
@dots{}
@print{} arnold:Arnold D. Robbins
@print{} miriam:Miriam A. Robbins
@dots{}
@end example

@option{-c} オプションを付けると、 @command{cut} は入力行中の特定の文字
(すなわち、特定の縦の列) を切り出す。これは、入力データが固定幅のフィールドを持ち、
フィールド・セパレータがないときに便利である。
たとえば、今月の月曜日は、何日と何日かをリストするには、次のようにする。

@c Is using cal ok?  Looked at gcal, but I don't like it.
@example
$ cal | cut -c 3-5
@print{} Mo
@print{}
@print{}  6
@print{} 13
@print{} 20
@print{} 27
@end example

@node The sort command
@unnumberedsec @command{sort} コマンド

次に @command{sort} コマンドを一瞥する。
これは Unix 風のシステムにおける最も強力なコマンドの一つであり、
パイプを使って手の込んだデータ処理を行うとき、気がつくと使っていることがよくあるものだ。

@command{sort} コマンドは、コマンドラインで指名された各ファイルを読み込んで、ソートする。
その後で、ソートしたデータをマージし、それを標準出力に書き出す。
コマンドラインでファイルが指定されていない場合は、標準入力を読み込む
(こうして、フィルターになる)。ソートは、文字の照合順序、あるいは、
ユーザが順序について指定した基準に基づいて行われる (参照: @ref{sort invocation})。


@node The uniq command
@unnumberedsec @command{uniq} コマンド

最後に目を向けるのは (少なくとも今のところはだが)、@command{uniq} プログラムだ。
データのソートをしていると、結果に重複行が現れることがよくある。
内容が全く同じ行だ。たいていの場合、各行は一つだけあればよい。そこで、@command{uniq}
の出番になる。@command{uniq} プログラムは、標準入力を読み込み、
連続する同一行については、そのうちの一件だけを表示する。@command{uniq}
には、オプションがいくつかある。後で @option{-c} オプションを使うことになるが、
これはユニークな、つまり他と違っている各行を表示するとき、
その行が入力中に現れた回数を前に付けるものである (参照: @ref{uniq invocation})。


@node Putting the tools together
@unnumberedsec 工具 (tools) を組み合わせる

さて、大規模な ISP のサーバーシステムがあって、何十人ものユーザがログインしているとしよう。
経営側がシステム管理者に、ログインしているユーザのソートしたリストを生成するプログラムを書くことを求めている。
しかも、あるユーザが多重ログインをしていても、その人の名前は出力に
1 回だけ現れればよいという条件がある。

システム管理者は腰を据えてシステムのマニュアル類に取り組み、そうした作業を実行する
C のプログラムを書くこともできるだろう。そのためには、たぶん数百行のコードが必要であり、
プログラムを書いて、テストして、デバッグするには、2 時間ぐらいかかるはずだ。
それに対して、ソフトウェアの道具箱に精通しているシステム管理者なら、
C のプログラムを書く代わりに、ログインしているユーザのリストを生成するところから始めることができる。

@example
$ who | cut -c1-8
@print{} arnold
@print{} miriam
@print{} bill
@print{} arnold
@end example

次に、リストをソートする。

@example
$ who | cut -c1-8 | sort
@print{} arnold
@print{} arnold
@print{} bill
@print{} miriam
@end example

最後に、ソートしたリストを @command{uniq} に渡して、重複を除く。

@example
$ who | cut -c1-8 | sort | uniq
@print{} arnold
@print{} bill
@print{} miriam
@end example

実を言うと、@command{sort} コマンドには @option{-u} というオプションがあって、@command{uniq}
がやることをやってくれる。しかし、@command{uniq} にはほかの働きもあり、そちらは
@samp{sort -u} で代用することができない。

システム管理者が、以下のように、このパイプラインをシェルスクリプトにしておけば、
システムのすべてのユーザが利用できるようになる
(@samp{#} はシステム管理者、すなわち @code{root} のプロンプトだ)。

@example
# cat > /usr/local/bin/listusers
who | cut -c1-8 | sort | uniq
^D
# chmod +x /usr/local/bin/listusers
@end example

ここには、心に留めておくべき重要なことが四つある。
まず第一に、1 行のコマンドラインにたった四つのプログラムを書くことで、システム管理者は約
2 時間分の仕事をしないで済ますことができた。それだけではない。シェルのパイプラインは、
C のプログラムを使った場合と比べても、ほぼ同じくらい効率がよく、
プログラマの労働時間という点から見ると、ずっとずっと効率がよい。
人間の労働時間はコンピュータの時間よりはるかに高価であり、
「何もかもやるには、いつだって時間が足りない」現代社会では、プログラマの時間を
2 時間も節約するのは、馬鹿にできない成果だ。

二番目に、ツールを組み合わせることで、個々のプログラムの作者が想像もしなかったような、
ある特定の目的のための仕事をやってのけることができる。
これも、強調しておくべき重要なことである。

第三に、ここでやって見せたように、段階を追ってパイプラインを構成するのも有益な方法だ。
そうすれば、パイプラインの段階ごとにデータを目で見ることができるので、
ツール類を間違いなく適切に使っているという自信を得ることができる。

最後に、実行したパイプラインをシェルスクリプトにまとめておけば、他のユーザがそのコマンドを使うことができる。
彼らのために作成した手の込んだコマンドの配管工事を、彼らは憶える必要すらないのだ。
どうやって実行するかという点から見ると、シェルスクリプトもコンパイルされたプログラムも見分けが付かないのである。

ここまでは準備運動だ。続いて、もっと複雑なパイプラインをもう二つご覧に入れよう。
そのためには、工具をもう二つ紹介する必要がある。

一つ目は @command{tr} コマンドだ。``transliterate (翻字する、字を置き換える)''
の意味である。 @command{tr} コマンドは、一字一字処理して行くというやり方で、
文字を置き換える (参照: @ref{tr invocation})。
通常、このコマンドを使用するのは、大文字を小文字に変換するといったことのためである。

@example
$ echo ThIs ExAmPlE HaS MIXED case! | tr '[:upper:]' '[:lower:]'
@print{} this example has mixed case!
@end example

役に立ちそうなオプションがいくつかある。

@table @code
@item -c
リストされた文字の補集合を動作対象にする。
言い換えると、指定された集合に存在しない文字に対して操作が行われる。

@item -d
一つ目の集合にある文字を出力から削除する。

@item -s
出力中の連続する同一文字を、ただの 1 文字に圧縮する。
@end table

すぐ後で、この三つのオプションをすべて使うことになる。

紹介するもう一つのコマンドは、@command{comm} だ。
@command{comm} コマンドは、二つのソートされた入力ファイルを入力データとして受け取り、
両ファイルの各行を三つの列に分けて表示する。
出力される列は、一番目のファイルにのみ存在する行、二番目のファイルにのみ存在する行、
両方のファイルに存在する行の順番である。@option{-1}, @option{-2}, @option{-3}
というコマンドライン・オプションを付けると、対応する列を表示しないようになる。
(これは直感的ではないので、ちょっとした慣れが必要だ。参照: @ref{comm invocation})
例を挙げよう。

@example
$ cat f1
@print{} 11111
@print{} 22222
@print{} 33333
@print{} 44444
$ cat f2
@print{} 00000
@print{} 22222
@print{} 33333
@print{} 55555
$ comm f1 f2
@print{}         00000
@print{} 11111
@print{}                 22222
@print{}                 33333
@print{} 44444
@print{}         55555
@end example

ファイル名を @file{-} にすると、@command{comm} は通常ファイルではなく、標準入力を読み込む。

これで、気の利いたパイプラインを組み立てる準備ができた。
最初に作るアプリケーションは、単語の出現頻度カウンターである。
これは、ある特定の単語を使いすぎていないかどうか、文書の作成者が判断するとき、役に立つ。

最初のステップは、入力ファイル中のすべての文字を大文字か小文字のどちらかに統一することである。
``The'' と ``the'' は、頻度計算にとって同じ単語だ。

@example
$ tr '[:upper:]' '[:lower:]' < whats.gnu | ...
@end example

次のステップは、句読点を除去することだ。
引用符の付いている単語と付いていない単語も同じものとして扱った方がよいだろう。
それならば、句読点類をすっぱり取り除いてしまうのが、一番簡単だ。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' | ...
@end smallexample

二番目の @command{tr} コマンドは、リストされた文字の補集合を操作対象にしている。
すなわち、アルファベットのすべての文字、数字、アンダースコア、空白以外を対象にするわけだ。
@samp{\n} は改行文字のことであり、これもそのまま残さなければならない。
(実用に供するスクリプトでは、ついでに ASCII タブ文字も残した方がよいだろう。)

この時点で、空白 (訳注: 改行を含む) で区切られた単語からなるデータができていることになる。
単語には、英数字 (それにアンダースコア) しか含まれていない。
次のステップは、データをバラして、1 行 1 単語になるようにすることだ。
そうすれば、すぐ後で見るように、出現回数の計算がずっと楽になる。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
> tr -s ' ' '\n' | ...
@end smallexample

このコマンドは、空白を改行に変える。@option{-s} オプションが付いているので、
出力中の連続する改行文字はたった 1 個に圧縮され、空行が取り除かれることになる。
(なお、2 行目行頭の @samp{>} という記号は、シェルの二次プロンプトである。
シェルがユーザに、コマンドがまだ最後まで打ち込まれていないと知らせるとき、これが表示される。)

今や、1 行 1 単語からなるデータが手元にある。句読点は含まれず、すべて小文字だ。
これで、各単語の出現回数を数える準備が整った。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
> tr -s ' ' '\n' | sort | uniq -c | ...
@end smallexample

この時点で、データはたぶんこんなふうになっているだろう。

@example
     60 a
      2 able
      6 about
      1 above
      2 accomplish
      1 acquire
      1 actually
      2 additional
@end example

なんと、出力が出現回数ではなく、単語によってソートされている！
こちらとしては、最も頻繁に使われる単語ほど先に表示したいのにだ。
幸いなことに、それは簡単に実現できる。@command{sort} のオプションをもう二つ使うだけでよい。

@table @code
@item -n
文字としてではなく、数値としてソートする。

@item -r
逆順にソートする。
@end table

最終的なパイプラインは次のようになる。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
> tr -s ' ' '\n' | sort | uniq -c | sort -n -r
@print{}    156 the
@print{}     60 a
@print{}     58 to
@print{}     51 of
@print{}     51 and
@dots{}
@end smallexample

ふう、憶えることがどっさり！ うん、でもね、同じ原則を応用してるだけなんだよ。
たった 2 行、6 個のコマンドで (実際には、長い 1 行を便宜上 2 行に分割しているだけだが)
興味深く有用な作業をするプログラムが出来上がった。それも、同じこことする
C のプログラムを書くよりもずっと短い時間でだ。

上記のパイプラインをちょっといじるだけで、なんと、簡単なスペルチェッカーが出来てしまう。
ある単語の綴りが正しいかどうかを判断するには、辞書で調べさえすればよい。
その単語が辞書になければ、綴りを間違えている可能性が高いわけだ。
そこで、とりあえず、辞書が必要になる。辞書の在り処は、慣例からすると
@file{/usr/dict/words} だ (現在では @file{/usr/share/dict/words}
かもしれない)。筆者の GNU/Linux システムでは
@footnote{この記事を 2000 年 11 月に改訂したとき使用したのは、Redhat Linux
6.1 である}、それはソートされた 45,402 語からなる辞書である。

それでは、自分の作ったファイルをどうやって辞書と比べるのか？
前の例と同様、ソートした単語のリストを 1 行 1 語の形式で生成する。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
> tr -s ' ' '\n' | sort -u | ...
@end smallexample

必要なのは、辞書にない単語のリストだけだ。そこで、@command{comm} の出番になる。

@smallexample
$ tr '[:upper:]' '[:lower:]' < whats.gnu | tr -cd '[:alnum:]_ \n' |
> tr -s ' ' '\n' | sort -u |
> comm -23 - /usr/dict/words
@end smallexample

@option{-2} と @option{-3} のオプションを使うと、辞書 (2 番目のファイル)
にしかない行と、両方のファイルにある行が排除される。1 番目のファイル
(標準入力、すなわち、自分が使った単語のリストだ) にしかない行は、辞書に存在しない単語だ。
そうした単語は、綴りを間違えている可能性がかなり高いわけである。
ご覧に入れたこのパイプラインは、Unix における本格的なスペルチェッカーへの最初の一歩だったのである。

他にも一言述べておくべきツールがいくつかある。

@table @command
@item grep
ファイルを調べて、正規表現にマッチするテキストを検索する。

@item wc
行数、単語数、文字数を計算する。

@item tee
データが流れるパイプのための T 字管。データをファイルと標準出力にコピーする。

@item sed
ストリーム・エディタ。上級ツール。

@item awk
データ処理用の言語。これも上級ツール。
@end table

ソフトウェア工具論が取り入れたものに、次のちょっとしたアドバイスもある。「骨の折れる部分は、他の奴にやらせろ」。
すなわち、ある道具を選んで、必要なことの大部分をやらせ、それから、その結果に手を加えて、こちらの望む形にする、ということである。

要約しておこう。

@enumerate 1
@item
個々のプログラムは、一つの仕事をきちんとやってのければよい。それ以上でもそれ以下でもない。

@item
プログラムを適切な配管工事で組み合わせると、全体が部分の総和以上になる結果が生じる。
作者が想像もしなかったようなプログラムの新しい使用法が見つかることもある。

@item
プログラムは決して余計なヘッダや追加情報を出力すべきではない。
そうしたものもパイプラインの先へ送られてしまうかもしれないからだ。
(これは、これまでに言及しなかったが、重要なことだ。)

@item
骨の折れる部分は、他の奴にやらせろ。

@item
自分の道具箱をよく知れ！ 個々のプログラムを適切に使え。適切なツールがなかったら、それを作れ。
@end enumerate

これを執筆している時点で、ここで取り上げたプログラムはすべて次の
URL から手に入れることができる。@*
@uref{http://ftp.gnu.org/old-gnu/textutils/textutils-1.22.tar.gz} @*
もっと新しいバージョンは以下の場所にある。@*
@uref{http://ftp.gnu.org/gnu/coreutils}

この記事で筆者が述べたことに、新しいことは何もない。
ソフトウェアは工具だという思想が最初に紹介されたのは、Brian Kernighan と P.J. Plauger
による @cite{Software Tools} という本の中だった (Addison-Wesley, ISBN
0-201-03669-X)。ソフトウェア工具の書き方と使い方を教えるこの本は、1976
年に執筆され、@command{ratfor} (RATional FORtran) という名前の FORTRAN
のプリプロセッサを使用している。その当時、C は今ほどありふれてはいず、FORTRAN
がそうだったのだ。最後の章では、@command{ratfor} を FORTRAN に変換するプロセッサを
@command{ratfor} で書いて見せている。@command{ratfor} は C にとてもよく似ているので、
C を御存じの方なら、コードを追うのに何の苦労もないことだろう。
(訳注: @cite{Software Tools} の翻訳は「ソフトウェア作法」という題で
1981 年に出版されている。木村泉 訳、共立出版)

1981 年に本は改訂され、@cite{Software Tools in Pascal}
という形でも手に入るようになった (Addison-Wesley, ISBN 0-201-10342-7)。
どちらの本も現在でも入手可能であり、プログラマなら、一読の価値が十分にある。
この 2 冊の本が筆者のプログラミングに対する見方を大きく変えてくれたことに、疑いの余地はない。

両方の本にあるプログラムは、Brian Kernighan のホームページから手に入れることができる
(@uref{http://cm.bell-labs.com/who/bwk})。Software Tools Users Group
という活動的なグループが長年に渡って存在し、そのメンバーがオリジナルの @command{ratfor}
プログラムを、FORTRAN コンパイラを持っているほとんどすべてのコンピュータ・システムに移植していた。
だが、1980 年代の中頃に Unix が大学を越えて浸透し出すにつれて、グループの人気は衰えて行った。

現在では GNU のコードをはじめ、Unix クローンのプログラムがどんどん作られており、
上記のプログラムはほとんど関心を持たれていない。
それに、現代の C のバージョンの方がはるかに効率がよく、できることも上記のプログラムよりずっと多くなっている。
それでも、よいプログラミング・スタイルのお手本として、
また、今でも価値がある考え方を熱心に説いている点において、
この 2 冊の本は肩を並べるものがない。筆者としては、大いにお薦めする次第だ。

謝辞: ソフトウェア工具の最初の道具鍛冶である、Bell 研究所の Brian
Kernighan 氏に、この記事を読んでチェックしてくださったことについて、
心からお礼を申し上げる。

@node About the translation
@appendix 翻訳について

この文書は GNU core utilities version @value{VERSION} の
info マニュアルの翻訳である。間違いの御指摘や改良の御提案は
Linux JM project 宛にメールでなさっていただきたい
(@email{linuxjm-discuss@@lists.osdn.me})。
 
まず最初に、coreutils の日本語版 info マニュアルの呼び出し方を簡単に説明する。
coreutils の 日本語版 info が install-info
コマンドを使ってきちんとシステムにインストールされているならば、コマンドラインから 
@samp{info coreutils-ja} で日本語マニュアル全体を、@samp{info chmod-ja}
などで個々のプログラムの日本語マニュアルを呼び出すことができる。
英語版を読むときは、今までどおり @samp{info coreutils} や @samp{info chmod}
とすればよい。個々のコマンドについては、英語版なら
@samp{info coreutils 'cp invocation'}、日本語版なら
@samp{info coreutils-ja 'cp invocation'} といったマニュアルの呼び出し方もある。

また、@samp{info} を引数なしで実行すると、
info マニュアルのトップレベルのメニューが開く。
ここで、メニュー項目にカーソルを合わせて、リターンキーを押せば、その項目に飛ぶ。
しかし、読みたい項目をキー操作で指定する方が簡単である。たとえば、
@kbd{m} キーを押した後 @kbd{chmod-ja}
と打ち込んで、リターンキーを押せば、chmod コマンドの日本語版マニュアルが、
@kbd{chmod} だけなら英語版マニュアルが表示される。

@kbd{coreutils-ja}、@kbd{chmod-ja} などと
@kbd{-ja} を付けるのは、@command{info} プログラムを起動するときと、
info のトップレベル・メニューにいるときだけである。
すでに日本語版 coreutils マニュアルのどれかを (それが 
coreutils-ja であれ、dd-ja であれ) @command{info} コマンドで開いている場合は、
@kbd{-ja} を後ろに付ける必要がなくなる。と言うより、付けてはいけない。
coreutils-ja の先頭ページのようにコマンドのメニューが存在するページでは
(実際には、スクロールしないと、メニューが見えないが)、たとえば、
@kbd{m} に続けて @kbd{chmod} と打ち込み、リターンキーを押すだけで、
chmod の日本語の説明が開く。また、日本語 coreutils マニュアルの任意のページから
coreutils-ja の他のノードへ直接飛ぶ場合も (ノードは、ほぼ章や節に相当する)、
@kbd{g} キーを押してから、@kbd{chmod invocation} などとノード名を打ち込み、
リターンキーを押せばよい。@kbd{m}, @kbd{g}、どちらの場合も、タブで文字列の補完ができる。

info マニュアルの読み方の基本は、「メニューやクロスリファレンスにカーソルを合わせてリターンキーを押せば、その項目に飛ぶ。
スペースで先に進み、バックスペースで後戻りする。@kbd{l} キーで直前に開いていたノードに戻る。
@kbd{q} キーで終了する」である。たぶん coreutils-ja.info 
のパッケージには、README.ja というファイルが含まれていると思う。
info マニュアルの呼び出し方や使用法について、そこにもう少し詳しい説明を書いておいたので、
ご覧になっていただきたい。

ここで、日本語の info マニュアルを使用するときの問題点を挙げておく。

@enumerate
@item
@command{info} コマンドのバージョンによっては、行末の処理が上手ではない。
そのため、行末に余計な文字が入ることがある。そうしたときは、@kbd{C-l} を押して 
(Ctrl と l (エル) キーを同時に押す)、画面の再描画を行っていただきたい。
表示が正常になるはずである。
Emacs の info リーダーでは、この問題はめったに起きない。

@item
最近の @command{info} コマンド (たとえば、バージョン 6.3) 
では、@kbd{s} や @kbd{/} による日本語の単語の検索ができるようになった。
@kbd{C-s} による日本語のインクリメンタル検索も可能になっている。
バージョンの古い @command{info} では、英単語による検索はできても、
日本語の単語による検索はできないので、注意していただきたい。

@item
X の端末エミュレータで @command{info} コマンドを使用する場合、
端末エミュレータとフォントの組み合わせによっては、
文字列を囲むクォートの表示がおかしくなることがある。
フォントに「Monospace Regular」を使っているなら、
「VL Pゴシック regular」か「Liberation Mono Regular」に変えてみるとよいかもしれない 
(それはそれで、別の問題が出る可能性もあるが)。
ちょっと古風だが、日本語が使える @command{xterm} 
(@command{uxterm} など) なら、クォートの表示にまず問題はない。

@item
coreutils の info のこの翻訳では、インデックスの日本語化まで手が回らなかった。
そのため、インデックスは英語のままである。

@item
古めの Emacs でこの翻訳を読もうとすると、文字化けするかもしれない。
回避法があるのかもしれないが、訳者にはわからなかった。
@end enumerate

この翻訳の最初の版は、coreutils-8.20 所収の texinfo ファイルを元に、
Linux JM project のために訳者が新たに翻訳したものだった。
以下に、そのときの後書きをほぼそのまま載せておく。

この info マニュアルの原文は、本文の「序」でも述べているように、
各プログラムの man ページを統合し、増補・改訂したものである。この info 
マニュアルがまとめられるにともない、公式の man ページの方は、コマンドの 
@samp{--help} オプションで見ることができるものとほぼ同文の、
簡単な内容のものになった。

従来どおりの詳しい man ページを希望する人たちも存在した。
そのために作られたのが、gnumaniak の man ページであり、従来の man ページを
info の情報で増補したものだったが、現在では保守されていないようだ。

作成の経緯がそうしたものなので、この info マニュアルの原文には、
gnumaniak の man ページの原文とほとんど内容が同じものがある。
翻訳作業に当たっては、すべての項目について gnumaniak の
man ページの翻訳を参考にした。あちらの訳文の方がよくできている項目もある
(gnumaniak の翻訳は
@uref{http://linuxjm.osdn.jp/html/gnumaniak/man1/} にある)。

この翻訳は、Linux JM project の gnumaniak の翻訳に多くを負っている。
そこで、まず、gnumaniak の翻訳者の方々 --- 中野武雄、佐藤裕一、白方健太郎、
Kazuyuki Tanisako、Omo Kazuki の諸氏にお礼を申し上げる。

訳文を見直す際には、西尾太さんが以前翻訳なさった coreutils-5.2.1 の 
info を参考にした。また、当然ながら、新しい man ページ
(こちらの翻訳者は、たぶん Yasuaki Taniguchi さんと Akihiro MOTOKI さん)
とも、できるだけ突き合わせた。西尾さん、Taniguchi さん、元木さんにもお礼を申し上げる。

gnumaniak や coreutils の man や info の翻訳をなさった方で、
私がお名前を挙げ忘れた方がいらっしゃるかもしれない。
お知らせくだされば、追加訂正する。

訳文には間違った箇所がたくさんあると思う。そのへんは、ご寛恕いただきたい。
皆さんがこの訳文を叩き台にして、増補・改訂・改訳を続け、
より新しく、よりわかりやすい、そして、より正確な coreutils
の翻訳を作ってくだされば、最初の翻訳者としてそれにまさる喜びはない。

2017-03-26 訳者

[翻訳履歴]

@itemize @bullet
@item
2014-03-15@*
coreutils-8.20 を翻訳    by 長南洋一@*
ptx, tsort, chcon, runcon は未訳

@item
2014-11-25@*
coreutils-8.22 を元に増補・改訂    by 長南洋一@*
numfmt, ptx, tsort, chcon, runcon を翻訳

@item
2016-07-07@*
numfmt の章の構成を修正。訳文の訂正と細かい変更    by 長南洋一

@item
2017-03-26@*
coreutils-8.26 を元に増補・改訂    by 長南洋一

@item
2019-09-09@*
訳文の訂正と変更    by 長南洋一
@end itemize

@node GNU Free Documentation License
@appendix GNU Free Documentation License

@include fdl.texi

@node Concept index
@unnumbered Index

@printindex cp

@bye

@c Local variables:
@c texinfo-column-for-description: 32
@c End:
