\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 @sc{gnu} Coreutils

@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.
* 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 and change 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.
* 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 and 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
このマニュアルは、@sc{gnu} core utilities version @value{VERSION} の詳細な解説である。
core utilities には、テキストやファイルを操作するための標準的な
プログラムが入っている。

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

@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 (エル) キーを同時に押して、画面を再描画
していただきたい。たぶん、表示が正常になるはずである。
@end copying

@titlepage
@title @sc{gnu} @code{Coreutils}
@subtitle Core GNU utilities
@subtitle for version @value{VERSION}, @value{UPDATED}
@author David MacKenzie et al.
@author 長南洋一 訳

@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 base64)
* Formatting file contents:: ファイルの整形 (fmt pr fold)
* Output of parts of files:: ファイルの部分出力 (head tail split csplit)
* Summarizing files::      チェックサムなど (wc sum 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::          chcon runcon
* Modified command invocation::  実行環境の変更 (chroot env nice nohup stdbuf 
                                   timeout)
* Process control::          プロセス制御 (kill)
* Delaying::                 一時停止 (sleep)
* Numeric operations::       数値の操作 (factor seq)
* File permissions::         アクセス・モード
* Date input formats::       日付文字列の指定法
* Opening the software toolbox::  ソフトウェア工具という考え方
* About this 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 のシンタクス
* Random sources::           ランダムデータのソース
* Target directory::         出力先ディレクトリ
* Trailing slashes::         末尾のスラッシュ
* Traversing symlinks::      シンボリックリンクをたどる
* Treating / specially::     / (ルート) を特別扱いする
* Standards conformance::    標準への準拠

ファイル全体の出力

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

ファイル内容の整形

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

ファイルの部分出力

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

ファイルの要約

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

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

* sort invocation::          テキストファイルを並べ替える
* shuf invocation::          テキストファイルをシャッフルする
* uniq invocation::          ファイルから重複を省く
* comm invocation::          ソート済みの二つのファイルを一行づつ比較する
* ptx invocation::           Produce a permuted index of file contents
* tsort invocation::         Topological sort

@command{ptx}: Produce permuted indexes

* General options in ptx::   Options which affect general program behavior
* Charset selection in ptx::  Underlying character set considerations
* Input processing in ptx::  Input fields, contexts, and keyword selection
* Output formatting in ptx::  Types of output format, and sizing the fields
* Compatibility in ptx::     The GNU extensions to @command{ptx}

フィールド操作

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

文字操作

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

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

* Character sets::           文字集合の指定
* Translating::              ある文字集合を別の文字集合に変換する
* Squeezing::                連続する文字の圧縮と文字の削除

ディレクトリの一覧表示

* 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 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::           現在誰がログインしているかを表示する

システム情報

* arch invocation::          マシンのハードウェア名を表示する
* date invocation::          システムの日付や時刻を表示、設定する
* nproc invocation::         Print the number of processors
* 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 context

* chcon invocation::         Change SELinux context of file
* runcon invocation::        Run a command in specified SELinux context

コマンド実行条件の変更

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

プロセス制御

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

一時停止

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

数値の操作

* factor invocation::        素因数を表示する
* seq invocation::           数列を表示する

ファイルの許可属性

* Mode Structure::           ファイルのモードビットの構成
* Symbolic Modes::           ファイルのモードビットの憶えやすい表記
* 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::          @sc{est}, @sc{pdt}, @sc{gmt}
* 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 this translation::   翻訳について

Copying This Manual

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

@end detailmenu
@end menu


@node Introduction
@chapter 序

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

@cindex POSIX
このマニュアルで説明している @sc{gnu} ユーティリティは、POSIX の規格に
おおむね準拠している。
@cindex bugs, reporting
バグの報告は、@email{bug-coreutils@@gnu.org} になさって
いただきたい。そのとき、バージョン番号、マシンのアーキテクチャ、入力に
使ったファイルといった情報はもとより、バグの再現に必要な他のいかなる
情報も、忘れずに記載していただきたい。たとえば、どんな入力をしたか、
どんな結果を期待していたか、実際の結果はどうだったか、それがおかしいと
考える理由は何なのかといったことである。差分の投稿は歓迎するが、何がどう
問題なのかの説明もやはり付けていただきたい。推測するのが難しいこともある
からだ。@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 @w{@kbd{--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 @w{@kbd{--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 optNull{cmd}
@item -0
@opindex -0
@itemx --null
@opindex --null
@cindex output @sc{nul}-byte-terminated lines
各行の末尾に改行ではなく、ゼロバイト (ASCII @sc{nul}) を出力する。この
オプションを使用すると、@command{\cmd\} の出力するデータに、途中に改行を
挟むものがあっても、他のプログラムがその出力を解析できるようになる。
@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 @w{@kbd{--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\} は整数であり、以下に挙げるような、何倍かを表す接尾辞を
後ろに付けることもできる。
@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\} は整数であり、以下に挙げるような、何倍かを表す接尾辞を
後ろに付けることもできる。
@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

いくつかのオプションは、このマニュアルで取り上げるすべてのプログラムで
利用することができる。そうしたオプションについては、個々のプログラムで
同じ説明を繰り返すことはせず、この場で説明しておく (実のところ、こうした
オプションは、@sc{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{tee -} は、入力したもののコピーを標準出力に二重に書き出す。使用できない
とはっきり断っていないかぎり、@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 のシンタクス。
* 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 規格への準拠。
@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{printenv}, @command{sort}, @command{stdbuf},
@command{test}, @command{timeout}, @command{tty} などである。


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

@cindex backup options

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

@table @samp

@item -b
@itemx @w{@kbd{--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}
が設定されていない場合、デフォルトは Emacs の場合と同じで、@samp{~}
である。

@end table

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

@cindex block size

@sc{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} の累乗倍 (訳注: 10^3 倍、10^6 倍など)
を示す場合は、SI (国際単位系) の単位の前に付ける接頭辞 (prefix) の上位
互換であり、@samp{2} の累乗倍 (訳注: 2^10 倍、2^20 倍など) を示す場合は、
ISO/IEC 80000-13 (以前は IEC 60027-2 だった) の接頭辞の上位互換である。
単位の前に付ける接頭辞については、次の URL を参照していただきたい。@*
@uref{http://www.bipm.org/en/si/si_brochure/chapter3/prefixes.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} と同じだ。

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

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

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

GNU の @command{chown} や @command{chgrp} は、@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} のような他のデータソースが必要になるかもしれない。どんな
データソースが利用できるかは、ご使用のオペレーティング・システム次第である。

前回コマンドを実行したときの結果を再現するには、何らかのランダム
データをファイルに保存しておき、そのコマンドの一回目の実行でも二回目
の実行でも、ランダムソースとしてそのファイルを使用すればよい。

@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 @w{@kbd{--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}) を起動するたびに
最後の引数を特別に指定するためのすっきりした方法がないからである。
(あるシェル・コマンドを駆使すれば、やることができるが、それでは、
人間の労力と脳力を不当に要求することになる。)

@w{@kbd{--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{.} の付くファイルが移動しな
い。@sc{gnu} @command{find} プログラムを使用しているなら、次のコマンドでそうした
ファイルも移動させることができる。

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

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

いくつかの @sc{gnu} プログラム (少なくとも、@command{cp} と @command{mv}) では、@var{source} 引数を
処理する前に、その引数の末尾にスラッシュが付いていたら、それを除去する
ことができるようになっている。@w{@kbd{--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} を実行したら、システム全体のすべてのファイルが消えて
しまうかもしれないのだ。そうしたコマンドの使用が正当であることは、
めったにないので、@sc{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} といったコマンドの動作は、
読者が予想なさるかもしれないようなものにはならない。
@sp 1
(訳注: 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
@sc{gnu} ユーティリティのデフォルトの動作が POSIX の規格と一致しない場合
が、若干ながら存在する。そうした非互換性を抑制するには、環境変数
@env{POSIXLY_CORRECT} を設定すればよい。もっとも、POSIX に準拠しているか
否かを点検しているのでもないかぎり、@env{POSIXLY_CORRECT} を設定する必要は、
おそらくないだろうが。

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

@vindex _POSIX2_VERSION
通常 @sc{gnu} のユーティリティは、お使いのシステムにとって標準である POSIX
のバージョンに従っている。@sc{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 の昔のバージョンを前提としていて、@samp{sort +1} や
@samp{tail +10} を使用している場合は、環境に @samp{_POSIX2_VERSION=199209} を設定
することで、互換性の問題を回避することができる。

@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 進数などの形式で書き出す。
* 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} が一つも指定されていない場合は、標準入力から読み込む。
@sp 1
書式:

@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
連続する空行の表示を抑制する。すなわち、連続する複数の空行の代わりに、
たった 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} が一つも指定されていない場合は、標準入力から読み込む。
@sp 1
書式:

@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
区切り文字列を正規表現として処理する。MS-DOS/MS-Windows 上で @command{tac}
を使用するユーザは、@command{tac} はバイナリモードでファイルを読み込む
ので、テキストファイルの各行の末尾が、Unix 流の LF ではなく、CR/LF
になっているかもしれないことに注意するべきである。

@item -s @var{separator}
@itemx --separator=@var{separator}
@opindex -s
@opindex --separator
改行の代わりに、@var{separator} をレコード区切り文字列 (record separator)
として使用する。

@end table

@exitstatus


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

@pindex nl
@cindex numbering lines
@cindex line numbering

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

@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
各論理ページの本文セクションにおける行の番号付けの方式を選択する。
行に番号が付かない場合、行番号の現在値は増加しないが、それでも行番号
の区切り文字は行の前に付く (訳注: 手元にある coreutils-8.20 の nl
の場合、空行のような行番号が付かない行には、行番号とテキストの区切り
文字も付かないようだ)。番号付けの方式には、以下のものがある。

@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} が一つも指定されていない場合は、標準入力
から読み込む。
@sp 1
書式:

@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} ごとに
分けたものであり、一つの 8 進数として表示される。

@var{offset} を指定した場合、それは、整形と出力を始める前に、入力を
何バイト読み飛ばすかを示している。デフォルトでは、@var{offset} は 8 進数と
見なされるが、数字の後ろに小数点を付ければ、10 進数と見なされる。
小数点が指定されず、オフセットの数字が @samp{0x} や @samp{0X} で始まっている場合
は、16 進数として解釈される。もし、数字の後ろに @samp{b} が付いているなら
ば、読み飛ばすバイト数は、@var{offset} に 512 を掛けたものになる。
@sp 1
(訳注: 数字の後ろに小数点を付けることで @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 -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 @sc{nul}) が続くものを出力するわけだ。@var{bytes} に接頭辞や接尾辞を
付けると、@option{-j} オプションの場合と同じように解釈される。

@option{--strings} に続く @var{bytes} が省略された場合、デフォルトは 3 である。

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

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

@table @samp
@item a
文字の名称 (訳注: たとえば、A は A、改行文字は nl)。最上位
ビットは無視する。
@item c
ASCII 文字かバックスラッシュ・エスケープ
@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

以下に挙げるいくつかのオプションは、形式指定の簡易版である。@sc{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
ASCII 文字かバックスラッシュ・エスケープとして出力する。
@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 base64 invocation
@section @command{base64}: データを表示可能データ (printable data) に変換する

@pindex base64
@cindex base64 encoding

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

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

base64 でエンコードすると、データが元のデータのほぼ 133% に増大する。
base64 エンコード形式は、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 文字である。(訳注:
日本語のテキストは、通常単語を空白で区切らないので、うまく整形できない。)
@sp 1
書式:

@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 行目のインデントに揃える。

@item -t
@itemx --tagged-paragraph
@opindex -t
@opindex --tagged-paragraph
@cindex tagged paragraphs
タグ付きパラグラフ・モード (@dfn{Tagged paragraph} mode)。クラウンマー
ジン・モードに似ているが、次の点が違う。パラグラフの最初の行と
二番目の行のインデントが同じ場合、最初の行は 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} の
日本語対応は完全ではない。とくに段組みがうまく行かない。)
@sp 1
書式:

@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} を使用する。

@c FIXME: this whole section here sounds very awkward to me. I
@c made a few small changes, but really it all needs to be redone. - Brian
@c OK, I fixed another sentence or two, but some of it I just don't understand.
次の変更がバージョン 1.22i で行われた。従って、@command{pr} のそれ以後の
バージョンにも当てはまる。 (Brian 記)
@itemize @bullet

@item
小文字のオプションのいくつか (@option{-s}, @option{-w}) は、POSIX に一層忠実に
準拠するよう、再定義された。また、より高度な用法の出力の中には、他の
Unix システムの動作に合わせたものもある。こうした変更は、@command{pr} の
前のバージョンと互換性がない。

@item
小文字のオプションによる思いがけない副作用をなくすために、大文字の
オプションが新たにいくつか導入された (@option{-J}, @option{-S}, @option{-W})。また @option{-N}
オプションと @samp{+FIRST_PAGE} の第二引数 @var{last_page} によって、より柔軟
な操作が可能になっている。入力ファイルにあるフォームフィードを細かく
操作するには、@option{-T} オプションを使う必要がある。

@item
大文字のオプションは、小文字のオプションに優先する。

@item
オプションに対する引数の中には、オプション文字とその引数の間に
空白を挟むことができないものがある (@option{-s}, @option{-e}, @option{-i}, @option{-n} など。
これについては、POSIX の仕様にすでに言及がある)。
@end itemize

このプログラムでは以下のオプションが使用できる。参照: @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 字)。多段組みで @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} 文字にする。この指定は、段組みオプションが
あってもなくても、有効である。@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} の日本語対応は完全ではない。)
@sp 1
書式:

@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{-} が指定されている
場合は、標準入力から読み込む。
@sp 1
書式:

@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{k}
@itemx --bytes=@var{k}
@opindex -c
@opindex --bytes
ファイルの先頭数行を表示する代わりに、先頭から @var{k} バイトを表示する。
ただし、@var{k} が @samp{-} で始まっている場合は、各ファイルについて、末尾の
@var{k} バイトを除いたすべてを表示することになる。@multiplierSuffixes{k}

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

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

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

@end table

@command{head} は、互換性を考慮して、@option{-@var{count}@var{options}} というオプション指定の
古い書式もサポートしている。ただし、この書式が認識されるのは、最初の
オプションとして指定されたときだけである。@var{count} は 10 進数であり、@option{-c}
オプションの場合と同様、サイズを示す文字 (@samp{b}, @samp{k}, @samp{m}) を後ろに続けて
もよく、また、行数であることを明示する @samp{l} や、ほかのオプション文字
(@samp{cqv}) を続けることもできる。標準的なホストで使うことを意図したスク
リプトでは、古い書式ではなく、@option{-c @var{count}} や @option{-n @var{count}} を使用するべきで
ある。そのスクリプトが、古い書式にしか対応していないホストでも動かな
ければならない場合は、@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{-} が指定されている
場合は、標準入力から読み込む。
@sp 1
書式:

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

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

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

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

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

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

@table @samp

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

@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 --retry
@opindex --retry
このオプションが役に立つのは、主として名前による追跡を行うときである
(すなわち、@option{--follow=name} とともに使うときだ)。このオプションを
付けないと、 tail はファイルが存在しなくなったり、何かほかの理由で
ファイルにアクセスできなくなったりしたとき、その旨報告するだけで、
以後再検査を行うことがない。

@item --sleep-interval=@var{number}
@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}} も一緒に指定している場合は別で、@command{tail} は、
プロセス @var{p} が生きているかどうかを、少なくとも @var{number} 間隔でチェック
する。

@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 --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{k}
@itemx --lines=@var{k}
@opindex -n
@opindex --lines
末尾の  @var{k} 行を出力する。ただし、@var{k} が @samp{+} で始まっている場合は、
各ファイルの末端から @var{k} 行目ではなく、先頭から @var{k} 行目を始点として
出力を開始する。サイズの乗数接尾辞は、@option{-c} の場合と同様である。

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

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

@end table

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

@vindex _POSIX2_VERSION
古いシステムでは、旧式のオプション書式において、先頭の @samp{-} を @option{-c}
や @option{-n} オプションの場合と同じ意味で @samp{+} に置き換えることができる。
また、そうしたシステムでは、古い用法と標準の用法が衝突する場合には、
古い用法が優先される。そうした古い動作を有効にしたり、無効にしたりする
には、環境変数 @env{_POSIX2_VERSION} を使用すればよい (@pxref{Standards conformance})。

標準的なホストで使用するためのスクリプトでは、古い書式を使わずに、
@option{-c @var{count}[b]}, @option{-n @var{count}} オプションや @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{-} である場合には、標準入力から読み込む。
@sp 1
書式:

@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} 行づつ各出力ファイルに書き込む。

