Redirecione para stdin em vez de argumento ao usar xargs [fechado]


12

por exemplo, usando o comando

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

O foo.txtcontém duas linhas

foo
bar

O comando acima não imprime nada.

Respostas:


6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

A parte complicada é que o xargs realiza a invocação implícita do subshell. Aqui, é invocado explicitamente e o tubo não se torna parte do transportador pai


1
Obrigado, atualizei minha pergunta para fornecer um exemplo mais concreto. mas ele não funciona como você sugeriu ..
Ryan

1
eco não pode ler a partir de stdin, então não há sentido. compare isto: cat foo.bar | wc -lecat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
Eu acho que você quer dizer em -Ivez de -J; não há -Jopção para xargs
Hitechcomputergeek

A versão de @Hitechcomputergeek FreeBSD de xargster -Jopção que é equivalente ao -ido linuxxargs
Kondybas

@ Kondybas Obrigado por me dizer isso; Eu não sabia que havia uma diferença entre os dois. Você pode confiar no GNU para não seguir o POSIX lol. ( -JNão está definido no POSIX, mas -Ié e tem um uso diferente do GNU do.)
Hitechcomputergeek

2

Se você deseja processar todas as linhas de foo.txt, precisará usar um loop. Use &para colocar o processo em segundo plano

while read line; do
   echo $line | bar.sh &
done < foo.txt

Se sua entrada contiver espaços, configure temporariamente o separador de campo interno para a nova linha

# save the field separator
OLD_IFS=$IFS

# new field separator, the end of line 
IFS=$'\n'

for line in $(cat foo.txt) ; do
   echo $line | bar.sh &
done

# restore default field separator  
IFS=$OLD_IFS     

Não, não, eu também estou preso nisso. TS quer dividir arquivo em linhas separadas e alimentá-los em roteiro de forma independente
Kondybas

1
Eu preciso usar xargs em paralelo o processo ..
Ryan

OK :-) Eu apenas procurei as opções do xargsOP usado.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.