Как создать программу-оболочку / usr / bin / mysql через перенаправление ввода-вывода? - PullRequest
0 голосов
/ 29 августа 2009

В настоящее время я полностью недоволен программой командной строки / 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]
$ 
  1. Теперь, хотя я мог бы добавить функцию трубопровода / перенаправления, говоря себе, что ... все, что предшествует точке с запятой '; в пользовательском вводе read () будет SQL, и все, что следует за ';' будут конструкции оболочки Unix, которые будут переданы прямо в eval () выше. Но я не уверен, что это самый лучший способ !

  2. Другое очень серьезное ограничение, которое все еще сохраняется: концепция сеанса не будет ... из-за нового вызова / 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, так что мне интересно, что здесь происходит !!

  3. Если это невозможно с помощью shell (bash), можно ли это сделать с помощью C-программы ...? который использует C API MySQL, скажем, чтобы открыть соединение с базой данных, а затем обеспечить ощущение сеанса через это соединение?

  4. Может ли здесь помочь Perl?

Большое спасибо за прослушивание.

1 Ответ

0 голосов
/ 29 августа 2009

Встроенное mysql приложение командной строки полностью поддерживает конвейерную передачу, перенаправление ввода / вывода и так далее.

Например, я мог бы выполнить эту команду непосредственно в командной строке:

$ echo "SELECT things FROM some_table" | mysql some_database | grep excitement > output.txt
...