10

Я пытаюсь использовать 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.

2 ответа2

5

Вы можете использовать новые строки, чтобы достичь ожидаемого результата. В вашем случае с расширением сервера это будет:

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4
2

Вы можете использовать дополнительную трубу, как это,

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

Промежуточное использование xargs 'echos' каждой буквы 'abc d' индивидуально из-за опции '-n1'. Это помещает каждую букву в отдельную строку, как это,

echo a b c d | xargs -n1
a
b
c
d 

Важно понимать, что при использовании -I (замена строки) xargs подразумевает -L, который выполняет служебную команду (в вашем случае echo) один раз в строке. Кроме того, вы не можете использовать -n с -L, поскольку они являются взаимоисключающими.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .