Hitachi

JP1 Version 11 JP1/Advanced Shell 


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文字として数えます。

コマンドラインの長さは,次の文字列の長さの合計です。文字列の長さには,文字列の終端を示すNULL0x00)の長さを含みます。

  • 外部コマンド名

  • 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

NULL0x00)を,コマンドライン引数の区切り文字に設定します。

標準入力からコマンド引数を入力するときに,NULL0x00)で区切られた文字列を,1つのコマンド引数として扱います。

デフォルトのコマンドライン引数の区切り文字や,「コマンド引数の入力で意味を持つ特殊文字」に示す特殊文字は,コマンド引数に含まれる文字として扱います。

なお,標準入力から入力する文字列で,NULL0x00)の前にNULL0x00)以外の文字がない場合でも,外部コマンドには文字列の終端を示すNULL0x00)だけを格納したコマンド引数が渡されます。

(例)

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コードの文字(d07)

\xh\xhh

1~2桁の16進数で表されたASCIIコードの文字(h09afAF)

なお,標準入力から入力する文字列で,指定したデリミタの前にデリミタ以外の文字がない場合でも,外部コマンドには文字列の終端を示すNULL\0)だけを格納したコマンド引数が渡されます。

(例)NULLを「\0」で示します。指定したデリミタを「X」で示します。

  • 標準入力の内容

    abcXXdef
  • 外部コマンドに渡されるコマンド引数配列(argv)の内容

    コマンド引数配列(argv)

    コマンド引数の内容

    1番目

    外部コマンド名\0

    2番目

    abc\0

    3番目

    \0

    4番目

    def\0

-dオプションおよび-0オプションを同時に指定した場合,最後に指定したオプションが有効になります。

-n コマンド引数の最大個数

--max-args=コマンド引数の最大個数

コマンドラインに含めるコマンド引数の最大個数を指定します。

指定するコマンド引数の最大個数には,次の引数の数は含まれません。

  • 外部コマンド名

  • xargsコマンドのコマンドラインに指定した外部コマンドのコマンド引数

コマンド引数の最大個数は,12147483647の範囲で指定できます。最大個数分のコマンド引数を含めたコマンドラインの長さが,コマンドラインの最大長を超える場合は,最大長を超えないように,最大個数よりも少ない数のコマンド引数で生成します。

なお,-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の場合は0254の範囲で,Windowsの場合は02147483647の範囲で指定できます。

しきい値の対象となるのは,xargsコマンドが終了コードに123を設定するときの外部コマンドの終了コードだけです。

外部コマンドの終了コードの扱いについては,「終了コード」を参照してください。

外部コマンド名

コマンドラインで実行する外部コマンド名を指定します。

外部コマンド名にパスが含まれていない場合は,OSのファイル実行関数(UNIXはexecvp関数,WindowsはCreateProcess関数)のパス検索順序で見つかった外部コマンドが実行されます。

外部コマンド名の指定を省略した場合,コマンド引数をそのまま標準出力に出力します。また,コマンド引数内のエスケープ文字もそのまま出力します。なお,「コマンドラインの長さ」のコマンドラインの長さには,外部コマンド名分の文字列の長さとして,5が加算されます。

外部コマンドのコマンド引数

コマンドラインで,外部コマンド名の後ろに追加するコマンド引数を指定します。

標準入力から入力したコマンド引数は,このコマンド引数の後ろに追加されます。複数回,コマンドラインの生成と実行が行われる場合は,それぞれのコマンドラインに,このコマンド引数が含められます。

終了コード

終了コード

意味

0

正常終了。

1

エラー終了。

xargsコマンド処理でエラーが発生しました。

123

【UNIXの場合】

外部コマンドが1254126127,およびシグナル終了時の終了コードは除く)の終了コード※1で終了しました。

【Windowsの場合】

外部コマンドが1以上の終了コード※2で終了しました。

コマンドラインの生成と実行処理を複数回行う必要がある場合,処理は継続されます。

124

【UNIXの場合】

外部コマンドが255の終了コード※1で終了しました。

【Windowsの場合】

外部コマンドが0未満の終了コード※2で終了しました。

なお,0未満の終了コードのうち,例外コードは除きます。例外コードについては,「5.8.8 ジョブ,ジョブステップおよびコマンドの終了コード」の「例外として扱う例外コードと意味」の表を参照してください。

125

【UNIXの場合】

外部コマンドがシグナル終了しました。

【Windowsの場合】※3

外部コマンドで例外が発生して終了しました。例外の内容については,「5.8.8 ジョブ,ジョブステップおよびコマンドの終了コード」の「例外として扱う例外コードと意味」の表を参照してください。

126

外部コマンドを実行できませんでした。

UNIXの場合,外部コマンドの終了コードが126のときは,この終了コードになります。

127

外部コマンドが見つかりませんでした。

UNIXの場合,外部コマンドの終了コードが127のときは,この終了コードになります。

注※1

外部コマンドがリターンする値の下位8ビットを,終了コードとして扱います。

注※2

外部コマンドがリターンする値を,符号付きの整数として扱います。

注※3

TerminateProcessなどによるプロセス即時終了で外部コマンドが終了した場合は,プロセス即時終了操作で設定される終了コードが,外部コマンドの終了コードになります。

注意事項

使用例

findコマンドで検索したファイルのパス名を受け取り,rmコマンドのオペランドに指定して実行します。なお,ディレクトリ区切り文字をエスケープ文字として扱わないようにするため,次の指定をします。

また,-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