Mengapa menggunakan bash dan menangguhkan loop sementara, loop berhenti setelah dilanjutkan? Contoh singkat di bawah ini.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Saya akrab dengan sinyal, dan saya menduga ini mungkin merupakan perilaku alami bash di sini, tetapi saya ingin lebih memahami mengapa berperilaku dengan cara tertentu.
bash
shell
signals
background-process
bkzland
sumber
sumber
$?
pada pengembalian, dantrue
tidak demikian halnyatrue
. mungkin. kupikir.Jawaban:
Ini terlihat seperti bug di beberapa shell, berfungsi seperti yang diharapkan dengan ksh93 dan zsh .
Latar Belakang:
Kebanyakan shell tampaknya menjalankan loop sementara di dalam shell utama dan
Bourne Shell menangguhkan seluruh shell jika Anda mengetikkan ^ Z dengan shell non-login
bash hanya menangguhkan
sleep
dan kemudian meninggalkan loop sementara demi mencetak prompt shell barudash membuat perintah ini tidak dapat ditangguhkan
Dengan ksh93 , semuanya bekerja sangat berbeda:
ksh93 melakukan hal yang sama, ketika perintah dimulai pertama kali, tetapi seperti
sleep
buitin di ksh93, ksh93 memiliki handler yang menyebabkan loop sementara untuk memotong shell utama dan kemudian menunda pada saat Anda mengetikkan ^ Z.Jika Anda dalam tipe ksh93 nanti
fg
, anak bercabang yang masih menjalankan loop dilanjutkan.Anda melihat perbedaan utama ketika membandingkan pesan kontrol pekerjaan dari bash dan ksh93:
laporan bash :
[1]+ Stopped sleep 1
tapi ksh93 melaporkan:
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh berperilaku mirip dengan ksh93
Dengan kedua shell, Anda memiliki satu proses (shell utama) selama Anda tidak mengetikkan ^ Z, dan dua proses shell setelah Anda mengetikkan ^ Z.
sumber
dash
benar - benar berakhir menangani sinyal ketika loop berakhir? dalam[d]?ash
kode sumber ada semua makro untuk INTON dan INTOFF tersebar di seluruh, dan biasanya sinyal yang diterima saat dalam keadaan INTOFF benar-benar ditangani pada (atau sekitar) INTON . Lagi pula, saya hanya ingin tahu karena saya pikir Anda tahu lebih baik - itu adalah jawaban yang bagus. Terima kasih.sleep 100
dapat ditangguhkan dan dilanjutkandash
, sehingga tampaknyadash
mengetahui tentang masalah dalam perintah ini dan secara selektif menonaktifkan kontrol pekerjaan.dash
kinerja di shell lain dengan menjatuhkan pemrosesan multibyte? dan ya,dash
memang mendukung kontrol pekerjaan, tetapi standar mengatakan shell interaktif harus mengabaikan TSTP, dan menjalankan loop sementara di shell saat ini di terminal interaktif tidak kurang dari shell interaktif daripada yang lain.Saya menulis salah satu penulis Bash tentang masalah ini, dan inilah jawabannya:
Jadi, jika ada yang ingin mengirimkan tambalan, gunakan alamat email yang ada di halaman manual.
sumber