互換性を考慮して、@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} の完全な行をできるだけ多く書き込む。1 行の長さが @var{size} バイト
を越える行は、複数のファイルに分割される。@var{size} の書式は、@option{--bytes}
オプションの場合と同じである。

@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 行づつ各出力ファイルに分配して行く。)
r/@var{k}/@var{n}  同上。ただし、@var{n} 個中の @var{k} 番目のみを標準出力に出力する。
@end example

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

行数が @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} の値を指定すると、
上で述べた接尾辞の長さを自動的に増やして行くデフォルトの機能まで無効
になる。そこで、ユーザとしては、99 を越える数字を接尾辞として使える
ようにするため、@option{-a} オプションも併せて指定したくなるかもしれない。

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

@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{-} である場合は、標準入力から読み込む。
@sp 1
書式:

@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} 行を含む出力
ファイルを作成していく。

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

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

@cindex summarizing files

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

@menu
* wc invocation::            行数、単語数、バイト数を表示する。
* sum invocation::           チェックサムとブロック数を表示する。
* cksum invocation::         CRC チェックサムとバイト数を表示する。
* 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{-} が指定された
場合は、標準入力を対象とする。
@sp 1
書式:

@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
最長行の長さのみを表示する。

@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 @sc{nul})
で終端されていなければならない。このオプションは、ファイル名のリスト
が長すぎて、コマンドライン長の上限を超過してしまいそうなときに、
\withTotalOption\便利である。そうした場合、@command{\cmd\} を @command{xargs} 経由で実行するのは、
望ましくない。なぜなら、@command{xargs} はファイルのリストをいくつかの部分
に分割して @command{\cmd\} に渡すので、@command{\cmd\} はリスト全体の\subListOutput\ではなく、
部分リストごとの\subListOutput\を表示してしまうからである。
ASCII @sc{nul} で終端されたファイル名のリストを得る方法の一つは、
@sc{gnu} @command{find} に @option{-print0} を付けて使うことである。@var{file} に @samp{-}
を指定すれば、
ASCII @sc{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{-} が指定された場合は、
標準入力を対象とする。
@sp 1
書式:

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

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

デフォルトでは、@sc{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{-} が指定された場合は、標準入力を対象とする。
@sp 1
書式:

@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 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} は、
ファイルとチェックサムの間に矛盾がないかどうかを判定することもできる。
@sp 1
書式:

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

各 @var{file} に対して @samp{md5sum} は、MD5 チェックサム、入力モードがバイ
ナリかテキストかを示すフラグ、それにファイル名を出力する。@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}
を実行してチェックサムを作成したときの出力である。入力の有効な行は
それぞれ、MD5 チェックサム、バイナリかテキストかのフラグ、ファイル
名の順になっている。バイナリモードには @samp{*} の指標が付き、テキスト
モードには、@samp{ } (空白) の指標が付く。そうした各行に対して、@command{md5sum}
は、そこに名前を挙げられたファイルを読み込み、その MD5 チェックサム
を計算する。そして、算出したメッセージダイジェストが、そのファイル名
と同じ行にあるチェックサムと一致しない場合は、そのファイルがテストに
失敗したことを通告するのである。両者が一致した場合は、テストにパス
したことになる。デフォルトでは、有効な各行に対して標準出力にメッ
セージを 1 行づつ書き出し、指名されたファイルがテストにパスしたか
どうかを明かにする。また、すべてのチェックが完了したとき、テストに
失敗したものが一つでもあれば、警告メッセージを標準エラーに出力する。
この出力を抑制したければ、@option{--status} オプションを使用すればよい。
リストされたファイルの中に、オープンできなかったり、読み込めなかっ
たりするものがあった場合や、有効な行に書いてあるチェックサムが対応
するファイルの実際の値と一致しなかった場合、それに、有効な行が全く
存在しなかった場合は、@command{md5sum} は 0 以外のステータスで終了する。
それ以外の場合は正常終了することになる。

@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} と全く同じである。@xref{md5sum invocation}.

注意: SHA384 と SHA512 のダイジェストは、SHA224 や SHA256 に比べて、
計算にかなり時間がかかる。32 ビットのコンピュータではなおさらである。


@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::           Produce a permuted index of file contents.
* tsort invocation::         Topological sort.
@end menu


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

@pindex sort
@cindex sorting files

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

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

@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 sort stability
@cindex sort's last-resort comparison
二つの行の比較は、次のように行われる。@command{sort} は、対になる各フィールド
を、コマンドラインで指定された順番で、そのフィールドに結びついた順序関係
のオプションに従いつつ比較し、相違が見つかるか、比較するフィールドが
なくなるまでそれを続ける。キーとなるフィールドが指定されていない場合に
比較に使用されるのは、デフォルトのキーである行全体である。最後に、すべて
のキーが同じだったときは、最後の手段として、@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_CTYPE} が @code{ja_JP.PCK} なのに、
@env{LC_COLLATE} が @code{en_US.UTF-8} の場合、@command{sort} の動作は未定義である。}

@sc{gnu} の @command{sort} は (@sc{gnu} のすべてのユーティリティについて規定されている
とおり)、入力行の長さに上限がない。言い換えれば、各行に入れられるバイト
数に制限がない。また、入力ファイルの最後のバイトが改行でなければ、@sc{gnu} の
@command{sort} は黙って改行を追加する。なお、行末の改行は、比較に当たっては、
行の一部として扱わない。

@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
NaNs (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 接尾辞は、数値の直後に置かなければならない。

@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} は、@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} といったコマンドを使って、
ファイルを直接書き変えるやり方で、ソートをしても問題がない。
これに対して、@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 バイト単位である。@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 @sc{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}) オプションが指定されている場合
は、等価な行が連続して二行存在しないかをチェックする (訳注: 等価な
行の連続があると、終了ステータスが 1 になる)。

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

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

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

@end table

@command{sort} の従来の (すなわち BSD と System V の) 実装では、いくつかの
オプションの解釈が互いに異なっていた。とりわけ、@option{-b}, @option{-f}, @option{-n} に
ついてそうだった。@sc{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
古いシステムの @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}} と
同じだ。

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

標準的なホストで使用することを意図したスクリプトでは、旧式の書式は
使わずに、@option{-k} の方を使用するべきである。たとえば、@samp{sort +2} は使わない
方がよい。@samp{sort ./+2} と解釈されるか、@samp{sort -k 3} と解釈されるか、わから
ないからである。そのスクリプトが、旧式の書式にしか対応していないホスト
でも動作しなければならないのなら、スクリプト中で
@w{@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 アドレスの
ソートは辞書順で行う。たとえば、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} は、入力された行をランダムに並べ替えてから出力することによって、
入力のシャッフルを行う。どの並び替えが出力されるかは、確率的に等しい。
@sp 1
書式:

@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{lines}
@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}.

@zeroTerminatedOption

@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} とおりに) 並べ替えて、出力することができる。

@exitstatus


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

@pindex uniq
@cindex uniquify files

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

@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} 個より少ないフィールドしかない場合は、比較に null 文字列を使用
する。フィールドとは、少なくとも 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} 個より少ない
文字しかない場合は、比較に null 文字列を使用する。フィールドを
スキップするオプションと、文字をスキップするオプションの両方を
使っている場合は、フィールドのスキップが先に行われる。

@vindex _POSIX2_VERSION
古めのシステムでは、@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
重複行の各グループの前に改行を出力する。@option{--zero-terminated}
(@option{-z}) を指定している場合は、改行の代わりに、ゼロバイト
(ASCII @sc{nul}) を使用する。

@item separate
重複行のグループ間を 1 個の改行で分離する。@option{--zero-terminated}
(@option{-z}) を指定している場合は、改行の代わりに、ゼロバイト (ASCII
@sc{nul}) を使用する。これは、@samp{prepend} を使うのとほぼ同じだが、
最初のグループの前に区切りの印を挿入しないのが異なっている。
それ故、ユーザが出力を直接見る場合に、より適しているかもしれない。
@end table

注意していただきたいが、グループ同士を改行で分離しているとき、
入力ストリームに連続する 2 行以上の空行があると、出力がまぎらわ
しいものになる。これを避けるには、入力を @samp{tr -s '\n'} でフィルタ
リングして、連続する改行をそれぞれの場所で 1 個の改行に置き換え
ればよい。

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

@item -u
@itemx --unique
@opindex -u
@opindex --unique
@cindex unique lines, outputting
連続する同一行は、1 行目も除去する。このオプションを単独で使うと、
@command{uniq} はユニークな (訳注: この場合、同一行が直後に続かないという
意味) 行だけを表示し、それ以外の何も表示しない。

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

@zeroTerminatedOption

@end table

@exitstatus


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

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

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

@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} は、空であってはならない。

@end table

@node ptx invocation
@section @command{ptx}: Produce permuted indexes

@pindex ptx

@command{ptx} reads a text file and essentially produces a permuted index,
with each keyword in its context.  The calling sketch is either one of:

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

The @option{-G} (or its equivalent: @option{--traditional}) option disables
all @sc{gnu} extensions and reverts to traditional mode, thus introducing
some limitations and changing several of the program's default option
values.  When @option{-G} is not specified, @sc{gnu} extensions are always
enabled.  @sc{gnu} extensions to @command{ptx} are documented wherever
appropriate in this document.  @xref{Compatibility in ptx}, for the full
list.

Individual options are explained in the following sections.

When @sc{gnu} extensions are enabled, there may be zero, one or several
@var{file}s after the options.  If there is no @var{file}, the program reads
the standard input.  If there is one or several @var{file}s, they give the
name of input files which are all read in turn, as if all the input files
were concatenated.  However, there is a full contextual break between each
file and, when automatic referencing is requested, file names and line
numbers refer to individual text input files.  In all cases, the program
outputs the permuted index to the standard output.

