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 hi
como um comando. É que o plano de fundo foi echo
impresso hi
enquanto 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 printf
para 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 sleep
para 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 echo
imprimiu 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 echo
conclusã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 hi
uma 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_COMMAND
definida).
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 echo
abrir um novo xterm / konsole / gnome-terminal. Use uma opção que mantém o terminal aberto após a saída do comando.