Eingabedatei als Argument durch Pipe übergeben?

Eingabedatei als Argument durch Pipe übergeben?

Ich habe zwei Probleme. Ich versuche, Dateien als Argument durch eine Pipe zu übergeben, und ich versuche, diese Datei als Variable innerhalb der shFunktion zu verwenden.

Hier ist mein Befehl:

find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

Hier sucht meine Zeile nach allen Dateien, die wie " segment.something" aussehen und übergibt sie an die rechte Seite der Pipe. In someFunction.shbrauche ich den Namen der Datei als Argument. Nehmen wir an, die Datei wird in eingegeben segment1.

Das someFunction.shdruckt jede Zeile von segment1(zum Beispiel) aus.

Wie übergebe ich die Ausgabe von der linken Seite der Pipe an die rechte Seite und wie rufe ich sie dann darin auf someFunction.sh?

Antwort1

Ihr Befehl

$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

hat zur Folge, dass höchstens vier Kopien des someFunction.shShell-Skripts parallel gestartet werden ( -P 4) (neue werden erstellt, sobald die alten fertig sind), wobei jede Kopie einen Dateinamen als Argument erhält ( -n 1).

Das bedeutet, dass jeder Aufruf Ihres Skripts wie folgt aussieht:

sh someFunction.sh segmentsomething

Innerhalb des Skripts fügt die Shell die Werte derPositionsparameter(die Argumente in der Befehlszeile) in $1usw. $2( $0enthält normalerweise den Namen des Skripts selbst). In Ihrem Fall $1enthält den Namen der Datei und die anderen sind leer.

Also, im Skript:

filename="$1"

echo "$filename"
cat "$filename"

Das ist alles. Wenn man findnach Dateien sucht und ihre Dateinamen weitergibt, xargsgibt es normalerweise das Problem mit den fehlerhaften Dateinamen, an die sich die Leute gegenseitig erinnern, und das werde ich hier auch tun.

Das findDienstprogramm übergibt Dateinamen, die durch Leerzeichen getrennt sind. Das ist nicht sinnvoll, wenn Ihre Dateinamen Leerzeichen enthalten, da dies zu Problemen beim xargsAufrufen Ihres Skripts mit richtigen Namen führen würde.

Daher ist es eine gute Praxis,stetsVerwenden Sie -print0mit findund -0mit xargs, was bedeutet, dass die Dateinamen nicht durch Leerzeichen, sondern durch nulZeichen ( \0) getrennt werden. Dies macht es viel sicherer.

Daher:

$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh

Antwort2

Sie könnten so etwas verwenden, vorausgesetzt, someFunction.shes befindet sich in Ihrem Arbeitsverzeichnis.

find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

Die -print0und -0erlauben Dateien mit Leerzeichen im Namen (ein häufiges Problem). In meinem someFunction.shhabe ich

#!/bin/bash
echo "Arg: " $1  
cat $1

Das gibt einfach den Dateinamen aus und schreibt dann den Inhalt der übergebenen Datei ansomeFunction.sh

verwandte Informationen