сценарий оболочки с ожиданием и сложной командной строкой: нет такого файла или каталога
Я пытаюсь заставить это работать
#!/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
Что мне не хватает?
2 ответа
Решение
1) не ставьте
spawn
аргументы в кавычках и 2) spawn не понимает синтаксис оболочки, вам необходимо явно создать оболочку
spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}
Здесь используются фигурные скобки, которые являются эквивалентом одинарных кавычек оболочки для expect/Tcl.
Хотя на самом деле это не ответ на ваш вопрос, но если вы пытаетесь сделатьpg_restore
без ввода пароля вы также можете использовать файл для хранения учетных данных.
Документация Postgres по~/.pgpass
-