Vom Umgang mit Windows Zeilenenden auf Unix-Systemen

  Perl
  Shell
  Dateitransfer
  OS
  Home

  Links

  Impressum

Ich starte ein Shellscript, dass ich von meinem Windows-PC mit scp rüberkopiert habe und das Ding läuft nicht mit ganz dubiosen Fehlermeldungen:

  ~$ ./test.sh
  : bad interpreter: No such file or directory
Aber das Script gibt's, die Hash-Bang-Zeile stimmt auch und dem Script sieht man keine Fehler an.

Mögliche Fehlerursache: Die Zeilenenden sind falsch.

  cat -v test.sh
bringt es an den Tag:
  $ cat -v test.sh
  ^M
  echo "TEST TEST"^M
Was machen die komischen '^M' hier ? Und vor allem: Wie bekomme ich die wieder weg ?

Zeilenende-Markierungen auf verschiedenen Systemen

Im ASCII-Zeichensatz sind zwei verschiedene Codes für die Zeilenende-Markierung vorgesehen: CR (Carriage Return: Wagenrücklauf) und LF (Line Feed: Zeilenvorschub).

Und wie so oft führt ein mehrdeutiger Standard zu inkompatiblen Lösungen:

Unix
Zeilenenden werden durch ein einfaches LF markiert.
Windows
Zeilenenden werden durch CRLF markiert.
Mac
Zeilenenden werden durch CR markiert. (Ist das eigentlich bei Mac OS/X immer noch so ? Weiss das jemand ?)
Das führt dazu, dass ein Unix-System eine Windows-Text-Datei am Zeilenende mit einem zusätzlichen "komischen" Zeichen sieht, nämlich dem CR, dass dann mit "^M" dargestellt wird.

Warum laufen Scripte mit Windows-Zeilenenden nicht ?

Die erste Zeile im Script (s.o.) heisst z.B.

  #!/bin/bash^M
Und damit sucht das System einen Interpreter, der "/bin/bash^M" heisst, und den gibt es wohl auf den meisten Systemen nicht....

Wie wandle ich Windows-Zeilenenden in Unix-Zeilenenden um ?

FTP
Beim Dateitransfer mit FTP kann man den Modus "ascii" einschalten, der genau diese Wandlung durchführt (je nach Transfer-Richtung wird LF->CRLF oder LF->CRLF gewandelt)
dos2unix
Auf vielen Systemen gibt es ein dos2unix- und unix2dos-Programm, dass das macht.
tr
  tr -d '\015' dateiname> dateiname.ohne_crlf
Perl
  perl -e 'while (<>) {s/\r//;print}' dateiname> dateiname.ohne_crlf
Emacs
Datei laden.
  C-x RET c undecided-unix C-x C-w dateiname.ohne_crlf

Ulrich Herbst
Letzte Änderung: 17.02.2004 10:08:33