Warum enthält der Dateiname Fragezeichen, wenn ich ein Skript auf meinem Remotecomputer ausführe?

10

Ich habe ein winziges Skript, das einfach das aktuelle Datum abruft, ein PHP-Skript ausführt und die Ausgabe (und Fehler) in einen Dateinamen umleitet, der das aktuelle Datum enthält.

DATE=$(date +"%Y%m%d")
FILE="log/${DATE}.log"
php -q script.php >> $FILE 2>&1

Wenn ich dieses Skript auf meinem lokalen Computer (Windows 7, Aptana IDE) ausführe, funktioniert das PHP-Skript einwandfrei und die Protokolldatei hat den erwarteten Dateinamen, z 20140502.log.

Wenn ich dieses Skript jedoch über SFTP auf meinen Remotecomputer übertrage und dieses Skript ausführe, sieht der Dateiname folgendermaßen aus:

20140502?.log?

Was könnte das Problem sein? Ist dies ein abschließender Fehler (z. B. ist die Codierung für SFTP-Uploads ANSII, wobei UTF-8 erwartet wird)? Oder muss ich etwas im Skript selbst ändern?

Informationen zu System / Shell:

[foo@bar path]$ sh --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

Lustige Tatsache: Wenn dieses Skript von einem Cronjob aufgerufen wird, treten die Fragezeichen nicht auf. Nur wenn ich das Skript manuell ausführe.

Gottlieb Notschnabel
quelle
Normalerweise zeigt das ?an, dass ein Zeichen nicht angezeigt werden kann. Klingt sicherlich nach einem Kodierungsunterschied. Können Sie uns die Ausgabe von geben env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L Ausgabe ist LANG=en_US.UTF-8.
Gottlieb Notschnabel
Entschuldigung für die Unklarheit. Ich meinte die Ausgabe an beiden Enden.
0xC0000022L
Tut mir leid, dass ich das verpasst habe ... Leider gibt dieser Befehl auf Windoze nichts aus: /
Gottlieb Notschnabel
1
Ist Ihnen bekannt, dass diese Folge von Redirections ( 2>&1 >> $FILE) stderr an das Terminal und stdout an die Datei sendet? Wenn Sie möchten, dass stderr auch in die Datei geht, brauchen Sie>> $FILE 2>&1
Glenn Jackman

Antworten:

17

Sie haben wahrscheinlich einige nicht druckbare Zeichen am Zeilenende (z. B. CRLF von Windows). Führen Sie Folgendes aus:

cat -A scriptname

Auf einem Remote-Computer werden Ihnen alle Zeichen in Ihrem Skript angezeigt. Anschließend können Sie in ein Unix-ähnliches Format konvertieren

dos2unix scriptname
Fazie
quelle
3

Notepad ++ hat sich als sehr nützlich erwiesen, um dies nach dem Versuch der Antwort zu korrigieren

cat -A Skriptname>

dos2unix Skriptname

da dies beim Konvertieren immer noch Fehler aufwies.

Über Notepad ++ gibt es die Option im Bearbeitungsmenü / EOL-Konvertierung / Unix / OSX-Format.

Immer noch sehr lernend, aber diese Methode löste mein Problem, aber die vorherige Lösung half dabei, herauszufinden, wo das Problem war.

Phoe
quelle