Eco di avanzamento da un processo in background senza richiesta di dirottamento


10

Considera lo script semplice hello:

#!/bin/bash

echo 'hello world!'

Ora da bash se provo a eseguire questo in background:

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

Quello che preferirei vedere:

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

Come posso cambiare il comportamento?

Risposte:


13

È una questione di tempistica: bash avvia il hellocomando in background, quindi visualizza un prompt che consente di immettere un nuovo comando, quindi il comando in background stampa un output. Quando si immette la riga di comando successiva (una riga di comando vuota, se si preme semplicemente Enter), bash visualizza la notifica del completamento del processo in background, quindi il prompt successivo.

Potresti voler sperimentare uno script che inizia con sleep 3e iniziare a digitare subito dopo aver avviato lo script in background, per vedere cosa sta succedendo a un ritmo che puoi seguire.

Puoi fare in modo che bash ti avvisi immediatamente quando termina un lavoro in background impostando l' notifyopzione con set -b. Quindi vedrai:

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

Bash non ridisegna il prompt in questo caso. Stai ancora modificando una riga di comando sulla riga del prompt visualizzata prima della stampa del processo in background hello world!. È possibile ridisegnare la riga corrente premendo Esc 1 Ctrl+ L. Potresti voler associare il comando redraw-current-linea una chiave più comoda; per esempio, per avere Ctrl+ Lridisegnare la riga corrente e Ctrl+ Alt+ Lcancellare lo schermo, aggiungi le seguenti righe al tuo ~/.inputrc:

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

Non conosco un modo per fare in modo che Bash ridisegni automaticamente la riga del prompt. Zsh lo fa di default.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.