Existem duas maneiras de interpretar esta questão - parece que você quer sobrescrever o que já foi escrito no terminal com algo diferente - o que é facilmente feito - ou então você quer alimentar programaticamente a entrada atual do shell interativo. .
O problema é que essas questões acabam significando duas coisas muito diferentes. Um erro que muitas pessoas fazem (uma que eu certamente fiz de qualquer maneira - repetidamente) é igualar os caracteres visuais impressos na tela do terminal com a entrada digitada no teclado como um e o mesmo. Na verdade, porém, o teclado é uma coisa muito mais simples de lidar do que a saída na tela - há muito trabalho entre os dois para transformar o primeiro no segundo. A impressão no terminal é uma conveniência - e geralmente fica.
Se você quiser alimentar a entrada para o shell, escrever na tela provavelmente não ajudará você. Você pode fazer isso, é claro, emitindo uma seqüência de escape padrão VT102 + para mover uma linha terminal poderia parecer:
printf '3[A'
... mas se você fizer isso não parecerá que muita coisa aconteceu - e isso é porque o shell não está lendo isso - está escrevendo no mesmo lugar que você está. Você pode fazer:
printf '3[A'; cat
... para realmente ver o que ele faz, porque cat
impedirá que o shell desenhe imediatamente um novo prompt. Você pode (provavelmente) adicionar um parâmetro numérico entre o [
bracket e o A
para várias linhas. Você pode descer com B
, à esquerda com D
e à direita com C
. Salvar a saída de tput
como chamado com as sequências termcap
que você pode encontrar em man termcap
para variáveis nomeadas geralmente é o caminho que as pessoas usam - e com razão. Terminais são coisas engraçadas.
Se você quiser se divertir de verdade, tente:
stty raw isig -echoctl; cat >/dev/null
Em um emulador de terminal xterm
-compatible (fornecido stty
suporta -echoctl
- mas se não precisar disso, de qualquer forma) que basicamente permitiria que você andasse em toda a sua tela de terminal com as setas e digite sobre qualquer um dos textos lá. Mas nada disso importa muito porque você está sobrescrevendo a tela - a casca não se importa com isso.
Se você quiser afetar um shell, você deve falar com o seu stdin. Um shell interativo normalmente não ouve muito o que você tem a dizer nessa frente, a menos que você o diga de antemão - quando você o chama. Caso contrário, apenas ouvirá o teclado - é o que é para (ou melhor, mais corretamente, o teclado é o stdin) . Mas você tem opções.
Uma boa maneira de fazer o script de uma entrada do shell interativo é atrasá-lo. Por exemplo, você pode obter um prompt fictício - que não fará nada além de aceitar entrada de teclado e ecoar para stderr
como:
sh -niv 2>&1 >/dev/null | ...
Também não precisa ser seu /bin/sh
- ele funcionará bem para bash
ou o que for. bash
fará todo o material típico de readline
- mesmo histórico de comando e $PS1
- mas executará -n
e -v
imprimem toda a entrada no canal. Você pode, então, canalizá-lo da maneira que quiser - talvez sobre outro canal para outro bash
depois de filtrar um pouco.
Você pode fazer muitas dessas coisas - mas não pode voltar no tempo. O último comando já terminou quando seu script é iniciado. Você não pode alterá-lo, mas pode organizá-lo para filtrar futuros comandos.