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