8.4.41 xargsコマンド(コマンドラインを生成して実行する)
形式
xargs [-0] [-r] [-x] [-d デリミタ] [-n コマンド引数の最大個数] [-s コマンドラインの最大長] [--cmdrc-threshold=しきい値] [外部コマンド名 [外部コマンドのコマンド引数 ...]
機能
標準入力からコマンド引数を入力し,コマンドラインを生成して実行します。
コマンド引数の入力方法については,「コマンド引数の入力」を参照してください。
生成するコマンドラインの長さが,コマンドラインの最大長を超えるときは,コマンドラインに含めるコマンド引数の数を調整し,コマンドラインの生成と実行を繰り返します。コマンドラインの最大長については,「コマンドラインの最大長」を参照してください。
- コマンド引数の入力
-
標準入力から入力するコマンド引数とは,標準入力から,コマンド引数の区切り文字で区切られた部分を選択した文字列です。
コマンド引数の区切り文字は,スペース(0x20),タブ文字(0x09),および改行文字です。Windowsの場合,[CR]+[LF](0x0d0a)または[LF](0x0a)が改行文字と見なされます。UNIXの場合,[LF](0x0a)が改行文字と見なされます。これらの区切り文字が連続している場合,1つの区切り文字として扱います。コマンド引数の区切り文字は,-0オプションまたは-dオプションで変更できます。
コマンド引数の入力では,次の文字は特殊な意味を持ちます。
表8‒23 コマンド引数の入力で意味を持つ特殊文字 特殊文字
意味
'
'(シングルクォーテーション)で囲まれた文字列に含まれる次の文字は,コマンド引数に含まれる文字として扱います。
-
コマンド引数の区切り文字(改行文字を除く)
-
その他の特殊文字
"
"(ダブルクォーテーション)で囲まれた文字列に含まれる次の文字は,コマンド引数に含まれる文字として扱います。
-
コマンド引数の区切り文字(改行文字を除く)
-
その他の特殊文字
\
\(バックスラッシュ)の直後にある次の文字は,その特殊な意味を無効(エスケープ文字)にします。
-
コマンド引数の区切り文字
-
特殊文字
また,コマンド引数の入力で,考慮する必要がある文字を次に示します。
-
NULL(0x00)
コマンド引数の文字列に含めることはできません。また,次のオプションをどちらも指定しなかった場合は,標準入力からNULL(0x00)を入力すると,入力を終了します。
・-0オプション
・オプション値に,「\0」などのNULL(0x00)を表すデリミタを指定した-dオプション
-
フォームフィード文字(0x0c),復帰文字(0x0d),および垂直タブ文字(0x0b)
これらの文字が,区切り文字で区切られたコマンド引数の先頭に置かれる場合は,コマンド引数の文字列に含まれません。
(例)フォームフィード文字は\f,復帰文字は\r,垂直タブ文字は\v,スペースは△で示します。
・標準入力の内容
\f\f\rABC\vDEF△\vGHI\fJKL
・外部コマンドに渡されるコマンド引数配列(argv)の内容
コマンド引数配列(argv)
コマンド引数の内容
1番目
外部コマンド名
2番目
ABC\vDEF
3番目
GHI\fJKL
コマンドラインの生成と実行は,次の要因で標準入力からコマンド引数が入力されなかったときにも行われます。
-
標準入力からの入力が0バイト
-
コマンド引数の区切り文字だけを入力した
標準入力からコマンド引数が入力されなかった場合に,コマンドラインの生成と実行をしたくないときは,-rオプションを指定してください。
コマンド引数の入力時の注意点については,「注意事項」を参照してください。
-
- コマンドラインの長さ
-
UNIXの場合,コマンドラインの長さの単位はバイトです。
Windowsの場合,コマンドラインの長さの単位は文字です。マルチバイト文字は1文字として数えます。
コマンドラインの長さは,次の文字列の長さの合計です。文字列の長さには,文字列の終端を示すNULL(0x00)の長さを含みます。
-
外部コマンド名
-
xargsコマンドの引数に指定した外部コマンド名のコマンド引数
-
標準入力から入力するコマンド引数
Windowsの場合,文字列の内容によって,次の文字数を加算します。
文字列の内容
加算する文字数
空白文字(0x20)※またはタブ文字(0x09)※を含む
2
"(ダブルクォーテーション)※を含む
1
"(ダブルクォーテーション)※の前に「\」※がある
・「\」が1つの場合:1
・「\」が連続している場合:「\」の個数
終端が「\」※でかつ,空白文字(0x20)※を含む
・「\」が1つの場合:1
・「\」が連続している場合:「\」の個数
- 注※
-
「コマンド引数の入力で意味を持つ特殊文字」の表に示す特殊文字,-0オプション,または-dオプションで,コマンド引数の文字列として扱う場合です。
-
- コマンドラインの最大長
-
「コマンドラインの長さ」に示すコマンドラインの長さが,コマンドラインの最大長を超えるときは,コマンドラインに含めるコマンド引数の数を調整し,コマンドラインの生成と実行を繰り返します。
コマンドラインの最大長は,-sオプションを指定しない場合,デフォルト値が適用されます。デフォルトのコマンドラインの最大長は,システムで実行できるコマンドラインの最大長によって決定します。コマンドラインの最大長と,システムで実行できるコマンドラインの最大長について,次に説明します。
【UNIXの場合】
コマンドラインの最大長は,システムで実行できるコマンドラインの最大長によって,次の値となります。
条件
使用するコマンドラインの最大長
システムで実行できるコマンドラインの最大長 ≧ 131072
131072バイト(128Kバイト)
システムで実行できるコマンドラインの最大長 < 131072
システムで実行できるコマンドラインの最大長
システムで実行できるコマンドラインの最大長は,次の算出式で求めた値です。
システムで実行できるコマンドラインの最大長※ = A - E - 8192
(凡例)
A:システムのARG_MAX値
E:外部コマンド実行時に設定される環境変数の合計サイズ
注※
小数点以下は切り捨てます。
- 重要
-
・64ビット版のLinuxの場合,ARG_MAX値に1Gバイト以上の値が設定されているときは,1G-1バイトをARG_MAX値とします。
・Solarisの場合,32ビットのプログラムに適用される値をARG_MAX値とします。
なお,Solarisの場合,次の1と2の合計がコマンドラインの最大長を超えないように,コマンドラインを生成します。
1. 「コマンドラインの長さ」のコマンドラインの長さ
2. 次の文字列ごとに4バイト
・外部コマンド名
・xargsコマンドの引数に指定した外部コマンドのコマンド引数
・標準入力から入力するコマンド引数
【Windowsの場合】
コマンドラインの最大長は,32760文字です。システムで実行できるコマンドラインの最大長も同じ値です。
なお,コマンドラインに含めるコマンド引数の数が1個の場合,コマンドラインの最大長を超えるときは,エラー終了します。
引数
-0
- --null
-
NULL(0x00)を,コマンドライン引数の区切り文字に設定します。
標準入力からコマンド引数を入力するときに,NULL(0x00)で区切られた文字列を,1つのコマンド引数として扱います。
デフォルトのコマンドライン引数の区切り文字や,「コマンド引数の入力で意味を持つ特殊文字」に示す特殊文字は,コマンド引数に含まれる文字として扱います。
なお,標準入力から入力する文字列で,NULL(0x00)の前にNULL(0x00)以外の文字がない場合でも,外部コマンドには文字列の終端を示すNULL(0x00)だけを格納したコマンド引数が渡されます。
(例)
NULLを「\0」で示します。
-
標準入力の内容
abc\0\0def
-
外部コマンドに渡されるコマンド引数配列(argv)の内容
コマンド引数配列(argv)
コマンド引数の内容
1番目
外部コマンド名\0
2番目
abc\0
3番目
\0
4番目
def\0
-0オプションおよび-dオプションを同時に指定した場合,最後に指定したオプションが有効になります。
-
-r
- --no-run-if-empty
-
標準入力からコマンド引数を入力できなかった場合,外部コマンドを実行しません。コマンド引数の入力については,「コマンド引数の入力」を参照してください。
-x
- --exit
-
生成したコマンドラインの長さが,コマンドラインの最大長を超えた場合,エラー終了させます。
このオプションは,-nオプションを同時に指定した場合に有効になります。-nオプションと同時に指定した場合の動作については,-nオプションの説明を参照してください。
-d デリミタ
- --delimiter=デリミタ
-
指定したデリミタを,コマンドライン引数の区切り文字に設定します。
標準入力からコマンド引数を入力するときに,デリミタで区切られた文字列を,1つのコマンド引数として扱います。
デフォルトのコマンドライン引数の区切り文字や,「コマンド引数の入力で意味を持つ特殊文字」の表に示す特殊文字は,コマンド引数に含まれる文字として扱います。
デリミタには,1バイトの文字だけ指定できます。指定したデリミタの長さが1バイト以外のときは,エラー終了します。
また,次のエスケープ文字も指定できます。
エスケープ文字
意味
\a
アラート文字(ベル)
\b
バックスペース文字
\f
フォームフィード文字(改ページ)
\n
改行文字
\r
復帰文字
\t
タブ文字
\v
垂直タブ文字
\d,\dd,\ddd
1~3桁の8進数で表されたASCIIコードの文字(d:0~7)
\xh,\xhh
1~2桁の16進数で表されたASCIIコードの文字(h:0~9,a~f,A~F)
なお,標準入力から入力する文字列で,指定したデリミタの前にデリミタ以外の文字がない場合でも,外部コマンドには文字列の終端を示すNULL(\0)だけを格納したコマンド引数が渡されます。
(例)NULLを「\0」で示します。指定したデリミタを「X」で示します。
-
標準入力の内容
abcXXdef
-
外部コマンドに渡されるコマンド引数配列(argv)の内容
コマンド引数配列(argv)
コマンド引数の内容
1番目
外部コマンド名\0
2番目
abc\0
3番目
\0
4番目
def\0
-dオプションおよび-0オプションを同時に指定した場合,最後に指定したオプションが有効になります。
-
-n コマンド引数の最大個数
- --max-args=コマンド引数の最大個数
-
コマンドラインに含めるコマンド引数の最大個数を指定します。
指定するコマンド引数の最大個数には,次の引数の数は含まれません。
-
外部コマンド名
-
xargsコマンドのコマンドラインに指定した外部コマンドのコマンド引数
コマンド引数の最大個数は,1~2147483647の範囲で指定できます。最大個数分のコマンド引数を含めたコマンドラインの長さが,コマンドラインの最大長を超える場合は,最大長を超えないように,最大個数よりも少ない数のコマンド引数で生成します。
なお,-xオプションを同時に指定した場合は,最大個数分のコマンド引数を含めたコマンドラインの長さが,コマンドラインの最大長を超えると,エラー終了します。
-
-s コマンドラインの最大長
- --max-chars=コマンドラインの最大長
-
生成するコマンドラインの最大長を指定します。
UNIXの場合,コマンドラインの長さの単位はバイトです。
Windowsの場合,コマンドラインの長さの単位は文字です。マルチバイト文字は1文字として数えます。
最大長は,1から「コマンドラインの最大長」に示す「システムで実行できるコマンドラインの最大長」の範囲で指定できます。
指定した最大長が,「コマンドラインの最大長」に示す「システムで実行できるコマンドラインの最大長」より大きい場合は,標準エラー出力にメッセージ「xargs: The value specified for the option -s exceeds the maximum length (システムで実行できるコマンドラインの最大長) of the command line in the system」を出力します。また,「システムで実行できるコマンドラインの最大長」が,コマンドラインの最大長に設定されます。
- --cmdrc-threshold=しきい値
-
実行する外部コマンドの終了コードが0でない場合でも,正常終了と見なしたい場合,しきい値となる値を指定します。これによって,外部コマンドの終了コードが,しきい値以下の場合が正常終了となります。
しきい値に指定できる値は,UNIXの場合は0~254の範囲で,Windowsの場合は0~2147483647の範囲で指定できます。
しきい値の対象となるのは,xargsコマンドが終了コードに123を設定するときの外部コマンドの終了コードだけです。
外部コマンドの終了コードの扱いについては,「終了コード」を参照してください。
- 外部コマンド名
-
コマンドラインで実行する外部コマンド名を指定します。
外部コマンド名にパスが含まれていない場合は,OSのファイル実行関数(UNIXはexecvp関数,WindowsはCreateProcess関数)のパス検索順序で見つかった外部コマンドが実行されます。
外部コマンド名の指定を省略した場合,コマンド引数をそのまま標準出力に出力します。また,コマンド引数内のエスケープ文字もそのまま出力します。なお,「コマンドラインの長さ」のコマンドラインの長さには,外部コマンド名分の文字列の長さとして,5が加算されます。
- 外部コマンドのコマンド引数
-
コマンドラインで,外部コマンド名の後ろに追加するコマンド引数を指定します。
標準入力から入力したコマンド引数は,このコマンド引数の後ろに追加されます。複数回,コマンドラインの生成と実行が行われる場合は,それぞれのコマンドラインに,このコマンド引数が含められます。
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了。 |
1 |
エラー終了。 xargsコマンド処理でエラーが発生しました。 |
123 |
コマンドラインの生成と実行処理を複数回行う必要がある場合,処理は継続されます。 |
124 |
|
125 |
|
126 |
外部コマンドを実行できませんでした。 UNIXの場合,外部コマンドの終了コードが126のときは,この終了コードになります。 |
127 |
外部コマンドが見つかりませんでした。 UNIXの場合,外部コマンドの終了コードが127のときは,この終了コードになります。 |
- 注※1
-
外部コマンドがリターンする値の下位8ビットを,終了コードとして扱います。
- 注※2
-
外部コマンドがリターンする値を,符号付きの整数として扱います。
- 注※3
-
TerminateProcessなどによるプロセス即時終了で外部コマンドが終了した場合は,プロセス即時終了操作で設定される終了コードが,外部コマンドの終了コードになります。
注意事項
-
次のオプションの両方を指定しなかった場合,標準入力から入力する文字列に,NULL(0x00)が含まれているときは,NULL(0x00)の直前までの文字列で,コマンドラインを生成して実行します。また,NULL(0x00)以降の文字列は無視されます。
-
-0オプション
-
オプション値に,「\0」などのNULL(0x00)を表すデリミタを指定した-dオプション
NULL(0x00)の扱いについては,「コマンド引数の入力」を参照してください。
-
-
Windowsの場合,標準入力からコマンド引数としてパス名を入力するときは,ディレクトリ区切り文字の\(バックスラッシュ)や,UNC形式のパス名を示す先頭の「\\」は,エスケープ文字として扱われます。このため,次のどれかを行ってください。
-
「コマンド引数の入力で意味を持つ特殊文字」の表に示す特殊文字で,\(バックスラッシュ)を文字として扱うようにします。
-
-0オプションを指定します。さらに,標準入力内のパス名の区切りをNULL(0x00)にします。例えば,findコマンドが出力するファイル検索結果を,xargsコマンドで入力するときは,findコマンドの検索式に-print0を指定します。
-
-dオプションを指定します。さらに,標準入力内のパス名の区切りを,-dオプションに指定するデリミタにします。例えば,findコマンドが出力するファイル検索結果を,xargsコマンドで入力するときは,-dオプションに「\n」(改行文字)を指定します。
-
-
Windowsの場合,特殊文字などを使用して,改行文字をコマンド引数に含めるときは,外部コマンドに渡される改行文字は[LF](0x0a)です。
-
Windowsの場合,標準入力から0x1aコードを入力すると,入力を終了します。
-
コマンドラインの実行では,外部コマンドの標準入力には,次のファイルが設定されます。
-
UNIXの場合:/dev/nullファイル
-
Windowsの場合:NULデバイス
/dev/nullファイル,またはNULデバイスがシステムに存在しない場合,標準エラー出力にメッセージ「xargs: Failed to open a null file when executing the external command 外部コマンド名 (error=エラー詳細)」を出力します。また,外部コマンドの標準入力をクローズしてから,コマンドラインを実行します。
-
-
外部コマンドからプログラムを実行する場合,外部コマンドに渡されたコマンド引数をプログラムに渡すときは,OSのコマンドラインの最大長を超えないようにしてください。OSのコマンドラインの最大長を超えた場合は,プログラムの実行に失敗します。
-
実行する外部コマンドが,0以外の正常終了を示す終了コードを返しても,xargsコマンドの終了コードは123になります。xargsコマンドの終了コードを0にしたい場合は,--cmdrc-thresholdオプションを使用してください。なお,外部コマンドの終了コードの扱いについては,「終了コード」を参照してください。
-
外部コマンドによっては,その外部コマンドのコマンドラインの最大長が,「コマンドラインの最大長」に示すデフォルトのコマンドラインの最大長より小さいときがあります。このような場合は,-sオプションに,外部コマンドのコマンドラインの最大長を指定して実行してください。
-
外部コマンドにコマンド引数の個数の上限がある場合は,-nオプションを使用して,コマンドラインに含めるコマンド引数の数が上限を超えないようにしてください。
使用例
findコマンドで検索したファイルのパス名を受け取り,rmコマンドのオペランドに指定して実行します。なお,ディレクトリ区切り文字をエスケープ文字として扱わないようにするため,次の指定をします。
-
findコマンドの検索式に-print0を指定。
-
xargsコマンドのオプションに-0を指定。
また,-rオプションを指定し,findコマンドでファイルが見つからなかったときに,rmコマンドを実行しないようにします。
C:\TEMP>%ADSH_OSCMD_DIR%\ls "C:\Program TEMP" cmd001.log file001.tmp file002.tmp file003.tmp file004.tmp file005.tmp file006.tmp C:\TEMP>%ADSH_OSCMD_DIR%\find "C:\Program TEMP" -name "*.tmp" -print0 | %ADSH_OSCMD_DIR%\xargs -0 -r %ADSH_OSCMD_DIR%\rm -f C:\TEMP>%ADSH_OSCMD_DIR%\ls "C:\Program TEMP" cmd001.log