When @sc{gnu} extensions are @emph{not} enabled, that is, when the program
operates in traditional mode, there may be zero, one or two parameters
besides the options.  If there are no parameters, the program reads the
standard input and outputs the permuted index to the standard output.  If
there is only one parameter, it names the text @var{input} to be read
instead of the standard input.  If two parameters are given, they give
respectively the name of the @var{input} file to read and the name of the
@var{output} file to produce.  @emph{Be very careful} to note that, in this
case, the contents of file given by the second parameter is destroyed.  This
behavior is dictated by System V @command{ptx} compatibility; @sc{gnu}
Standards normally discourage output parameters not introduced by an option.

Note that for @emph{any} file named as the value of an option or as an input
text file, a single dash @kbd{-} may be used, in which case standard input
is assumed.  However, it would not make sense to use this convention more
than once per program invocation.

@menu
* General options in ptx::   Options which affect general program behavior.
* Charset selection in ptx::  Underlying character set considerations.
* Input processing in ptx::  Input fields, contexts, and keyword selection.
* Output formatting in ptx::  Types of output format, and sizing the fields.
* Compatibility in ptx::     
@end menu


@node General options in ptx
@subsection General options

@table @samp

@item -G
@itemx --traditional
As already explained, this option disables all @sc{gnu} extensions to
@command{ptx} and switches to traditional mode.

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

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

@end table

@exitstatus


@node Charset selection in ptx
@subsection Charset selection

@c FIXME:  People don't necessarily know what an IBM-PC was these days.
As it is set up now, the program assumes that the input file is coded using
8-bit ISO 8859-1 code, also known as Latin-1 character set, @emph{unless} it
is compiled for MS-DOS, in which case it uses the character set of the
IBM-PC@.  (@sc{gnu} @command{ptx} is not known to work on smaller MS-DOS
machines anymore.)  Compared to 7-bit ASCII, the set of characters which are
letters is different; this alters the behavior of regular expression
matching.  Thus, the default regular expression for a keyword allows foreign
or diacriticized letters.  Keyword sorting, however, is still crude; it
obeys the underlying character set ordering quite blindly.

@table @samp

@item -f
@itemx --ignore-case
Fold lower case letters to upper case for sorting.

@end table


@node Input processing in ptx
@subsection Word selection and input processing

@table @samp

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

This option provides an alternative (to @option{-W}) method of describing
which characters make up words.  It introduces the name of a file which
contains a list of characters which can@emph{not} be part of one word; this
file is called the @dfn{Break file}.  Any character which is not part of the
Break file is a word constituent.  If both options @option{-b} and
@option{-W} are specified, then @option{-W} has precedence and @option{-b}
is ignored.

When @sc{gnu} extensions are enabled, the only way to avoid newline as a
break character is to write all the break characters in the file with no
newline at all, not even at the end of the file.  When @sc{gnu} extensions
are disabled, spaces, tabs and newlines are always considered as break
characters even if not included in the Break file.

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

The file associated with this option contains a list of words which will
never be taken as keywords in concordance output.  It is called the
@dfn{Ignore file}.  The file contains exactly one word in each line; the end
of line separation of words is not subject to the value of the @option{-S}
option.

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

The file associated with this option contains a list of words which will be
retained in concordance output; any word not mentioned in this file is
ignored.  The file is called the @dfn{Only file}.  The file contains exactly
one word in each line; the end of line separation of words is not subject to
the value of the @option{-S} option.

There is no default for the Only file.  When both an Only file and an Ignore
file are specified, a word is considered a keyword only if it is listed in
the Only file and not in the Ignore file.

@item -r
@itemx --references

On each input line, the leading sequence of non-white space characters will
be taken to be a reference that has the purpose of identifying this input
line in the resulting permuted index.  @xref{Output formatting in ptx}, for
more information about reference production.  Using this option changes the
default value for option @option{-S}.

Using this option, the program does not try very hard to remove references
from contexts in output, but it succeeds in doing so @emph{when} the context
ends exactly at the newline.  If option @option{-r} is used with @option{-S}
default value, or when @sc{gnu} extensions are disabled, this condition is
always met and references are completely excluded from the output contexts.

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

This option selects which regular expression will describe the end of a line
or the end of a sentence.  In fact, this regular expression is not the only
distinction between end of lines or end of sentences, and input line
boundaries have no special significance outside this option.  By default,
when @sc{gnu} extensions are enabled and if @option{-r} option is not used,
end of sentences are used.  In this case, this @var{regex} is imported from
@sc{gnu} Emacs:

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

Whenever @sc{gnu} extensions are disabled or if @option{-r} option is used,
end of lines are used; in this case, the default @var{regexp} is just:

@example
\n
@end example

Using an empty @var{regexp} is equivalent to completely disabling end of
line or end of sentence recognition.  In this case, the whole file is
considered to be a single big line or sentence.  The user might want to
disallow all truncation flag generation as well, through option @option{-F
""}.  @xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
Manual}.

When the keywords happen to be near the beginning of the input line or
sentence, this often creates an unused area at the beginning of the output
context line; when the keywords happen to be near the end of the input line
or sentence, this often creates an unused area at the end of the output
context line.  The program tries to fill those unused areas by wrapping
around context in them; the tail of the input line or sentence is used to
fill the unused area on the left of the output line; the head of the input
line or sentence is used to fill the unused area on the right of the output
line.

As a matter of convenience to the user, many usual backslashed escape
sequences from the C language are recognized and converted to the
corresponding characters by @command{ptx} itself.

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

This option selects which regular expression will describe each keyword.  By
default, if @sc{gnu} extensions are enabled, a word is a sequence of
letters; the @var{regexp} used is @samp{\w+}.  When @sc{gnu} extensions are
disabled, a word is by default anything which ends with a space, a tab or a
newline; the @var{regexp} used is @samp{[^ \t\n]+}.

An empty @var{regexp} is equivalent to not using this option.
@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
Manual}.

As a matter of convenience to the user, many usual backslashed escape
sequences, as found in the C language, are recognized and converted to the
corresponding characters by @command{ptx} itself.

@end table


@node Output formatting in ptx
@subsection Output formatting

Output format is mainly controlled by the @option{-O} and @option{-T}
options described in the table below.  When neither @option{-O} nor
@option{-T} are selected, and if @sc{gnu} extensions are enabled, the
program chooses an output format suitable for a dumb terminal.  Each keyword
occurrence is output to the center of one line, surrounded by its left and
right contexts.  Each field is properly justified, so the concordance output
can be readily observed.  As a special feature, if automatic references are
selected by option @option{-A} and are output before the left context, that
is, if option @option{-R} is @emph{not} selected, then a colon is added
after the reference; this nicely interfaces with @sc{gnu} Emacs
@code{next-error} processing.  In this default output format, each white
space character, like newline and tab, is merely changed to exactly one
space, with no special attempt to compress consecutive spaces.  This might
change in the future.  Except for those white space characters, every other
character of the underlying set of 256 characters is transmitted verbatim.

Output format is further controlled by the following options.

@table @samp

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

Select the size of the minimum white space gap between the fields on the
output line.

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

Select the maximum output width of each final line.  If references are used,
they are included or excluded from the maximum output width depending on the
value of option @option{-R}@.  If this option is not selected, that is, when
references are output before the left context, the maximum output width
takes into account the maximum length of all references.  If this option is
selected, that is, when references are output after the right context, the
maximum output width does not take into account the space taken by
references, nor the gap that precedes them.

@item -A
@itemx --auto-reference

Select automatic references.  Each input line will have an automatic
reference made up of the file name and the line ordinal, with a single colon
between them.  However, the file name will be empty when standard input is
being read.  If both @option{-A} and @option{-r} are selected, then the
input reference is still read and skipped, but the automatic reference is
used at output time, overriding the input reference.

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

In the default output format, when option @option{-R} is not used, any
references produced by the effect of options @option{-r} or @option{-A} are
placed to the far right of output lines, after the right context.  With
default output format, when the @option{-R} option is specified, references
are rather placed at the beginning of each output line, before the left
context.  For any other output format, option @option{-R} is ignored, with
one exception: with @option{-R} the width of references is @emph{not} taken
into account in total output width given by @option{-w}.

This option is automatically selected whenever @sc{gnu} extensions are
disabled.

@item -F @var{string}
@itemx --flac-truncation=@var{string}

This option will request that any truncation in the output be reported using
the string @var{string}.  Most output fields theoretically extend towards
the beginning or the end of the current line, or current sentence, as
selected with option @option{-S}@.  But there is a maximum allowed output
line width, changeable through option @option{-w}, which is further divided
into space for various output fields.  When a field has to be truncated
because it cannot extend beyond the beginning or the end of the current line
to fit in, then a truncation occurs.  By default, the string used is a
single slash, as in @option{-F /}.

@var{string} may have more than one character, as in @option{-F ...}.  Also,
in the particular case when @var{string} is empty (@option{-F ""}),
truncation flagging is disabled, and no truncation marks are appended in
this case.

As a matter of convenience to the user, many usual backslashed escape
sequences, as found in the C language, are recognized and converted to the
corresponding characters by @command{ptx} itself.

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

Select another @var{string} to be used instead of @samp{xx}, while
generating output suitable for @command{nroff}, @command{troff} or @TeX{}.

@item -O
@itemx --format=roff

Choose an output format suitable for @command{nroff} or @command{troff}
processing.  Each output line will look like:

@smallexample
.xx "@var{tail}" "@var{before}" "@var{keyword_and_after}"@c
 "@var{head}" "@var{ref}"
@end smallexample

so it will be possible to write a @samp{.xx} roff macro to take care of the
output typesetting.  This is the default output format when @sc{gnu}
extensions are disabled.  Option @option{-M} can be used to change @samp{xx}
to another macro name.

