Você pode ecoar com novas linhas para alcançar o resultado esperado. No seu caso com a expansão do servidor que seria:
$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4
Estou tentando usar xargs para executar um comando para cada argumento fornecido, mas infelizmente o sinalizador --replace / -I não parece funcionar corretamente quando conjugado com -n. Parece que {} expandirá para a lista completa de argumentos lidos de stdin, independentemente da opção -n.
Infelizmente, todos os exemplos na Web parecem ser para comandos (mv, cp, rm), que terão vários argumentos em que {} é expandido.
Por exemplo, ao executar:
echo a b c d | xargs -n 1 -I {} echo derp {}
A saída é:
derp a b c d
Mas eu esperava:
derp a
derp b
derp c
derp d
No entanto, executá-lo sem -I {} produz o resultado esperado:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Existe alguma maneira de conseguir isso com xargs? Minha intenção final é usá-lo para executar várias sessões ssh (parralel), como
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Estou executando xargs (GNU findutils) 4.4.2
no RHEL 6.3.
Você pode usar um tubo extra como esse,
echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d
O uso intermediário de xargs 'echos' em cada letra 'a b c d' individualmente devido à opção '-n1'. Isso coloca cada letra em sua própria linha como esta,
echo a b c d | xargs -n1
a
b
c
d
É importante entender ao usar -I (substituição de string), xargs implica -L, que executa o comando do utilitário (no seu caso echo) uma vez por linha. Além disso, você não pode usar -n com -L como eles são mutuamente exclusivos.
Tags command-line ssh bash xargs linux