目前,我对命令行程序 /usr/bin/mysql 非常不满意!它不会,例如,让我利用:
(a) 各种 Unix 工具(如 grep、sed...),以及
(b) Unix 概念,例如 io 重定向、管道。
(顺便说一句,IIRC,Sybase 的命令行 shell,用于允许管道和足够强大的 Unix 风格的命令行使用。)
所以......我想知道,是否可以自己为这个吸盘创建一个外壳包装?
我的第一个版本看起来像这样。
# #!/bin/bash
sqlUser=USER_NAME
sqlPassword= # The password will be taken from ~/.my.cnf .
# Sql statements specified via stdin.
while read -p 'SQL> ' x
do
if [ "$x" = "quit" ]; then
# Quit the loop.
echo "Goodbye."
break
else
eval "mysql -u$sqlUser -e '$x' "
echo
fi
done
示例用法:
[sd@host:~/tmp]
$ ./mysqlsh
SQL> select * from bankdb.loan;
+---------+---------------+--------+
| loan_no | branch_name | amount |
+---------+---------------+--------+
| L-11 | Round Hill | 900 |
| L-14 | Downtown | 1500 |
| L-15 | Perryridge | 1500 |
| L-16 | Perryridge | 1300 |
| L-17 | Downtown | 1000 |
| L-23 | Redwood | 2000 |
| L-93 | Mianus | 500 |
+---------+---------------+--------+
SQL> quit
Goodbye.
[sd@host:~/tmp]
$
现在,虽然我可以通过对自己说......分号';'之前的任何内容来添加管道/重定向功能 在 read() 的用户输入中将是 SQL,以及 ';' 之后的任何内容 将是直接传递给上面的 eval() 的 Unix shell 结构。但是,我不确定这是否是最好的方法!
另一个仍然存在的非常严重的限制是:将没有会话的概念......由于在 while 循环的每次迭代中都对 /usr/bin/mysql 进行了新的调用。所以,我真正想做的是:(a)启动一个 /usr/bin/mysql 的单个实例,以及(b) 以某种方式将 /usr/bin/mysql 的 stdin、stdout、stderr 流连接到我的包装程序。 现在,这个特技可能吗?请注意,我尝试了 [sd@host:~/tmp] $ mysql -uSD 2>&1 | tee sql.out 并且它没有按“预期”工作。意思是,我没有在我的 sql.out 文件中获得熟悉的 mysql 交互消息,所以想知道这里发生了什么!
如果通过 shell (bash) 无法做到这一点,是否可以通过 C 程序来完成...?例如,使用 MySQL 的 C API 打开数据库连接,然后通过该连接提供会话感?
Perl 能帮上忙吗?
非常感谢您的收听。