Mengapa (dan bagaimana) menggunakan cat pada file biner mengacaukan terminal?

8

Jika saya mengerti catmanualnya dengan benar:

menyatukan file dan mencetak pada output standar

catakan mengambil file sebagai argumen dan mencetaknya pada output standar.
Yang tidak saya dapatkan adalah jika saya menggunakan perintah:

cat img.png > copy.png

Saya akan mendapatkan 2 file png identik sementara jika saya hanya

cat img.png  

Saya memiliki semua kemungkinan terminal saya menjadi kacau dan salah menafsirkan apa yang saya ketik.

  • Bagaimana itu mungkin?
  • Nilai biner masih berupa data biner. Mengapa tidak hanya menunjukkan serangkaian 0 dan 1 atau interpretasi dari data biner di ASCII atau apa pun pengkodean di terminal?
  • Apakah perilaku ini juga dimungkinkan dengan catmemasukkan file teks yang berisi karakter aneh?
  • Haruskah mekanisme untuk mencegah perilaku ini seperti pernyataan coba {} catch {} harus diterapkan?
Kiwy
sumber
2
Terminal Anda tidak kacau. Itu dalam keadaan Anda memaksanya masuk dengan mengirimkannya karakter kontrol. Bahwa Anda tidak dapat menggunakannya lagi setelah mengubah negara mungkin bukan yang Anda inginkan, tetapi itu sepenuhnya akibat Anda tidak memahami konsekuensi dari tindakan Anda. Itu akan sama dengan mengganti warna font Anda menjadi hijau di pengolah kata dan mengatakan pengolah kata Anda kacau, hanya karena Anda tidak tahu bagaimana mengubahnya kembali ke font hitam tanpa misalnya keluar dari program.
Anthon
4
suatu resetperintah kadang-kadang bisa membantu, tetapi ini bukan solusi ajaib.
Ouki
Urutan aktual untuk mengetik adalah Control-J reset Control-J. Hampir selalu mengembalikan kewarasan.
Joshua
1
@ Joshua Dan apa perbedaan antara satu-satunya resetdan resetantara penekanan tombol Ctrl-J? Saya tidak dapat melihat (atau alasan untuk melakukan hal yang lebih rumit)
sintaks
1
Karena jika terminal dibiarkan dalam mode RAW, Enter menghasilkan Ctrl-M, bukan Ctrl-J sehingga shell tidak melihat keystroke yang diperlukan untuk mengakhiri garis dan menjalankan perintah.
Joshua

Jawaban:

8

cat menggabungkan file yang diberikan sebagai argumen pada baris perintah ke output standar, ia membaca byte pada suatu waktu dan default tidak melakukan interpretasi dari byte yang dibaca.

Dalam contoh pertama Anda, Anda mengarahkan stdout ke file, itu sebabnya Anda mendapatkan file baru.

Dalam contoh kedua Anda byte ditulis ke terminal, dan itu adalah terminal yang menafsirkan urutan karakter sebagai urutan kontrol untuk terminal, ini sebabnya Anda mendapatkan perilaku yang tidak biasa pada terminal Anda. Ini tidak ada hubungannya dengan catitu, cattidak tahu apa yang akan Anda lakukan dengan output itu. Anda mungkin mengirimnya melalui pipa ke program lain untuk menginterpretasikan / memproses / mencetak atau memainkan "Bernyanyi di tengah hujan".

Jadi mengikuti filosofi unix,

lakukan satu hal, lakukan satu hal saja, tetapi lakukan dengan baik

cat jangan mencoba menebak apa yang Anda coba lakukan.

sunting 1 balasan ke komentar pertama @ kiwy di bawah ini.

Ya dan Tidak, izinkan saya menjelaskan,

Tidak, jika Anda catke terminal, karena itu (perangkat lunak terminal) mengirimkan output ke layar Anda atau menafsirkan urutan kontrol (itu meniru perangkat keras lama yaitu perangkat teletype ).

tapi,

Ya jika Anda menggunakan pipa dan program penerima dapat menafsirkan karakter sebagai perintah.

lihat cat ini sebagai contoh, cat anyOldShellScript | bashbash akan menafsirkan apa yang didapat sebagai perintah.

X Tian
sumber
Apakah ini berarti bahwa jika Anda catfile biner yang mungkin berisi instruksi teks biasa seperti rm -rf .ini dapat ditafsirkan?
Kiwy
Saya menerima jawabannya meskipun saya tidak benar-benar mengerti mengapa terminal bisa kacau seperti ini jika saya mengetik seperti tolol pada keyboard saya, saya tidak pernah berhasil mendapatkan ini: D
Kiwy
Dan sekarang ironi ... hum
Kiwy
1
@Kiwy control karakter tidak ada di keyboard Anda, tetapi Anda dapat membuat echooutputnya jika Anda mau. Lihat stackoverflow.com/questions/5947742/… untuk cara melakukannya dan termsys.demon.co.uk/vtansi.htm untuk mengetahui beberapa hal yang mungkin
David Wilkins
@ Davidvidil hey terima kasih itu bagus, begitu banyak hal untuk dipelajari dan tidak ada waktu untuk itu :-(
Kiwy
2

Saya kira ini terjadi terutama karena karakter yang tidak dapat dicetak dengan kode di bawah 0x20. Itu adalah kode kontrol / pelarian khusus, yang digunakan untuk kunci seperti Backspace, Hapus dll.

UVV
sumber