secuencias de comandos de shell con expect y una línea de comando compleja: no existe tal archivo o directorio

secuencias de comandos de shell con expect y una línea de comando compleja: no existe tal archivo o directorio

Estoy tratando de hacer que esto funcione

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

Pero siempre recibo:

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

¿Qué me estoy perdiendo?

Respuesta1

1) no ponga los spawnargumentos entre comillas y 2) spawn no entiende la sintaxis del shell, necesita generar un shell explícitamente

spawn bash -c {(psql blabla "blabla sql;" &> /dev/null) && (pg_restore -d xx my_file.sql &> /dev/null)}

Esto utiliza llaves, que son el equivalente esperado/Tcl de las comillas simples del shell.

Respuesta2

Aunque esta no es realmente la respuesta a su pregunta, si está intentando hacerlo pg_restoresin ingresar una contraseña, también puede usar el ~/.pgpassarchivo para almacenar las credenciales.

Documentación de Postgres sobre ~/.pgpass-

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

información relacionada