Różne dane wyjściowe podczas przekierowywania

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

daje

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

natomiast

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

zwraca plik filezawierający

a b
1 0
2 1

(gdzie tabulator znajduje się między znakami alfanumerycznymi w każdym wierszu).

Myślę, że przekierowanie nie powinno zmieniać wyniku. Dlaczego otrzymuję dwa różne wyniki?


Edit: William Jackson „s odpowiedź mówi, że jest to cecha MySQL: format zależy od tego, czy wyjście jest przekierowywane. To jednak nie odpowiada na moje pytanie. Skąd mysql „wie”, czy dane wyjściowe są przekierowywane? Czy przekierowanie nie tylko bierze wynik i cóż, przekierowuje go gdzieś? Czy to nie powinno być niewidoczne dla mysql?

msh210
źródło
Dodaj -tflagę do polecenia mysql :)
spencer.sm

Odpowiedzi:

13

Edycja: Nie jestem pewien, jak mysqlto działa, ale można go użyć isatty(3)do ustalenia, czy STDOUTjest to terminal, czy też nie i odpowiednio zmodyfikować dane wyjściowe.

Edit 2:mysql narzędzie wiersza poleceń na pewno korzysta isatty(). Możesz przeczytać kod źródłowy.

Istnieje kilka dobrych przykładów tego (chociaż nie w C) w przepełnieniu stosu:


Aby odpowiedzieć na pytanie: „Dlaczego?”: Ponieważ tak mówi dokumentacja. Zobacz instrukcję obsługi :

W przypadku użycia interaktywnego wyniki zapytania są prezentowane w formacie tabeli ASCII. W przypadku użycia nieinteraktywnego (na przykład jako filtr) wynik jest prezentowany w formacie rozdzielanym tabulatorami.

Podejrzewam, że ta decyzja została podjęta ze względu na czytelność. W przypadku użycia interaktywnego mysqlmożna założyć, że człowiek czyta dane wyjściowe, i na ogół łatwiej nam odczytać dane ograniczone tymi wierszami. Przy zastosowaniu nieinteraktywnym zakłada się, że inny program zajmie się wyjściem, a wyjście rozdzielane tabulatorami jest łatwiejsze do wykorzystania programowego.

Jeśli chcesz zastąpić to ustawienie domyślne i uzyskać format tabeli ASCII podczas przekierowywania danych wyjściowych, możesz użyć opcji wiersza polecenia --table( -t) :

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
źródło
1
Nie jestem zainteresowany zastąpieniem wartości domyślnej. Nie wiedziałem, czy różnica w wynikach była spowodowana czymś w mysql, czy przyczyną czegoś w bash. Ale to nie w pełni odpowiada na moje pytanie. Skąd mysql wie, co dzieje się z jego wyjściem? Myślę, że przekierowanie powinno być niewidoczne dla mysql. Zredagowałem pytanie, aby jaśniej określić, o co mam zapytać. +1, choć za odpowiedzi bardzo ładnie Mam pytanie (podobno) zdawała się pytać.
msh210
Ach, źle zrozumiałem. Zaktualizowałem swoją odpowiedź.
William Jackson
Ach, to pomaga. Ale wciąż nie jest tak naprawdę tym, czego chcę, a mianowicie „skąd isatty„ wie ”? Oznacza to, że isatty nazywa się mysql. To, czy stdout jest tty, jest faktem w bash, a nie w mysql. Skąd mysql wie, co się dzieje w bash? Myślałem, że rzeczy w bash byłyby niewidoczne dla mysql.
msh210,
1
Stdout to deskryptor pliku i bashmożna go używać isatty()tak samo, jak każdego innego programu do określania, czy wskazuje on tty, czy plik na dysku. isatty()jest dostarczany przez system operacyjny, a nie bash.
William Jackson