Saya ingin melakukan perintah 10 detik, dan menjalankannya di latar belakang (sehingga menghilangkan watch
?). Semua jawaban menunjukkan sesuatu seperti yang berikut ini, tetapi ini akan berlangsung 11 hingga 14 detik. Bagaimana ini bisa dicapai?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Jawaban:
Bagaimana tentang:
ETA: Dengan semua komentar, alternatif, dan subkulit untuk perlindungan ekstra, yang terlihat jauh lebih rumit daripada awalnya. Jadi, sebagai perbandingan, inilah yang terlihat sebelum saya mulai mengkhawatirkan
wait
ataukill
, dengan mereka$!
dan kebutuhan akan isolasi:Sisanya benar-benar hanya untuk saat Anda membutuhkannya.
sumber
$!
: "Perluas ID proses pekerjaan yang paling baru ditempatkan di latar belakang," dan bashsleep
tidak ditempatkan di latar belakang, jadi tidak, itu tidak akan terjadi. :)Anda dapat melakukan sesuatu seperti berikut di
bash
,zsh
, atauksh
:Inilah yang dikatakan
bash
manual$SECONDS
:Berikut ini contoh kerjanya:
sumber
SECONDS
lakukansleep "$((10-(($SECONDS-$start_time)%10)))"
. Anda harus melakukanstart_time=$SECONDS
sebelum loop.SECONDS
. Memunculkan sub-shell seperti dalam edit terbaru Anda, juga harus menghindari masalah ini.while true
pengulangan, saya tidak menemukan kondisi shell yang diharapkan untuk bertahan. Membungkus lingkaran seperti itu dalam konteksnya sendiri biasanya merupakan praktik terbaik. Dalam situasi seperti itu, saya akan lebih peduli untuk melakukannyatrap
demi$SECONDS
demi demi, meskipun.Hanya BASH - Anda juga dapat menghitung waktu yang dihabiskan oleh perintah Anda dan kurangi dari 10:
Dari BASH man:
sumber