ftblog

:: widerstand zwecklos ::
email jabber gpgkey
hackergotchi

February 08, 2007

Von Filenamen und Fußschüssen

Filed under: rants -- 12:18

Boooarh!

Also, manchmal fragt man sich wirklich was Leute so rauchen...
Im speziellen, Leute die meinen Dokumente schreiben zu müssen, um diese dann
ahnungslosen Anfängern unterzujubeln, die dann den Bullshit dieser Autoren als
einzige Wahrheit verstehen...

Ich hasse ja sowieso diese so genannten HOWTOs, die die bash mit '/bin/sh'
gleichsetzen... So wie auch dieses: Das 'Bash Prog Intro HOWTO'.

Leute die 'Programming' mit 'Prog' abkürzen sind ja eh die selben Leute, die
auch 'funzen' an Stelle von 'funktionieren' verwenden. Denen sollte man lieber
gar nichts glauben.

Also, jemand (ein echter Anfänger) fragte im Usenet, wie denn Schleifen über
Dateinamen in Shell Skripten zu formulieren werden. Das ist schon allein
deswegen eine gute Frage, weil sie auch von Leuten die es besser wissen müssten
falsch gemacht wird. So natürlich auch wieder hier...

Der Fragesteller wird also mit einer konkreten URI beworfen:
<http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#s7>

Und was steht da drin?

for i in $( ls ); do
  echo item: $i
done

An dieser Stelle frage ich mich, warum jemand mit so wenig Shellahnung ein
Dokument schreibt, daß Anfängern helfen soll. Mich wundert nun zumindest nicht
mehr, warum so ein Scheiß immer wieder in irgendwelchen Skripten zu finden ist.
Ich kann zumindest verstehen, warum der Herr 'Mike G' nicht seinen ganzen Namen
in den Text geschrieben hat. Er war sich wohl der Mittelmäßigkeit seiner
Leistung bewusst.

Nun gut, immerhin hat sich herum gesprochen, daß dieser Mist schon fehlschlägt,
sobald Leerzeichen im Dateinamen auftauchen. Also kommt als nächstes folgender
Vorschlag:

ls | while read FILE; do ...; done

Das klappt nun schon ein wenig besser. Aber immer noch nicht richtig.
Wer, zum Teufel, hat das Gerücht in die Welt gesetzt, daß man 'ls' zum
generieren von Dateinamen benutzt? Wer? WER?!

Dazu benutzt man evtl. noch find, wenn es komplizierter (zB rekursiv) werden
soll. Aber auch dann nicht in $( ... ) für eine for Scheife,
sondern mit '-exec'.

Machen wir mal einen Versuch:

mkdir $'\n' $' ' $'\t' $'test\ndir0' $'test\tdir1' $'test dir'

Damit erzeugen wir in der zsh (und ich glaube ksh und bash kennen $'...' auch)
sechs Verzeichnisse, mit Sonderzeichen im Namen. Das ist vielleich bei anderen
Dingen als einem einfachen Space ein wenig ekelig, kommt aber schon mal vor.
Und ehrlich gesagt geht es, wie man gleich sehen wird, nicht einmal um die
ekeligen Namen, an denen man mit diesen Billig-Lösungen aus Deppen HOWTOs
scheitern wird. Nein! Diese Lösungen sind in etwa so, als ginge ein Arzt
druch euren Arsch hinauf zu eurem Kopf, um eure Augen von hinten behandeln zu
können...

Also, Versuch Nummer eins:

zsh% for i in $( ls ) ; do rmdir "$i" ; done
rmdir: test: No such file or directory
rmdir: dir1: No such file or directory
rmdir: test: No such file or directory
rmdir: dir0: No such file or directory
rmdir: test: No such file or directory
rmdir: dir: No such file or directory
zsh% ls -la
total 32
drwx------ 2 hawk hawk 4096 Feb 8 10:54 ?
drwx------ 2 hawk hawk 4096 Feb 8 10:54 ?
drwx------ 2 hawk hawk 4096 Feb 8 10:54
drwx------ 8 hawk hawk 4096 Feb 8 11:09 .
drwxr-xr-x 5 hawk hawk 4096 Feb 8 10:36 ..
drwx------ 2 hawk hawk 4096 Feb 8 10:54 test?dir1
drwx------ 2 hawk hawk 4096 Feb 8 10:54 test?dir0
drwx------ 2 hawk hawk 4096 Feb 8 11:09 test dir

Cool, das Kommando hat '\n', '\t' und ' ' garnicht versucht zu bearbeiten.
Andere Namen hat es dafür aber zerrissen...

Aber, daß dieser Versuch scheiße ist, sagte ich ja schon.

Nummer 2:

zsh% ls | while read FILE ; do rmdir "$FILE" ; done
rmdir: : No such file or directory
rmdir: : No such file or directory
rmdir: : No such file or directory
rmdir: : No such file or directory
rmdir: test: No such file or directory
rmdir: dir0: No such file or directory
zsh% ls -la
total 24
drwx------ 2 hawk hawk 4096 Feb 8 10:54 ?
drwx------ 2 hawk hawk 4096 Feb 8 10:54 ?
drwx------ 2 hawk hawk 4096 Feb 8 10:54
drwx------ 6 hawk hawk 4096 Feb 8 11:47 .
drwxr-xr-x 5 hawk hawk 4096 Feb 8 10:36 ..
drwx------ 2 hawk hawk 4096 Feb 8 10:54 test?dir0

Alright! Er hat immerhin etwas getroffen... Gut die Verzeichnisse, die Namen
mit nur einem Zeichen haben nicht, aber was soll's, oder? Und unser
Testverzeichnis mit dem '\n' in der Mitte? Völlig egal, oder?

Ich will eine Lösung die nicht nur kürzer ist als die anderen, nein! Auch noch
einfacher zu verstehen sein und immer funktionieren soll sie! Das sind ja
gleich drei Wünsche auf einmal! Das geht nun wirklich nicht...

zsh% for i in * ; do rmdir "$i" ; done
zsh% ls -la
total 8
drwx------ 2 hawk hawk 4096 Feb 8 11:58 .
drwxr-xr-x 5 hawk hawk 4096 Feb 8 10:36 ..

WOW! Magie! Verbrennt die Hexe!
Geht also doch...

Was lernen wir daraus?
Glaubt nicht alles was ihr lest. Hinterfragt es besser zweimal. Denkt selbst.
Und an diese Leute, die immer wieder solchen Scheiß schreiben müssen und
das dann auch noch als HOWTO in der Welt verteilen, um Anfänger auf das eingene
mickrige Niveau zu ziehen: Lest bitte mal ein _gutes_ Buch zum Thema, um nicht
bei den einfachsten Dingen, die in jeder FAQ Sammlung stehen auf die Schnauze
zu fallen.

Powered by zblog
valid css | valid xhtml | utf-8 encoded | best viewed with anybrowser