Ich habe dieses Skript erstellt, um meine Postgresql-Datenbank mit cron zu sichern:
backup.sh
#!/bin/bash
export PGUSER="user"
export PGPASSWORD="pass"
FECHA_ACTUAL=`date +%Y-%m-%d`
HORA_ACTUAL=`date +%H:%M`
ARCH_RESP=$FECHA_ACTUAL-$HORA_ACTUAL
pg_dump -O -Fc mydb -h localhost > /home/user/backups/backup_$ARCH_RESP.sql
find /home/user/backups/ -name '*.sql' -mtime +2 -exec rm -f {} \;
unset PGUSER
unset PGPASSWORD
Wenn ich diesen Code kopiere und auf dem Terminal einfüge, funktioniert er einwandfrei. Wenn ich jedoch versuche, das Skript auszuführen, wird folgende Fehlermeldung angezeigt:
user @ dental: ~ / scripts $ ./backup.sh
export: fehlerhafter Interpreter: keine solche Datei oder kein solches Verzeichnis
Stimmt etwas mit meinem Skript nicht? Oder ist es der falsche Dolmetscher, wie es heißt?
bash
shell-script
Elros Romeo
quelle
quelle
type -a bash
?head -n 1 backup.sh | od -c
.Antworten:
Ich kann den gleichen Fehler erhalten, wenn die erste Zeile nur mit einem CR (anstelle von LF) beendet wird:
Was passiert ist, dass der Kernel nach einem Interpreter-Programm namens sucht
/bin/bash\rexport
, es nicht findet und einen Fehler löscht. Bash druckt eine Fehlermeldung mit dem Namen der DateiDa der Wagenrücklauf den Ausgang jedoch wieder an den Anfang der Zeile verschiebt, sehen Sie nur
Das Problem scheint also bei den Zeilenenden zu liegen.
Beachten Sie, dass bei einem CRLF-Zeilenende im DOS-Stil das Ergebnis anders ist, da jetzt ein LF zum Beenden der Zeile vorhanden ist.
Obwohl ich nicht weiß, warum bash
^M
diesmal die CR bei der Ausgabe zu zitieren scheint .IIRC, die einzige CR als Zeilenende, ist ein Überbleibsel alter Mac-Systeme und
dos2unix
scheint dies nicht standardmäßig zu beheben. Sie müsstenmac2unix
oder verwendendos2unix -c mac
.So etwas sollte auch alle CR- oder CRLF-Linien in Lix-Zeilenenden im Unix-Stil umwandeln, wenn Sie zufällig alle Stile verwechselt haben und die CRs in keinem anderen Sinne benötigen.
quelle