เอาท์พุทที่แตกต่างกันเมื่อเปลี่ยนเส้นทาง


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

อัตราผลตอบแทน

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

แต่ทว่า

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

ให้ไฟล์fileที่มี

a b
1 0
2 1

(โดยที่แท็บอยู่ระหว่างอักขระตัวอักษรและตัวเลขในแต่ละบรรทัด)

ฉันคิดว่าการเปลี่ยนเส้นทางไม่ควรเปลี่ยนผลลัพธ์ ทำไมฉันถึงได้ผลลัพธ์ที่แตกต่างกันสองอย่าง


แก้ไข: คำตอบของWilliam Jacksonกล่าวว่านี่เป็นคุณสมบัติของ mysql: รูปแบบผลลัพธ์ขึ้นอยู่กับว่ามีการเปลี่ยนเส้นทางผลลัพธ์หรือไม่ แต่นี่ไม่ได้ตอบคำถามของฉัน mysql 'รู้' ว่าการส่งออกกำลังถูกเปลี่ยนเส้นทางอย่างไร? การเปลี่ยนเส้นทางไม่ใช่แค่เอาท์พุทและเอาล่ะเปลี่ยนเส้นทางไปที่อื่นหรือไม่? ไม่ควรล่องหนกับ mysql หรือ?


เพิ่มการ-tตั้งค่าสถานะคำสั่ง mysql ของคุณ :)
spencer.sm

คำตอบ:


13

แก้ไข:ฉันไม่สามารถมั่นใจได้ว่านี่เป็นวิธีการmysqlแต่ก็สามารถใช้isatty(3)เพื่อตรวจสอบว่าSTDOUTเป็นขั้วหรือไม่และการปรับเปลี่ยนผลลัพธ์ตาม

แก้ไข 2:เครื่องมือบรรทัดคำสั่งการใช้งานแน่นอนmysql คุณสามารถอ่านซอร์สโค้ดได้isatty()

มีตัวอย่างที่ดีของเรื่องนี้ (แม้ว่าจะไม่ได้อยู่C) ที่ Stack Overflow:


หากต้องการตอบคำถามของคุณ "ทำไม": เพราะนั่นคือสิ่งที่เอกสารอธิบาย ดูคู่มืออ้างอิง :

เมื่อใช้แบบโต้ตอบผลลัพธ์แบบสอบถามจะแสดงในรูปแบบตาราง ASCII เมื่อใช้แบบไม่โต้ตอบ (เช่นเป็นตัวกรอง) ผลลัพธ์จะแสดงในรูปแบบที่คั่นด้วยแท็บ

ฉันสงสัยว่าการตัดสินใจนี้ทำขึ้นเพื่อให้สามารถอ่านได้ เมื่อใช้แบบโต้ตอบmysqlสามารถถือว่ามนุษย์กำลังอ่านเอาต์พุตและโดยทั่วไปมนุษย์เราจะอ่านข้อมูลที่คั่นด้วยเส้นเหล่านั้นได้ง่ายขึ้น เมื่อใช้แบบไม่โต้ตอบสมมติฐานก็คือโปรแกรมอื่นกำลังใช้งานเอาต์พุตและเอาต์พุตที่คั่นด้วยแท็บนั้นง่ายต่อการใช้งานโดยทางโปรแกรม

หากคุณสนใจที่จะเอาชนะค่าเริ่มต้นนี้และรับรูปแบบตาราง ASCII เมื่อเปลี่ยนเส้นทางเอาต์พุตคุณสามารถใช้ตัวเลือกบรรทัดคำสั่ง--table( -t) :

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

1
ฉันไม่สนใจที่จะเอาชนะค่าเริ่มต้น ¶ฉันไม่ทราบว่าความแตกต่างในผลลัพธ์เป็นเพราะอะไรใน mysql หรือเป็นเพราะทุบตี แต่นี่ไม่ได้ตอบคำถามของฉันอย่างเต็มที่ mysql รู้ได้อย่างไรว่าเกิดอะไรขึ้นกับเอาต์พุตของมัน? ฉันคิดว่าการเปลี่ยนเส้นทางควรจะมองไม่เห็นกับ mysql ฉันแก้ไขคำถามให้ระบุชัดเจนยิ่งขึ้นว่าฉันหมายถึงอะไร +1 อย่างไรก็ตามสำหรับการตอบคำถามที่ฉันดูเหมือนจะถาม
msh210

อาฉันเข้าใจผิด ฉันปรับปรุงคำตอบของฉัน
วิลเลียมแจ็คสัน

อ่านั่นช่วยได้ แต่มันก็ยังไม่ใช่สิ่งที่ฉันต้องการซึ่งก็คือ "isatty 'รู้' ได้อย่างไร? นั่นคือ isatty ถูกเรียกโดย mysql ไม่ว่า stdout จะเป็น tty หรือไม่นั้นเป็นความจริงของชีวิตในการทุบตีไม่ใช่ใน mysql mysql รู้ได้อย่างไรว่าเกิดอะไรขึ้นในการทุบตี? ฉันจะคิดว่าสิ่งที่ทุบตีจะมองไม่เห็น mysql
msh210

1
Stdout เป็น file descriptor และbashสามารถใช้isatty()เหมือนกับโปรแกรมอื่น ๆ เพื่อตรวจสอบว่ามันชี้ไปที่ tty หรือไฟล์บนดิสก์ isatty()ให้บริการโดยระบบปฏิบัติการไม่ทุบตี
William Jackson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.