9
$ 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

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

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


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

1 ответ1

12

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

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

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


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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .