Output berbeda saat mengarahkan

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

hasil panen

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

sedangkan

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

menghasilkan file yang fileberisi

a b
1 0
2 1

(di mana tab berada di antara karakter alfanumerik di setiap baris).

Saya akan berpikir bahwa redirection seharusnya tidak mengubah output. Mengapa saya mendapatkan dua hasil yang berbeda?


Edit: William Jackson 's jawaban mengatakan bahwa ini adalah fitur dari mysql: format output tergantung pada apakah output sedang diarahkan. Ini tidak menjawab pertanyaan saya. Bagaimana mysql 'tahu' apakah output sedang dialihkan? Apakah pengalihan tidak hanya mengambil output dan, baik, mengarahkannya kembali ke suatu tempat? Bukankah seharusnya itu tidak terlihat oleh mysql?

msh210
sumber
Tambahkan -tbendera ke perintah mysql Anda :)
spencer.sm

Jawaban:

13

Sunting: Saya tidak yakin ini bagaimana caranya mysql, tetapi bisa digunakan isatty(3)untuk menentukan apakah STDOUTterminal atau tidak, dan memodifikasi output yang sesuai.

Edit 2: The mysqltool baris perintah pasti menggunakan isatty(). Anda dapat membaca kode sumber.

Ada beberapa contoh bagus tentang hal ini (walaupun tidak ada C) di Stack Overflow:


Untuk menjawab pertanyaan Anda, "Mengapa?": Karena itulah yang dikatakan dokumentasi. Lihat manual referensi :

Saat digunakan secara interaktif, hasil kueri disajikan dalam format tabel ASCII. Ketika digunakan secara non-interaktif (misalnya, sebagai filter), hasilnya disajikan dalam format yang dipisahkan-tab.

Saya menduga keputusan ini dibuat untuk keterbacaan. Ketika digunakan secara interaktif, mysqldapat mengasumsikan manusia membaca output, dan umumnya lebih mudah bagi kita manusia untuk membaca data yang dibatasi oleh garis. Ketika digunakan secara non-interaktif, asumsinya adalah bahwa program lain akan mengkonsumsi output, dan output yang dibatasi-tab lebih mudah untuk dikonsumsi secara terprogram.

Jika Anda tertarik untuk mengganti default ini dan mendapatkan format tabel ASCII saat mengarahkan output, Anda dapat menggunakan opsi baris perintah --table( -t) :

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
sumber
1
Saya tidak tertarik mengesampingkan default. ¶ Saya tidak tahu apakah perbedaan dalam output disebabkan oleh sesuatu di mysql atau karena sesuatu di bash. Tetapi ini tidak sepenuhnya menjawab pertanyaan saya. Bagaimana mysql tahu apa yang terjadi pada outputnya? Saya pikir pengalihan harus tidak terlihat oleh mysql. Saya telah mengedit pertanyaan untuk menyatakan dengan lebih jelas apa yang ingin saya tanyakan. 1, meskipun, untuk menjawab sangat baik pertanyaan saya (ternyata) tampaknya akan bertanya.
msh210
Ah, saya salah paham. Saya memperbarui jawaban saya.
William Jackson
Ah, itu membantu. Tapi itu masih bukan yang saya inginkan, yaitu "bagaimana isatty 'tahu'?" Artinya, isatty disebut dengan mysql. Apakah stdout adalah tty adalah fakta kehidupan di bash, bukan di mysql. Bagaimana mysql tahu apa yang terjadi di bash? Saya akan berpikir hal-hal di bash tidak akan terlihat oleh mysql.
msh210
1
Stdout adalah deskriptor file, dan bashdapat menggunakan isatty()yang sama dengan program lain untuk menentukan apakah itu menunjuk ke tty atau file pada disk. isatty()disediakan oleh OS, bukan bash.
William Jackson