Я пытаюсь использовать xargs для запуска команды для каждого предоставленного аргумента, но, к сожалению, флаг --replace / -I, похоже, не работает должным образом при сопряжении с -n. Кажется, {} расширится до полного списка аргументов, считываемых из stdin, независимо от опции -n.
К сожалению, все примеры в Интернете, похоже, относятся к командам (mv, cp, rm), которые будут принимать несколько аргументов при раскрытии {}.
Например, при запуске:
echo a b c d | xargs -n 1 -I {} echo derp {}
Выход:
derp a b c d
Но я ожидал:
derp a
derp b
derp c
derp d
Однако запуск его без -I {} дает ожидаемый результат:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Есть ли способ добиться этого с помощью xargs? Мое конечное намерение состоит в том, чтобы использовать его для запуска нескольких (parralel) сессий ssh, например
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Я бегу xargs (GNU findutils) 4.4.2
на RHEL 6.3.
xargs
, но не с GNUxargs
.man xargs
на-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
так он ведет себя как задумано.Ответы:
Вы можете повторить с новой строки, чтобы достичь ожидаемого результата. В вашем случае с расширением сервера это будет:
источник
zsh
... Исправил мой ответ.echo
нужна-e
опция.Вы можете использовать дополнительную трубу, как это,
Промежуточное использование xargs 'echos' каждой буквы 'abcd' индивидуально из-за опции '-n1'. Это помещает каждую букву в отдельной строке, как это,
Важно понимать, что при использовании -I (замена строки) xargs подразумевает -L, который выполняет служебную команду (в вашем случае echo) один раз в строке. Кроме того, вы не можете использовать -n с -L, поскольку они являются взаимоисключающими.
источник