Sortie différente lors de la redirection

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

les rendements

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

tandis que

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

renvoie un fichier filecontenant

a b
1 0
2 1

(où un onglet se trouve entre les caractères alphanumériques de chaque ligne).

Je pense que la redirection ne devrait pas changer la sortie. Pourquoi est-ce que j'obtiens deux résultats différents?


Edit: la réponse de William Jackson dit que c'est une fonctionnalité de mysql: le format de sortie dépend de la redirection de la sortie. Mais cela ne répond pas à ma question. Comment mysql 'sait' si la sortie est redirigée? La redirection ne prend-elle pas simplement la sortie et, bien, la redirige-t-elle quelque part? Cela ne devrait-il pas être invisible pour mysql?

msh210
la source
Ajoutez le -tdrapeau à votre commande mysql :)
spencer.sm

Réponses:

13

Edit: je ne peux pas être certain que c'est comme mysqlça, mais il pourrait être utilisé isatty(3)pour déterminer s'il STDOUTs'agit d'un terminal ou non, et modifier la sortie en conséquence.

Edit 2: L' mysqloutil de ligne de commande utilise définitivement isatty(). Vous pouvez lire le code source.

Il y a quelques bons exemples de cela (mais pas dans C) sur Stack Overflow:


Pour répondre à votre question, "Pourquoi?": Parce que c'est ce que dit la documentation. Voir le manuel de référence :

Lorsqu'ils sont utilisés de manière interactive, les résultats de la requête sont présentés dans un format de table ASCII. Lorsqu'il est utilisé de manière non interactive (par exemple, en tant que filtre), le résultat est présenté dans un format séparé par des tabulations.

Je soupçonne que cette décision a été prise pour plus de lisibilité. Lorsqu'il est utilisé de manière interactive, il mysqlpeut supposer qu'un humain lit la sortie, et il est généralement plus facile pour nous, humains, de lire des données délimitées par ces lignes. Lorsqu'il est utilisé de manière non interactive, l'hypothèse est qu'un autre programme va consommer la sortie et que la sortie délimitée par des tabulations est plus facile à consommer par programme.

Si vous souhaitez remplacer cette valeur par défaut et obtenir le format de table ASCII lors de la redirection de la sortie, vous pouvez utiliser l' option de ligne de commande --table( -t) :

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
la source
1
Je ne suis pas intéressé à remplacer la valeur par défaut. ¶ Je ne savais pas si la différence de sortie était due à quelque chose dans mysql ou à quelque chose dans bash. Mais cela ne répond pas entièrement à ma question. Comment mysql sait-il ce qui arrive à sa sortie? Je pense que la redirection devrait être invisible pour mysql. J'ai édité la question pour dire plus clairement ce que je veux dire. +1, cependant, pour avoir très bien répondu à la question que je semblais (apparemment) poser.
msh210
Ah, j'ai mal compris. J'ai mis à jour ma réponse.
William Jackson
Ah, ça aide. Mais ce n'est toujours pas vraiment ce que je veux, c'est-à-dire "comment isatty" sait "?" Autrement dit, isatty est appelé par mysql. Que stdout soit un tty est une réalité de bash, pas de mysql. Comment mysql sait-il ce qui se passe dans bash? Je pense que les choses dans bash seraient invisibles pour mysql.
msh210
1
Stdout est un descripteur de fichier et bashpeut utiliser isatty()le même que n'importe quel autre programme pour déterminer s'il pointe vers un tty ou un fichier sur le disque. isatty()est fourni par le système d'exploitation, pas bash.
William Jackson