Salida diferente al redirigir

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

rendimientos

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

mientras

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

produce un archivo que filecontiene

a b
1 0
2 1

(donde hay una pestaña entre los caracteres alfanuméricos en cada línea).

Creo que la redirección no debería cambiar la salida. ¿Por qué obtengo dos resultados diferentes?


Editar: la respuesta de William Jackson dice que esta es una característica de mysql: el formato de salida depende de si la salida se está redirigiendo. Sin embargo, esto no responde mi pregunta. ¿Cómo 'sabe' mysql si la salida se está redirigiendo? ¿La redirección no solo toma la salida y, bueno, la redirige a alguna parte? ¿No debería ser invisible para mysql?

msh210
fuente
Agregue la -tbandera a su comando mysql :)
spencer.sm

Respuestas:

13

Editar: No puedo estar seguro de cómo mysqles esto, pero podría usarse isatty(3)para determinar si STDOUTes un terminal o no, y modificar la salida en consecuencia.

Edición 2: La mysqlherramienta de línea de comandos utiliza definitivamente isatty(). Puedes leer el código fuente.

Hay algunos buenos ejemplos de esto (aunque no en C) en Stack Overflow:


Para responder a su pregunta, "¿Por qué?": Porque eso es lo que dice la documentación. Ver el manual de referencia :

Cuando se usa de forma interactiva, los resultados de la consulta se presentan en un formato de tabla ASCII. Cuando se usa de forma no interactiva (por ejemplo, como un filtro), el resultado se presenta en formato separado por tabuladores.

Sospecho que esta decisión se tomó para facilitar la lectura. Cuando se usa de forma interactiva, mysqlpuede suponer que un ser humano está leyendo la salida, y generalmente es más fácil para nosotros los humanos leer datos que están delimitados por esas líneas. Cuando se usa de forma no interactiva, se supone que otro programa va a consumir la salida, y que la salida delimitada por tabulaciones es más fácil de consumir mediante programación.

Si está interesado en anular este valor predeterminado y obtener el formato de tabla ASCII al redirigir la salida, puede usar la opción de línea de comando --table( -t) :

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
fuente
1
No estoy interesado en anular el valor predeterminado. ¶ No sabía si la diferencia en la salida se debía a algo en mysql o a algo en bash. Pero esto no responde completamente a mi pregunta. ¿Cómo sabe mysql qué está pasando con su salida? Creo que la redirección debería ser invisible para mysql. He editado la pregunta para indicar más claramente lo que quiero hacer. +1, sin embargo, por responder muy bien la pregunta que (aparentemente) parecía estar haciendo.
msh210
Ah, no entendí bien. Actualicé mi respuesta.
William Jackson
Ah, eso ayuda. Pero todavía no es realmente lo que quiero, que es "¿cómo 'sabe' isatty?" Es decir, isatty es llamado por mysql. Si stdout es un tty es un hecho de la vida en bash, no en mysql. ¿Cómo sabe mysql lo que sucede en bash? Creo que las cosas en bash serían invisibles para mysql.
msh210
1
Stdout es un descriptor de archivo y bashpuede usar isatty()lo mismo que cualquier otro programa para determinar si está apuntando a un tty o un archivo en el disco. isatty()es proporcionado por el sistema operativo, no bash.
William Jackson