es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ksh: ¿cómo ejecutar un comando de manera paramétrica?

Tengo el siguiente comando psql que funciona bien:

psql --echo-queries -v ON_ERROR_STOP=0 -v GROUP_ID=${id} ${PS_USER}:${PS_PASS}@${PS_INST}:${PS_PORT}/${PS_DB} << EOF 1> ${log_file} 2>&1
\set AUTOCOMMIT OFF
INSERT INTO city (city_id, city, country_id) VALUES (1000,'TEST1', 1);
EOF

Me gustaría tener el código más limpio preparando la cadena de conexión de antemano y ejecutándolo cuando sea necesario, algo así:

Preparando la cadena de conexión

ps_connection="${PS_USER}:${PS_PASS}@${PS_INST}:${PS_PORT}/${PS_DB}"

psql --echo-queries -v ON_ERROR_STOP=0 -v GROUP_ID=${id} ${ps_connection} << EOF 1> ${log_file} 2>&1
\set AUTOCOMMIT OFF
....
EOF

Cuando lo hago con sqlplus funciona:

sqlplus -s $curr_connection << EOF  1>> ${log_file} 2>&1 
....

¿Por qué no funciona con psql?

También he intentado preparar el comando completo de psql, he intentado eval y exec y no funcionó:

ps_connection="psql --echo-queries -v ON_ERROR_STOP=0 -v GROUP_ID=${id} ${PS_USER}:${PS_PASS}@${PS_INST}:${PS_PORT}/${PS_DB}"

También intenté `exec ${ps_connection}`

eval ${ps_connection} << EOF 1> ${log_file} 2>&1
\set AUTOCOMMIT OFF
....
EOF

Obtengo:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el primer enfoque no funcionó con psql podría ser que psql requiere que la sustitución de variables se realice antes de pasar la cadena de conexión. En el segundo enfoque, la cadena de conexión se prepara de antemano y debería funcionar bien.

    En cuanto al tercer enfoque con eval y exec, es posible que la cadena no se evalúe correctamente debido a las comillas alrededor de la variable. Se recomienda utilizar comillas dobles alrededor de las variables que requieren sustitución, como ${id}, y comillas simples alrededor del resto de la cadena.

    Aquí hay un ejemplo de cómo se podría modificar el tercer enfoque:

    ps_connection="psql --echo-queries -v ON_ERROR_STOP=0 -v GROUP_ID=${id} '${PS_USER}:${PS_PASS}@${PS_INST}:${PS_PORT}/${PS_DB}'"
    
    eval ${ps_connection} << EOF 1 > ${log_file} 2>&1
    \set AUTOCOMMIT OFF
    ....
    EOF
    

    Al utilizar comillas simples alrededor de la cadena de conexión, nos aseguramos de que se evalúe como una cadena literal y no como un comando.

Comments are closed.