Main /

Programmierer Aergernisse

Programmierer Aergernisse

Die größten Ärgernisse eines Programmierers

Das muss man einfach wissen..

Line Endings

Es gibt da einen klitze kleinen Unterschied zwischen Windows/DOS Text|Source Dateien und UNIX Text|Source Dateien, der Unterschied ist das berühmt berüchtigte Zeilenende.

  • Bei UNIX endet jede Zeile nur mit einem Zeichen, dem '\n'.
  • Bei Windows/DOS sind es zwei Zeichen '\r\n'.

Den meisten besseren Programmen/Interpretern ist es mittlerweile völlig egal, da funktioniert es immer. Leider gibt es immer noch Ausnahmen, die dann in seltsamen Fehlermeldungen enden. Oder dessen Ausgabe/Ansicht unbrauchbar ist.

  • /bin/tcsh linux kommt nicht mit Windows/DOS Endungen zurecht, es braucht UNIX Endungen.
  • Notepad windows will partout Windows/DOS Zeilenendungen haben. Sonst gibt es kein Linefeed, alles steht in einer Zeile.

Links

Tipps

  • um bei einem Stapel Dateien die Line Endings zu ändern:
 find . -type f -exec dos2unix {} \;
  • Achtung! Niemals mit Binärdateien versuchen, die Dateien sind danach kaputt.

Backslash/Slash der Verzeichnisseparator

Unter Windows/DOS ist ein '\' ein Verzeichnisseparator, unter UNIX ist es das '/'. Das wäre eigentlich noch nicht so schlimm, aber ein '\' gilt häufig als Spezialzeichen, was bedeutet, das z.B. das nächste Zeichen interpretiert werden soll. So ist '\n' ein Zeilenende, ein '\t' ein Tabulator, ein '\c' verhindert einen Zeilenvorschub, damit lassen dann prima Zähler basteln, ohne das für jede Ausgabe diese eine Zeile weiter wandert. Um ein '\'(Backslash) auszugeben muss dann allerdings ein doppeltes '\\' angegeben werden.

Wer jetzt in einer MultiOS Umgebung arbeitet und mit mehreren Skripten hantiert, die z.B. Dateinamen weiterreichen, php->perl->4nt/bash/tcsh ... bekommt ganz schnell einen Schaden, da es meist nicht so funktioniert wie erwartet.

BTW:

 C:\Temp\BlahFasel.txt

Das ist ein legaler Dateiname unter UNIX happy smiley

Space (Leerzeichen) in Dateinamen

Ja, es ist erlaubt, es sieht auch besser aus, aber die UNIX Welt ist eine Skript Welt, da sind Spaces in Dateinamen verpönnt. Da die meisten Skripte mit sowas nicht zurechtkommen. Da ein Leerzeichen hier auch als Trenner genutzt wird.

Ein Skript aufrufen:

 # foo "Datei mit Space"

Das Skript foo hat jetzt als ersten Parameter ($1) ein Datei mit Space die Tüttel sind vom Bash/Tcsh Interpreter entfernt worden. Wird dieser Parameter jetzt als Parameter an ein weiteres Skript übergeben, kommt es vor, das plötzlich 3 Parameter daraus geworden sind. Datei, mit, Space Deshalb Hände weg von Spaces in Dateinamen.

Umlaute und sonstige Sonderzeichen in Dateinamen

Umlaute sind nett, bieten aber auch Potenzial für viele Fehler. Bestes Beispiel: UTF-8, das in modernen NTFS Versionen genutzt werden kann verlängert alle Zeichen die nicht zw. 1-127 liegen (ASCII Standard) um min. ein Zeichen, die deutschen Umlaute sind min. 3 Zeichen lang. Im ISO-8859-1 sind die deutschen Umlaute aber nur ein Zeichen lang. Jetzt muss man wissen welches Filesystem welche Zeichenkodierung nutzt. Wenn dann noch Samba dazu kommt, kommt es sehr schnell zu Problemen. Zumal die meisten Systeme nicht neu aufgesetzt werden, sondern nur wachsen.

Deshalb Hände weg von Sonderzeichen in Dateinamen.

Andere Sprachen

Unter UNIX lassen sich durch setzen der Variable LC_ALL andere Sprachen setzen.

 export LC_ALL=de_DE

Schon geben viele Skripte ihre Ergebnisse in deutscher Sprache aus.

Leider nutzen einige Skripte den Output von Skripten für eigene Interpretationen mit sed, oder awk, die dann, wenn falsch/einfach programmiert, nicht damit zurechtkommen, weil der Output Schlüsselwörter nicht mehr enthält.

Beispiel:

 fdisk -l | grep heads

sollte eigentlich ausgeben, wieviele Köpfe eine Festplatte hat, leider funktioniert das nicht unter einem deutschen UNIX. Als beste Lösung:

 LC_ALL=C fdisk -l | grep heads

Dann wird für das Ausführen von fdisk eben kurz auf Standard C (en-US) zurückgeschaltet und das Ergebnis dann mittels grep richtig gefiltert. Das funktioniert dann auch Weltweit und nicht nur in der jeweiligen Landessprache.

Alias werden nicht vererbt

Ein Alias ist eine Ersetzung einer Befehlsfolge mittels eines anderen oder desselben Namens.

 alias dir 'ls -l'

Wird jetzt ein anderes Skript gestartet, kann es diese Aliase nicht nutzen. Es sei den, nutzt source um das Skript zu starten.

Frische Änderungen | Menü editieren
zuletzt geändert am 29.03.2010 14:20 Uhr von Lars
Edit Page | Page History