[РЕДАКТИРОВАТЬ]
nos имел основную идею - только один раз запустите «mysql», и предоставленное nos решение должно работать, но оно оставило FIFO на диске.
nos также было правильно, что я облажался: простой "echo X >FIFO
" закроет FIFO; Я вспомнил неправильно. И мои (удаленные) комментарии w.r.t. время не применяется, извините.
Тем не менее, вам не нужен FIFO, вы можете использовать межпроцессный канал. И, просматривая мои старые сценарии MySQL, некоторые работали сродни с этим, но вы не можете позволить любым командам писать в stdout (без некоторых трюков "exec").
#!/bin/bash
(
echo "LOCK TABLES mytable READ ;"
echo "Doing something..." >&2
echo "describe mytable;"
sleep 5
echo "UNLOCK tables;"
) | mysql ${ARGUMENTS}
Другой вариант может состоять в том, чтобы назначить файловый дескриптор FIFO, а затем запустить его в фоновом режиме. Это очень похоже на то, что делал nos , но опция "exec" не требует вложенной оболочки для запуска команд bash; следовательно, вы могли бы установить «RC» в «другие вещи»:
#!/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}
Обратите внимание, что есть несколько проблем управления:
- В этом коде НЕТ ПРОВЕРКИ ОШИБОК из-за невозможности блокировки (или любых команд SQL
в рамках "других вещей"). И это определенно нетривиально.
- Поскольку в первом примере «другие вещи» находятся внутри подоболочки, вы не можете легко
установить код возврата скрипта из этого контекста.