Bei Verwendung von xargs Umleitung zu stdin statt zum Argument

Bei Verwendung von xargs Umleitung zu stdin statt zum Argument

beispielsweise mit dem Befehl

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

Das foo.txtenthält zwei Zeilen

foo
bar

Der obige Befehl druckt nichts.

Antwort1

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

Der schwierige Teil ist, dass xargs implizite Subshell-Aufrufe durchführt. Hier wird sh explizit aufgerufen und pipe wird nicht Teil des übergeordneten Förderers

Antwort2

Wenn Sie alle Zeilen von foo.txt verarbeiten möchten, müssen Sie eine Schleife verwenden. Verwenden Sie diese Option, &um den Prozess in den Hintergrund zu versetzen.

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

Wenn Ihre Eingabe Leerzeichen enthält, setzen Sie den internen Feldtrenner vorübergehend auf die neue Zeile.

# 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     

verwandte Informationen