Komut istemi olmadan arka plan işleminden ilerleme yankılanması


10

Basit komut dosyasını düşünün hello:

#!/bin/bash

echo 'hello world!'

Şimdi bash dan bu arka planda çalıştırmak çalışırsanız:

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

Ne görmeyi tercih ederim:

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

Davranışı nasıl değiştirebilirim?

Yanıtlar:


13

Bu bir zamanlama meselesidir: bash hellokomutu arka planda başlatır , ardından yeni bir komut girmenize izin vermek için bir komut istemi görüntüler, ardından background komutu bazı çıktılar yazdırır. Bir sonraki komut satırını (boş bir komut satırı, yalnızca düğmesine basarsanız Enter) girdiğinizde , bash arka plan işinin bittiğine dair bildirimi, ardından bir sonraki istemi görüntüler.

sleep 3Takip edebileceğiniz bir hızda neler olduğunu görmek için, komut dosyasını arka planda başlattıktan hemen sonra başlayan ve yazmaya başlayan bir komut dosyasını denemek isteyebilirsiniz .

notifySeçeneği ayarlayarak bir arka plan işi sona erdiğinde bash'ı hemen bilgilendirebilirsiniz set -b. Sonra göreceksiniz:

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

Bash bu durumda istemi yeniden çizmez. Hala arka plan işi yazdırılmadan önce görüntülenen bilgi istemi satırında bir komut satırı düzenliyorsunuz hello world!. Esc 1 Ctrl+ Düğmesine basarak geçerli satırı yeniden çizebilirsiniz L. Komutu redraw-current-linedaha uygun bir anahtara bağlamak isteyebilirsiniz ; örneğin, geçerli satırı Ctrl+ Lyeniden çizmek ve Ctrl+ Alt+ Lekranı temizlemek için şu satırları ekleyin ~/.inputrc:

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

Bash istemi satırını otomatik olarak yeniden çizmenin bir yolunu bilmiyorum. Zsh bunu varsayılan olarak yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.