![скрипт оболочки с ожиданием и сложной командной строкой: нет такого файла или каталога](https://rvso.com/image/747343/%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8%20%D1%81%20%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B8%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B9%3A%20%D0%BD%D0%B5%D1%82%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B3%D0%BE%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0.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
-