Redireccionar a stdin en lugar de argumento cuando se usa xargs [cerrado]

12

por ejemplo, usando el comando

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

El foo.txtcontiene dos líneas

foo
bar

El comando anterior no imprime nada.

Ryan
fuente

Respuestas:

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

La parte difícil es que xargs realiza una invocación de subshell implícita. Aquí se invoca sh explícitamente y la tubería no se convierte en parte del transportador principal

Kondybas
fuente
1
Gracias, he actualizado mi pregunta para proporcionar un ejemplo más concreto. pero no funciona como sugeriste ..
Ryan
1
echo no puede leer desde stdin, por lo que la canalización no tiene sentido. compare esto: cat foo.bar | wc -lycat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas
1
Creo que quieres decir en -Ilugar de -J; no hay -Jopción para
xargs
@Hitechcomputergeek La versión de FreeBSD de xargstiene una -Jopción que es equivalente a la -idel linuxxargs
Kondybas
@Kondybas Gracias por decirme eso; No sabía que había una diferencia entre los dos. Puede confiar en GNU para no seguir POSIX lol. ( -Jno está definido en POSIX pero -Ies y tiene un uso diferente al de GNU.)
Hitechcomputergeek
2

Si desea procesar todas las líneas de foo.txt, deberá usar un bucle. Use &para poner el proceso en segundo plano

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

Si su entrada contiene espacios, configure temporalmente el separador de campo interno en la nueva línea

# 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     
Matteo
fuente
No, no, yo también estoy atascado. TS quiere dividir el archivo en líneas separadas y alimentarlos al script de forma independiente
Kondybas
1
Necesito usar xargs para paralelar el proceso ...
Ryan
OK :-) Acabo de buscar las opciones del xargsOP utilizado.
Matteo