Yönlendirme sırasında farklı çıktılar


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

verim

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

buna karşılık

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

bir dosya verir file ihtiva eden

a b
1 0
2 1

(burada bir sekme, her satırdaki alfasayısal karakterler arasındadır).

Yeniden yönlendirmenin çıktıyı değiştirmemesi gerektiğini düşünüyorum. Neden iki farklı sonuç alıyorum?


Düzenle: William Jackson 'ler Cevap Bunun bir mysql özelliği olduğunu söyler: çıkış biçimi, çıkışın yeniden yönlendirilip yönlendirilmediğine bağlıdır. Bu, sorumu cevaplamıyor. MySQL çıktının yönlendirilip yönlendirilmediğini nasıl 'biliyor'? Yeniden yönlendirme yalnızca çıktıyı almakla kalmaz ve bir yere de yeniden yönlendirir mi? MySQL için görünmez mi olmamalı?


Ekle -t mysql komutunuzu işaretleyin :)
spencer.sm

Yanıtlar:


12

Düzenle: Bundan emin olamıyorum. mysql yapar, ama kullanıyor olabilir isatty(3) olup olmadığını belirlemek STDOUT bir terminaldir veya değildir ve çıktının buna göre değiştirilmesi.

Düzenleme 2: mysql komut satırı aracı kesinlikle kullanır isatty(). Kaynak kodunu okuyabilirsiniz.

Bunun bazı güzel örnekleri var (olmasa da) C (over Overflow'ta):


Sorunuzu cevaplamak için, "Neden?": Çünkü belgelerin dediği şey bu. Referans el kitabına bakın :

Etkileşimli olarak kullanıldığında, sorgu sonuçları bir ASCII tablo biçiminde sunulur. Birleşimsel olarak kullanıldığında (örneğin, bir filtre olarak), sonuç sekmeyle ayrılmış biçimde sunulur.

Bu kararın okunabilirlik için verildiğinden şüpheleniyorum. Etkileşimli olarak kullanıldığında, mysql bir insanın çıktıyı okuduğunu varsayabiliriz ve genellikle insanların bu satırlarla sınırlanmış verileri okuması daha kolaydır. Etkileşimli olmayan bir şekilde kullanıldığında, varsayımın başka bir programın çıktıyı tüketeceği ve sekme ile ayrılmış çıktıların programatik olarak tüketilmesi daha kolay olduğu varsayımıdır.

Bu varsayılanı geçersiz kılmak ve çıkışı yönlendirirken ASCII-tablo formatını almakla ilgileniyorsanız, --table ( -t ) komut satırı seçeneği :

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

1
Varsayılanı geçersiz kılmakla ilgilenmiyorum. Output Çıktıdaki farkın mysql'deki bir şeyden mi yoksa bashtaki bir şeyden mi kaynaklandığını bilmiyordum. Ama bu sorumu tam olarak cevaplamıyor. MySQL çıktılarına ne olduğunu nereden biliyor? Yönlendirme mysql görünmez olması gerektiğini düşünüyorum. Sormak istediğim şeyi daha net bir şekilde belirtmek için soruyu değiştirdim. + 1, yine de ben soruyu çok güzel cevaplamak için (görünüşe göre) gibiydi sormak için.
msh210

Ah, yanlış anladım. Cevabımı güncelledim.
William Jackson

Ah, bu yardımcı olur. Ama hala istediğim şey bu değil, ki "isatty nasıl" biliyor "? Yani, isatiye mysql denir. Stdout'un bir tty olup olmadığı mysql'de değil, bash'taki yaşamın bir gerçeğidir. MySQL bashta neler olup bittiğini nasıl biliyor? Bash içindeki şeylerin mysql için görünmez olacağını düşünürdüm.
msh210

1
Stdout bir dosya tanıtıcısı ve bash kullanabilirsiniz isatty() diskteki bir tty'ye veya bir dosyaya işaret edip etmediğini belirlemek için kullanılan diğer programlarla aynı. isatty() OS tarafından sağlanır, bash değil.
William Jackson

Ah! Bu şimdi çok mantıklı geliyor. Teşekkürler.
msh210
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.