$ 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?
bash
mysql
redirection
stdout
msh210
источник
источник
-t
флаг к своей команде mysql :)Ответы:
Редактировать: я не могу быть уверен, что
mysql
это так, но он может быть использованisatty(3)
для определения,STDOUT
является ли терминал или нет, и соответствующим образом изменить вывод.Изменить 2:
mysql
инструмент командной строки , безусловно , используетisatty()
. Вы можете прочитать исходный код.Есть несколько хороших примеров этого (хотя и не в
C
) в переполнении стека:Чтобы ответить на ваш вопрос: «Почему?»: Потому что так говорится в документации. Смотрите справочное руководство :
Я подозреваю, что это решение было принято для удобства чтения. При использовании в интерактивном режиме
mysql
может предполагать, что человек читает выходные данные, и нам, людям, как правило, легче читать данные, ограниченные этими строками. При неинтерактивном использовании предполагается, что другая программа будет использовать выходные данные, а выходные данные с разделителями табуляции легче использовать программно.Если вы заинтересованы в переопределении этого значения по умолчанию и получении формата ASCII-таблицы при перенаправлении вывода, вы можете использовать параметр командной строки
--table
(-t
) :источник
bash
может использоватьisatty()
то же самое, что и любая другая программа, чтобы определить, указывает ли он на tty или файл на диске.isatty()
предоставляется ОС, а не Bash.