$ mysql -e 'select a,b from tablefoo' databasename
ergibt
+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+
wohingegen
$ mysql -e 'select a,b from tablefoo' databasename > file
ergibt eine Datei file
mit
a b
1 0
2 1
(wobei sich zwischen den alphanumerischen Zeichen in jeder Zeile eine Registerkarte befindet).
Ich würde denken, dass die Umleitung die Ausgabe nicht ändern sollte. Warum erhalte ich zwei unterschiedliche Ergebnisse?
Edit: William Jackson ‚s Antwort sagt , dass dies ist eine Funktion von mysql: Ausgabeformat hängt davon ab , ob die Ausgabe umgeleitet wird. Dies beantwortet meine Frage jedoch nicht. Woher weiß MySQL, ob die Ausgabe umgeleitet wird? Nimmt die Umleitung nicht nur die Ausgabe und leitet sie irgendwohin um? Sollte das für MySQL nicht unsichtbar sein?
bash
mysql
redirection
stdout
msh210
quelle
quelle
-t
Flagge zu Ihrem MySQL-Befehl hinzu :)Antworten:
Bearbeiten: Ich kann nicht sicher sein, wie
mysql
das geht, aber es könnte verwendet werden,isatty(3)
um festzustellen, obSTDOUT
es sich um ein Terminal handelt oder nicht, und um die Ausgabe entsprechend zu ändern.Bearbeiten 2: Das
mysql
Befehlszeilenprogramm verwendet definitivisatty()
. Sie können den Quellcode lesen.Es gibt einige gute Beispiele dafür (obwohl nicht in
C
) bei Stack Overflow:Um Ihre Frage zu beantworten: "Warum?": Denn das steht in der Dokumentation. Siehe Referenzhandbuch :
Ich vermute, diese Entscheidung wurde aus Gründen der Lesbarkeit getroffen. Bei interaktiver Verwendung
mysql
kann davon ausgegangen werden, dass ein Mensch die Ausgabe liest, und es ist für uns Menschen im Allgemeinen einfacher, Daten zu lesen, die durch diese Zeilen begrenzt sind. Bei nicht interaktiver Verwendung wird davon ausgegangen, dass ein anderes Programm die Ausgabe verwenden wird und dass die durch Tabulatoren getrennte Ausgabe einfacher programmgesteuert verwendet werden kann.Wenn Sie diese Standardeinstellung überschreiben und beim Umleiten der Ausgabe das ASCII-Tabellenformat erhalten möchten, können Sie die Befehlszeilenoption
--table
(-t
) verwenden :quelle
bash
kannisatty()
wie jedes andere Programm verwenden, um festzustellen, ob es auf ein tty oder eine Datei auf der Festplatte verweist.isatty()
wird vom Betriebssystem bereitgestellt, nicht von bash.