[EDIT]
nos a eu l'idée de base - ne fonctionne "mysql" une fois , et la solution ns fournie devrait fonctionner, mais elle a laissé le FIFO sur le disque.
nos était également correct que j'ai vissé: un simple "echo X >FIFO
" fermera le FIFO; Je me suis souvenu à tort. Et mes commentaires (supprimés) w.r.t. le timing ne s'applique pas, désolé.
Cela dit, vous n'avez pas besoin d'une FIFO, vous pouvez utiliser un tube inter-processus. Et en regardant à travers mes anciens scripts MySQL, certains ont fonctionné comme ça, mais vous ne pouvez pas laisser des commandes écrire dans stdout (sans quelques astuces "exec").
#!/bin/bash
(
echo "LOCK TABLES mytable READ ;"
echo "Doing something..." >&2
echo "describe mytable;"
sleep 5
echo "UNLOCK tables;"
) | mysql ${ARGUMENTS}
Une autre option pourrait être d'attribuer un descripteur de fichier dans le FIFO, ont alors fonctionner en arrière-plan. C'est très similaire à ce que nos a fait, mais l'option "exec" n'exigerait pas un sous-shell pour exécuter les commandes bash; serait donc vous permettre de définir « RC » dans le « autres choses »:
#!/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}
Notez qu'il ya quelques problèmes de contrôle:
- Ce code n'a AUCUNE ERREUR VÉRIFIER pour défaut de verrouillage (ou toutes les commandes SQL dans les "autres choses"). Et c'est certainement non-trivial.
- Puisque dans le premier exemple, les «autres choses» sont dans un sous-shell, vous ne pouvez pas facilement définir le code de retour du script à partir de ce contexte.
Le '-u' ne devrait-il pas être' -e'? –