Was hat das zu bedeuten?

Wenn man sich auf der Konsole befindet, ruft man ein php-Skript entweder via “php ./filename.php” auf oder fügt in der ersten Zeile eine Interpreterdefinition ein: “#!/usr/bin/php”, danach beginnt das Skript, wie gewohnt, mit Wenn man die Datei nun ausführbar macht (chmod +x filename.php) kann man sie direkt via ./filename.php aufrufen, genau das ist es, was ich mit normalerweise mit cron-jobs mache.

Nun habe ich die genannte Zeile bei rund 20 Skripten eingefügt, die Dateien ausführbar gemacht und bei ca. jeder zweiten, war das Ergebnis das im Titel des Beitrag genannte, ohne dass das Skript wirklich ausgeführt wurde. Recherchen im Netz ergaben, dass das kein unbekanntes Problem sei, aber entweder existierte der StackOverflow-Artikel nicht mehr oder es gab keine Antworten auf die Frage in diversen Foren.

Die Lösung ist ganz einfach: DOS-Zeilen-Enden

OS X und Unix-Systeme nutzen nur einen “LineFeed” (\n), Window dagegen ein CarriageReturn und einen LineFeed (\r\n) um eine Zeile zu beenden. Ist die Datei nun im Window-Format, taucht oben genannter Fehler auf, wenn man versucht, das Skript auf einem Unix-System auszuführen.

Für das Problem gibt es diverse Lösungen, da “dos2unix” nicht zur Verfügung stand, schrieb ich mein eigenes Shellskript, welches alle \r-Zeichen aus einer übergebenen Datei löscht. Ein Konsolenbefehl hätte es getan, aber ich wollte das Ganze während des Deployvorgangs auslösen (und zwar nur für den cron-Ordner).


#!/bin/bash
tr -d '\r' < $1 > /tmp/dos2unix
cat /tmp/dos2unix > $1
rm /tmp/dos2unix

Im Deployskript folgte dann noch dieser Aufruf:

find $pathToCron -type f -name "*.php" -exec [$pathToDos2Unix.sh] \'{}\' \;

Hinterlasse einen Kommentar.

Network-wide options by YD - Freelance Wordpress Developer