[EDIT]
nos tuvieron la idea básica - sólo se ejecutan una vez "mysql" , y la solución que se proporciona debería funcionar, pero dejó FIFO en el disco.
nos también fue correcto que lo estropeé: un simple "echo X >FIFO
" cerrará el FIFO; Lo recordé mal. Y mis (eliminados) comentarios w.r.t. el tiempo no aplica, lo siento.
Dicho esto, no necesita un FIFO, podría usar un tubo entre procesos. Y mirando a través de mis viejos scripts de MySQL, algunos funcionó similares a esto, pero no puede dejar que los comandos escriban en stdout (sin algunos trucos de "exec").
#!/bin/bash
(
echo "LOCK TABLES mytable READ ;"
echo "Doing something..." >&2
echo "describe mytable;"
sleep 5
echo "UNLOCK tables;"
) | mysql ${ARGUMENTS}
Otra opción podría ser asignar un descriptor de archivo a la FIFO y luego ejecutarlo en segundo plano. Esto es muy similar a lo que nos hizo, pero la opción "exec" no requeriría una subshell para ejecutar los comandos bash; por lo tanto, permitiría establecer "RC" en el "otras cosas":
#!/bin/bash
# Use the PID ($$) in the FIFO and remove it on exit:
FIFO="/tmp/mysql-pipe.$$"
mkfifo ${FIFO} || exit $?
RC=0
# Tie FD3 to the FIFO (only for writing), then start MySQL in the u
# background with its input from the FIFO:
exec 3<>${FIFO}
mysql ${ARGUMENTS} <${FIFO} &
MYSQL=$!
trap "rm -f ${FIFO};kill -1 ${MYSQL} 2>&-" 0
# Now lock the table...
echo "LOCK TABLES mytable WRITE;" >&3
# ... do your other stuff here, set RC ...
echo "DESCRIBE mytable;" >&3
sleep 5
RC=3
# ...
echo "UNLOCK TABLES;" >&3
exec 3>&-
# You probably wish to sleep for a bit, or wait on ${MYSQL} before you exit
exit ${RC}
Tenga en cuenta que hay algunos problemas de control:
- Este código no tiene comprobación de errores por falta de bloquear (o cualquier comando SQL dentro de "otras cosas"). Y eso es definitivamente no trivial.
- Dado que en el primer ejemplo, "otras cosas" está dentro de una subcadena, no puede fácilmente establecer el código de retorno de la secuencia de comandos desde ese contexto.
¿No debería el '-u' ser' -e'? –