4

GNUxargsにはオプション '-x' があります。マニュアルページには次のように書かれています:

-x サイズ (-s オプションを参照) を超えた場合に終了します。

しかし、が設定されているかxargsどうかは気にしないよう-xです。-xがまったく効果を発揮する例を作ることができませんでした。

唯一の違いが追加され-x、異なる出力を生成する 2 つの例を挙げてください。

4

3 に答える 3

4

サイズを超えたかどうかをテストするには、サイズを設定する必要があります。

$ 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
于 2010-06-12T01:38:18.203 に答える
1

なぜこれが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 の後、関数はプログラムを終了します。returnbc_do_exec()echo 10 11returnerror()xargs

私は、そのうちの 1 つに 12 ~ 15 人がいると予想していました。

入力項目がそれ自体で長すぎる場合はxargs 常にsaid が終了するため、後続のすべての項目が失われます。

于 2016-01-28T13:48:44.017 に答える
0

tl;dr

  • -xonlyの使用は-n <argumentCount>:<argumentCount>引数は、利用可能な場合-s <byteCount+1>、暗黙のバイト数の最大値または明示的に指定されたオプションのいずれかに基づいて、単一のコマンド ラインに収まる必要があります。そうでない場合は、xargsエラーで終了します。
    がなければ、引数の-x少ないコマンド ラインが構築され、引数が1 つでも適合しない場合を除き、エラーは発生しません。次のポイントを参照してください。

    • およびオプションには、-xロジックが暗黙的に適用されることに注意してください。-L <lineCount>-I <placeHolder>
    • 警告: OSX 10.11.3 および PC-BSD 10.1 の時点で、 と の組み合わせは-xのBSD実装壊れ-nているようです- 以下を参照してください。xargs
  • がなければ-n、 を使用する理由はあり-xません。どちらのxargs実装も、単一の引数に遭遇すると、常にエラーで終了し、結果として全体のバイト サイズの制限に対して長すぎるコマンドになります (再度、暗示または で指定されます)。-s <byteCount+1>

    • GNU xargs : -xArmaliの hepful answerで発見されたように、(v4.2.2 の時点で)バグ-n が表面化していません。
    • BSD xargs : -xwithout-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の例:

  • コマンドインスタンスごとに、可能な場合は連続する 2 つの引数を使用する(を使用しない) か、使用する必要がある (使用する)必要があることを指定します。 -x -x-n 2
  • 各コマンドを 8 (9 - 1) バイト以下に制限します。-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 の回答で説明が得られる場合があります。

于 2016-01-28T22:18:24.220 に答える