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"?
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:
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.