Другой вывод при перенаправлении


10
$ mysql -e 'select a,b from tablefoo' databasename

доходность

+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+

в то время как

$ mysql -e 'select a,b from tablefoo' databasename > file

дает файл, fileсодержащий

a b
1 0
2 1

(где вкладка находится между буквенно-цифровыми символами в каждой строке).

Я думаю, что перенаправление не должно изменить вывод. Почему я получаю два разных результата?


Edit: Уильям Джексон «s ответ говорит , что это особенность MySQL: Формат вывода зависит от того, будет ли перенаправлен выход. Это не отвечает на мой вопрос, хотя. Как mysql 'узнает', перенаправлен ли вывод? Перенаправление не только берет выход и, ну, перенаправляет это куда-нибудь? Разве это не должно быть невидимым для MySQL?


Добавьте -tфлаг к своей команде mysql :)
spencer.sm

Ответы:


13

Редактировать: я не могу быть уверен, что mysqlэто так, но он может быть использован isatty(3)для определения, STDOUTявляется ли терминал или нет, и соответствующим образом изменить вывод.

Изменить 2:mysql инструмент командной строки , безусловно , использует isatty(). Вы можете прочитать исходный код.

Есть несколько хороших примеров этого (хотя и не в C) в переполнении стека:


Чтобы ответить на ваш вопрос: «Почему?»: Потому что так говорится в документации. Смотрите справочное руководство :

При интерактивном использовании результаты запроса представляются в формате ASCII-таблицы. При неинтерактивном использовании (например, в качестве фильтра) результат представляется в формате табуляции.

Я подозреваю, что это решение было принято для удобства чтения. При использовании в интерактивном режиме mysqlможет предполагать, что человек читает выходные данные, и нам, людям, как правило, легче читать данные, ограниченные этими строками. При неинтерактивном использовании предполагается, что другая программа будет использовать выходные данные, а выходные данные с разделителями табуляции легче использовать программно.

Если вы заинтересованы в переопределении этого значения по умолчанию и получении формата ASCII-таблицы при перенаправлении вывода, вы можете использовать параметр командной строки --table( -t) :

mysql -t -e 'select a,b from tablefoo' databasename > file

1
Я не заинтересован в переопределении дефолта. ¶ Я не знал, была ли разница в выводе вызвана чем-то в mysql или чем-то в bash. Но это не полностью отвечает на мой вопрос. Как mysql узнает, что происходит с его выводом? Я думаю, что перенаправление должно быть невидимым для MySQL. Я отредактировал вопрос, чтобы более четко изложить, что я хочу задать. +1, хотя, отвечая очень хорошо на этот вопрос я (видимо) , казалось , чтобы спросить.
msh210

Ах, я неправильно понял. Я обновил свой ответ.
Уильям Джексон

Ах, это помогает. Но это все-таки не совсем то, чего я хочу, а именно: «как Изашти« узнает »?» То есть isatty называется mysql. Является ли stdout tty фактом жизни в bash, а не в mysql. Как mysql узнает, что происходит в bash? Я думаю, что вещи в bash были бы невидимы для mysql.
msh210

1
Stdout является файловым дескриптором и bashможет использовать isatty()то же самое, что и любая другая программа, чтобы определить, указывает ли он на tty или файл на диске. isatty()предоставляется ОС, а не Bash.
Уильям Джексон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.