Ecoando o 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?

Dave Johnson
fonte

Respostas:

13

É uma questão de tempo: o bash inicia o hellocomando em segundo plano, depois exibe um prompt para permitir que você insira um novo comando e, em seguida, o comando em segundo plano imprime alguma saída. Quando você insere a próxima linha de comando (uma linha de comando vazia, se você pressionar apenas Enter), o bash exibe a notificação de que o trabalho em segundo plano foi concluído e o próximo prompt.

Convém experimentar um script que comece com sleep 3e comece a digitar logo após iniciar o script em segundo plano, para ver o que está acontecendo em um ritmo que você pode seguir.

Você pode fazer com que o bash o notifique imediatamente quando um trabalho em segundo plano terminar, definindo a notifyopção com set -b. Então você verá:

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

O Bash não redesenha o prompt nesse caso. Você ainda está editando uma linha de comando na linha de prompt que apareceu antes da impressão do trabalho em segundo plano hello world!. Você pode redesenhar a linha atual pressionando Esc 1 Ctrl+ L. Você pode vincular o comando redraw-current-linea uma chave mais conveniente; por exemplo, ter Ctrl+ Lredesenhar a linha atual e Ctrl+ Alt+ Llimpar a tela, adicione as seguintes linhas ao seu ~/.inputrc:

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

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

Gilles 'SO- parar de ser mau'
fonte