2009-07-24 13 views
4

Ich habe ein Bash-Skript Ich bearbeite Windows mit UltraEdit und speichern als UTF-8 Keine Stückliste, mit Unix-Linie Terminator-Stil, wie im Dialogfeld "Speichern unter" in UE angegeben.Newline Madness in Bash-Skript

Ich lade es dann auf eine centos 5 x86 Maschine, die Parallels virtuozzo läuft, und jedes Mal, egal wie ich es hochlade (FTP als Binärdatei oder über Parallels Management Console), wird das Skript nicht funktionieren. Wenn ich das Skript über die Parallels Management Console ansehe, sehe ich, dass die LETZTE und NUR die letzte Zeile ein merkwürdiges Zeichen enthält. Wenn ich den Zeilenabschluss aus der letzten Zeile entferne (lassen Sie das Skript beim letzten druckbaren Zeichen enden), funktioniert alles einwandfrei.

Meine Fragen:

A), warum nur sind die letzte Terminator Probleme verursacht Linie?

B) Wie vermeide ich das in der Zukunft?

danke!

Antwort

1

Ich verwendete STRG-H auf Ultraedit, die die gleiche Ausgabe wie UNIX-XXD-Befehl anzeigt, und ich sehe die 0D 0A dort, obwohl die Datei festgelegt ist, verwenden UNIX-Terminatoren. Das ist ein Ultraedit-Problem. Ich verwende v 13.20a.

Ich bin neu zu Stackoverflow. Soll ich eine neue Frage öffnen oder diese neu anhängen?

Dank an alle

+1

Keine Notwendigkeit, eine neue Frage zu erstellen .. nur ändern Sie diese mit Ihren Updates. –

2

erstens würde ich empfehlen Sie als binäre übertragen .. da Sie scheinen genau das Format zu wissen, Sie wollen ..

ASCII/Text FTP ist bekannt für Zeilenende-Konvertierung tun, wenn Sie nicht wollen, es auch.

+0

wenn das das Problem war es passieren würde nicht, wenn ich über PMC übertragen. es sei denn, PMC verwendet einige FTP-basierte Übertragungen, und die ich nicht weiß über ... – Gaia

+0

Übertragung als Binär nicht korrigiert, wie erwartet. Siehe Kommentare zu Sinans Antwort. – Gaia

1

Der nächste Schritt ist, einen Hexdump auf die Datei zu tun und zu sehen, was drin ist. Das hört sich sehr nach einem bloßen CR an. Denken Sie daran, dass Wagenrücklauf bedeutet "Schreiben Sie das nächste Zeichen in Position 0 der aktuellen Zeile". Versuchen Sie hexdump -C file oder sogar od -t x1 file laufen zu lassen und suchen Sie nach 0A und 0D (0D = CR, 0A = LF).

+0

es ist eine blanke CR das ist da (^ M) das Problem ist, wie kommt es dort hin? Ich töte alle nachfolgenden Sachen von der letzten Zeile, dann füge ich einen weiteren Zeilenumbruch ein und speichere die Datei gemäß den obigen Spezifikationen. – Gaia

+0

od -t x1 Datei gibt zurück 0000000 23 21 2f 62 69 6e 2f 62 61 73 68 0d 0a 0000015 – Gaia

2

Sie können nur dos2unix laufen sie los zu bekommen ..

+0

Ich habe das Perl-Skript ausgeführt, weil dos2unix auf meiner Distribution nicht verfügbar zu sein scheint. – Gaia

+0

-bash: dos2unix: Befehl nicht gefunden – Gaia

+0

Zuerst können Sie normalerweise "Dateidateiname" sagen, um zu bestimmen, wann die Datei CRLF-Zeilenabschlusszeichen im DOS-Stil hat. Dann, wenn Sie 'dos2unix' nicht haben, können Sie es in vielen Formen online für Ihre Plattform bekommen. – nik

2

Es gibt zwei Probleme hier: Erstens, speichert der Editor unter der Annahme, mit Unix-Zeilenenden, sollten Sie binäre FTP verwenden, nicht ASCII. Zweitens, und das ist rätselhaft, scheint der Editor ein CTRL-Z am Ende der Datei einzufügen (was seit den späten Achtzigern AFAIK nicht notwendig war).

Sie eine Datei speichern, die aus einer einzigen Zeile, überträgt es auf das Unix-System über übliche Mittel und Verwendung:

xxd myscript.sh 

zu sehen, ob das letzte Byte in der Datei 0x1a ist zu überprüfen, ob meine Theorie ist, richtig.

+0

eine Zeile Skript als binär übertragen berichtet '0000000: 2321 2f62 696e 2f62 6173 68 #/bin/bash' – Gaia

+0

zweizeilige kehrt '0000000: 2321 2f62 696e 2f62 6173 680d 0a #/bin/bash ..' – Gaia

+0

Der Versuch, die zwei Zeilen auszuführen, zeigt die zusätzliche CR. das ist mein Problem. -bash: ./hello.sh:/bin/bash^M: schlechter Interpreter: Keine solche Datei oder Verzeichnis (sorry, ich kann nicht den Backtick auf einem internationalen kbd bekommen) – Gaia

0

Sie könnten einfach das Skript aus der Ferne bearbeiten.

Emacs/Vim/Nano usw. funktioniert gut über Kitt. Wenn Sie Emacs mögen, können Sie auch Tramp verwenden, um entfernte Dateien mit den Emacs zu bearbeiten, die auf dem Computer laufen, auf dem Sie gerade sitzen, obwohl ich kein Tramp mit Windows verwendet habe. komodo-edit als remote editing, und obwohl ich komodo-edit sehr empfehlen kann, habe ich die remote-funktion nicht benutzt.

+0

sicher, aber ich versuche herauszufinden, was stimmt nicht mit meiner derzeitigen Methode. es sollte funktionieren. Danke – Gaia

2

Ich hatte ein ähnliches Problem mit der BOM (Bytereihenfolgemarkierung) in Ultraedit gespeichert auf alle neuen Dateien eingestellt werden, auch wenn ich diese Option nicht markiert hatte. Das hat in Linux Chaos angerichtet. Die Lösung bestand darin, die Standardcodierung auf ANSII zu setzen. Diese Einstellung ist mindestens in UltraEdit v18.

Erweitert> Konfiguration> Editor> New File Creation

Encoding Typ: Erstellen Sie neue Dateien als ANSII