![Shell-Skripting mit expect und einer komplexen Befehlszeile: keine solche Datei oder kein solches Verzeichnis](https://rvso.com/image/747343/Shell-Skripting%20mit%20expect%20und%20einer%20komplexen%20Befehlszeile%3A%20keine%20solche%20Datei%20oder%20kein%20solches%20Verzeichnis.png)
Ich versuche, das zum Laufen zu bringen
#!/usr/bin/expect
spawn "(psql blabla \"blabla sql;\" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)"
expect "Password for user my_base: "
send "v"
Aber ich bekomme immer:
spawn (psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)
couldn't execute "(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)": no such file or directory
Was vermisse ich?
Antwort1
1) Setzen Sie die spawn
Argumente nicht in Anführungszeichen und 2) Spawn versteht die Shell-Syntax nicht. Sie müssen explizit eine Shell spawnen.
spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}
Dabei werden Klammern verwendet, die das expect/Tcl-Äquivalent der einfachen Anführungszeichen der Shell sind.
Antwort2
Dies ist zwar nicht wirklich die Antwort auf Ihre Frage, aber wenn Sie dies ohne Eingabe eines Kennworts versuchen pg_restore
, können Sie die ~/.pgpass
Datei auch zum Speichern der Anmeldeinformationen verwenden.
Postgres-Dokumentation zu ~/.pgpass
-