Можно ли получить номер сегмента в вызове xargs?

Xargs может использоваться, чтобы разрезать содержимое стандартного ввода на управляемые фрагменты и вызывать команду для каждого такого фрагмента. Но возможно ли узнать, что это за произведение? Чтобы привести пример:

сек 1 10 | xargs -P 2 -n 2 mycommand

позвоню

mycommand 1 2 &
mycommand 3 4 &
mycommand 5 6 &
mycommand 7 8 &
mycommand 9 10 &

Но я хотел бы знать, в моем скрипте "mycommand", что

mycommand 1 2

обрабатывает первый кусок / сегмент, и так далее. Можно ли получить доступ к этой информации?

PS В простом примере выше я могу просто посмотреть на цифры и сказать. Но для произвольных списков, как можно получить доступ к информации, не вставляя номер # во входной поток?

1 ответ

Решение

Я только вижу, что вы можете сделать это, если вы измените свой ввод и добавите порядковый номер:

seq 1 10 | perl -ne '$. % 2 and print (($.+1)/2,"\n"); print' | xargs -n3 ...

Непонятно, зачем вам это нужно, но если ваша конечная цель - сохранить выходные данные в том же порядке, что и входные, может быть проще использовать GNU Parallel:

seq 1 10 | parallel -j+0 -n2 -k mycommand 

Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Начиная с версии 20101113, GNU Parallel имеет $PARALLEL_SEQ, для которого задан порядковый номер команды:

seq 1 10 | parallel -j+0 -n2 -k mycommand \$PARALLEL_SEQ

Это может быть именно то, что вы ищете.

Другие вопросы по тегам