GNU "параллельный --канал" не обрабатывает стандартный ввод по строкам
Я очень смущен тем, как использовать GNU parallel для передачи стандартного ввода в команду задания.
У меня есть то, что я представлял себе как действительно распространенный вариант использования. У меня есть некоторый процесс xxd
, который что-то делает с stdin и выводит в stdout. У меня есть какой-то способ генерировать или получать работу из другого стандартного потока, напримерseq 3
, и я могу объединить их и создать импровизированный инструмент питания, например:
$ seq 3 | while read line; do echo $line | xxd; done
00000000: 310a 1.
00000000: 320a 2.
00000000: 330a 3.
Отлично. Мы можем ясно видеть, что каждый вызов из xxd
получает одну строку, и добавляется завершающая новая строка.
Вот что делает трубопровод к parallel
:
$ seq 3 | parallel --pipe --recend="n" -L 1 xxd
...
00000000: 310a 320a 330a 1.2.3.
parallel --pipe
принимает весь стандартный ввод и отправляет его в один вызов xxd
, что меня смущает, потому что все задокументированные параметры и их значения по умолчанию, похоже, противоречат этому поведению: --recend="n"
(по умолчанию) разделяет задания новой строкой, -L 1
(по умолчанию) отправляет команде максимум одну строку.
Разделители нулей имеют ту же проблему. Хотя они тоже прошли дословно:
seq 3 | tr 'n' '' | parallel --null --pipe xxd
...
00000000: 3100 3200 3300 1.2.3.
Было бы полезно получить объяснение такого поведения, тем более что эти параметры, по-видимому, относятся конкретно к режиму --pipe
parallel
.