In this output format, each non-graphical character, like newline and tab,
is merely changed to exactly one space, with no special attempt to compress
consecutive spaces.  Each quote character: @kbd{"} is doubled so it will be
correctly processed by @command{nroff} or @command{troff}.

@item -T
@itemx --format=tex

Choose an output format suitable for @TeX{} processing.  Each output line
will look like:

@smallexample
\xx @{@var{tail}@}@{@var{before}@}@{@var{keyword}@}@c
@{@var{after}@}@{@var{head}@}@{@var{ref}@}
@end smallexample

@noindent
so it will be possible to write a @code{\xx} definition to take care of the
output typesetting.  Note that when references are not being produced, that
is, neither option @option{-A} nor option @option{-r} is selected, the last
parameter of each @code{\xx} call is inhibited.  Option @option{-M} can be
used to change @samp{xx} to another macro name.

In this output format, some special characters, like @kbd{$}, @kbd{%},
@kbd{&}, @kbd{#} and @kbd{_} are automatically protected with a backslash.
Curly brackets @kbd{@{}, @kbd{@}} are protected with a backslash and a pair
of dollar signs (to force mathematical mode).  The backslash itself produces
the sequence @code{\backslash@{@}}.  Circumflex and tilde diacritical marks
produce the sequence @code{^\@{ @}} and @code{~\@{ @}} respectively.  Other
diacriticized characters of the underlying character set produce an
appropriate @TeX{} sequence as far as possible.  The other non-graphical
characters, like newline and tab, and all other characters which are not
part of ASCII, are merely changed to exactly one space, with no special
attempt to compress consecutive spaces.  Let me know how to improve this
special character processing for @TeX{}.

@end table


@node Compatibility in ptx
@subsection The @sc{gnu} extensions to @command{ptx}

This version of @command{ptx} contains a few features which do not exist in
System V @command{ptx}.  These extra features are suppressed by using the
@option{-G} command line option, unless overridden by other command line
options.  Some @sc{gnu} extensions cannot be recovered by overriding, so the
simple rule is to avoid @option{-G} if you care about @sc{gnu} extensions.
Here are the differences between this program and System V @command{ptx}.

@itemize @bullet

@item
This program can read many input files at once, it always writes the
resulting concordance on standard output.  On the other hand, System V
@command{ptx} reads only one file and sends the result to standard output
or, if a second @var{file} parameter is given on the command, to that
@var{file}.

Having output parameters not introduced by options is a dangerous practice
which @sc{gnu} avoids as far as possible.  So, for using @command{ptx}
portably between @sc{gnu} and System V, you should always use it with a
single input file, and always expect the result on standard output.  You
might also want to automatically configure in a @option{-G} option to
@command{ptx} calls in products using @command{ptx}, if the configurator
finds that the installed @command{ptx} accepts @option{-G}.

@item
The only options available in System V @command{ptx} are options
@option{-b}, @option{-f}, @option{-g}, @option{-i}, @option{-o},
@option{-r}, @option{-t} and @option{-w}.  All other options are @sc{gnu}
extensions and are not repeated in this enumeration.  Moreover, some options
have a slightly different meaning when @sc{gnu} extensions are enabled, as
explained below.

@item
By default, concordance output is not formatted for @command{troff} or
@command{nroff}.  It is rather formatted for a dumb terminal.
@command{troff} or @command{nroff} output may still be selected through
option @option{-O}.

@item
Unless @option{-R} option is used, the maximum reference width is subtracted
from the total output line width.  With @sc{gnu} extensions disabled, width
of references is not taken into account in the output line width
computations.

@item
All 256 bytes, even ASCII @sc{nul} bytes, are always read and processed from
input file with no adverse effect, even if @sc{gnu} extensions are
disabled.  However, System V @command{ptx} does not accept 8-bit characters,
a few control characters are rejected, and the tilde @kbd{~} is also
rejected.

@item
Input line length is only limited by available memory, even if @sc{gnu}
extensions are disabled.  However, System V @command{ptx} processes only the
first 200 characters in each line.

@item
The break (non-word) characters default to be every character except all
letters of the underlying character set, diacriticized or not.  When
@sc{gnu} extensions are disabled, the break characters default to space, tab
and newline only.

@item
The program makes better use of output line width.  If @sc{gnu} extensions
are disabled, the program rather tries to imitate System V @command{ptx},
but still, there are some slight disposition glitches this program does not
completely reproduce.

@item
The user can specify both an Ignore file and an Only file.  This is not
allowed with System V @command{ptx}.

@end itemize


@node tsort invocation
@section @command{tsort}: Topological sort

@pindex tsort
@cindex topological sort

@command{tsort} performs a topological sort on the given @var{file}, or
standard input if no input file is given or for a @var{file} of @samp{-}.
For more details and some history, see @ref{tsort background}.  Synopsis:

@example
tsort [@var{option}] [@var{file}]
@end example

@command{tsort} reads its input as pairs of strings, separated by blanks,
indicating a partial ordering.  The output is a total ordering that
corresponds to the given partial ordering.

For example

@example
tsort <<EOF
a b c
d
e f
b c d e
EOF
@end example

@noindent
will produce the output

@example
a
b
c
d
e
f
@end example

Consider a more realistic example.  You have a large set of functions all in
one file, and they may all be declared static except one.  Currently that
one (say @code{main}) is the first function defined in the file, and the
ones it calls directly follow it, followed by those they call, etc.  Let's
say that you are determined to take advantage of prototypes, so you have to
choose between declaring all of those functions (which means duplicating a
lot of information from the definitions) and rearranging the functions so
that as many as possible are defined before they are used.  One way to
automate the latter process is to get a list for each function of the
functions it calls directly.  Many programs can generate such lists.  They
describe a call graph.  Consider the following list, in which a given line
indicates that the function on the left calls the one on the right directly.

@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

then you can use @command{tsort} to produce an ordering of those functions
that satisfies your requirement.

@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} detects any cycles in the input and writes the first cycle
encountered to standard error.

Note that for a given partial ordering, generally there is no unique total
ordering.  In the context of the call graph above, the function
@code{parse_options} may be placed anywhere in the list as long as it
precedes @code{main}.

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

@exitstatus

@menu
* tsort background::         Where tsort came from.
@end menu

@node tsort background
@subsection @command{tsort}: Background

@command{tsort} exists because very early versions of the Unix linker
processed an archive file exactly once, and in order.  As @command{ld} read
each object in the archive, it decided whether it was needed in the program
based on whether it defined any symbols which were undefined at that point
in the link.

This meant that dependencies within the archive had to be handled
specially.  For example, @code{scanf} probably calls @code{read}.  That
means that in a single pass through an archive, it was important for
@code{scanf.o} to appear before read.o, because otherwise a program which
calls @code{scanf} but not @code{read} might end up with an unexpected
unresolved reference to @code{read}.

The way to address this problem was to first generate a set of dependencies
of one object file on another.  This was done by a shell script called
@command{lorder}.  The GNU tools don't provide a version of lorder, as far
as I know, but you can still find it in BSD distributions.

Then you ran @command{tsort} over the @command{lorder} output, and you used
the resulting sort to define the order in which you added objects to the
archive.

This whole procedure has been obsolete since about 1980, because Unix
archives now contain a symbol table (traditionally built by
@command{ranlib}, now generally built by @command{ar} itself), and the Unix
linker uses the symbol table to effectively make multiple passes over an
archive file.

Anyhow, that's where tsort came from.  To solve an old problem with the way
the linker handled archive files, which has since been solved in different
ways.


@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{-} が指定されて
いる場合は、標準入力を対象とする。
@sp 1
書式:

@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{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} オプションで
選択されたバイト、文字、フィールドを含まない部分を選択して、表示する。
言い換えれば、そうしたオプションによって指定されたバイトや文字や
フィールドは「表示しない」ということだ。このオプションは、フィールドが
たくさんあるとき、そのうちの一部を除いたすべてを表示したい場合に
便利である。

@end table

@exitstatus


@node paste invocation
@section @command{paste}: 複数のファイルの各行をマージする

@pindex paste
@cindex merging files

@command{paste} は、指定された各ファイルの行番号が同じ行を、タブ文字を
間にはさんで連結して、標準出力に書き出す。入力ファイルが全く
指定されていない場合や、ファイル名が @samp{-} だった場合は、標準入力が
使用される。

例を挙げる。

@example
$ cat num2
1
2
$ cat let3
a
b
c
$ paste num2 let3
1       a
2       b
       @ c
@end example

書式:

@example
paste [@var{option}]@dots{} [@var{file}]@dots{}
@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

@end table

@exitstatus


@node join invocation
@section @command{join}: 共通のフィールドに基づいて行を結合する

@pindex join
@cindex common field, joining on

@command{join} は、二つの入力ファイルを対象に、同一の共通フィールド (join
field) を持つことで「対」になっている各行を、1 行にまとめて、標準出力
に書き出す。
@sp 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} はファイル番号であり、@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 @sc{nul} 文字がフィールドの区切りに
使用される。

@item -v @var{file-number}
通常の出力はせず、@var{file-number} (@samp{1} か @samp{2} である) のファイルに存在
する、対にならない各行を表示する。

@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::                連続する同一文字の圧縮と文字の削除。
@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）を使って範囲を囲む
ことになっているが、@sc{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} と等価な文字のすべてに展開される。
展開される文字の間に特定の順序はない。等価クラスは、比較的最近の
発明であり、英語以外のアルファベットをサポートするためのものである。
しかしながら、等価クラスを定義したり、何が等価クラスに含まれるかを
決定したりする標準的な方法は存在しないようだ。そのため、@sc{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} と同じ長さに切り詰める。

デフォルトでは、@sc{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 @sc{nul} 文字、それが
@var{set1} の補集合の最初の要素である) 改行文字に変換しないからだ。

@noindent
ちなみに、上記の慣用表現は、システムによってはうまく動作しない。
なぜなら、範囲指定を使っているからであり、また、改行の 8 進数による
コードを 012 と決め込んでいるからである。@command{tr} が POSIX に準拠している
なら、以下の方が、よりよい書き方である。

@example
tr -cs '[:alnum:]' '[\n*]'
@end example


@node Squeezing
@subsection 連続する文字の圧縮と文字の削除

@cindex squeezing repeat characters
@cindex deleting 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{-} が指定されている場合は、標準入力を対象にする。
@sp 1
書式:

@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})
とは、スペースかタブのことである。他のロケールでは、ほかの空白文字が
追加されているかもしれない。
@sp 1
書式:

@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} オプションが自動的に設定される。
@sp 1
(訳注: 一例を挙げておく。たとえば、@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} のデフォルトの動作である。オプション以外の引数が
一つも指定されていない場合は、@command{ls} はカレントディレクトリを対象にし、
あたかも @samp{.} という引数を一つだけ付けて起動したかのように動作する。

@vindex LC_ALL
デフォルトでは、出力を、現在のロケール設定に従って、アルファベット
順でソートする
@footnote{POSIX 以外のロケールを使用している場合は (たとえば、@env{LC_ALL} を
@samp{en_US} に設定している場合は)、@command{ls} の出力が、見慣れない順序で並んで
いるかもしれない。そうした場合は、環境変数 @env{LC_ALL} を @samp{C} にしてみる
とよい。}。
標準出力が端末の場合は、出力を段組みで (訳注:
すなわち、1 行に複数ファイルの形式で) 表示し (ソートは縦方向に行う)、
制御文字を疑問符として出力する。それ以外の場合は、出力が 1 行 1 ファイル
の形式になり、制御文字はそのまま手を加えずに出力する。

