Fazendo eco ao progresso de um processo em segundo plano sem prompt de seqüestro

10

Considere o script simples hello :

#!/bin/bash

echo 'hello world!'

Agora, do bash, se eu tentar executar isso em segundo plano:

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

O que eu preferiria ver:

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

Como posso mudar o comportamento?

    
por Dave Johnson 14.12.2014 / 23:36

1 resposta

13

É uma questão de tempo: o bash lança o comando hello em segundo plano e, em seguida, exibe um prompt para permitir que você insira um novo comando e, em seguida, o comando background imprime alguma saída. Quando você entra na próxima linha de comando (uma linha de comando vazia, se você simplesmente pressiona Enter ), o bash exibe a notificação de que a tarefa em segundo plano foi concluída, então o próximo prompt.

Você pode experimentar um script que comece com sleep 3 e comece a digitar logo após o lançamento do script em segundo plano, para ver o que está acontecendo em um ritmo que você possa seguir.

Você pode fazer o bash notificá-lo imediatamente quando um trabalho em background terminar, definindo a opção notify com set -b . Então você verá:

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

Bash não redesenha o prompt nesse caso. Você ainda está editando uma linha de comando na linha de prompt que apareceu antes que a tarefa em segundo plano fosse impressa em hello world! . Você pode redesenhar a linha atual pressionando Esc 1 Ctrl + L . Você pode querer ligar o comando redraw-current-line a uma chave mais conveniente; por exemplo, ter Ctrl + L redesenhando a linha atual e Ctrl + Alt + L limpe a tela, adicione as seguintes linhas ao seu ~/.inputrc :

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

Eu não sei como fazer o bash redesenhar a linha de prompt automaticamente. Zsh faz isso por padrão.

    
por 15.12.2014 / 00:39