The "hi" stream is printed in my prompt (in the
stdin
) and not in mystdout
Não, é não "impresso em seu stdin
".
Se você pressionou return, ele não tentaria executar hi
como um comando. É só que o% background echo
imprimiu hi
enquanto o cursor estava após o seu prompt.
Talvez você queira imprimir uma nova linha principal , como (sleep 1m && echo -e '\nhi' &)
. (Ajuste conforme necessário para o echo
no seu shell. Ou use printf
para portabilidade.)
Eu coloquei o &
dentro do subshell para "negar" o job em background, então você também evita o "ruído" de [1]+ Done
. Com &&
entre os comandos, &
se aplica a toda a cadeia de comandos compostos, por isso retorna imediatamente ao prompt do shell, em vez de esperar que sleep
saia como você obteria com (sleep 1; echo ... &)
Veja o que acontece (com atraso de 1 segundo):
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 algo, por isso não sabe que precisa reimprimir o seu pedido ou limpar o ecrã. 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 echo
terminar . Apenas fazendo echo "$PS1"
não irá reproduzir nenhum caractere já digitado. kill -WINCH $$
no meu sistema fica boquiaberto para reimprimir sua linha de prompt sem limpar a tela, deixando hi
em uma linha sozinha antes do prompt. SIGWINCH é enviado automaticamente quando o tamanho do WINdow é CHANGES, e a resposta do bash a ele faz o que queremos.
Pode funcionar com outros shells, mas eu não estou tentando fazer isso 100% portátil / POSIX. ( Infelizmente, isso só funciona no bash4.4, não no bash4.3, ou depende de alguma configuração que eu desconheç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 de shell que usa um argumento sleep e uma mensagem.
O bash 4.3 não reimprime seu prompt após o SIGWINCH, então isso não funciona lá. Eu tenho shopt -s checkwinsize
ativado em ambos os sistemas, mas só funciona no sistema Bash 4.4 (Arch Linux).
Se não funcionar, você pode tentar (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, que "funciona" se a linha de comando estiver vazia. (Também ignora a possibilidade de que PROMPT_COMMAND
esteja definido.)
Não existe uma maneira realmente simples de obter a saída do terminal para mixar com o que você estiver fazendo no seu terminal mais tarde, quando o timer disparar. Se você está no meio da rolagem de algo em less
, você pode facilmente perder isso.
Se você está procurando algo com resultados interativos, sugiro reproduzir um arquivo de áudio. por exemplo. com um player de linha de comando como mpv
(bom 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 que seu echo
abra um novo xterm / konsole / gnome-terminal. Use uma opção que mantenha o terminal aberto após o comando sair.