Tại sao (và làm thế nào) đã sử dụng con mèo trên các tệp nhị phân làm rối thiết bị đầu cuối?


8

Nếu tôi hiểu cathướng dẫn sử dụng một cách chính xác:

nối các tập tin và in trên đầu ra tiêu chuẩn

catsẽ lấy các tệp làm đối số và in chúng trên đầu ra tiêu chuẩn.
Những gì tôi không nhận được là nếu tôi sử dụng lệnh:

cat img.png > copy.png

Tôi sẽ nhận được 2 tệp png giống hệt nhau trong khi tôi chỉ

cat img.png  

Tôi có tất cả cơ hội rằng thiết bị đầu cuối của tôi bị rối và giải thích sai những gì tôi gõ.

  • Làm thế nào mà có thể?
  • Giá trị nhị phân vẫn là dữ liệu nhị phân. Tại sao nó không chỉ đơn giản hiển thị một chuỗi 0 và 1 hoặc việc giải thích các dữ liệu nhị phân đó trong ASCII hoặc bất kỳ mã hóa nào trong thiết bị đầu cuối là gì?
  • Có phải hành vi này cũng có thể bằng cách nhập catmột tệp văn bản chứa các ký tự lạ?
  • Có nên thực hiện một cơ chế để ngăn chặn hành vi này như thử câu lệnh {} Catch {} không?

2
Thiết bị đầu cuối của bạn không bị rối tung. Đó là trong trạng thái bạn buộc nó vào bằng cách gửi cho nó các ký tự điều khiển. Rằng bạn không thể sử dụng nó nữa sau khi thay đổi trạng thái có thể không phải là điều bạn muốn, nhưng đó hoàn toàn là kết quả của việc bạn không hiểu hậu quả của hành động của mình. Điều đó cũng giống như chuyển màu phông chữ của bạn sang màu xanh lục trong trình xử lý văn bản và nói rằng trình xử lý văn bản của bạn bị rối, chỉ vì bạn không biết cách chuyển nó trở lại phông chữ màu đen mà không cần thoát khỏi chương trình.
Anthon

4
một resetlệnh đôi khi có thể giúp đỡ, nhưng đây không phải là giải pháp kỳ diệu.
Ouki

Trình tự thực tế để gõ là Control-J reset Control-J. Hầu như luôn khôi phục sự tỉnh táo.
Joshua

1
@Joshua Và sự khác biệt giữa phím bấm đơn resetresetphím Ctrl-J là gì? Tôi không thể thấy bất kỳ (cũng không có lý do nào để đi theo cách phức tạp hơn)
cú pháp

1
Bởi vì nếu thiết bị đầu cuối bị bỏ lại ở chế độ RAW, Enter sẽ tạo Ctrl-M thay vì Ctrl-J để shell không thấy tổ hợp phím cần thiết để kết thúc một dòng và chạy lệnh.
Joshua

Câu trả lời:


8

cat nối các tệp được cung cấp dưới dạng đối số trên dòng lệnh thành đầu ra tiêu chuẩn, nó đọc các byte tại một thời điểm như mặc định không thực hiện bất kỳ giải thích nào về các byte mà nó đọc.

Trong ví dụ đầu tiên của bạn, bạn đang chuyển hướng thiết bị xuất chuẩn sang một tệp, đó là lý do tại sao bạn nhận được một tệp mới.

Trong ví dụ thứ hai của bạn, các byte được ghi vào thiết bị đầu cuối và đó là thiết bị đầu cuối đang diễn giải các chuỗi ký tự là chuỗi điều khiển cho thiết bị đầu cuối, đây là lý do tại sao bạn có hành vi bất thường trên thiết bị đầu cuối của mình. Nó không có gì để làm catnhư vậy, catkhông biết bạn sẽ làm gì với đầu ra của nó. Bạn có thể gửi nó qua một đường ống đến một chương trình khác để diễn giải / xử lý / in hoặc chơi "Hát trong mưa".

Vì vậy, theo triết lý unix,

làm một việc, làm một việc duy nhất, nhưng làm tốt

cat không nên cố gắng đoán thứ hai những gì bạn đang cố gắng làm.

chỉnh sửa 1 trả lời bình luận đầu tiên của @ kiwy bên dưới.

Có và Không, hãy để tôi giải thích,

Không, nếu bạn catđến một thiết bị đầu cuối, bởi vì nó (phần mềm đầu cuối) đang gửi đầu ra đến màn hình của bạn hoặc diễn giải các chuỗi điều khiển (nó đang mô phỏng một phần cứng cũ, tức là một thiết bị teletype ).

nhưng,

Có nếu bạn cat vào một ống và chương trình nhận có thể hiểu các ký tự là các lệnh.

Hãy xem con mèo này làm ví dụ, cat anyOldShellScript | bashbash sẽ diễn giải những gì nó nhận được dưới dạng các lệnh.


điều đó có nghĩa là nếu bạn catmột tệp nhị phân có thể chứa trong hướng dẫn văn bản đơn giản như thế rm -rf .này có thể được giải thích?
Kiwy

Tôi chấp nhận câu trả lời mặc dù tôi không thực sự hiểu tại sao thiết bị đầu cuối có thể bị rối như thế này nếu tôi gõ như ngu ngốc trên bàn phím của mình, tôi không bao giờ quản lý để có được điều này: D
Kiwy

Và bây giờ thật trớ trêu ... hum
Kiwy 13/03/2016

1
Các ký tự điều khiển @Kiwy không tồn tại trên bàn phím của bạn, nhưng bạn có thể tạo echođầu ra cho chúng nếu bạn chọn. Xem stackoverflow.com/questions/5947742/ trên để biết cách thực hiện và termsys.demon.co.uk/vtansi.htmlm để biết một số điều có thể
David Wilkins

@DavidWilkins hey cảm ơn thật tuyệt, thật nhiều điều để học và không có thời gian cho điều đó :-(
Kiwy

2

Tôi đoán điều này xảy ra chủ yếu là do các ký tự không in được với mã dưới 0x20. Đó là các mã điều khiển / thoát đặc biệt, được sử dụng cho các khóa như Backspace, Xóa, v.v.

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.