Simbol hash (#) berubah menjadi simbol pound (£) setelah catting binary


42

Beginilah tampilan bash prompt saya.

bash prompt tua

Kemudian saya melakukan sesuatu yang mungkin tidak begitu pintar, saya lakukan cat /bin/bash. Dan sekarang bash prompt saya terlihat seperti ini, dengan simbol pound (£) alih-alih simbol hash (#). Bahkan memengaruhi simbol hash di dalam file, lihat di sini:

simbol pound dalam file

Adakah ide bagaimana mengembalikan ini?

Sunting: Pertanyaan ini tidak menanyakan "Bagaimana cara mengubah bash prompt saya?", Tetapi "bash prompt saya berubah dengan sendirinya, bagaimana saya bisa mengembalikannya?"

Lengkap.bashrc bagi yang berminat.



1
(Saya mengambil sedikit kebebasan untuk mengedit judul untuk memunculkan apa yang menyebabkan masalah. Edit atau kembalikan
sesukamu

9
Prompt, berkas dll masih mengandung kode karakter untuk #, \x23; hanya saja terminal itu sekarang mengartikannya \x23sebagai £.
deltab

4
Bagian yang menarik adalah bahwa "pound" adalah nama lain untuk simbol hash di Amerika (dan mungkin kebangsaan lain?) Bahasa Inggris ... =)
jpmc26

1
Program terminal apa ini dilakukan?
SnoringFrog

Jawaban:


102

Terminal menerima dan mengeksekusi sekelompok urutan karakter yang berbeda sebagai perintah kontrol. Sebagai contoh, semua gerakan kursor dilakukan dengan menggunakan itu. Beberapa kode membuat perubahan permanen, seperti mengatur warna, atau memberi tahu terminal untuk menggunakan set karakter alternatif. File executable dan file biner lainnya dapat berisi byte yang mewakili perintah-perintah itu, sehingga membuang file biner ke terminal dapat memiliki efek samping yang mengganggu. Lihat misalnya di sini untuk beberapa kode kontrol.

Latar belakang historis untuk ini adalah bahwa pada awalnya, terminal adalah perangkat yang agak bodoh dengan layar dan keyboard , dan mereka terhubung ke komputer yang sebenarnya melalui port serial. Sebelum itu, mereka adalah printer dengan keyboard. Tidak banyak protokol untuk memisahkan byte data dari byte perintah, jadi perintah diberikan ke terminal "inline". (Atau lebih tepatnya, kode pelarian dan karakter kontrol adalah protokolnya.) Orang mungkin berasumsi bahwa jika sistem dirancang hari ini, akan ada pemisahan yang lebih jelas antara data dan perintah.

Alih-alih hanya menutup jendela terminal atau mematikan emulator, Anda dapat menggunakan resetperintah , yang mengirimkan perintah serupa (atau beberapa) untuk mengatur ulang terminal kembali ke default waras.

Saya tidak tahu persis apa yang menyebabkan hash melakukan perubahan. (Tapi @ Random832 tidak, lihat jawabannya .) Saya lebih akrab dengan "set karakter alternatif", yang dapat mengubah semua karakter menjadi mesin terbang menggambar garis. Bahkan jika itu terjadi, input dari keyboard biasanya tidak berubah, jadi tulisan resetEntertetap berfungsi meskipun karakter ditampilkan sebagai sampah atau tidak sama sekali. (Dibandingkan dengan prompt Anda yang diubah menjadi banyak baris, Anda hanya mendapat efek kecil.)


1
Terima kasih atas penjelasan terperincinya. Saya akan memberikan suara segera setelah saya memiliki reputasi yang diperlukan.
lhermann

2
Ketika saya pertama kali mencoba cat /dev/urandomdi konsol instalasi Debian (resolusi layar yang membawa perangkat keras bata ke pikiran), saya pikir saya telah memicu overflow, dan dengan cepat menavigasi jalan saya ke tombol "abaikan semua perubahan, nyalakan kembali mesin". Sekarang saya tahu ini adalah "fitur yang dimaksudkan".
wizzwizz4

2
Ini adalah fitur yang dimaksudkan secara historis yang tidak diinginkan sekarang. Beberapa emulator terminal (semua baik) harus menonaktifkan karakter-set-switch legacy lolos ketika berjalan di lingkungan UTF-8, tetapi apakah mereka melakukannya, dan bagaimana Anda mengaktifkan opsi untuk melakukannya jika itu tidak default, didokumentasikan dengan buruk dan bervariasi.
R ..

78

Sebagai catatan, untuk menjawab mengapa ini terjadi dan bagaimana hal itu bisa diperbaiki tanpa menutup terminal (dan jika resetgagal):

Banyak terminal mendukung, sebagai fitur dari terminal VT220 yang mereka tiru, sejumlah set karakter pengganti nasional berdasarkan ISO 646 dan ISO 2022 . Secara khusus, itu sangat umum untuk beberapa alasan, bahkan jika yang lain tidak didukung, bagi mereka untuk mendukung set karakter Inggris, yang memiliki simbol mata uang pound pada posisi yang sama di mana ASCII memiliki tanda angka.

Jadi, ketika Anda mencetak file biner ke terminal, secara kebetulan output urutan ESC ( A[atau mungkin ESC ) Adan ^N] ke terminal. Ini dapat dibatalkan secara manual dengan mencetak urutan yang menetapkannya ke status normal:

printf '\e(B\e)0\x0f'

Saya menebak sesuatu seperti ini, tanpa mengetahui rinciannya. Terima kasih atas penjelasannya. Betapa hebatnya memiliki orang-orang seperti Anda di sekitar!
lhermann

1
Oh sayang, burung-burung camar menggantikan Ä dan Ö ... Dan Terminal pada OS X bahkan mendukung penggantian itu, pada 2016. Jika saya hanya punya upvote lain untuk diberikan.
ilkkachu

@ilkkachu beberapa terminal yang sebaliknya mendukung mereka (saya tahu Putty, dan saya pikir juga konsol Linux) menolak mereka ketika UTF-8 sedang digunakan, karena ISO 2022 mengatakan bahwa urutan lain (selain ESC % @) tidak boleh didukung saat di negara bagian yang digunakan untuk mendukung UTF-8. Jadi mereka mungkin menghilang pada akhirnya karena lebih banyak aplikasi dipaksa untuk menggunakan UTF-8 untuk menggambar garis [yang merupakan penggunaan fitur ini yang sebenarnya paling banyak digunakan, rangkaian karakter lainnya sebagian besar dimasukkan karena "bebas" ketika Anda memiliki mekanisme yang diterapkan ]
Random832

20
Sangat mudah untuk mengingat urutan pelarian ini: "A" adalah singkatan dari Inggris, "B" adalah singkatan dari "American": D
egmont

8
@egmont Saya menggali ini, ternyata, mereka ditugaskan secara berurutan dalam urutan mereka terdaftar dengan ISO. Yang pertama adalah versi referensi internasional lama [dengan ¤untuk $] adalah @, dan kemudian versi Inggris kebetulan masuk sebelum versi Amerika. itscj.ipsj.or.jp/itscj_english/index.html untuk daftar semuanya.
Random832

30

Tutup terminal dan buka yang baru.


19
Anda seharusnya tidak. Pertanyaannya valid. Mungkin seseorang akan menjelaskan mengapa ini terjadi secara rinci. Ini pasti lubang di Bash. £duduk di bawah tombol yang sama dengan #hanya dipanggil Alt. Entah bagaimana mereka Alttetap di Bash. Bagaimanapun, Anda dapat menunggu penjelasan yang tepat, atau jika Anda puas dengan jawaban saya, klik tanda centang untuk menerimanya.
Tomasz

1
Atau lebih tepatnya tidak di Bash, tetapi dalam program terminal. Saya mencoba yang sama pada baris perintah di luar GUI dan itu loop selamanya.
Tomasz

5
@ Xororous, pertanyaannya menyatakan bahwa masalah muncul ketika dia catmengedit /bin/bashke terminal.
ilkkachu

2
Random832 memberikan penjelasan yang baik tentang apa yang sebenarnya terjadi
lhermann

16
Ini berlebihan - bagaimana jika Anda memiliki beberapa status di sesi Anda yang ingin Anda pertahankan? Bagaimana jika itu konsol daripada terminal X? resetadalah alat yang tepat untuk pekerjaan itu.
pericynthion


9

stty sanesepertinya memperbaiki masalah juga reset.


7

Tidak perlu menutup dan membuka kembali atau mengatur ulang terminal Anda! Meskipun pengaturan ulang akan berfungsi, ini bukan cara yang tepat!

Anda hanya perlu menghapus / menghapus buffer terminal scrollback Anda . Untuk melakukannya, cukup gunakan perintah di bawah ini:

$ echo -ne '\0033\0143'

1
Apakah Anda memiliki penjelasan untuk mukjizat ini?
Tomasz

1
@ Thomas Ya, mate pasti. ketika -eberlaku, ia akan mengenali beberapa urutan yang dapat Anda baca dengan menjalankan man echo, salah satunya adalah \0NNNyang merupakan singkatan dari byte dengan nilai oktal NNN. Bahkan, Anda tidak perlu MENYETEL ulang sesi terminal Anda, Anda hanya perlu MEMBERSIHKAN buffer scrollback Anda. Dan perintah yang saya katakan akan melakukan pekerjaan yang diminta. Misalnya, jika Anda menggunakan MacOS X, ada bilah menu Edit di saat menggunakan terminal, dan ada opsi sebagai "Hapus Scrollback atau ⌥⌘K".
FarazX

5
Urutannya \033\143adalah ESC c, Reset ke Status Awal : "Setel ulang VT100 ke kondisi awal, yaitu, status yang dimilikinya setelah dinyalakan. Ini juga menyebabkan pelaksanaan uji-coba swa-daya dan sinyal INIT H untuk ditegaskan secara singkat. "
deltab

1
@deltab Saya lupa menyebutkan tentang ESC, terima kasih sejuta teman.
FarazX

1
@tomas Setiap kali Anda mencoba untuk menampilkan file yang tidak seharusnya ditampilkan - misalnya file biner - terminal akan bertindak aneh dan canggung. Banyak pengguna Linux melakukan reset, tetapi itu bukan pilihan terbaik karena tidak perlu mereset sesi terminal, dan membersihkan buffer scrollback semua diperlukan.
FarazX
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.