mysql -u user -e "show tables;"
这种方法的局限性在于会丢失需要进行两次操作的事务的原子性和锁定状态:例如,在整个双重操作的过程中无法保留表格
T
的锁定状态。### Minimalistic example
data=$(mysql -e "\
lock table T write;
select col from T;
")
# ...
# parse 'data' and compute 'output' variable
# ...
mysql -e "insert into T values ($output);"
我的解决方案是通过使用两个FIFO并将进程挂在后台,保持MySQL会话跨多个访问保持打开状态。
建议的解决方案:
创建一对FIFO: mkfifo IN OUT
.
将MySQL客户端实例放置在适当位置,并带有一个虚拟的while
循环以保持管道打开并防止SIGPIPE
信号:
mysql --xml --batch --raw --skip-column-names \
-h "$hostname" -u "$username" "$db" >IN <OUT &
while :; do sleep 1; done <IN >OUT &
然后进行测试:
echo "show tables;" >OUT
read <IN
结果:
它不起作用。 echo
命令完成并且 bash 跳过它,这意味着 MySQL 接收了输入,但是 read
永远挂起,因此没有输出产生。
我发现消除 IN
FIFO 整个任务就不会挂起:
mysql --xml --batch --raw --skip-column-names \
-h "$hostname" -u "$username" "$db" <OUT &
while :; do sleep 1; done >OUT &
echo "show tables;" >OUT # this produces the expected output
这种行为是否符合预期?我还想知道在Bash中是否可能进行双重操作而无需自定义homebrews。
>>
)或管道符号(|
)了吗?好问题,祝你好运! - shellter