[linux-l] Cygwin - Schleife durch Pfade, die Leerzeichen enthalten

Steffen Dettmer steffen at dett.de
Mi Mär 24 23:59:41 CET 2004


* Jens Dreger wrote on Sun, Mar 21, 2004 at 18:56 +0100:
> Das sieht auch eher seltsam aus. Ich dachte ja, dass Dein Problem
> irgendwie an cygwin liegt, aber ein kurzer Test zeigt, dass sich die
> bash da nicht viel anders verhaelt:

Prima Posting, schöne Gegenüberstellung!

> echo "A"; for x in /tmp/test1/*; do echo "\$x='$x'"; done
> echo "B"; for x in "/tmp/test1/*"; do echo "\$x='$x'"; done
> 
> Wie man sieht, tut Fall 'A' von alleine das richtige. 

Ja, man sollte sich merken, was for da tut, und sich vielleicht
"for file in * ;" merken. Das funktioniert eben einfach. Und "for
"file file;" funktioniert auch (nimmt die Script-Parameter). Bei
einer Variablen*zuweisung* wird eben nicht "noch einmal"
evaluiert (selbst wenn "*" ein Backtickpaar erzeugt, passiert
nichts weiter). 

Allerdings wird beim Bau einer Kommandozeile "zweimal" evaluiert:
zuerst Variable gegen ihren Wert, dann Aufrufparameter durch
Whitespacesuche. Mehr aber auch nicht (wenn $file='`date`' ist,
und man "file $file" schreibt, kommt can't stat ``date`'...).

Also entsteht /hier/ das Whitespace-"Problem" (und kein
Leerzeichen-Problem, \n und \t sind genauso schlecht) - und hier
muss man quoten.

> Bei Fall 'E' habe ich mal IFS auf "\n" gesetzt (damit das
> IFS aendern hilft in solchen Faellen mit Leerzeichen in
> Dateinamen immer. 

... bloss hilft nicht, wenn man Zeilenvorschübe in Dateinamen
hat! Ja, ich versteh auch überhaupt nicht, warum man
Zeilenverschübe in Dateinamen packen kann, aber es gibt solche
Files. Möglicherweise entsteht sowas auch durch "Bugs" in anderen
Scripten. Also lieber richtig quoten :-)

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.



Mehr Informationen über die Mailingliste linux-l