使用expect和複雜命令列的shell腳本:沒有這樣的檔案或目錄

使用expect和複雜命令列的shell腳本:沒有這樣的檔案或目錄

我正在努力讓這項工作成功

#!/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"

但我總是得到:

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

我缺什麼?

答案1

1)不要將spawn參數放在引號中,2)spawn不理解shell語法,您需要明確產生shell

spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}

這使用了大括號,它是 shell 的單引號的 Expect/Tcl 等價物。

答案2

雖然這不是您問題的真正答案,但如果您嘗試在pg_restore不輸入密碼的情況下執行操作,您也可以使用該~/.pgpass檔案來儲存憑證。

Postgres 文檔~/.pgpass-

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

相關內容