скрипт оболочки с ожиданием и сложной командной строкой: нет такого файла или каталога

скрипт оболочки с ожиданием и сложной командной строкой: нет такого файла или каталога

Я пытаюсь сделать так, чтобы это сработало.

#!/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-

https://www.postgresql.org/docs/current/libpq-pgpass.html

Связанный контент