![script de shell com expectativa e uma linha de comando complexa: esse arquivo ou diretório não existe](https://rvso.com/image/747343/script%20de%20shell%20com%20expectativa%20e%20uma%20linha%20de%20comando%20complexa%3A%20esse%20arquivo%20ou%20diret%C3%B3rio%20n%C3%A3o%20existe.png)
Estou tentando fazer isso funcionar
#!/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"
Mas eu sempre recebo:
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
o que estou perdendo?
Responder1
1) não coloque os spawn
argumentos entre aspas e 2) o spawn não entende a sintaxe do shell, você precisa gerar explicitamente um shell
spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}
Isso usa colchetes, que são o equivalente expect/Tcl das aspas simples do shell.
Responder2
Embora esta não seja realmente a resposta à sua pergunta, se você estiver tentando fazer isso pg_restore
sem inserir uma senha, também poderá usar o ~/.pgpass
arquivo para armazenar credenciais.
Documentação do Postgres em ~/.pgpass
-