![expect と複雑なコマンドラインを使用したシェルスクリプト: そのようなファイルまたはディレクトリはありません](https://rvso.com/image/747343/expect%20%E3%81%A8%E8%A4%87%E9%9B%91%E3%81%AA%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%3A%20%E3%81%9D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93.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 はシェル構文を理解しないので、明示的にシェルを起動する必要があります。
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 をご覧ください。