Saat berlari
top -n1 | head
kursor terminal menghilang. Berlari top -n1
membawanya kembali.
Diuji dalam gnome-terminal
dan tilix
di Ubuntu 16.04 dan CentOS 7.5.
Berjalan top -n1 | tail
tidak memiliki masalah ini, jadi saya pikir, sesuatu di akhir top
output membiarkan kursor muncul kembali yang tidak dieksekusi saat mencetak head
satu - satunya.
Apa yang menyebabkan ini dan bagaimana saya bisa mendapatkan kursor lebih elegan?
terminal
gnome-terminal
top
cursor
pLumo
sumber
sumber
tput cnorm
. ( via )Jawaban:
Saya tidak dapat membuat ulang perilaku ini di mana-mana, tetapi itu muncul di Ubuntu 18.04
Penting untuk memeriksa hex dumps dari output teratas:
Secara khusus, urutan mulai
0x1b5b3f
adalah urutan melarikan diri ANSI , yang secara efektif adalah meta-data untuk mengontrol hal-hal seperti posisi kursor dan warna teks.Secara khusus, menjelang awal baris pertama output atas, ada
ESC [?25l
, dan menjelang akhir baris terakhir adalahESC [?25h
. Sesuai halaman wikipedia, ini adalah kode terkait untuk menyembunyikan dan menampilkan kursor.Dengan memipakan
top -n1
output kehead
, terminal akan menerima perintah hide-cursor di awal, tetapi bukan perintah show-cursor di akhir, dan karenanya kursor akan tetap tidak terlihat sampai beberapa tindakan lain menyalakannya kembali.@MrShunz saran untuk menggunakan
-b
opsitop
ini sudah tepat. Opsi ini menonaktifkan semua urutan pelarian ANSI di output atas, alih-alih hanya mengeluarkan teks ASCII yang dapat dicetak. Tidak ada kursor yang akan dirugikan selama eksekusitop
dengan-b
:sumber
printf \\033[?25l
menyembunyikan danprintf \\033[?25h
mengungkapkan kursor lagi. Urutan melarikan diri lainnya[H
dan[2J
menghapus terminal (bandingkanclear | xxd
)Cara terbaik IMHO adalah
top
menggunakan mode "bets" (-b
bendera) yang dimaksudkan untuk digunakan dengan kasus penggunaan non-interaktif seperti pemipaan ke program lain atau ke file.Jadi ini
tidak akan meninggalkan shell tanpa kursor.
Adapun mengapa kursor menghilang ...
Karena
top
merupakan program interaktif, ia "mengacaukan" terminal untuk mengambil input, menggulir konten, dll, dan menyembunyikan kursor.Ketika mengakhiri itu harus mengembalikan kursor dan status tampilan yang ditemukan sebelum dipanggil, dan melakukannya dengan mengirimkan satu atau lebih kode kontrol ke terminal itu sendiri.
Dengan memipakan perintah melalui
head
, kode kontrol ini tidak akan melewati (head
mencetak hanya 10 baris pertama secara default, dan output dari keduanyatop
dan kode kontrol untuk mengembalikan keadaan terminal selalu> 10 baris).Bahkan, jika Anda memberikan
head
garis yang cukup untuk dicetak, kursor akan muncul!Sebagai contoh,
meninggalkan kursor di sistem saya.
sumber
-b
adalah cara untuk saya.