@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
詳細形式でディレクトリ内容をリスト表示するとき、グループ情報を
表示しない (@sc{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} のデフォルトである。

@item -C
@itemx --format=vertical
@opindex -C
@opindex --format
@opindex vertical @r{sorted files in columns}
ファイルのリストを段組みで (訳注: すなわち、1 行に複数ファイルの
形式で) 表示し、ソートは縦方向に行う。これは、標準出力が端末の
ときの @command{ls} のデフォルトである。@command{dir} コマンドにとっては、これが
常にデフォルトになる。@sc{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
@option{--color} を @var{when} を付けずに指定するのは、"@option{--color=always} と
同じことである。カラー表示にしたファイル・リストをパイプで @command{more}
や @command{less} のようなページャに送ると、たいての場合、判読に苦しむ
羽目になる。ただし、@code{more -f} を使うと、うまく行くようだ。(訳注:
訳者の手元では、@code{less -R} や @code{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 の場合は、タブを使用しない。

@c FIXME: remove in 2009, if Apple Terminal has been fixed for long enough.
端末エミュレータの中には、ASCII 以外のバイトが前にあると、
列をタブ位置の右にきちんと揃えてくれないものがある (少なくとも、
Mac OS X 10.4.8 の Apple Terminal 1.5 (133) がそうだ)。そうした
端末エミュレータを使用している場合は、@option{-T0} オプションを使うか、
環境変数 @code{TABSIZE=0} を設定するかして、列を揃えるのにタブではなく、
スペースを使うよう、@command{ls} に指示するとよい。

@item -w
@itemx --width=@var{cols}
@opindex -w
@opindex --width
@vindex COLUMNS
スクリーンの横幅が @var{cols} 桁だと想定する。デフォルトの値は、
可能ならば端末の設定から取得する。取得できないときは、環境変数
@env{COLUMNS} を使用し、それも設定されていなければ、80 をデフォルト
にする。

@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 以降は @option{--dired}
オプションを使用しており (訳注: @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
ファイル名中の非表示文字 (nongraphic characters) を、C 言語で
使うような、バックスラッシュにアルファベットや 8 進数を続ける方法を
使用して、クォートする。

@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} の場合のデフォルトである。

@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} は、以下に挙げるものの
一つでなければならない。

@table @samp
@item literal
文字列に手を加えず、そのまま出力する。これは、@option{-N} や
@option{--literal} オプションと同じである。
@item shell
文字列にシェルのメタ文字がある場合や、出力が誤解を招くものに
なりそうな場合に、シェル向けのクォートを施す。このクォート
方法は、@command{bash} のような POSIX 互換のシェルにはふさわしいもの
だが、@command{csh} のような非互換のシェルでは、必ずしもうまく働く
とはかぎらない。
@item shell-always
普通ならクォートが不要な場合でも、文字列にシェル向けのクォートを
施す。
@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

@option{--quoting-style} オプションのデフォルト値は、環境変数
@env{QUOTING_STYLE} によって指定することができる。この環境変数が
設定されていない場合、デフォルトの値は @samp{literal} だが、
このパッケージの将来のバージョンでは、デフォルトを @samp{shell} に
変更するかもしれない。

@item --show-control-chars
@opindex --show-control-chars
非表示文字に手を加えず、ファイル名中にそのまま出力する。
これは、出力先が端末でない場合や、プログラムが @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} と同じである。すなわち、デフォルトでは、
詳細形式でファイルをリストし、特殊文字は、バックスラッシュ・エスケープ
シーケンスを使って表示する。

@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} はファイルをコピーする (オプションによっては、ディレクトリの
コピーも行う)。コピーによって作られたファイルは、コピー元から全く
独立したものになる。一つのファイルを別のファイルにコピーすることも
できるし、好きなだけたくさんのファイルをコピー先のディレクトリに
一遍にコピーすることもできる。
@sp 1
書式:

@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{--archive}
(@option{-a}), @option{-d}, @option{--dereference} (@option{-L}),
@option{--no-dereference} (@option{-P}), @option{-H}。
こうしたオプションを二つ以上指定した場合、@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} が同一で、しかも、通常ファイルを指している
場合、@command{cp} は @option{--force --backup} オプションが指定されると、バックアップ
ファイルを作成することになる。標準のものであれ (訳注: ファイルの末尾に
チルダ @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 @w{@kbd{--backup}[=@var{method}]}
@opindex -b
@opindex --backup
@vindex VERSION_CONTROL
@cindex backups, making
@xref{Backup options}.  そのままでは、上書きされるか、消去されて
しまう各ファイルのバックアップを作成する。特殊な用法としては、
次のものがある。force と backup の両方のオプションが指定されて
いるとき、@command{cp} は、コピー元 (@var{source}) とコピー先 (@var{dest}) が同じ名前
で、しかも存在する通常ファイルを指していると、コピー元 (@var{source}) の
バックアップを作成する。次のちょっとした Bourne シェルのスクリプト
は、オプションのこの組み合わせの応用だが、便利である。

@example
#!/bin/sh
# Usage: backup FILE...
# リストされた各 FILE について @sc{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 @w{@kbd{--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
最終アクセス日時と最終更新日時 (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{--preserve=links} を意味し、@option{-H} は @command{cp} にコマンドライン
引数の参照をたどるよう指示している。そのため、@command{cp} は、二つの
コピー元ファイルの inod が同じであることに気づき、両者を
ハードリンクと認識して、その関係をコピー先で維持するのである。

次のものは、@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 を使って実装している場合は、そうした属性もこのオプション
によって維持される。
@item all
ファイルの属性をすべて維持する。上記のすべてを指定するのと
同じことだが、SELinux セキュリティ・コンテキストや拡張属性の
維持に失敗しても、@command{cp} の終了ステータスが変わらないという点が
異なっている。@option{-a} とは違って、@samp{Operation not supported} 以外のすべての
警告メッセージを出力する。
@end table

@var{attribute_list} なしで @option{--preserve} を使用するのは、
@option{--preserve=mode,ownership,timestamps} と同じことである。

このオプションを使わない場合、各コピー先ファイルは、対応する
コピー元ファイルのモードビットを付けて作成される。ただし、
umask で設定されているビットと、set-user-ID や set-group-ID ビットは
落とされる。@xref{File permissions}.

@item @w{@kbd{--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{--archive} (@option{-a}),
@option{-d},@option{--dereference} (@option{-L}), @option{--no-dereference}
(@option{-P}), and @option{-H}
などのオプションを参照。スペシャルファイルについては、コピーする
際に、コピー元ファイルと同じファイル型のコピー先ファイルを作成する。
@option{--copy-contents} を参照。シンボリックリンクやスペシャルファイルの
コピーに @option{-r} オプションを使用するのは、どのシステムでも通用する
ことではない。@sc{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
あるファイルシステムでコピーを始めた場合、別のファイルシステム
にあるサブディレクトリをスキップする。ただし、マウントポイントの
ディレクトリはコピーされる。

@end table

@exitstatus


@node dd invocation
@section @command{dd}: ファイルの変換とコピー

@pindex dd
@cindex converting while copying a file

@command{dd} はファイルをコピーする (デフォルトでは、標準入力から標準出力へ
コピーする)。その際、入出力のブロックサイズを変更することができる。
また、コピーと同時にデータ形式の変換を行うこともできる。
@sp 1
書式:

@example
dd [@var{operand}]@dots{}
dd @var{option}
@end example

指定できるオプションは、@option{--help} と @option{--version} だけである。
@xref{Common options}.  @command{dd} では、以下のオペランドが使える。

@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} はブロック数ではなく、バイト数と見なされる。

@item status=@var{which}
@opindex status
通常、@samp{INFO} シグナルを受け取った場合や、@command{dd} が終了したときに、
転送情報が標準エラーに出力される。@var{which} を指定することで、どの
情報を表示しないかを設定できる。

@table @samp

@item noxfer
@opindex noxfer @r{dd status=}
転送速度や転送量の統計を表示しない。通常は、そうした情報が
ステータス表示の最後の行になる。

@item none
@opindex none @r{dd status=}
情報メッセージを標準エラーに全く表示しない。エラーメッセージは
通常どおり出力する。

@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 の変換を行う。

@item ebcdic
@opindex ebcdic@r{, converting to}
ASCII を EBCDIC に変換する。これは @samp{ascii} 変換の逆の動作で
ある。

@item ibm
@opindex alternate ebcdic@r{, converting to}
POSIX が規定しているもう一つの変換テーブルを使って、ASCII を
EBCDIC の別の形式に変換する。こちらは 1 対 1 の変換ではない
が、@samp{~}, @samp{[}, @samp{]} について、よく使われる伝統的な慣行を反映
している。

@samp{ascii}, @samp{ebcdic}, @samp{ibm} は、どれか一つしか指定できない。

@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
出力ブロックが @sc{nul} のみからなっているとき、それを書き出さず
に、seek を試みる。穴空きファイル (sparse file) をサポート
しているシステムでは、この動作は、出力ファイルを書き出して
いるときに、穴空きの出力を作成することになる。このオプションを
@samp{conv=notrunc} や @samp{oflag=append} と一緒に使う際は、気をつけ
なければならない。@samp{conv=notrunc} が付いていると、入力中の @sc{nul}
ブロックに対応する位置にある、出力ファイル中の存在するデータは、
そのまま保持されることになる。@samp{oflag=append} を付けた場合は、
seek は行っても効果がない。なお、@samp{conv=sparse} では、出力先が
ファイルではなく、デバイスの場合も、入力中の @sc{nul} ブロックは
やはりコピーされない。そんなわけで、このオプションが最も役に
立つのは、仮想デバイスや、前もって 0 で初期化したデバイスに
対してである。

@item swab
@opindex swab @r{(byte-swapping)}
@cindex byte-swapping
入力された全バイトを 2 個づつ組にして、前後を入れ替える。@sc{gnu}
の @command{dd} は、他の @command{dd} とは違って、読み込むバイトが奇数個でも
動作する。最後のバイトは （入れ替えるものがないので) そのまま
コピーするのである。

@item sync
@opindex sync @r{(padding with ASCII @sc{nul}s)}
すべての入力ブロックに対して @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 のとき、キャッシュの廃棄に失敗すると、その旨
メッセージが表示され、終了ステータスに反映する。以下に、
使用法の例をいくつか挙げておく。

@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 キャッシュのみを使って、データを転送する。
dd if=ifile of=ofile iflag=nocache oflag=nocache
@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}
でのみ使える。

@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

実行中の @command{dd} のプロセスに @samp{INFO} シグナルを送ると、@command{dd} は入出力の
統計情報を標準エラーに書き出してから、コピー作業を続行する。以下の
例では、@command{dd} がバックグラウンドで動作し、1 千万ブロックのコピーを行って
いる。@command{kill} コマンドが実行されると、@command{dd} は実行途中の入出力統計を
表示する。そして、正常に作業を完了するか、@code{SIGINT} シグナルによって
キルされたとき、最終的な統計情報を出力する。

@example
$ dd if=/dev/zero of=/dev/null count=10MB & pid=$!
$ kill -s INFO $pid; wait $pid
3385223+0 records in
3385223+0 records out
1733234176 bytes (1.7 GB) copied, 6.42173 seconds, 270 MB/s
10000000+0 records in
10000000+0 records out
5120000000 bytes (5.1 GB) copied, 18.913 seconds, 271 MB/s
@end example

@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} はファイルをコピーするとき、ファイルのモードビット
(訳注: 一般にアクセス権とか、許可属性と言われるもの) をセットし、可能ならば、
所有者やグループも設定する。
@sp 1
書式:

@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 コンテキストを
持っているときは、インストール先を更新しない (訳注: 要するに、
コピーが必要なときだけコピーするということ)。

@item -c
@opindex -c
無視する。Unix の古いバージョンの  @command{install} との互換性のために
ある。

@item -D
@opindex -D
@var{dest} の指定中に存在していない親ディレクトリがあれば、それを作成
してから、@var{source} を @var{dest} にコピーする。インストール先ディレクトリ
が @option{--target-directory=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

@optNoTargetDirectory

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
コピーを行う前に、コピーするファイル名を表示する。

@item -Z @var{context}
@itemx --context=@var{context}
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
作成するファイルやディレクトリに対して使用するデフォルトの SElinux
セキュリティ・コンテキストを設定する。SElinux が無効になっている
ときは、警告を出し、このオプションを無視する。

@end table

@exitstatus


@node mv invocation
@section @command{mv}: ファイルの移動 (名前の変更) を行う

@pindex mv

@command{mv} は、ファイル (やディレクトリ) の移動、または名前の変更を行う。
@sp 1
書式:

@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}.

このプログラムでは以下のオプションが使用できる。参照: @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

@end table

@exitstatus


@node rm invocation
@section @command{rm}: ファイルやディレクトリを削除する

@pindex rm
@cindex removing files or directories

@command{rm} は、指定された各ファイルを削除する。デフォルトでは、ディレクトリ
の削除は行わない。
@sp 1
書式:

@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{-i} または @option{--interactive=always} オプションが
指定されている場合や、ファイルが書き込み不可のとき、標準入力が端末で、
しかも @option{--force} (@option{-f}) オプションが指定されていない場合は、@command{rm} は
プロンプトを出して、そのファイルを削除するかどうか、ユーザに問い合わ
せる。答えが肯定でなければ、そのファイルをスキップする。

ファイル名の最後の構成要素 (訳注: ファイル名 (いわゆるパス名) の
最後の / より後ろの部分) が @file{.} や @file{..} であるファイルを削除しようと
しても、@command{rm} はそれを実行しない。ユーザに問い合わせることもない。

警告: @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}.

@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{-} で始まるファイルを削除するには、
どうしたらよいか、というものがある。@sc{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 個だけ使っていたのは、
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 -@var{number}
@itemx -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
@opindex -u
@opindex --remove
@cindex removing files after shredding
shred 処理したファイルを (可能ならば) サイズ 0 に短縮し
(truncate)、その上で削除する。ファイルが複数のリンクを持って
いる場合、削除されるのは、名前を指定されたリンクだけである。

@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})。
@sp 1
書式:

@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
とも言う) を作ることになる。
@sp 1
書式:

@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 links}、略称はシムリンク
@dfn{symlinks}) は、特殊なファイル型の一つである (すべてのカーネルが
サポートしているわけではない。たとえば、System V release 3 やそれ
以前のシステムにはシムリンクが存在しない)。このファイル型では、
リンクファイルは、実際には別のファイルを、名前を使って参照している。
ほとんどのファイル操作において (ファイルのオープン、読み込み、書き
出しなど) シンボリックリンク・ファイルが渡された場合、カーネルは
自動的にリンクの参照を読み解いて (@dfn{dereferences})、リンクの参照先
を操作の対象にする。ただし、操作によっては (たとえば、ファイルの
削除)、参照先ではなく、リンクファイルそのものを対象にするものもある。
シムリンクの所有者やグループは、リンクを通して行われるファイルアクセス
に対して意味を持たないが、削除制限ビットが立っているディレクトリから
シンボリックリンクを削除する際には、かかわりを持ってくる。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

@xref{realpath invocation}.  @command{realpath} を使えば、相対パスを
生成する際に、もっと複雑なことができる。

@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} は、指定された名前でディレクトリを作成する。
@sp 1
書式:

@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
各引数について、存在していない親ディレクトリがあれば、それを作成し、
その許可属性ビットを、@samp{u+wx} になるように調整した umask を基にして
設定する。親ディレクトリがすでに存在している場合は、このオプション
は何もせず、その許可属性ビットを変更することもない。

新たに作成するいかなる親ディレクトリの許可属性ビットも、@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}
と併せて使うと、大変便利である。

@item -Z @var{context}
@itemx --context=@var{context}
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
作成するディレクトリに対して使用する、デフォルトの  SELinux
セキュリティ・コンテキストを設定する。

@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}
とも言う) を作成する。
@sp 1
書式:

@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}.

@item -Z @var{context}
@itemx --context=@var{context}
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
作成する FIFO に対して使用する、デフォルトの SELinux セキュリティ・
コンテキストを設定する。

@end table

@exitstatus


@node mknod invocation
@section @command{mknod}: ブロック型やキャラクタ型のスペシャルファイルを作成する。

@pindex mknod
@cindex block special files, creating
@cindex character special files, creating

@command{mknod} は、指定された名前で FIFO、キャラクター・スペシャルファイル、
ブロック・スペシャルファイルを作成する。
@sp 1
書式:

@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}.

@item -Z @var{context}
@itemx --context=@var{context}
@opindex -Z
@opindex --context
@cindex SELinux
@cindex security context
作成するファイルに対して使用する、デフォルトの SELinux セキュリティ・
コンテキストを設定する。

@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}] @var{file}
@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
出力の末尾に改行を付けない。

@item -s
@itemx -q
@itemx --silent
@itemx --quiet
@opindex -s
@opindex -q
@opindex --silent
@opindex --quiet
ほとんどのエラーメッセージを出さないようにする。

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
エラーメッセージを表示する。

@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} は、空のディレクトリを削除する。
@sp 1
書式:

@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})。
@sp 1
書式:

@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)
のそれと同じものに変更することもできる。
@sp 1
書式:

@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{.} を含むユーザを指していたり
すると、不都合が生じるからだ。

@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 @w{@kbd{--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) のグループと同じものに変更することも
できる。
@sp 1
書式:

@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}.

このプログラムでは以下のオプションが使用できる。参照: @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} は、名前を指定したファイルのアクセス権を変更する。
@sp 1
書式:

@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} システムコールがシンボリックリンクのアクセス権を変更
できないからである。シンボリックリンクのアクセス権が利用されることは
全くないので、この制限は問題にならない。とは言え、シンボリックリンク
がコマンドラインで指定されていることはありうる。そうした場合、@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) を変更する。
@sp 1
書式:

@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}.
なお、@sc{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
@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
古めのシステムでは、@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} は、ファイルシステムごとに、使用されているディスク容量と利用可能な
ディスクス容量を報告する。
@sp 1
書式:

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

引数を指定しないと、@command{df} は、現在マウントされているすべてのファイル
システム (ファイルシステムのタイプは問わない) について、使用されている
ディスク容量と、利用可能なディスク容量を報告する。引数が指定されている
場合は、引数として指定された各 @var{file} が存在するファイルシステムについて
報告する。

通常、ディスク容量は 1024 バイトを 1 単位として表示するが、この動作は
変更することができる (@pxref{Block size})。なお、小数点以下は切り上げて
整数にする。

@cindex disk device file
@cindex device file, disk
引数 @var{file} がディスク・デバイスファイルで、そのディスク・デバイス
上に存在するファイルシステムが現在マウントされている場合、@command{df} が
表示するのは、そのファイルシステムの利用可能な容量であって、デバイス・
ノードが存在するファイルシステム (すなわち、ルート・ファイルシステム)
の利用可能な容量ではない。また、@sc{gnu} の @command{df} は、マウントされていない
ファイルシステムのディスク使用量を測定しようとはしない。なぜなら、
ほとんどのファイルシステムにおいて、そういうことを行うには、ファイル
システムの構造について他と全く共通性のない内奥の知識が必要だからである。

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

@table @samp

