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.

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


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     

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.