Output diverso durante il reindirizzamento


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

i rendimenti

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

mentre

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

restituisce un file filecontenente

a b
1 0
2 1

(dove una scheda si trova tra i caratteri alfanumerici su ciascuna riga).

Penserei che il reindirizzamento non dovrebbe cambiare l'output. Perché ottengo due risultati diversi?


Modifica: la risposta di William Jackson afferma che questa è una caratteristica di mysql: il formato di output dipende dal reindirizzamento dell'output. Questo non risponde alla mia domanda, però. In che modo mysql "sa" se l'output viene reindirizzato? Il reindirizzamento non prende solo l'output e, beh, lo reindirizza da qualche parte? Non dovrebbe essere invisibile a mysql?


Aggiungi la -tbandiera al tuo comando mysql :)
spencer.sm

Risposte:


13

Modifica: non posso essere certo che sia così mysql, ma potrebbe essere utilizzato isatty(3)per determinare se si STDOUTtratta di un terminale o meno e modificare di conseguenza l'output.

Modifica 2: lo mysqlstrumento da riga di comando utilizza sicuramente isatty(). Puoi leggere il codice sorgente.

Ci sono alcuni buoni esempi di questo (sebbene non in C) su Stack Overflow:


Per rispondere alla tua domanda "Perché?": Perché è quello che dice la documentazione. Vedi il manuale di riferimento :

Se utilizzati in modo interattivo, i risultati della query vengono presentati in un formato di tabella ASCII. Se utilizzato in modo non interattivo (ad esempio, come filtro), il risultato viene presentato in formato separato da tabulazioni.

Sospetto che questa decisione sia stata presa per leggibilità. Se utilizzato in modo interattivo, mysqlpuò supporre che un essere umano stia leggendo l'output, ed è generalmente più facile per noi umani leggere i dati delimitati da tali righe. Se utilizzato in modo non interattivo, si presuppone che un altro programma consumerà l'output e che l'output delimitato da tabulazioni sia più semplice da utilizzare a livello di programmazione.

Se sei interessato a sovrascrivere questo valore predefinito e ottenere il formato di tabella ASCII durante il reindirizzamento dell'output, puoi utilizzare l' opzione della riga di comando --table( -t) :

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

1
Non mi interessa ignorare l'impostazione predefinita. ¶ Non sapevo se la differenza nell'output fosse dovuta a qualcosa in mysql o fosse dovuta a qualcosa in bash. Ma questo non risponde completamente alla mia domanda. Come fa mysql a sapere cosa sta succedendo al suo output? Penso che il reindirizzamento dovrebbe essere invisibile a mysql. Ho modificato la domanda per indicare più chiaramente cosa intendo fare. +1, tuttavia, per aver risposto molto bene alla domanda che (apparentemente) mi sembra di porre.
msh210

Ah, ho frainteso. Ho aggiornato la mia risposta.
William Jackson,

Ah, questo aiuta. Ma non è ancora quello che voglio, che è "come fa" a saperlo "? Cioè, isatty viene chiamato da mysql. Se stdout sia un tty è un fatto della vita in bash, non in mysql. Come fa mysql a sapere cosa sta succedendo in bash? Penserei che le cose in Bash sarebbero invisibili a mysql.
msh210,

1
Stdout è un descrittore di file e bashpuò usare isatty()lo stesso di qualsiasi altro programma per determinare se punta a un tty o a un file su disco. isatty()è fornito dal sistema operativo, non bash.
William Jackson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.