Я до сих пор не могу объяснить, почему это дает 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
всегда только даватьразница в одну строку (а именно строку, которая была бы слишком длинной)?
Это, конечно, зависит от типа xargs
, который вы используете, но от распространенных GNU findutils 'xargs
(который вполне может быть тем, что у вас есть) имеет именно такое поведение, нарушая принцип наименьшего удивления: он накапливает командную строку в памяти, многократно читая следующий элемент ввода и добавляя его в существующую командную строку, пока не выполнитвписаться в длину строки… Теперь он проверяет, поместится ли прочитанный элемент в строку в качестве единственного аргумента (как в случае с 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()
просто return
с без bc_do_exec()
без уже накопленной правильно сформированной команды (echo 10 11
в вашем примере).Затем после return
ing, функция error()
выходит из программы xargs
.
Я ожидал, что 12 - 15 будет в одном из них.
Поскольку указанное xargs
всегда завершается, если элемент ввода сам по себе слишком длинный, все последующие элементы теряются.