Provided by: manpages-ja_0.5.0.0.20131015+dfsg-2_all
名前
xargs - 標準入力を読み込んでコマンドラインを作成し、それを実行する
書式
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines] [--max-lines[=max-lines]] [-n max-args] [--max-args=max- args] [-s max-chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs] [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] [--version] [--help] [command [initial-arguments]]
説明
このマニュアルページは GNU 版 xargs の使用法を説明している。 xargs は、標準入力から空白や 改行で区切られた一連の項目を読み込み (空白はダブルクォート、シングルクォート、バックスラッ シュによって 保護できる)、それを引き数にして、指定した command を実行する (デフォルトのコ マンドは /bin/echo である)。 このとき、ユーザが command に対して指定した引き数 (上記書式の initial-arguments) があれば、 xargs は標準入力から読み込んだ一連の項目をその後ろに 追加し ていく (訳注: 作成されたコマンドラインが、コマンドライン長の上限を 越える場合や、オプショ ンによる特別な指定がある場合は、入力を適宜分割して、 command を複数回実行することにな る)。標準入力における空行は無視する。 Unix ではファイル名に空白や改行を含むことが可能なので、この デフォルトの動作は、しばしば問 題を引き起こす。空白や改行を含む ファイル名は、 xargs によって適切に処理されないからだ。そ うした状況では、 -0 オプションを使用した方がよい。そうすれば、その手の問題を回避することが できる。 なお、 -0 オプションを使う場合は、 xargs の入力を生成するプログラムの方も、区切り の記号として必ずヌル文字を 使うようにする必要がある。たとえば、そのプログラムが GNU find ならば、 -print0 オプションでそれが可能だ。 指定したコマンドの実行が終了ステータス 255 で終了することがあれば、 xargs は即座に停止し て、それ以上入力を読み込まない。また、このとき、 エラーメッセージを標準エラーに表示する。
オプション
--arg-file=file -a file 一連の項目を標準入力からではなく、 file から読み込む。なお、デフォルトでは、指定し たコマンドを実行する際に、 標準入力が /dev/null に付け換えられるが、このオプション を使用した場合は、 標準入力の付け換えが起こらない (訳注: 別の言い方をすると、指定し たコマンドの実行中、デフォルトでは 標準入力が使えなくなるが、このオプションを指定し た場合は、 標準入力が使えるということである)。 --null -0 入力される一連の項目が、ホワイトスペース (空白や改行) ではなく、 ヌル文字によって区 切られる。また、引用符やバックスラッシュが 特別な意味を持たなくなる (すなわち、あら ゆる文字が文字通りに解釈される)。 後述のファイル終端文字列も無効になり、他の引き数 と同じように扱われる。 このオプションは、入力される項目にホワイトスペース、引用符、 バックスラッシュなどが含まれる可能性がある場合に、役に立つ。 GNU find の -print0 オ プションが生成する出力は、このモードに対応した入力になる。 --delimiter=delim -d delim 入力される一連の項目が、指定された文字によって区切られる。引用符や バックスラッシュ は特別な意味を持たない。すなわち、入力中の あらゆる文字が文字通りに解釈される。ファ イル終端文字列も無効になり、 他の引き数と同じように扱われる。入力が、項目を区切るの が改行のみ であるような単純な構成の場合なら、このオプションを利用してもよいが、 ほ とんどたいていの場合、なるべくなら、 xargs の --null を使うように、出力側のプログラ ムを設計する方が望ましい。 指定する区切り記号は、単一の文字でもよく、 \n のような C 言語式のエスケープした文字でも、8 進数や 16 進数の エスケープコードでもよい。8 進数 や 16 進数のエスケープコードは、 printf コマンドの場合と同様に解釈される。マルチバ イト文字には対応していない。 -E eof-str eof-str をファイル終端文字列として設定する。ファイル終端文字列が 入力行の中に現れる と、それ以後の入力は無視される。 -E も -e も指定しない場合、ファイル終端文字列は使 用されない。 --eof[=eof-str] -e[eof-str] このオプションは -E オプションの同義語である。 -E の方を使ってほしい。理由は、そち らが POSIX に準拠しているのに対して、 こちらは準拠していないからだ。eof-str の部分 が省略されると、 ファイル終端文字列が存在しないことになる。 -E も -e も指定しない場 合、ファイル終端文字列は使用されない。 --help xargs のオプションについて簡単に説明し終了する。 -I replace-str xargs が実行するコマンドに対してユーザが引き数 (すなわち initial-arguments) を指定 したとき、その initial-arguments 中にある replace-str の部分すべてを、標準入力から 読み込んだ名前で 置き換える。 なお、空白は、クォートされていない場合も、入力される 項目の区切りには ならない。区切り記号は改行文字だけになるのだ。 -x と -L 1 が自動的 に設定される。 --replace[=replace-str] -i[replace-str] このオプションは、 replace-str が指定されていれば、 -Ireplace-str の同義語であ り、指定されていなければ、 -I{} の同義語である。このオプションは非推奨になってい る。 -I を使った方がよい。 -L max-lines 1 コマンドラインにつき最大 max-lines 行の (空行ではない) 入力行を 使用する。入力行 の行末に空白文字が付いていると、その行は 次の入力行に論理的に続いていることにな る。自動的に -x が指定される。 --max-lines[=max-lines] -l[max-lines] -L オプションの同義語である。 -L とは違って、 max-lines という引き数を指定するかど うかは任意である。引き数 max-lines を指定しなかった場合は、デフォルトの 1 が使用さ れる。 POSIX 標準では -L の方を使うことになっているので、 -l オプションの使用はお勧 めできない。 --max-args=max-args -n max-args 1 コマンドラインにつき最大 max-args 個の引き数を使用する。 作成されたコマンドライン が、コマンドライン長の上限を 超過する場合は (-s オプション参照)、 max-args より少な い引き数が使用されることになる。ただし、 -x オプションが指定されているときは別 で、その場合は xargs が終了する。 --interactive -p コマンドライン一行ごとに、実行するかどうかをユーザに尋ねるプロンプトを出し、 端末か ら一行読み込む。コマンドラインを実行するのは、返答が `y' または `Y' で 始まるときだ けである。自動的に -t が指定される。 --no-run-if-empty -r 標準入力に空白しか含まれていない場合は、指定したコマンドを実行しない。 通常では、入 力が全くない場合でも、コマンドが一回は実行されるのだ。 このオプションは GNU の拡張 である。 --max-chars=max-chars -s max-chars 1 コマンドラインにつき最大 max-chars の文字を使用する。 この文字数には、指定したコ マンドと initial-arguments、それに 各引き数文字列の終端を示すヌル文字も含まれる。指 定できる値の上限は システム次第であり、exec に対する引き数の最大長から、 現在の環境 のサイズと 2048 バイトの余裕領域を引いたものである。 もしその値が 128KiB 以上だった ときは、デフォルトの値として 128KiB が 使用される。128KiB 未満だったときは、算出さ れた上限がデフォルトの値になる。 1KiB は 1024 バイトである。 --verbose -t 実行する前に、コマンドラインを標準エラー出力に表示する。 --version xargs のバージョン番号を表示して、終了する。 --show-limits コマンドライン長の上限を表示する。コマンドライン長の上限は、 オペレーティングシステ ム、 xargs が設定したバッファサイズ、 -s オプションによって決まる。 xargs にコマン ドライン長の上限の表示以外をさせたくなかったら、 入力を /dev/null からパイプで xargs に渡すとよい (さらに --no-run-if-empty を指定した方がよいかもしれない)。 --exit -x 作成されたコマンドラインがコマンドライン長の上限を超過していたら (-s オプションを参 照)、終了する。 --max-procs=max-procs -P max-procs 同時に最多で max-procs プロセスまで指定したコマンドを実行する。デフォルトは 1 であ る。もし max-procs が 0 だと、 xargs はできるだけ多くのプロセスを同時に実行しようと する。 -P と一緒に -n オプションを使うとよい。さもないと、exec がたった一回しか 行 われないかもしれない。
用例
find /tmp -name core -type f -print | xargs /bin/rm -f /tmp ディレクトリ以下に core という名前のファイルを捜して、それを消去する。改行や空白を含 む ファイル名があると、正しく動作しないので、注意すること。 find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f /tmp ディレクトリ以下に core という名前のファイルを捜して、それを消去する。ファイル名の処 理に 当たっては、ファイルやディレクトリの名前に空白や改行が含まれていても、 適切に扱われる ようにする。 find /tmp -depth -name core -type f -delete /tmp ディレクトリ以下に core という名前のファイルを捜して、それを消去する。上の例よりも こ ちらの方が効率的である (なぜなら、 rm を実行するために fork(2) と exec(2) を使わないですむ し、そもそも、 xargs のプロセスを必要としないから)。 cut -d: -f1 < /etc/passwd | sort | xargs echo システムの全ユーザを列挙した簡潔なリストを生成する (訳注: 要するに、 改行ではなく、空白で 区切られたユーザ名のリストを作るということ)。 xargs sh -c 'emacs "$@" < /dev/tty' emacs xargs の標準入力からファイルのリストを受け取り、Emacs を必要なだけ次々と 立ち上げて、それ を編集する。この例は BSD の -o オプションと同じことを実現するが、こちらの方が柔軟性があ り、 多くのシステムで利用できる。
終了ステータス
xargs の終了ステータスは以下のとおりである。 0 成功した。 123 指定したコマンドの実行が 1-125 のステータスで終了した。 124 指定したコマンドが 255 のステータスで終了した。 125 指定したコマンドがシグナルによって kill された。 126 指定したコマンドが実行できない。 127 指定したコマンドが見つからない。 1 上記以外のエラーが起きた。 128 以上の終了ステータスは、致命的なシグナルのせいでプログラムが 止まったことを示すため に、シェルが使用している。
標準への準拠
GNU xargs version 4.2.9 以来、ファイルの論理的な終端を示す指標 (a logical end-of-file marker) を持たないのが、 xargs のデフォルトになっている。このことは POSIX (IEEE Std 1003.1, 2004 Edition) で認められている。 -l や -i オプションは 1997 年版の POSIX 標準には存在するが、 2004 年版の POSIX 標準には存 在しない。従って、それぞれ -L や -I の方を使うべきである。 POSIX 標準は、実装に当たって、 exec 関数に対する引き数のサイズに上限を設けることを認めてい る。 そして、その上限は、環境のサイズも含めて、少なくとも 4096 バイトあれば よいことになっ ている。移植性のあるスクリプトを書こうと思ったら、 これより大きいサイズを当てにしてはいけ ない。もっとも、実際の上限が そんなに小さい実装など、筆者としては見たことも聞いたこともな いけれど。 --show-limits オプションを使えば、使用中のシステムで有効な実際の上限を知ること ができる。
関連項目
find(1), locate(1), locatedb(5), updatedb(1), fork(2), execvp(3), Finding Files (on-line in Info, or printed)
バグ
-L オプションと -I オプションを組み合わせても、うまく行かない。組み合わせて使えた方が よい のかもしれないが。 [訳注]: -I オプションの説明にあるように、 -I replace-str を指定すると、 -L 1 が自動的に設 定される。ここで言っているのは、現状では -L 2 や -L 3 を -I と一緒に使っても、期待 する効果を得られないということである。 xargs を安全に使うことは不可能である。なぜなら、入力されるファイル名の リストを生成する時 間と xargs が実行するコマンドがそれを使用する時間との間には、必ず時間差が あるからだ。も し、他のユーザがシステムにアクセスすることができれば、 そのユーザはこの隙間の時間にファイ ルシステムを操作して、 xargs が実行するコマンドの動作を、こちらが意図していないファイルに 無理矢理向けることができる。この問題や、これに関連する問題については、 findutils に含まれ る Texinfo 文書の「Security Considerations」という章で もっと細かく論じているので、そちら を参照していただきたい。 なお、 find の -execdir オプションは、より安全な方法として xargs の代わりに使用できることが多い。 -I オプションを使うと、標準入力から読み込まれた各行は内部的にバッファされる。 これは、 -I オプションを付けて使ったとき、 xargs が受け付ける入力行一行の長さに上限があるということ だ。 この制限を回避するためには、 -s オプションを使って、 xargs が使用するバッファ空間のサ イズを増やしてやればよい。さらに、 xargs をもう一つ実行すれば、 長すぎる行の出現を確実に避 けることができる。 たとえば、 somecommand | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}' この例では、 xargs の最初の実行には、入力行の長さの上限がない。 -I オプションを使っていな いからである。 xargs の二番目の実行には、そうした上限があるが、処理できる以上の長さの行に 絶対に出会わないようになっている。これが理想的な解決法だ というのではない。むしろ、 -I オ プションによって入力行の長さに上限ができない方がよいのであり、 だからこそ、この問題を「バ グ」セクションで論じているのである。 なお、この問題は find(1) の出力では起きない。 find は 1 行に 1 ファイル名しか出力しないからだ。 バグ報告の最善の方法は、 http://savannah.gnu.org/bugs/?group=findutils にある書式を使用す ることだ。そうすれば、問題解決の進行状態を 追うことができるからである。xargs(1) や findutils パッケージ全般についてのその他のご意見は、 bug-findutils メーリングリストにお出 しになればよい。メーリングリストに参加するには、 bug-findutils-request@gnu.org 宛てに E メールを送っていただきたい。 XARGS(1)