Shell-Skripting mit expect und einer komplexen Befehlszeile: keine solche Datei oder kein solches Verzeichnis

Shell-Skripting mit expect und einer komplexen Befehlszeile: keine solche Datei oder kein solches Verzeichnis

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 spawnArgumente 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 ~/.pgpassDatei auch zum Speichern der Anmeldeinformationen verwenden.

Postgres-Dokumentation zu ~/.pgpass-

https://www.postgresql.org/docs/current/libpq-pgpass.html

verwandte Informationen