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.

Ryan
quelle

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

Kondybas
quelle
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     
Matteo
quelle
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