Đầu ra khác nhau khi chuyển hướng


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

sản lượng

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

trong khi

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

mang lại một tập tin filechứa

a b
1 0
2 1

(trong đó một tab nằm giữa các ký tự chữ và số trên mỗi dòng).

Tôi nghĩ rằng chuyển hướng không nên thay đổi đầu ra. Tại sao tôi nhận được hai kết quả khác nhau?


Chỉnh sửa: Câu trả lời của William Jackson nói rằng đây là một tính năng của mysql: định dạng đầu ra phụ thuộc vào việc đầu ra có được chuyển hướng hay không. Điều này không trả lời câu hỏi của tôi, mặc dù. Làm thế nào để mysql 'biết' liệu đầu ra đang được chuyển hướng? Liệu chuyển hướng không chỉ mất đầu ra và, tốt, chuyển hướng nó ở đâu đó? Không nên vô hình với mysql?


Thêm -tcờ vào lệnh mysql của bạn :)
spencer.sm

Câu trả lời:


13

Chỉnh sửa: Tôi không thể chắc chắn đây là cách mysqlthực hiện, nhưng nó có thể được sử dụng isatty(3)để xác định xem có phải STDOUTlà thiết bị đầu cuối hay không và sửa đổi đầu ra cho phù hợp.

Chỉnh sửa 2: Công mysqlcụ dòng lệnh chắc chắn sử dụng isatty(). Bạn có thể đọc mã nguồn.

Có một số ví dụ hay về điều này (mặc dù không có C) tại Stack Overflow:


Để trả lời câu hỏi của bạn, "Tại sao?": Bởi vì đó là những gì tài liệu nói. Xem hướng dẫn tham khảo :

Khi được sử dụng tương tác, kết quả truy vấn được trình bày theo định dạng bảng ASCII. Khi được sử dụng không tương tác (ví dụ như bộ lọc), kết quả được trình bày ở định dạng được phân tách bằng tab.

Tôi nghi ngờ quyết định này được đưa ra để dễ đọc. Khi được sử dụng một cách tương tác, mysqlcó thể giả sử một con người đang đọc đầu ra và con người chúng ta thường dễ dàng đọc dữ liệu được phân định bởi các dòng đó. Khi được sử dụng không tương tác, giả định rằng một chương trình khác sẽ tiêu thụ đầu ra và đầu ra được phân định bằng tab sẽ dễ dàng hơn để tiêu thụ theo chương trình.

Nếu bạn quan tâm đến việc ghi đè mặc định này và nhận định dạng bảng ASCII khi chuyển hướng đầu ra, bạn có thể sử dụng tùy chọn dòng lệnh --table( -t) :

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

1
Tôi không quan tâm đến việc ghi đè mặc định. Tôi không biết liệu sự khác biệt về đầu ra là do thứ gì đó trong mysql hay là do thứ gì đó trong bash. Nhưng điều này không trả lời đầy đủ câu hỏi của tôi. Làm thế nào để mysql biết những gì đang xảy ra với đầu ra của nó? Tôi nghĩ rằng việc chuyển hướng sẽ vô hình với mysql. Tôi đã chỉnh sửa câu hỏi để nói rõ hơn những gì tôi muốn hỏi. Tuy nhiên, +1 để trả lời rất hay câu hỏi mà tôi (dường như) dường như đang hỏi.
msh210

À, tôi hiểu lầm rồi. Tôi cập nhật câu trả lời của tôi.
William Jackson

Ah, điều đó có ích. Nhưng nó vẫn không thực sự là những gì tôi muốn, đó là "làm thế nào để" biết "? Đó là, isatty được gọi bởi mysql. Cho dù stdout là một tty là một thực tế của cuộc sống trong bash, không phải trong mysql. Làm thế nào để mysql biết những gì đang xảy ra trong bash? Tôi nghĩ những thứ trong bash sẽ vô hình với mysql.
msh210

1
Stdout là một bộ mô tả tệp và bashcó thể sử dụng isatty()giống như bất kỳ chương trình nào khác để xác định xem nó đang trỏ đến một tty hay một tệp trên đĩa. isatty()được cung cấp bởi hệ điều hành, không phải bash.
William Jackson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.