GNUxargs
にはオプション '-x' があります。マニュアルページには次のように書かれています:
-x サイズ (-s オプションを参照) を超えた場合に終了します。
しかし、が設定されているかxargs
どうかは気にしないよう-x
です。-x
がまったく効果を発揮する例を作ることができませんでした。
唯一の違いが追加され-x
、異なる出力を生成する 2 つの例を挙げてください。
サイズを超えたかどうかをテストするには、サイズを設定する必要があります。
$ echo -e "12\n1234"
12
1234
$ echo -e "12\n1234" | xargs echo
12 1234
$ echo -e "12\n1234" | xargs -x echo # no effect
12 1234
$ echo -e "12\n1234\n13" | xargs -s 8 echo # process valid args until an error occurs
xargs: argument line too long
12
$ echo -e "12\n1234" | xargs -s 8 -x echo # error and exit
xargs: argument line too long
なぜこれが1 - 11を与えるのか、私はまだ説明できません:
(seq 11; echo -e "1234111";seq 12 15) | xargs -s 11 echo
しかし、これは1 - 9を与えます:
(seq 11; echo -e "1234111";seq 12 15) | xargs -s 11 -x echo
-x
常に 1 行 (つまり、長すぎる行) の違いのみを示しますか?
これはもちろん、使用している種類に依存しxargs
ますが、一般的な GNU findutils ' xargs
(あなたが持っているものかもしれません) はまさにこの動作をしており、最小の驚きの原則に違反しています:次の入力項目を読み取り、それが行の長さに収まらないまで、既存のコマンド ラインに追加します。次に、読み取った項目が 1 つの引数として 1 行に収まらないかどうかをチェックします (これは、echo 1234111
あなたの例では):
if (p >= endbuf)
{
exec_if_possible ();
error (EXIT_FAILURE, 0, _("argument line too long"));
}
(上記のコードはread_line()
、findutils-4.6.0/xargs/xargs.c の関数の終わり近くにあり、findutils-4.4.2 とほぼ同じです)
static void
exec_if_possible (void)
{
if (bc_ctl.replace_pat || initial_args ||
bc_state.cmd_argc == bc_ctl.initial_argc || bc_ctl.exit_if_size_exceeded)
return;
bc_do_exec (&bc_ctl, &bc_state);
}
オプション-x
(に対応bc_ctl.exit_if_size_exceeded
) が違いを生む場所は次-x
のとおりexec_if_possible()
です。次に、ing の後、関数はプログラムを終了します。return
bc_do_exec()
echo 10 11
return
error()
xargs
私は、そのうちの 1 つに 12 ~ 15 人がいると予想していました。
入力項目がそれ自体で長すぎる場合はxargs
常にsaid が終了するため、後続のすべての項目が失われます。
tl;dr
-x
onlyの使用は-n <argumentCount>
:<argumentCount>
引数は、利用可能な場合-s <byteCount+1>
、暗黙のバイト数の最大値または明示的に指定されたオプションのいずれかに基づいて、単一のコマンド ラインに収まる必要があります。そうでない場合は、xargs
エラーで終了します。
がなければ、引数の-x
少ないコマンド ラインが構築され、引数が1 つでも適合しない場合を除き、エラーは発生しません。次のポイントを参照してください。
-x
ロジックが暗黙的に適用されることに注意してください。-L <lineCount>
-I <placeHolder>
-x
のBSD実装で壊れ-n
ているようです- 以下を参照してください。xargs
がなければ-n
、 を使用する理由はあり-x
ません。どちらのxargs
実装も、単一の引数に遭遇すると、常にエラーで終了し、結果として全体のバイト サイズの制限に対して長すぎるコマンドになります (再度、暗示または で指定されます)。-s <byteCount+1>
xargs
: -x
Armaliの hepful answerで発見されたように、(v4.2.2 の時点で)バグ-n
が表面化していません。xargs
: -x
without-n
は構文的にサポートされていません。-x
両方の実装で、 がなくても、1 つの長すぎる引数によってエラーが発生する
ことを示す簡単な例:$ echo 1 10 | xargs -s 7 echo # max. command length is 6 (7 - 1) bytes
1 # ok: 'echo 1' is 6 bytes
xargs: argument line too long # 'echo 10' is too long
以下のGNU xargs
の例:
-x
-x
-n 2
-s 9
注: BSD xargs
では、以下のno の -x
例は同じように機能し、-x
例は機能するはずxargs
ですが、OSX 10.11.3 および PC-BSD 10.1 にあるバージョンでは機能しません: が指定されている場合-x
は常に、指定された<argumentCount>
値-n <argumentCount>
は無視され、xargs
動作します指定されたかのよう-n 1
に。
# NO -x: Use 2 arguments *if possible*.
$ echo -e "1 2 3 4a 5 6" | xargs -n 2 -s 9 echo
1 2
3 # 'echo 3 4a' is more than 8 (9 - 1) bytes -> '3' is used *alone*
4a # 'echo 4a 5' also doesn't fit -> '4a' is also used alone.
5 6
# WITH -x: *Must* use 2 arguments (if available); *fail* otherwise.
$ echo -e "1 2 3 4a 5 6" | xargs -n 2 -s 9 -x echo
xargs: argument list too long # 'echo 3 4a' is too long; cannot use 2 arguments -> error
1 2
最後に正常に実行されたコマンドの前に、エラーメッセージが奇妙なことに出力されることに注意してください。これは上記のバグに関連している可能性があるため、Armali の回答で説明が得られる場合があります。