![使用expect和複雜命令列的shell腳本:沒有這樣的檔案或目錄](https://rvso.com/image/747343/%E4%BD%BF%E7%94%A8expect%E5%92%8C%E8%A4%87%E9%9B%9C%E5%91%BD%E4%BB%A4%E5%88%97%E7%9A%84shell%E8%85%B3%E6%9C%AC%EF%BC%9A%E6%B2%92%E6%9C%89%E9%80%99%E6%A8%A3%E7%9A%84%E6%AA%94%E6%A1%88%E6%88%96%E7%9B%AE%E9%8C%84.png)
我正在努力讓這項工作成功
#!/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
-