expect と複雑なコマンドラインを使用したシェルスクリプト: そのようなファイルまたはディレクトリはありません

expect と複雑なコマンドラインを使用したシェルスクリプト: そのようなファイルまたはディレクトリはありません

私はこれをうまく機能させようとしています

#!/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 をご覧ください。

関連情報