Saya memiliki skrip bash berikut:
# do some time consuming task here
read -p "Give me some input: " input
Sekarang seperti yang sudah Anda duga, jika pengguna menekan beberapa kunci acak selama "tugas yang memakan waktu", input yang tidak diinginkan juga diperhitungkan. Bagaimana saya menghapus stdin
(atau setidaknya mengabaikannya) sebelum saya mengeluarkan perintah baca?
Jawaban:
Saya tidak berpikir ada cara untuk menghapus stdin tetapi (dengan bash) Anda dapat membaca dan membuang apa yang ada sebelum Anda meminta input
Ini berbunyi stdin dan memiliki batas waktu 1 detik, namun gagal jika ada lebih dari 10.000 karakter di stdin. Saya tidak tahu seberapa besar Anda bisa membuat parameter nchars.
sumber
Di Bash 4, Anda dapat mengatur
-t
(batas waktu) menjadi0
. Dalam hal ini,read
segera kembali dengan status keluar yang menunjukkan apakah ada data yang menunggu atau tidak:sumber
Ini berbunyi beberapa baris input, jika pengguna secara tidak sengaja menekan masukkan beberapa kali
sumber
ini bekerja dengan baik untuk saya:
sumber
-e
dalam hal ini?Lampirkan tugas yang memakan waktu di blok yang stdinnya ditutup:
sumber
read
akan tetap membaca baris pertama yang dimasukkan selama# time consuming
tugas. Selanjutnya, jika skrip tidak mengandung perintah yang membaca stdin setelahread
maka baris yang belum dibaca dieksekusi pada terminal interaktif setelah skrip berakhir. Adakah yang berhasil menguji ini?Membangun berdasarkan jawaban christophjaeger, saya menambahkan
-s
agar input tidak bergema ke terminal dan-n
sehingga tidak menunggu baris baru.sumber
-n
adalah ide yang bagus, tetapi dua jawaban sebelumnya telah menyebutkannya. Dan mengingat bahwa inti dari latihan ini adalah membaca dan membuang apa pun yang diketik sebelumread
dieksekusi , saya tidak mengerti apa yang baik menurut Anda yang-s
akan dilakukan.sumber