В настоящее время я полностью недоволен программой командной строки / usr / bin / mysql! Это, например, не позволяет мне использовать:
(a) различные инструменты Unix (например, grep, sed ...) и
(b) Такие понятия Unix, как io-redirection, piping.
(Кстати, IIRC, оболочка командной строки для Sybase, используемая для обеспечения возможности конвейерной передачи и достаточно мощного использования командной строки в стиле 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, и все, что следует за ';' будут конструкции оболочки Unix, которые будут переданы прямо в eval () выше. Но я не уверен, что это самый лучший способ !
Другое очень серьезное ограничение, которое все еще сохраняется: концепция сеанса не будет ... из-за нового вызова / usr / bin / mysql на каждой итерации цикла while. Итак, я действительно хотел бы иметь возможность : (a) запустить один, единственный экземпляр / usr / bin / mysql и (b) каким-то образом wire / usr / bin / mysql's stdin, stdout, stderr направляет в мою программу-обертку.
Теперь, возможен ли этот трюк? Обратите внимание, что я пытался
[Сд @ хост: ~ / TMP]
$ mysql -uSD 2> & 1 | тройник
и это не сработало, как ожидалось. То есть я не получил знакомые интерактивные сообщения mysql в свой файл sql.out, так что мне интересно, что здесь происходит !!
Если это невозможно с помощью shell (bash), можно ли это сделать с помощью C-программы ...? который использует C API MySQL, скажем, чтобы открыть соединение с базой данных, а затем обеспечить ощущение сеанса через это соединение?
Может ли здесь помочь Perl?
Большое спасибо за прослушивание.