@item -a
@itemx --all
@opindex -a
@opindex --all
@cindex automounter file systems
@cindex ignore file systems
一覧表示にダミーのファイルシステムを含める。そうしたものは、デフォルト
の表示では省略されている。たいていの場合、そうしたファイルシステムは、
たとえばオートマウンタのエントリのような、特殊な用途のための擬似
ファイルシステムである。

@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 単位として、サイズを表示する。

@item --total
@opindex --total
@cindex grand total of disk size, usage and available space
すべての引数を処理した後で、全引数からなる総計を表示する。
このオプションを使用すれば、ディスクの容量、使用した量、使用可能
な量について、リストされたすべてのデバイスを合わせた総量を知ること
ができる。

@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 -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 -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 4.2@r{, }ufs@r{, }efs@dots{}
@cindex Linux file system types
@cindex local file system types
@opindex 4.2 @r{file system type}
@opindex ufs @r{file system type}
@opindex efs @r{file system type}
ローカルでマウントしているハードディスクのファイルシステム。
(ローカルのマウントでは、システムが複数のタイプをサポートして
いることもある。たとえば、Linux がそうだ。)

@item hsfs@r{, }cdfs
@cindex CD-ROM file system type
@cindex High Sierra file system
@opindex hsfs @r{file system type}
@opindex cdfs @r{file system type}
CD-ROM ドライブのファイルシステム。HP-UX は @samp{cdfs} を使用し、
ほかのシステムのほとんどは @samp{hsfs} (@samp{hs} は ``High Sierra'' を
表している) を使用している。

@item pcfs
@cindex PC file system
@cindex DOS file system
@cindex MS-DOS file system
@cindex diskette file system
@opindex pcfs
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

@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} は、指定したファイルのディスク使用量を報告する。引数がディレ
クトリの場合は、サブディレクトリごとのディスク使用量も報告する。
@sp 1
書式:

@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

@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
@itemx --bytes
@opindex -b
@opindex --bytes
@code{--apparent-size --block-size=1} と同じ。

@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 -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} のような、シンボリックリンクであることが
多いディレクトリのディスク使用量を調べるときに、重宝である。

@c --files0-from=FILE
@filesZeroFromOption{du,, @ @option{--total} (@option{-c}) オプションを使用した結果}

@optHumanReadable

@item -H
@opindex -H
@option{--dereference-args} (@option{-D}) と同じである。

@item -k
@opindex -k
@cindex kibibytes for file sizes
デフォルトのブロックサイズがどうなっていようと、1 ブロック 1024
バイトでサイズを表示する (@pxref{Block size})。このオプションは @option{--block-size=1K}
に等しい。

@item -l
@itemx --count-links
@opindex -l
@opindex --count-links
@cindex hard links, counting in @command{du}
すべてのファイルを計算に入れる。すなわち、(ハードリンクとして) 前に
現れたことがあっても、計算に入れる。

@item -L
@itemx --dereference
@opindex -L
@opindex --dereference
@cindex symbolic links, dereferencing 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 -d @var{depth}
@item --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} と同じことに
なる。

@optNull{du}

@optSi

@item -s
@itemx --summarize
@opindex -s
@opindex --summarize
各引数についてディスク使用量の合計だけを表示する。

@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} というディレクトリ名に対して報告されるサイズは、ディレクトリエントリ
@var{d} の @code{stat.st_size} から取り出したサイズのみになる。

@item --time
@opindex --time
@cindex last modified dates, displaying in @command{du}
そのディレクトリ以下にあるすべてのファイルやサブディレクトリの更新
日時 (modification time) のうちで、最も新しいものを表示する。

@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}) のうちで、最も新しいもの
を表示する。

@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
@itemx --one-file-system
@opindex -x
@opindex --one-file-system
@cindex one file system, restricting @command{du} to
処理される引数が存在するファイルシステムとは別のファイルシステムに
あるディレクトリをスキップする。

@item --exclude=@var{pattern}
@opindex --exclude=@var{pattern}
@cindex excluding files from @command{du}
再帰的な処理を行っているとき、@var{pattern} にマッチするサブディレクトリ
やファイルをスキップする。たとえば、@code{du --exclude='*.o'} と指定
すると、名前が @samp{.o} で終わるファイルを除外することになる。

@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{-} なら、パターンを標準入力
から読み込む。

@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} は指定されたファイルに関する情報を表示する。
@sp 1
書式:

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

オプションなしで実行すると、@command{stat} は指定されたファイルについて
すべての情報を報告する。また、@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
情報を簡潔な形式で表示する。他のプログラムで解析するときに都合がよい。

@end table

@option{--format} や "@option{--printf} の @var{format} 中で、ファイルに対して使用できる
書式指定子には以下のものがある。

@itemize @bullet
@item %a - 8 進数で表現したアクセス権
@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{%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 を呼び出せば、現在ベースになっているマウント
ポイントを知ることができる。
@sp 1
(訳注: 訳者には意味不明。「現在ベースになっているマウントポイント
(the current base mount point)」が、上記訳注の newdir のことなら、
stat を再帰的に呼び出すまでもない。@samp{stat -c "%m" newdir/@var{FILE}} は、
newdir を表示する。また the current base mount point が「根底にある
(すなわち、デバイスを最初にマウントした) マウントポイント」のこと
なら、stat を再帰的に呼び出しても、それを突き止めることはできない。
ひょっとすると、書式指定子に @samp{%m} が追加された最近の 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 superblock, writing
@cindex inodes, written buffered
@command{sync} は、メモリにバッファされているあらゆるデータをディスクに
書き出す。そうした書き出しには、スーパーブロックの変更、 inode の
変更、遅延読み書きを含むことができる (が、それだけに止まらない)。
この機能はカーネルによって実装されていなければならない。@command{sync}
プログラムは、@code{sync} システムコールを実行する以外、何もしないのである。

@cindex crashes and corruption
カーネルは、(比較的遅い) ディスクの読み書きをできるだけしないで
済ますために、メモリにデータを保持している。このことによって、動作速度
が向上するが、コンピュータがクラッシュした場合、データが失われたり、
ファイルシステムが壊れたりという結果が生じかねない。@command{sync} コマンドを
使えば、メモリ上にあるすべてが間違いなくディスクに書き出されることに
なる。

@option{--help} や @option{--version} を単独で使用することはできるが、それ以外の
いかなる引数も無視される (@pxref{Common options})。

@exitstatus


@node truncate invocation
@section @command{truncate}: ファイルサイズの短縮・伸長を行う

@pindex truncate
@cindex truncating, file sizes

@command{truncate} は、各 @var{file} のサイズを指定したサイズにまで短縮したり、引き
伸ばしたりする。
@sp 1
書式:

@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 @sc{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} にする。@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 個のスペースを置き、行末に改行を付け加える。
@sp 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{printf} コマンドの使用を考えてもよい。
@xref{printf invocation}.

@exitstatus


@node printf invocation
@section @command{printf}: データを整形して表示する

@pindex printf
@command{printf} は、テキストを整形して表示する。
@sp 1
書式:

@example
printf @var{format} [@var{argument}]@dots{}
@end example

@command{printf} は、文字列 @var{format} を表示する。その際、C の @samp{printf} 関数と
ほとんど同じやり方で、@samp{%} 書式指定子と @samp{\} エスケープシーケンスを解釈
して、数値や文字列の引数を整形する。詳細については、次の項目を参照する
こと。 @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{format} 中の書式指定子に対応する、文字列
なり、数値なりの引数が存在しないということ)、文脈が文字列と数値の
どちらを期待しているかによって、空文字列、または 0 と見なされる。
たとえば、@samp{printf %sx%d} というコマンドは、@samp{0} を表示する。

@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
@command{printf} コマンドの書式指定子には、@samp{%b} が追加されている。@samp{%b}
は、対応する引数文字列中の @samp{\} エスケープシーケンスを、それが
@var{format} 文字列中にあるときと同じように解釈・変換して、引数文字列
を表示する。ただし、引数中の 8 進数エスケープシーケンスは @samp{\0@var{ooo}}
の形を取る。@var{ooo} は 0 から 3 桁の 8 進数である。@samp{\@var{ooo}} が 9 ビット
の値ならば、9 ビット目 (訳注: すなわち最上位ビット) は無視される。
@samp{%b} に精度も指定すると、変換した文字列の先頭から何バイトを表示
するかが、それによって決まる。

@item
数値の引数は、単独の C の定数でなければならない。前に @samp{+} や @samp{-}
が付いていてもよい。たとえば、@samp{printf %.4d -3} は、@samp{-0003} を
出力する。

@item
@vindex POSIXLY_CORRECT
数値が期待される引数の先頭文字が @samp{"} や @samp{'} である場合、その引数の
値は、引用符の直後に来る文字の数値である (訳注: すなわち、一般に
は、その文字の ASCII コードの 10 進数表記が出力される)。その後に
さらに文字が続く場合は、@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 進数ならば)、表示する文字を指定している
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 種類のキャラクタ・シンタクス
(訳注: 要するに、コードによる文字の指定法) を解釈することができる。
一つは、16 ビットの Unicode (ISO/IEC 10646) 文字を表す @samp{\u} であり、
4 桁の 16 進数 @var{hhhh} で指定する。もう一つは、32 ビットの Unicode 文字を
表す @samp{\U} で、こちらは 8 桁の 16 進数 @var{hhhhhhhh} で指定する。@command{printf} は
Unicode の文字を出力するに当たって、@env{LC_CTYPE} のロケールに従う。なお、
U+0000...U+009F と U+D800...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 以降を使用すれば、任意の文字列をそのエンコーディングに変換する
ことができるのだ。以下に示すのは、一つのテキストを、ロケールに影響
されずにそのテキストを出力するシェルスクリプトに変換する方法である。

@smallexample
$ LC_CTYPE=zh_CN.big5 /usr/local/bin/printf \
    '中文\n' > sample.txt
$ 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} は、コマンドラインで指定された引数を、空白で区切り、末尾に
改行を付けて、kill されるまで延々と表示する。引数が指定されていない
場合は、@samp{y} の後ろに改行を付けて、kill されるまで延々と表示する。

書き込みエラーがあると、@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} の長さとして評価される。

@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

おなじみの論理演算子である。

@table @samp

@item ! @var{expr}
@opindex !
@var{expr} が偽ならば、真。

@item @var{expr1} -a @var{expr2}
@opindex -a
@cindex logical and operator
@cindex and operator
@var{expr1} と @var{expr2} の両方が真ならば、真。

@item @var{expr1} -o @var{expr2}
@opindex -o
@cindex logical or operator
@cindex or operator
@var{expr1} と @var{expr2} のどちらかが真ならば、真。

@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} に
渡すことはできないのだ。この問題を回避する方法の一つは、@sc{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} コマンドは、標準入力を標準出力にコピーするとともに、引数として
指定されたファイル (複数可) にもコピーする。これは、あるデータをパイプ
に送るだけでなく、同時にそのコピーを保存したい場合に、便利である。
@sp 1
書式:

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

書き出し先のファイルがまだ存在していなければ、作成される。書き出し
先のファイルがすでに存在している場合は、@option{-a} オプションを使用しない
かぎり、ファイルに前からあったデータは上書きされる。

@var{file} の一つに @samp{-} を指定すると、@command{tee} は、入力のコピーをもう一つ、
標準出力に送出する。だが、コピー同士が重なり合うので、たいていの場合、
これはあまり役に立たない。

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

@table @samp
@item -a
@itemx --append
@opindex -a
@opindex --append
指定されたファイルの末尾に標準入力を追加する。すなわち、ファイルを
上書きしない。

@item -i
@itemx --ignore-interrupts
@opindex -i
@opindex --ignore-interrupts
割り込みシグナルを無視する。

@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, bashref, The Bash Reference Manual}.)。
そのため、@command{zsh}, @command{bash}, @command{ksh} では
うまく動作するが、@command{/bin/sh} では動作しない。従って、こうしたコードを
シェルスクリプトで使用するときは、スクリプトの先頭に @samp{#!/bin/bash} など
と書くことを忘れてはいけない。

上記の例は、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 -d /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

@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} の先頭にディレクトリ部分があれば、それを取り除く。
@sp 1
書式:

@example
basename @var{name} [@var{suffix}]
basename @var{option}... @var{name}...
@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} オプ
ションも指定したことになる。

@item -z
@itemx --zero
@opindex -z
@opindex --zero
出力する項目を @sc{nul} 文字で区切る。

@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{.} を表示する。
@sp 1
書式:

@example
dirname [@var{option}] @var{name}...
@end example

@var{name} は実在するファイル名でなくても構わないが、実在するファイル名
ならば、この操作によって、最後の要素が存在するディレクトリが、最後の
要素それ自体がディレクトリである場合も含めて、利用できる形で表示される。

@basenameAndDirname

