O fluxo "oi" é impresso no meu prompt (no stdin) e não no meustdout
Não, é não "impresso na sua stdin".
Se você pressionasse return, ele não tentaria executar hicomo um comando. É que o plano de fundo foi echoimpresso hienquanto o cursor estava após o seu prompt.
Talvez você queira imprimir uma nova linha líder , como (sleep 1m && echo -e '\nhi' &). (Ajuste conforme necessário para oecho seu shell. Ou use printfpara portabilidade.)
Eu coloquei o &interior do subshell para "negar" o trabalho em segundo plano, para que você também evite o "ruído" de [1]+ Done. Com &&entre os comandos, &aplica-se a toda a cadeia composto de comando, assim que ele retorna para a direita janela de comandos para longe em vez de esperar sleeppara sair como você deseja obter com(sleep 1; echo ... &)
Aqui está o que acontece (com 1 segundo de atraso):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
O Bash não sabe que echoimprimiu alguma coisa, por isso não sabe que precisa reimprimir o prompt ou limpar a tela. Você pode fazer isso manualmente com control-L.
Você pode escrever uma função de shell que recebe o bash para reimprimir seu prompt após a echoconclusão . Apenas fazer echo "$PS1"não reproduzirá nenhum caractere já digitado. kill -WINCH $$no meu sistema, o bash obtém o reimprimir sua linha de prompt sem limpar a tela, deixando hiuma linha sozinha antes do prompt. O SIGWINCH é enviado automaticamente quando o tamanho do WINdow muda, e a resposta do bash faz o que queremos.
Pode funcionar com outras conchas, mas não estou tentando tornar este 100% portátil / POSIX. ( Infelizmente, isso só funciona no bash4.4, não no bash4.3, ou depende de alguma configuração da qual não conheço )
# bash4.4
peter@volta:~$ (sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
peter@volta:~$ ljlksjksajflasdf dfas # typed in 2 seconds
hi
peter@volta:~$ ljlksjksajflasdf dfas # reprinted by Bash because of `kill -WINCH`
Você pode facilmente agrupar isso em uma função shell que recebe uma mensagem de suspensão e uma mensagem de suspensão.
o bash 4.3 não reimprime seu prompt após o SIGWINCH; portanto, isso não funciona lá. eu tenhoshopt -s checkwinsize ativei nos dois sistemas, mas ele funciona apenas no sistema Bash 4.4 (Arch Linux).
Se não funcionar, você pode tentar o (sleep 2 && echo -e '\nhi' && echo "$PS1" &)que "funciona" se a linha de comando estiver vazia. (Ele também ignora a possibilidade PROMPT_COMMANDdefinida).
Não há uma maneira realmente limpa de fazer com que a saída do terminal se misture com o que você possa estar fazendo no seu terminal mais tarde, quando o timer disparar. Se você estiver no meio de rolar alguma coisaless , poderá facilmente perdê-la.
Se você estiver procurando algo com resultados interativos, sugiro que você reproduza um arquivo de áudio. por exemplo, com um jogador de linha de comando como mpv(belo fork do MPlayer2). Ou escolha um arquivo de vídeo para abrir uma nova janela.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Você pode querer echoabrir um novo xterm / konsole / gnome-terminal. Use uma opção que mantém o terminal aberto após a saída do comando.