Beberapa alat antarmuka baris perintah mengembalikan konsol yang rusak ketika dibatalkan oleh CTRL+C
. Terkadang teks tidak terlihat, atau ada masalah grafis sampai saya menjalankan perintah reset
.
(Saya menggunakan bash, tetapi berharap itu tidak tergantung pada shell.)
Apakah efek ini memiliki nama? Apa yang menyebabkan ini, dan bagaimana pemrogram dapat mencegah ini dalam alat? Apakah ada strategi bagaimana masalah ini diatasi dalam bahasa pemrograman utama?
command-line
console
kill
crash
Jonas Stein
sumber
sumber
stty sane
untuk janggut kelabuJawaban:
Konsol kadang-kadang membutuhkan
reset(1)
(atau beberapastty(1)
perintah) karena keadaan terminal semu tidak berubah ketika beberapa proses (misalnya program dimulai oleh shell Anda) berakhir.Baca tty demystified .
(Saya menemukan penanganan pseudo-terminal dan pseudottys bagian tersulit dari Linux)
Program berperilaku baik yang berhubungan dengan terminal dan mengubah moda atau disiplin jalurnya harus berusaha keras untuk menghindari crash dan mengeluarkan panggilan yang sesuai (lihat termios (3) ) untuk menempatkan terminal dalam keadaan yang benar. BTW, perpustakaan seperti ncurses atau readline sangat membantu (tetapi Anda perlu memanggil rutin pembersihan mereka dengan tepat).
Lihat sinyal (7) dan keamanan sinyal (7) . Menghindari menabrak kode Anda sulit. Baca tentang perilaku tidak terdefinisi .
Solusi yang tidak sempurna bisa untuk mendefinisikan fungsi shell yang menjalankan program Anda kemudian melakukan
reset
(yang kadang-kadang bisa tidak tepat).sumber
reset
dapat menghasilkanstty
pengaturan yang berbeda dari yang asli.stty -a > /tmp/test1
di bash lalu perintah, yang saya batalkan. Warna terminal sekarang merah.stty -a > /tmp/test2
tapitest1
dantest2
persis sama.Menanggapi masalah ini tidak sepenuhnya bebas shell. Di zsh, ada
ttyctl
builtin, yang dapat "membekukan" atau "mencairkan" mode tty. Saya tidak berpikir ada yang setara di bash. Thesetty
perintah dalam tcsh melakukan hal yang sama, tetapi lebih fine-grained: Anda dapat membekukan pengaturan individu.Membekukan mode tty hanya berarti bahwa zsh akan mengingat mode saat ini, dan jika beberapa anak di masa depan mengubahnya, mode tersebut akan dipulihkan ketika anak ditangguhkan atau berakhir.
Ini akan melindungi Anda dari beberapa efek buruk dari program yang macet atau gagal membersihkan terminal. Anda harus ingat untuk mencairkan jika ingin melakukan perubahan
stty
, jika tidak, shell akan segera membatalkan apa pun yang Andastty
lakukan.reset
tidak lebih dari mengembalikanstty
mode, jadi Anda mungkin masih membutuhkannya kadang-kadang, tetapi tidak sering.sumber