Saya telah menulis skrip shell untuk menguji API yang menyalin file dan menggemakan progresnya setelah masing-masing.
Ada tidur dua detik di antara setiap salinan, jadi saya ingin menambahkan kemampuan untuk menekan tombol apa saja untuk menjeda skrip untuk memungkinkan pengujian yang lebih dalam. Kemudian tekan tombol apa saja untuk melanjutkan.
Bagaimana saya bisa menambahkan ini dalam beberapa baris mungkin?
shell-script
blarg
sumber
sumber
sleep 10; notify-send hello
dan tekan CTRL + Z untuk berhenti,notify-send hello
jalankan. jika perintah kedua dijalankan, mengapa proses pertama dihentikan? setelah itu jika ketikfg
saya tidak bisa melihat sesuatu terjadi, yang jelas, karena perintah kedua sudah dijalankancmd; cmd; cmd;
itu seperti menuliscmd <newline> cmd <newline> ...
. Atau untuk skrip yang dapat Anda tulis( cmd; cmd; cmd; )
, itu akan berperilaku seperti skrip, karena subkulit yang dihasilkan oleh(
sleep 10
. ketika saya menekan CTRL + Z setelah 3 detik dan kembali setelah beberapa detik dan memperhatikan bahwa perintah tidur mati dalam waktu kurang dari 7 detik. yang berlawanan dengan apa yang Anda katakan, karena perintah nevers akan berhenti hanya berjalan di latar belakang.strace
dsleep
perintah dan menemukan bahwa panggilan sistem yang digunakan adalahnanosleep()
. Tampaknya menjadi tindakan khusus dari panggilannanosleep
sistem.restart_syscall()
memulai ulang panggilan sistem yang terputus dengan argumen waktu yang disesuaikan untuk memperhitungkan waktu yang telah berlalu (termasuk waktu di mana proses dihentikan oleh sinyal). Baca halaman manual itu: man7.org/linux/man-pages/man2/restart_syscall.2.htmlfg %1
atau latar belakang (ex:)bg %1
. (jika pekerjaan hanya memberikan 1 angka, yaitu hanya 1 proses yang ditangguhkan, seperti yang ditunjukkan dalam contoh kekacauan: hanya[1]+ stopped sleep 10
, Anda dapat menghilangkan%n
bagian tersebut. jika ada beberapa proses latar belakang (berjalan atau berhenti), Anda perlu menetapkan yang Anda inginkan dengan:%n
(mis:fg %2
memiliki% 2 resume di latar depan))Jika Anda hanya ingin menjeda skrip sementara tetap berada di dalam skrip maka Anda dapat menggunakan baca alih-alih tidur.
Kamu bisa menggunakan
read -t
untuk mengatur batas waktu untuk membacaread -n
untuk membaca satu karakter (secara efektif cukup tekan tombol apa saja) untuk melanjutkan skripKarena Anda belum memberikan kode apa pun, di bawah ini adalah contoh bagaimana kode itu dapat digunakan.
Jika q ditekan maka
read -n1
mencegah skrip dari melanjutkan sampai tombol ditekan.Ketika suatu tombol ditekan maka centang diatur ulang dan skrip berlanjut dalam loop seperti biasa.
Anda juga dapat menambahkan
stty -echo
bagian awal danstty echo
akhir untuk mencegah pengetikan mengacaukan hasil layarsumber
Dengan
dd
Anda dapat dengan andal membaca satu byte dari file. Denganstty
Anda dapat mengaturmin
sejumlah byte untuk memenuhi syarat terminal baca dantime
keluar dalam sepersepuluh detik. Kombinasikan keduanya dan Anda dapat melakukannya tanpasleep
sepenuhnya, saya pikir, dan biarkan batas waktu terminal baca bekerja untuk Anda:Itu adalah contoh kecil
while
loop yang saya coba-coba untuk Anda coba. Setiap dua detikdd
keluar dari percobaan membacastdin
- diarahkan dari/dev/tty
- danwhile
loop loop. Itu ataudd
tidak time-out karena Anda menekan tombol - dalam hal ini shell interaktif dipanggil.Berikut ini adalah uji coba - angka yang dicetak di kepala setiap baris adalah nilai dari variabel shell
$SECONDS
:sumber
stty sane
setelah mengubah pengaturan stty, saya mungkin salah tetapi sepertinya Anda tidak meresetnya di mana saja?s=$(stty -g </dev/tty)
. Segera setelah menelepondd
saya kemudian mengembalikannya denganstty "$s"
. Status terminal tidak peduli dengan subshell dan pengaturan itu tetap terlepas dari shell induknya.stty sane
belum tentu apa yang ingin Anda lakukan - lebih baik mengembalikan negara ke cara Anda menemukannya daripada menganggap negarasane
pada saat itu. Jika saya tidak mengembalikannya, semua itu adaecho
di mana-mana. Mengetahui hal itu adalah sebagian alasan mengapa saya datang sangat terlambat - jawaban Anda tidak ada di sini ketika saya mulai menguji.