Різний вихід при переадресації


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) в Stack Overflow:


Щоб відповісти на ваше запитання, "Чому?": Тому що це говорить документація. Дивіться посібник з посилання :

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

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

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

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

1
Мене не цікавить переосмислення за замовчуванням. ¶ Я не знав, чи різниця у випуску обумовлена ​​чимось у mysql, чи через щось у баші. Але це не відповідає повністю на моє запитання. Як mysql знає, що відбувається з його результатом? Я думаю, що перенаправлення має бути невидимим для mysql. Я відредагував це питання, щоб чіткіше сказати, що я хочу задати. +1, хоча, відповідаючи дуже добре на це питання я (мабуть) , здавалося , щоб запитати.
msh210

Ах, я неправильно зрозумів. Я оновив свою відповідь.
Вільям Джексон

Ах, це допомагає. Але це все ще не дуже те, що я хочу, а саме: "як знає" симпатія? " Тобто, isatty називається mysql. Будь stdout tty - це факт життя в bash, а не в mysql. Звідки mysql знає, що відбувається в bash? Я думаю, що речі в баші будуть невидимими для mysql.
msh210

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