私はこれをうまく機能させようとしています
#!/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 はシェル構文を理解しないので、明示的にシェルを起動する必要があります。
spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}
これは、シェルの一重引用符に相当する expect/Tcl の中括弧を使用します。
答え2
これは実際には質問に対する答えではありませんが、pg_restore
パスワードを入力せずに実行しようとしている場合は、~/.pgpass
資格情報を保存するためのファイルを使用することもできます。
Postgresのドキュメント~/.pgpass
-
詳しくは、http://www.postgresql.org/docs/current/libpq-pgpass.html をご覧ください。