script de shell com expectativa e uma linha de comando complexa: esse arquivo ou diretório não existe

script de shell com expectativa e uma linha de comando complexa: esse arquivo ou diretório não existe

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 spawnargumentos 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_restoresem inserir uma senha, também poderá usar o ~/.pgpassarquivo para armazenar credenciais.

Documentação do Postgres em ~/.pgpass-

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

informação relacionada