Redirect to stdin statt argument bei Verwendung von xargs [closed]


12

Verwenden Sie beispielsweise den 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 gibt nichts aus.

Antworten:


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

Der schwierige Teil ist, dass xargs implizite Subshell-Aufrufe ausführt. Hier wird sie explizit aufgerufen und das Rohr wird nicht Teil des übergeordneten Förderers


1
Vielen Dank, ich habe meine Frage aktualisiert, um ein konkreteres Beispiel bereitzustellen. Aber es funktioniert nicht wie Sie vorgeschlagen ..
Ryan

1
echo kann nicht von stdin gelesen werden, daher macht es keinen Sinn, zu stdin zu leiten. Vergleichen Sie dies: cat foo.bar | wc -lundcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
Ich denke du meinst -Istatt -J; Es gibt keine -JOption zu
Xargs

@Hitechcomputergeek FreeBSD-Version von xargshave -JOption, die -ider Linux -Version entsprichtxargs
Kondybas

@Kondybas Danke, dass du mir das erzählt hast; Mir war nicht bewusst, dass es einen Unterschied zwischen den beiden gab. Sie können darauf vertrauen, dass GNU POSIX lol nicht folgt. ( -J-I
Wird

2

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 stellen

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

Wenn Ihre Eingabe Leerzeichen enthält, setzen Sie das interne Feldtrennzeichen 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     

Nein, nein, ich bleibe auch dabei. TS möchte die Datei in separate Zeilen aufteilen und diese selbständig in das Skript
einspeisen

1
Ich muss xargs verwenden, um den Prozess zu parallelisieren.
Ryan

OK :-) Ich habe gerade die Optionen des verwendeten xargsOP nachgeschlagen .
Matteo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.