Saya ingin menerapkan bilah kemajuan yang menunjukkan detik-detik yang telah berlalu di pesta. Untuk ini, saya perlu menghapus baris terakhir yang ditampilkan di layar (perintah "hapus" menghapus semua layar, tetapi saya hanya perlu menghapus garis bilah kemajuan dan menggantinya dengan informasi baru).
Hasil akhirnya akan terlihat seperti ini:
$ Elapsed time 5 seconds
Kemudian setelah 10 detik saya ingin mengganti kalimat ini (dalam posisi yang sama di layar) dengan:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
untuk menghindari panggilan seq :-)Kereta kembali dengan sendirinya hanya memindahkan kursor ke awal baris. Tidak masalah jika setiap baris keluaran baru setidaknya sepanjang baris sebelumnya, tetapi jika baris baru lebih pendek, baris sebelumnya tidak akan sepenuhnya ditimpa, misalnya:
Untuk benar-benar menghapus baris untuk teks baru, Anda dapat menambahkan
\033[K
setelah\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
sumber
\e[K
bukan\033[K
.\033[G
io\r
sebelumnya\033[K
meskipun jelas\r
jauh lebih sederhana. Juga invisible-island.net/xterm/ctlseqs/ctlseqs.html memberikan rincian lebih dari Wikipedia dan berasal dari pengembang xterm.Jawaban Derek Veit berfungsi dengan baik selama panjang garis tidak pernah melebihi lebar terminal. Jika tidak demikian, kode berikut akan mencegah keluaran sampah:
sebelum baris ditulis untuk pertama kali, lakukan
yang menyimpan posisi kursor saat ini. Sekarang kapan pun Anda ingin mencetak baris Anda, gunakan
untuk pertama-tama kembali ke posisi kursor yang disimpan, lalu bersihkan layar dari kursor ke bawah, dan terakhir tulis hasilnya.
sumber
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
daripadatput el
. Contoh @ Um digunakaned
(mungkin dia memperbaikinya setelah Anda berkomentar).Metode \ 033 tidak berhasil untuk saya. Metode \ r berfungsi tetapi tidak benar-benar menghapus apa pun, cukup letakkan kursor di awal baris. Jadi jika string baru lebih pendek dari yang lama, Anda dapat melihat teks sisa di akhir baris. Pada akhirnya tput adalah cara terbaik untuk pergi. Ini memiliki kegunaan lain selain hal-hal kursor ditambah itu datang pra-instal di banyak distro Linux & BSD sehingga harus tersedia untuk sebagian besar pengguna bash.
Berikut sedikit skrip hitung mundur untuk dimainkan:
sumber
Jika hasil kemajuan adalah multi baris, atau skrip sudah mencetak karakter baris baru, Anda dapat melompati baris dengan sesuatu seperti:
printf "\033[5A"
yang akan membuat kursor melompat 5 baris ke atas. Kemudian Anda dapat menimpa apa pun yang Anda butuhkan.
Jika itu tidak berhasil, Anda dapat mencoba
printf "\e[5A"
atauecho -e "\033[5A"
, yang seharusnya memiliki efek yang sama.Pada dasarnya, dengan escape sequence Anda dapat mengontrol hampir semua yang ada di layar.
sumber
tput cuu 5
, di mana 5 adalah jumlah baris (cuu
untuk naik,cud
turun).Gunakan karakter carriage return:
sumber
Dapat mencapainya dengan menempatkan kereta kembali
\r
.Dalam satu baris kode dengan
printf
atau dengan
echo -ne
sumber