Вопрос GNU «parallel -pipe» не обрабатывает stdin строками


Я очень смущен тем, как использовать GNU параллельно, чтобы передать stdin команде job.

У меня есть то, что я представлял себе действительно обычный использование случай. У меня есть какой-то процесс 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 принимает все stdin и отправляет его одному вызову xxd что меня смущает, потому что все документированные параметры и их значения по умолчанию, похоже, противоречат этому поведению: --recend="\n" (по умолчанию) ограничивает задания по новой строке, -L 1 (по умолчанию) отправляет в команду максимум одну строку.

У нулевых разделителей такая же проблема. Они также передаются дословно:

seq 3 | tr '\n' '\0' | parallel --null --pipe xxd
...

00000000: 3100 3200 3300                           1.2.3.

Объяснение этого поведения было бы оценено, особенно потому, что эти параметры, по-видимому, применяются конкретно к --pipe режим parallel,


2
2017-07-17 22:26


происхождения




ответы:


Вы так близко. -L устанавливает запись размер (в строках), но не сколько записей должно быть отправлено. Это контролируется -N, По умолчанию --recend является \n так что это не нужно. По умолчанию -L 1, так что это не нужно.

seq 3 | parallel --pipe -N 1 xxd

2
2017-07-18 00:18





Примечание: это мое первоначальное решение. Это довольно уродливое и уступающее принятый ответ, Однако я оставляю его неповрежденным по образовательным причинам.

Хитрость заключается в том, чтобы не использовать режим трубы и использовать эхо (или подобное) для преобразования execve args в stdout для каждого задания:

$ seq 3 | parallel "echo {} | xxd"
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.

1
2017-07-17 22:26



Отличная работа. Приобретен для обмена знаниями таким образом. - Kamil Maciorowski