POSIX によれば、@var{name} が @samp{//} の場合に、結果がどうなるかは、実装側で
決めてよいことになっている。GNU の @command{dirname} について言うと、@var{//} と @var{/}
とが別のものであるプラットフォームでは、結果は @samp{//} になり、全く区別
しないプラットフォームでは、結果は @samp{/} になる。

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

@table @samp

@item -z
@itemx --zero
@opindex -z
@opindex --zero
出力する項目を @sc{nul} 文字で区切る。

@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} は、ファイル名が有効かどうか、可搬性があるかどうかを検査する。
@sp 1
書式:

@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} は、テンポラリファイルやテンポラリディレクトリの作成を行う。
@sp 1
書式:

@example
mktemp [@var{option}]@dots{} [@var{template}]
@end example

@command{mktemp} は、@var{template} を基にして、安全なテンポラリファイルや
ディレクトリを作成し、その名前を表示する。@var{template} を指定する場合、
その最後の構成部分に少なくとも 3 個の連続する @samp{X} が含まれていなければ
ならない。省略した場合は、@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{/} 文字の削除も行う。デフォルト
では、指定したファイル名のうち、最後の要素以外のすべての要素が実在して
いなければならない。
@sp 1
書式:

@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 -s
@itemx --strip
@itemx --no-symlinks
@opindex -s
@opindex --strip
@opindex --no-symlinks
シンボリックリンクの展開を行わない。すなわち、@samp{/./} や @samp{/../} の
参照の解決と、余分な @samp{/} 文字の削除だけを行う。@option{-m} オプションと
組み合わせた場合、@command{realpath} は与えられたファイル名の操作を行う
だけであって、実在のファイルとは全くかかわりを持たない。

@item -z
@itemx --zero
@opindex -z
@opindex --zero
出力する項目を @sc{nul} 文字で区切る。

@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

@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} は、カレントディレクトリの名前を表示する。
@sp 1
書式:

@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) のような、端末の諸特性を表示、
または変更する。
@sp 1
書式:

@example
stty [@var{option}] [@var{setting}]@dots{}
stty [@var{option}]
@end example

tty ラインの設定を指定しない場合、@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
のシステムであっても、そうした設定が使えないことがあるかもしれないが、
あらゆる場合について書いておくことは、不可能である。とりあえず、試して
みていただきたい。

@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 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。無効化できる。
@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 @sc{nul} 文字ではなく、ASCII @sc{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 を意味するということ。
「19.2.5 組み合わせ設定」の lcase と termios(3) を参照。)

@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。無効化できる。
@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 -ixoff
-iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0
ff0 isig icanon iexten echo echoe echok -echonl
-noflsh -xcase -tostop -echoprt echoctl echoke
@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 -iuclc -ixany
-imaxbel -opost -isig -icanon -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 swtch
@opindex swtch
シェルの別の層 (a different shell layer) に切り換える。非 POSIX。

@item start
@opindex start
停止している出力を再開する。

@item stop
@opindex stop
出力を停止する。

@item susp
@opindex susp
端末停止シグナル (terminal stop signal) を送る。

@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 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} は、環境変数の値を表示する。
@sp 1
書式:

@example
printenv [@var{option}] [@var{variable}]@dots{}
@end example

@var{variable} が一つも指定されていない場合、@command{printenv} はすべての環境変数
の値を表示する。@var{variable} が指定されている場合は、その変数それぞれに
ついて、設定されていれば値を表示し、設定されていなければ何も表示しない。

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

@table @samp

@optNull{printenv}

@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} というメッセージを出す。
@sp 1
書式:

@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} を実行しているプロセスについて情報を表示する。
@sp 1
書式:

@example
id [@var{option}]@dots{} [@var{username}]
@end example

@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
が無効になっている場合は、警告メッセージを出し、終了ステータスを
1 にする。

@end table

@exitstatus

@macro primaryAndSupplementaryGroups{cmd,arg}
プロセスの基本 (primary) グループや 補助 (supplementary) グループは、
通常その親プロセスから継承され、普通はログイン後ずっと変わらないものだ。
従って、ログイン後にグループ・データベースを変更しても、現在のログイン
セッションが続いている間は、@command{\cmd\} コマンドはその変更を反映しない。
しかし、\arg\を指定して @command{\cmd\} を実行した場合は、ユーザ・
データベースやグループ・データベースの参照が、改めて行われるので、
変更した結果が表示されることになる。
@end macro
@primaryAndSupplementaryGroups{id,引数にユーザの名前}

@node logname invocation
@section @command{logname}: 現在のログイン名を表示する

@pindex logname
@cindex printing user's login name
@cindex login name, printing
@cindex user name, printing

@command{logname} は、自分を呼び出したユーザの名前を、システムが管理して
いるファイル (たいていは @file{/var/run/utmp} か @file{/etc/utmp}) で調べて
表示し、ステータス 0 で終了する。自分を呼び出したプロセスに対する
エントリが存在しない場合は、@command{logname} はエラーメッセージを出し、
ステータス 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) グループ名を表示し、
ユーザ名が指定されていなければ、現在のプロセスの基本グループ名と
補助グループ名を表示する。複数の名前が指定されている場合は、
各ユーザの名前がグループのリストの前に置かれ、両者の間はコロンで
区切られる。
@sp 1
書式:

@example
groups [@var{username}]@dots{}
@end example

グループのリストは、@samp{id -Gn} コマンドの出力と同じである。

@primaryAndSupplementaryGroups{groups,ユーザのリスト}

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

@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 行に表示する。ユーザ名はログイン
セッションごとに表示されるので、あるユーザが複数のログインセッションを
行っていれば、そのユーザの名前はログインセッションの数だけ出力に現れる
ことになる。
@sp 1
書式:

@example
users [@var{file}]
@end example

引数 @var{file} の指定がない場合、@command{users} はシステムが管理するファイル
(たいていは @file{/var/run/utmp} か @file{/etc/utmp}) からログインしているユーザの
情報を引き出す。引数 @var{file} が指定されている場合は、代りにそのファイルを
使用する。@file{/var/log/wtmp} が使われることが多い。

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

@exitstatus


@node who invocation
@section @command{who}: 現在誰がログインしているかを表示する

@pindex who
@cindex printing current user information
@cindex information, about current users

@command{who} は、現在ログインしているユーザについての情報を表示する。
@sp 1
書式:

@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 ディスプレー名。

オプション以外の引数を一つだけ指定すると、@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
ログイン日時の後ろに、ユーザが何時間何分アイドル状態でいるかを
表示する。@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

@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
エポック (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
その月の何日目か (e.g., @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 %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} は、(以下で述べるように) その
引数で指定した日時にシステムクロックを設定する。システムクロックを設定
するには、しかるべき権限が必要である。リブート後も変更を維持するには、
システムクロックに合わせてハードウェアクロックも更新する必要があるかも
しれないことに注意していただきたい。ご使用のシステムでは、ハードウェア
クロックの更新は、自動的に行われないかもしれないからだ。

引き数の構成要素は、すべて数字でなければならない。それは以下の意味を
持っている。
@sp 1
(訳注: 念のため、この章の冒頭にあるシステムクロック設定用の書式を
再掲しておく。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 -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} の書式でタイムゾーンも付ける。

@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} という文字では
なく、空白を使うことをアプリケーションに許している、という相違点も
ある。他の標準の書式とは違って、RFC 3339 の書式は、現在のロケール
が何であろうとも、@option{--date} (@option{-d}) や @option{--file} (@option{-f})
オプションに
対する入力として常に適切である。

引数 @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} を参照。
前節「21.1.5 日時の設定」 も参照すること。@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) を使用する。協定世界時
は、歴史的な理由から「グリニッジ標準時 (@sc{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
日付を表す文字列をエポック (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{@@} という表記に頼っても
構わないなら、上記のコマンドを短くすることができる。

@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} と同じこと
である。
@sp 1
書式:

@example
arch [@var{option}]
@end example

このプログラムでは、共通オプションしか使用できない。@ref{Common options}.

@exitstatus


@node nproc invocation
@section @command{nproc}: 利用できるプロセッサの個数を表示する

@pindex nproc
@cindex Print the number of processors
@cindex system information, printing

カレントプロセスが利用できるプロセシング・ユニットの個数を表示する。
それは、稼働しているプロセッサの数より少ないかもしれない。そうした
情報が取得できない場合は、搭載されているプロセッサの数を表示する。
環境変数 @env{OMP_NUM_THREADS} が設定されている場合は、その変数が、返さ
れる値を決めることになる。なお、結果は必ず 0 より大きくなる。
@sp 1
書式:

@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} オプションが指定されたかのように振る舞う。
@sp 1
書式:

@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} の部分である。
@sp 1
(訳注: @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} と表示する。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} と
表示する。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} は、引数なしで実行すると、使用しているホストシステムの
名前を表示する。引数を一つ付けると、使用しているホストの名前を指定
された文字列に設定する。ホストの名前を設定するには、しかるべき権限が
必要である。
@sp 1
書式:

@example
hostname [@var{name}]
@end example

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

@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 ビットの数値がシステムの
インターネット・アドレスと密接な関係を持っているが、いつでもそうとは
かぎらない。

@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 のカーネルは、割り込み不可能なプロセスを
含める方である。

@node SELinux context
@chapter SELinux context

@cindex SELinux context
@cindex SELinux, context
@cindex commands for SELinux context

This section describes commands for operations with SELinux contexts.

@menu
* chcon invocation::         Change SELinux context of file
* runcon invocation::        Run a command in specified SELinux context
@end menu

@node chcon invocation
@section @command{chcon}: Change SELinux context of file

@pindex chcon
@cindex changing security context
@cindex change SELinux context

@command{chcon} changes the SELinux security context of the selected files.
Synopses:

@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

Change the SELinux security context of each @var{file} to @var{context}.
With @option{--reference}, change the security context of each @var{file} to
that of @var{rfile}.

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

@table @samp

@item -h
@itemx --no-dereference
@opindex -h
@opindex --no-dereference
@cindex no dereference
Affect symbolic links instead of any referenced file.

@item --reference=@var{rfile}
@opindex --reference
@cindex reference file
Use @var{rfile}'s security context rather than specifying a @var{context}
value.

@item -R
@itemx --recursive
@opindex -R
@opindex --recursive
Operate on files and directories recursively.

@choptH @xref{Traversing symlinks}.

@choptL @xref{Traversing symlinks}.

@choptP @xref{Traversing symlinks}.

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
@cindex diagnostic
Output a diagnostic for every file processed.

@item -u @var{user}
@itemx --user=@var{user}
@opindex -u
@opindex --user
Set user @var{user} in the target security context.

@item -r @var{role}
@itemx --role=@var{role}
@opindex -r
@opindex --role
Set role @var{role} in the target security context.

@item -t @var{type}
@itemx --type=@var{type}
@opindex -t
@opindex --type
Set type @var{type} in the target security context.

@item -l @var{range}
@itemx --range=@var{range}
@opindex -l
@opindex --range
Set range @var{range} in the target security context.

@end table

@exitstatus

@node runcon invocation
@section @command{runcon}: Run a command in specified SELinux context

@pindex runcon
@cindex run with security context


@command{runcon} runs file in specified SELinux security context.

書式:
@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

Run @var{command} with completely-specified @var{context}, or with current
or transitioned security context modified by one or more of @var{level},
@var{role}, @var{type} and @var{user}.

If none of @option{-c}, @option{-t}, @option{-u}, @option{-r}, or
@option{-l} is specified, the first argument is used as the complete
context.  Any additional arguments after @var{command} are interpreted as
arguments to the command.

With neither @var{context} nor @var{command}, print the current security
context.

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

@table @samp

@item -c
@itemx --compute
@opindex -c
@opindex --compute
Compute process transition context before modifying.

@item -u @var{user}
@itemx --user=@var{user}
@opindex -u
@opindex --user
Set user @var{user} in the target security context.

@item -r @var{role}
@itemx --role=@var{role}
@opindex -r
@opindex --role
Set role @var{role} in the target security context.

@item -t @var{type}
@itemx --type=@var{type}
@opindex -t
@opindex --type
Set type @var{type} in the target security context.

@item -l @var{range}
@itemx --range=@var{range}
@opindex -l
@opindex --range
Set range @var{range} in the target security context.

@end table

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

@display
126 if @var{command} is found but cannot be invoked
127 if @command{runcon} itself fails or if @var{command} cannot be found
the exit status of @var{command} otherwise
@end display

@node Modified command invocation
@chapter コマンド実行条件の変更

@cindex modified command invocation
@cindex invocation of commands, modified
@cindex commands for invoking other commands

この章で説明するコマンドは、他のコマンドを現在の条件とは違った条件で
実行する。たとえば、環境を変更して実行する、別のユーザとして実行する
といったことである。

@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 関数をサポートしていないため、
内部で使用する関数が特権を要求しないからである。}
@sp 1
書式:

@example
chroot @var{option} @var{newroot} [@var{command} [@var{args}]@dots{}]
chroot @var{option}
@end example

通常、ファイル名の検索は、ディレクトリ構造の根 (ルート、root)、
すなわち @file{/} を起点として行われる。@command{chroot} はこのルートを @var{newroot}
ディレクトリ (実在するディレクトリでなければならない) に変更し、
その上で @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 --userspec=@var{user}[:@var{group}]
@opindex --userspec
デフォルトでは、@var{command} は、呼び出し側のプロセスと同じ資格情報を
使って、実行される。このオプションを使えば、@var{command} を別の @var{user}
として実行することができる。別の基本 @var{group} を指定することも可能だ。

@item --groups=@var{groups}
@opindex --groups
このオプションを使えば、新しいプロセスが使用する補助 @var{groups} を指定
することができる。グループのリスト (名前でも ID 番号でもよい) は、
コンマで区切られていなければならない。

@end table

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} でリストされたファイルも、新しいルートディレクトリ
になるディレクトリ以下のしかるべき場所にコピーしておく。さらに、
実行ファイルが何か他のファイルも必要としているなら (たとえば、データ
ファイル、ステータスファイル、デバイスファイルなど)、それも適切な
場所にコピーする。

