Edited at

MySQLの出力を表形式のままリダイレクトしたい

More than 3 years have passed since last update.


やりたいこと

例えば、MySQLのデータベース一覧を表示してみる。

$ mysql -e 'show databases'

+--------------------+
| Database |
+--------------------+
| my_database1 |
| my_database2 |
| my_database3 |
| my_database4 |
+--------------------+

表形式で出力される。

これをこのままファイルに保存したい。

で、リダイレクトしたら

$ mysql -e 'show databases' > output

$ cat output
Database
my_database1
my_database2
my_database3
my_database4

???

期待しているのと違うんですけど。


原因は

これはどうもMySQLがisatty()で出力先を判断しているため。

isatty()

http://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html

出力先がttyか否かを判断して、出力形式を変化させてる。


isatty()を上書き

そこでLD_PRELOADを使ってisattyをすげ替えてしまう。

まず、1を返却するisatty()の共有ライブラリを作成

$ echo 'int isatty(int fd){return 1;}'|gcc -xc -shared -o tmp.so -

$ ls
tmp.so

LD_PRELOADに作成したtmp.soを指定して実行。

なお、LD_LIBRARY_PATHにはtmp.soのあるカレントディレクトリを追加。

$ LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH LD_PRELOAD=tmp.so mysql -e 'show databases' > output

$ cat output
+--------------------+
| Database |
+--------------------+
| my_database1 |
| my_database2 |
| my_database3 |
| my_database4 |
+--------------------+

あ、できた