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

Jens Dreger jens.dreger at physik.fu-berlin.de
So Mär 21 18:56:07 CET 2004


On Sun, Mar 21, 2004 at 03:40:20PM +0100, Christian Boulanger wrote:
> > Leerzeichen, Tabulatoren und sogar Zeilenumbr?che sind 
> > eigentlich kein Problem - es sei denn, Du machst eines daraus.
> 
> Bei mir wars ein Problem in einer 
> 
> 	for x in "$localroot/*" ; do 

Da sollte das * gar nicht an der Stelle expandiert werden...
 
> Schleife kamen immer nur die halben Dateinamen in $x an, also "Eigene" statt
> "Eigene Dateien". Selbes Ergebnis mit
> 
> 	for x in `ls -X \"$localroot\"` 
> 
> oder ?hnlichen Dingen, die ich per google fand.

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:

--------------8<-----------------------------------------
#!/bin/bash
mkdir -p /tmp/test1
touch "/tmp/test1/a b" /tmp/test1/c
echo "A"; for x in /tmp/test1/*; do echo "\$x='$x'"; done
echo "B"; for x in "/tmp/test1/*"; do echo "\$x='$x'"; done
echo "C"; for x in `ls -X \"/tmp/test1/\"`; do echo "\$x='$x'"; done
echo "D"; for x in `ls -X /tmp/test1/`; do echo "\$x='$x'"; done
echo -n "$IFS" | od -txCc
IFS=$'\n'
echo -n "$IFS" | od -txCc
echo "E"; for x in `ls -X /tmp/test1/`; do echo "\$x='$x'"; done
--------------8<--------------------------------------------

liefert sowohl unter debian-Linux als auch unter cygwin:

-------------8<---------------------------------------------
A
$x='/tmp/test1/a b'
$x='/tmp/test1/c'
B
$x='/tmp/test1/*'
C
ls: "/tmp/test1/": No such file or directory
D
$x='a'
$x='b'
$x='c'
0000000 20 09 0a
             \t  \n
0000003
0000000 0a
         \n
0000001
E
$x='a b'
$x='c'
-------------8<---------------------------------------------

Wie man sieht, tut Fall 'A' von alleine das richtige. Bei Fall 'E'
habe ich mal IFS auf "\n" gesetzt (damit das $'\n'-Konstrukt geht,
muss unter cygwin explizit #!/bin/bash in der ersten Zeile stehen,
unter Linux ging's bei mir auch so.). IFS aendern hilft in solchen
Faellen mit Leerzeichen in Dateinamen immer. Siehe "man bash" zu IFS
und Word Splitting.

Bash-Versionen:

cygwin:~> bash --version                                                                                                 
GNU bash, version 2.05b.0(5)-release (i686-pc-cygwin)
Copyright (C) 2002 Free Software Foundation, Inc.

dreger at smart:~> bash --version
GNU bash, version 2.05b.0(1)-release (i386-pc-linux-gnu)
Copyright (C) 2002 Free Software Foundation, Inc.

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l