$ 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 file
contenant
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?
bash
mysql
redirection
stdout
msh210
la source
la source
-t
drapeau à votre commande mysql :)Réponses:
Edit: je ne peux pas être certain que c'est comme
mysql
ça, mais il pourrait être utiliséisatty(3)
pour déterminer s'ilSTDOUT
s'agit d'un terminal ou non, et modifier la sortie en conséquence.Edit 2: L'
mysql
outil de ligne de commande utilise définitivementisatty()
. 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 :
Je soupçonne que cette décision a été prise pour plus de lisibilité. Lorsqu'il est utilisé de manière interactive, il
mysql
peut 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
) :la source
bash
peut utiliserisatty()
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.