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?


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.