A resposta é usar sh -c
para lançar xargs
:
echo 'A,B,C,D' | xargs -d, -i -P 4 sh -c 'echo "{}" | nc localhost 7000'
Veja: link
Eu estou tentando inventar um one-liner para enviar texto para um simples servidor de eco - mas várias conexões em paralelo. É isso que estou tentando:
echo -e A,B,C,D | xargs -d, -i -P 4 echo {} | nc localhost 7000
No entanto, não funciona bem. O servidor recebe quatro conexões, mas nenhum dado ("nulo").
Qual é o comando xargs e netcat correto aqui?
A resposta é usar sh -c
para lançar xargs
:
echo 'A,B,C,D' | xargs -d, -i -P 4 sh -c 'echo "{}" | nc localhost 7000'
Veja: link
Isso pode ser um pouco mais conciso (e mais fácil eu digo) se você gosta de usar o Paralelo GNU :
parallel 'echo {} | nc localhost 7000' ::: A B C D
Ou até mesmo:
parallel 'echo {} | nc localhost 7000' ::: {A..D}
Use echo -n
ou você terá 5 conexões em vez de quatro, uma delas sem dados. Se no servidor isso não estiver marcado, talvez esteja causando o seu problema.
echo -n A,B,C,D | xargs -d, -I{} -P 4 -n 1 echo {} | nc localhost 7000
Além disso, usando um netcat como servidor de escuta, parece funcionar corretamente:
zhen@sydow:~$ nc -l 7000
A
D
B
C
E também parece ser paralelo, vejo eco fora de ordem.
Você não precisa repetir o eco, é a ação padrão do xargs. Este one-liner serve como um teste auto-contido rápido, mas você pode remover o ouvinte de teste configurado antes do &
nc -l 7001 & echo A B C D | xargs -P4 -n1 | nc localhost 7001
Resultados:
amit@deimos:~$ nc -l 7001 & echo A B C D | xargs -P4 -n1 | nc localhost 7001
[6] 7115
D
B
C
A
[6] Done nc -l 7001