使用 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

相关内容