Unterschiedliche Ausgabe bei Umleitung

10
$ 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 filemit

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?

msh210
quelle
Fügen Sie die -tFlagge zu Ihrem MySQL-Befehl hinzu :)
spencer.sm

Antworten:

13

Bearbeiten: Ich kann nicht sicher sein, wie mysqldas geht, aber es könnte verwendet werden, isatty(3)um festzustellen, ob STDOUTes sich um ein Terminal handelt oder nicht, und um die Ausgabe entsprechend zu ändern.

Bearbeiten 2: Das mysqlBefehlszeilenprogramm verwendet definitiv isatty(). 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 :

Bei interaktiver Verwendung werden Abfrageergebnisse in einem ASCII-Tabellenformat dargestellt. Bei nicht interaktiver Verwendung (z. B. als Filter) wird das Ergebnis in einem durch Tabulatoren getrennten Format angezeigt.

Ich vermute, diese Entscheidung wurde aus Gründen der Lesbarkeit getroffen. Bei interaktiver Verwendung mysqlkann 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 :

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
quelle
1
Ich bin nicht daran interessiert, die Standardeinstellung zu überschreiben. ¶ Ich wusste nicht, ob der Unterschied in der Ausgabe auf etwas in MySQL oder auf etwas in Bash zurückzuführen ist. Dies beantwortet meine Frage jedoch nicht vollständig. Woher weiß MySQL, was mit seiner Ausgabe passiert? Ich würde denken, dass die Umleitung für MySQL unsichtbar sein sollte. Ich habe die Frage bearbeitet, um klarer anzugeben, was ich stellen möchte. +1, um die Frage, die ich (anscheinend) zu stellen schien , sehr gut zu beantworten .
msh210
Ah, ich habe es falsch verstanden. Ich habe meine Antwort aktualisiert.
William Jackson
Ah, das hilft. Aber es ist immer noch nicht wirklich das, was ich will. Was ist "Woher weiß Isatty?" Das heißt, isatty wird von mysql aufgerufen. Ob stdout ein tty ist, ist eine Tatsache des Lebens in bash, nicht in mysql. Woher weiß MySQL, was in Bash los ist? Ich würde denken, dass Sachen in Bash für MySQL unsichtbar wären.
msh210
1
Stdout ist ein Dateideskriptor und bashkann isatty()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.
William Jackson