2016-05-20 14 views
3

Ich versuche, ein Bash-Skript strikt POSIX-konform zu machen, d. H. Das Entfernen aller potenziellen "Bashisms" mithilfe von checkbashisms -px ${script_filename}. In der angegebenen Datei, gehe ich durch ein Verzeichnis find und dann Rohr jeder Dateipfad zu read mit \0 als Trennzeichen verwenden von -print0, um mit der Lage zu sein, Dateinamen mit Zeilenumbrüchen zu handhaben:

find . -print0 | while read -d $'\0' inpath 
do 
    echo "Reading path \"${inpath}\"." 
done 

jedoch checkbashisms mag das nicht, weil the option -d isn't strictly POSIX-compliant:

möglich bashism in ... Zeile n (lesen Sie mit anderen Option als -r)

Wie kann ich äquivalenten Code schreiben, der POSIX-kompatibel ist, d. H. Die Ausgabe von find mit einem Nicht-Zeilentrennzeichen zu lesen?

Antwort

3

Ohne -d Option, read Built-in kann keine nullterminierten Daten lesen.

Sie können dies in find + xargs:

find . -mindepth 1 -print0 | xargs -0 sh -c 'for f; do echo "Reading path \"$f\""; done' _ 

Oder wenn Sie nichts dagegen haben eine Shell für jede Datei verwenden Laichen nur find:

find . -mindepth 1 -exec sh -c 'echo "Reading path \"$1\""' - {} \; 
+0

Der erste Vorschlag '$ 0 'gesetzt wird, '$ 1', ...' $ {! #} 'So' für f; 'wird * nicht * den ersten übergebenen Wert lesen. Sie können dies beheben, indem Sie ein leeres Argument an sh: 'find ... | senden xargs -0 sh -c '...' "" ' – andlrc

+0

Eigentlich habe ich diesen Befehl auf 2 verschiedenen Systemen getestet und gefunden. -print0 | xargs -0 sh -c 'echo "$ @"' 'druckt alle Dateinamen. – anubhava

+1

Ich nehme an, das ist, weil das erste das aktuelle Verzeichnis ist. Aber mit einem Filter wie "-Typ f" würden Sie einen Unterschied bemerken. – andlrc