mysql 輸出重定向時為什麼邊框會消失
今天,遇到了特神奇的一件事:
[root@www cron]# /home/mysql/bin/mysql -uroot -p123456 -e "select count(*) from test.email where 1"
+----------+
| COUNT(*) |
+----------+
| 93 |
+----------+
[root@www cron]#
[root@www cron]# /home/mysql/bin/mysql -uroot -p123456 -e "select count(*) from test.email where 1" | more
COUNT(*)
93
[root@www cron]#
就是多了一個管道+more, mysql輸出中的邊框怎麼不見了…與加了–silent選項的效果是相同的。
[root@www cron]#
[root@www cron]# /home/mysql/bin/mysql --silent -uroot -p123456 -e "select count(*) from test.email where 1"
COUNT(*)
93
[root@www cron]#
翻源代碼,終於找到了原因:
[root@H209 client]# pwd
/mysql-5.6.2-labs-innodb-memcached/client
[root@H209 client]# vi mysql.cc
1105 int main(int argc,char *argv[])
1106 {
1107 char buff[80];
1108
1109 MY_INIT(argv[0]);
1110 DBUG_ENTER("main");
1111 DBUG_PROCESS(argv[0]);
1112
1113 delimiter_str= delimiter;
1114 default_prompt = my_strdup(getenv("MYSQL_PS1") ?
1115 getenv("MYSQL_PS1") :
1116 "mysql> ",MYF(MY_WME));
1117 current_prompt = my_strdup(default_prompt,MYF(MY_WME));
1118 prompt_counter=0;
1119
1120 outfile[0]=0; // no (default) outfile
1121 strmov(pager, "stdout"); // the default, if --pager wasn't given
1122 {
1123 char *tmp=getenv("PAGER");
1124 if (tmp && strlen(tmp))
1125 {
1126 default_pager_set= 1;
1127 strmov(default_pager, tmp);
1128 }
1129 }
1130 if (!isatty(0) || !isatty(1))
1131 {
1132 status.batch=1; opt_silent=1;
1133 ignore_errors=0;
1134 }
注意1130行的isatty(0)和isatty(1)。
[root@H209 client]# man isatty
ISATTY(3) Linux Programmer’s Manual ISATTY(3)
NAME
isatty - does this descriptor refer TO a terminal
SYNOPSIS
#include <unistd.h>
INT isatty(INT DESC);
DESCRIPTION
RETURNS 1 IF DESC IS an OPEN descriptor connected TO a terminal AND 0 ELSE.
1130 if (!isatty(0) || !isatty(1))
1131 {
1132 status.batch=1; opt_silent=1;
1133 ignore_errors=0;
1134 }
如果 stdin沒有連接到terminal,或者stdout沒有連接到terminal,就設置 opt_silent為1,於是就相當於附加了–silent選項。
除了管道之外, 標准輸出輸入重定向也會產生這種效果。
[root@www cron]# /home/mysql/bin/mysql -uroot -p123456 -e "select count(*) from test.email where 1"
+----------+
| COUNT(*) |
+----------+
| 93 |
+----------+
[root@www cron]# /home/mysql/bin/mysql -uroot -p123456 -e "select count(*) from test.email where 1" >a
[root@www cron]# cat a
COUNT(*)
93
[root@www cron]# cat SQL
SELECT COUNT(*) FROM test.email WHERE 1
[root@www cron]# /home/mysql/bin/mysql -uroot -p123456 <SQL
COUNT(*)
93
[root@www cron]#