Menggaungkan kemajuan dari proses latar belakang tanpa membajak prompt

10

Pertimbangkan skrip sederhana hello:

#!/bin/bash

echo 'hello world!'

Sekarang dari bash jika saya mencoba menjalankan ini di latar belakang:

$ hello &
[1] 12345
$ hello world!
 <--- prompt is stuck here until I hit enter!
[1]+ Done
$  <--- prompt back to normal

Apa yang saya lebih suka lihat:

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$  <--- prompt normal the whole time

Bagaimana saya bisa mengubah perilaku?

Dave Johnson
sumber

Jawaban:

13

Ini masalah waktu: bash meluncurkan helloperintah di latar belakang, kemudian menampilkan prompt untuk membiarkan Anda memasukkan perintah baru, lalu perintah latar belakang mencetak beberapa output. Ketika Anda memasukkan baris perintah berikutnya (baris perintah kosong, jika Anda hanya menekan Enter), bash menampilkan pemberitahuan bahwa pekerjaan latar belakang telah selesai, maka prompt berikutnya.

Anda mungkin ingin bereksperimen dengan skrip yang dimulai dengan sleep 3dan mulai mengetik tepat setelah meluncurkan skrip di latar belakang, untuk melihat apa yang terjadi pada kecepatan yang dapat Anda ikuti.

Anda dapat membuat bash segera memberi tahu Anda ketika pekerjaan latar belakang berakhir dengan mengatur notifyopsi set -b. Maka Anda akan melihat:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

Bash tidak menggambar ulang prompt dalam hal ini. Anda masih mengedit baris perintah pada baris prompt yang muncul sebelum pekerjaan latar belakang dicetak hello world!. Anda dapat menggambar ulang garis saat ini dengan menekan Esc 1 Ctrl+ L. Anda mungkin ingin mengikat perintah redraw-current-lineke kunci yang lebih nyaman; misalnya, agar Ctrl+ Lmenggambar ulang garis saat ini dan Ctrl+ Alt+ Lmenghapus layar, tambahkan baris berikut ke Anda ~/.inputrc:

"\C-l": redraw-current-line
"\e\C-l": clear-screen

Saya tidak tahu cara membuat bash menggambar ulang baris prompt secara otomatis. Zsh melakukannya secara default.

Gilles 'SANGAT berhenti menjadi jahat'
sumber