Assumindo o caso mais simples (uma palavra curta, nenhuma quebra de linha, nenhuma preocupação em chegar ao final da tela com a rolagem), você poderia fazer isso
#!/bin/bash
SENTENCE=""
tput sc
while read word
do
SENTENCE="$SENTENCE $word"
tput rc
tput hpa 20
printf '%s\n' "$SENTENCE"
tput sc
done
Isso usa dois recursos de terminal que estão na maioria das descrições de terminal que você usaria:
- salva / restaura a posição do cursor (os parâmetros
sc
erc
) e - posição horizontal (o parâmetro
hpa
).
Você pode codificar as seqüências de escape correspondentes, às custas da legibilidade ...
A propósito, alguns podem sugerir o uso do escape de seta para cima, mas isso tem o mesmo problema de rolagem no final da tela, como também \e[F
( CPL
, que não está na descrição do seu terminal ).
Para mover horizontalmente, você pode usar o cursor à direita com um parâmetro, por exemplo,
tput cuf 20
que seria \e[20C
.
No final da pergunta, há comentários sobre \e[1a
, mas as sequências de escape ANSI são dependentes de maiúsculas e minúsculas, o que não é o mesmo que \e[1A
(que move o cursor para cima por uma linha). Isso pode ser o que você tinha em mente:
#!/bin/bash
SENTENCE=""
while read word
do
SENTENCE="$SENTENCE $word"
tput cuu1
tput hpa 20
printf '%s\n' "$SENTENCE"
done
que é mais fácil de ler do que
#!/bin/bash
SENTENCE=""
while read word
do
SENTENCE="$SENTENCE $word"
echo -en '\e[A'
echo -en '\e[20C'
echo "$SENTENCE"
done