@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} は、環境を変更して、コマンドを実行する。
@sp 1
書式:

@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 @sc{nul} 以外なら、どんな文字を
含んでいても構わない。とは言え、変数名は、アンダースコア、数字、ASCII
文字のみから構成し、数字以外の文字で始めるようにした方が、賢明である。
それ以外の名前だと、シェルなどのアプリケーションがうまく動作しないからだ。

@vindex PATH
@samp{=} という文字を含まない最初のオペランドが、起動するプログラムで
あり、環境変数 @env{PATH} に従って、どこにあるかが検索される。残っている
引数があれば、すべてそのプログラムに引数として渡される。起動するプロ
グラムは、シェルの組み込みコマンドであってはならない (@pxref{Special built-in
utilities})。

@env{PATH} に対する変更は、@var{command} のありかを検索する前に有効になる。
そこで、@env{PATH} を短縮するときには、気をつけなければならない。@env{PATH} が
空だったり、@file{/bin} のような重要なディレクトリを欠いていると、@env{PATH} を
変更する前と同じ動作にならないからだ。

めったにないことだが、プログラムの名前に @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{env}

@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 は、
プロセスが優先的にスケジュールされるかどうかに影響するパラメータである。
(訳注: niceness を「スケジュール優先度」と訳さない理由については、
三つほど下のパラグラフをご覧ください。)
@sp 1
書式:

@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}

このプログラムでは、以下のオプションが使用できる。参照: @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

@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

@command{nohup} を使って、@var{command} を実行すると、指定されたコマンドがハング
アップ・シグナルを無視するようになる。従って、そのコマンドは、ユーザが
ログアウトした後でも、バックグラウンドで実行を継続することができる。
@sp 1
書式:

@example
nohup @var{command} [@var{arg}]@dots{}
@end example

標準入力が端末の場合、標準入力は @file{/dev/null} に付け換えられる。その
結果、端末セッションが、@command{nohup} によって実行されたコマンドが端末を使用
していると勘違いすることがなくなる。これは GNU の拡張である。GNU 以外
のホストでも使うことを考えているプログラムでは、GNU の拡張を当てにせず、
@samp{nohup @var{command} [@var{arg}]@dots{} </dev/null} を使った方がよい。

標準出力が端末の場合、コマンドの標準出力は、@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}: I/O ストリームのバッファリングを変更して、コマンドを実行する

@pindex stdbuf
@cindex standard streams, buffering
@cindex line buffered

@command{stdbuf} を使用すると、プログラムと結びついている 3 種類の標準 I/O
ストリームに対して、そのバッファリング動作を変更することができる。
@sp 1
書式:

@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

@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} は渡されたコマンドを実行し、指定された時間が経過しても
まだ実行が続いていたら、そのコマンドを終了させる。
@sp 1
書式:

@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 --foreground
@opindex --foreground
独立したバックグラウンドのプログラム・グループを作成しない。
そうすることで、@command{timeout} に管理される @var{command} が、フォアグラウンド
の TTY を通常どおり使用できるようにする。対話的シェルから直接実行
されていない (訳注: たとえば、シェルスクリプト中で実行される)
@command{timeout} コマンドをサポートするためにこの動作が必要になるのは、
次の二つの場合である。
@enumerate
@item
@var{command} が対話的であり、たとえば端末からの読み込みが必要な
場合。
@item
端末から直接 @var{command} にシグナルを送ることができるようにしたい
場合。(たとえば、Ctrl-C を送るとか)。
@end enumerate

この動作モードでは、@var{command} のいかなる子プロセスも、時間切れで
終了することがないのに注意すること。

@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} に the 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} は、シグナルに関する情報を一覧
表示する。
@sp 1
書式:

@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}} という形式のオプションの場合
は例外で、大文字を使わなければならない。小文字を使うと、他のオプション
とまぎらわしいからである。サポートしているシグナル名とシグナル番号に
ついては、右の節を参照していただきたい。@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} は、コマンドライン引数の値の合計によって指定された時間だけ
停止する。
@sp 1
書式:

@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} は整数でなければならず、引数は
接尾辞なしのものが一つしか認められていなかった。それに対して 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::        素因数を表示する。
* seq invocation::           連続する数を表示する。
@end menu


@node factor invocation
@section @command{factor}: 素因数を表示する

@pindex factor
@cindex prime factors

@command{factor} は、素因数を表示する。
@sp 1
書式:

@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 Rho アルゴリズムは、比較的小さな因数を持つ数値に
対してとりわけ効率がよい。もし、小さな因数を持たない大きな数値 (たと
えば、二つの大きな素数の積からなる数値) の素因数分解をなさりたいのなら、
他の手法の方がずっと適している。

@command{factor} が GNU MP を使用せずにビルドされている場合は、単精度の
算術しか利用できない。従って、大きな数値 (一般には @math{2^{64}} 以上)
には対応していない。単精度用のコードが使用しているアルゴリズムは、
比較的小さな数値を素因数に分解するためのものなのである。

@exitstatus


@node seq invocation
@section @command{seq}: 数列を表示する

@pindex seq
@cindex numeric sequences
@cindex sequence of numbers

@command{seq} は、数列を標準出力に表示する。
@sp 1
書式:

@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} は、何も出力
しない。数値には浮動小数点数を指定してもよい。@xref{Floating point}.

このプログラムでは以下のオプションが使用できる。参照: @ref{Common options}.
オプションはオペランドの前に置かなければならない。

@table @samp
@item -f @var{format}
@itemx --format=@var{format}
@opindex -f @var{format}
@opindex --format=@var{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}
@cindex separator for numbers in @command{seq}
数の区切りに @var{string} を使う。デフォルトは改行である。出力の最後
には、必ず改行が付く。

@item -w
@itemx --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 @sc{lf} (Line Feed) 文字によって行分け
されたバイトの連続なのである。なお、この @sc{lf} 文字は、Unix の文書では
「改行 (newline)」と呼ばれる習慣になっている (C のプログラマにとっては
@code{\n} だ)。これこそ、すべての伝統的なフィルター・プログラムによって使用
されて来たフォーマットである。(昔のオペレーティング・システムの多くは、
バイナリ・データを扱うための複雑な手段や専用のプログラムを備えていた。
だが、Unix は、ただ単にテキストエディタでデータを見たり編集できたり
する方がはるかに簡単だという考えから、そうした道具をずっと敬遠してきた
のである。)

さて、前置きはこれくらいで充分だ。まず、道具のいくつかをざっと見て
みよう。その後で、そうした道具をおもしろいやり方で組み合わせる方法を
ご覧に入れる。以下の解説では、当面の問題に関係のあるコマンドライン・
オプションしか取り上げない。いつでもそうすべきことだが、コマンドについて
詳しいことを知りたかったら、ご使用のシステムの文書を参照なさるとよい。

@node The who command
@unnumberedsec @command{who} コマンド

最初に取り上げるプログラムは、@command{who} コマンドだ。これは単独で使うと、
現在ログインしているユーザのリストを生成する。筆者がこの原稿を書いて
いるのは、シングルユーザのシステムだが、数人のユーザがログインしている
ことにしよう。

@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) やフィールドを切り出す。そこで、@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} コマンドは、コマンドラインで指名された各ファイルを読み込んで、
ソートする。その後で、ソートしたデータをマージし、それを標準出力に書き
出す。コマンドラインでファイルが指定されていない場合は、標準入力を読み
込む (こうして、フィルターになる)。ソートは、文字の照合順序、あるいは、
ユーザが順序について指定した基準に基づいて行われる。


@node The uniq command
@unnumberedsec @command{uniq} コマンド

最後に目を向けるのは (少なくとも今のところはだが)、@command{uniq} プログラムだ。
データのソートをしていると、結果に重複行が現れることがよくある。内容が
全く同じ行だ。たいていの場合、各行は一つだけあればよい。そこで、@command{uniq}
の出番になる。@command{uniq} プログラムは、標準入力を読み込み、連続する同一行に
ついては、そのうちの一件だけを表示する。@command{uniq} には、オプションがいくつ
かある。後で @option{-c} オプションを使うことになるが、これはユニークな、つまり
重複しない各行を表示するとき、その行が入力中に現れた回数を前に付ける
ものである。


@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} コマンドは、一字一字処理して行くというやり方で、
文字を置き換える。通常、このコマンドを使用するのは、大文字を小文字に
変換するといったことのためである。

@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} というコマンドライン・オプションを
付けると、対応する列を表示しないようになる。 (これは直感的ではないので、
ちょっとした慣れが必要だ。) 例を挙げよう。

@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} だ。筆者の 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

これを執筆している時点で、ここで取り上げたプログラムはすべてアノニ
マス @command{ftp} で次の場所から手に入れることができる (今では、もっと新しい
バージョンが利用できるかもしれない)。@*
@uref{ftp://gnudist.gnu.org/textutils/textutils-1.22.tar.gz} @*
(訳注: 2014 年 3 月現在では、coreutils のサイトは次のものになっている。@*
@uref{http://www.gnu.org/software/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 を御存じの方なら、コードを追うのに何の苦労もないことだろう。

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 this translation
@appendix 翻訳について

この文書は、@sc{gnu} core utilities version @value{VERSION} の info マニュアルの
翻訳である。
 
まず最初に、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} と打ち込んで、リターンキーを押せば、日本語版
マニュアルが、@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} の場合はタブで、文字列の補完ができる。(たぶん coreutils-ja.info の
パッケージには、README.ja というファイルが含まれていると思う。その
「2.1 日本語 info マニュアルの呼び出し方」という節にもう少し詳しい
説明を書いておいたので、ご覧になっていただきたい。)

ここで、日本語の info マニュアルを使用するときの問題点を挙げておく。

@enumerate
@item
@command{info} コマンドは、日本語の行末表示が上手ではない。そのため、
行末に余計な文字が入ることがある。そうしたときは、@kbd{C-l} を押して 
(Ctrl と l (エル) キーを同時に押す)、画面の再描画を行っていただき
たい。表示が正常になるはずである。Emacs の info リーダーでは、この
問題はたぶん起きない。

@item
現在のところ、@command{info} コマンドでは、@kbd{s} や @kbd{/} で日本語の単語を検索
できないようだ。@kbd{C-s} による日本語の検索は、単語によっては成功する
こともあるが、''Unknown command'' で失敗することもあり、これもあまり
頼りにならない。それに対して、Emacs の info リーダーでは、@kbd{s} でも 
@kbd{C-s} でも日本語の検索ができる。

@item
coreutils の info のこの翻訳では、インデックスの日本語化まで手が
回らなかった。そのため、インデックスは英語のままである。

@item
古めの Emacs でこの翻訳を読もうとすると、文字化けするかもしれない。
回避法があるのかもしれないが、訳者にはわからなかった。
@end enumerate

このマニュアルは、coreutils-8.20 所収の texinfo マニュアルを元に、
Linux JM project のために訳者が新たに翻訳したものである。ptx, tsort, 
chcon, runcon の 4 件は未訳である。間違いの指摘や改良の提案は Linux JM 
project (@email{linuxjm-discuss@@lists.sourceforge.jp}) 宛にメールでなさって
いただきたい。

この info マニュアルの原文は、本文の「序」でも述べているように、
各プログラムの man ページを統合し、増補・改訂したものである。この info 
マニュアルがまとめられるにともない、公式の man ページの方はコマンドの 
@samp{--help} オプションで見ることができるものとほぼ同文の、簡単な内容の
ものになった。

従来どおりの詳しい man ページを希望する人たちも存在した。そのために
作られたのが、gnumaniak の man ページであり、従来の man ページを info 
の情報で増補したものだったが、現在では保守されていないようだ。

作成の経緯がそうしたものなので、この info マニュアルの原文には、
gnumaniak の man ページの原文とほとんど内容が同じものがある。今回の
翻訳作業に当たっては、すべての項目について gnumaniak の man ページの
翻訳を参考にした。あちらの訳文の方がよくできている項目もある。

この翻訳は、gnumaniak の翻訳に多くを負っている。そこで、まず、
gnumaniak の翻訳者の方々 --- 中野武雄、佐藤裕一、白方健太郎、Kazuyuki 
Tanisako、Omo Kazuki の諸氏にお礼を申し上げる。

訳文を見直す際には、西尾太さんが以前翻訳なさった coreutils-5.2.1 の 
info を参考にした。また、当然ながら、現在の man ページ (こちらの
翻訳者は、たぶん Yasuaki Taniguchi さんと Akihiro MOTOKI さん) とも、
できるだけ突き合わせた。西尾さん、Taniguchi さん、元木さんにもお礼を
申し上げる。

gnumaniak や coreutils の man や info の翻訳をなさった方で、私が
お名前を挙げ忘れた方がいらっしゃるかもしれない。お知らせくだされば、
追加訂正する。

訳文には間違った箇所も多々あると思う。そのへんは、ご寛恕いただき
たい。皆さんがこの訳文を叩き台にして、増補・改訂・改訳を続け、より
新しく、よりわかりやすい、そして、より正確な coreutils の翻訳を作って
くだされば、最初の翻訳者としてそれにまさる喜びはない。

2014-03-15 訳者

[翻訳履歴]

@itemize @bullet
@item
2014-03-15@*
coreutils-8.20 を翻訳 --- by 長南洋一@*
ptx, tsort, chcon, runcon は未訳
@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:
