Mantenha a entrada do bash na linha superior da tela

12

Gostaria de manter a bashentrada do prompt de comando na parte superior da tela, para que as saídas dos comandos mais antigos sejam empurradas para baixo em vez de para cima.

Como posso conseguir isso?

Tom Price
fonte
6
Então, se você é catum arquivo, a ordem seria invertida?
caos
Não, mas eu gostaria que os blocos de saída fossem empurrados para baixo #
Tom Price
1
bashNão é possível fazer isso, porque bashnem sequer sabemos sobre as posições da tela: ele apenas grava em um arquivo de saída. Você precisaria de um emulador de terminal que saiba sobre basho prompt interativo para saber quando redefinir o cursor e quando rolar a janela.
chepner
Obrigado @chepner, estou revisando esse problema e seu comentário me fez olhar para fora do bash e começar a olhar para toda a pilha de displays. Eu quero permanecer nos consoles virtuais baseados em texto (ou seja, sem o X Windows), para evitar os emuladores de terminal por enquanto, mas, para as minhas sessões de GUI, certamente analisarei isso. No caso de alguém se depara com esta questão, o meu palpite é que tem a ver com tty e atualmente estou olhando aqui para inspiração ... linusakesson.net/programming/tty
Tom Price

Respostas:

7

Adicione estas linhas ao seu .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashtem PROMPT_COMMAND , que mantém o comando será executado antes do bashprompt de exibição. Aqui, configuramos a função prompt_on_top, que usa tput para definir o cursor na parte superior da tela.

bashtambém tem uma maneira de executar um comando antes de executar qualquer comando, usando trap para manipular o sinal DEBUG. Aqui nós configurá-lo para a função pre_cmd, que irá limpar a tela de idade, e não fazer nada se fez conclusão ( COMP_LINE não está vazia) ou comando executado em BASH_PROMPT.


Há uma limitação nessa abordagem: se a saída do comando for muito longa demais para uma tela, a saída será substituída pela prompt_on_topação. Nesse caso, você precisa canalizar a saída para um pager para ler a saída inteira.

cuonglm
fonte
1
Obrigado pela sua resposta bem explicada, há muito para eu ler e aprender. Testei seu script e, atualmente, ele efetivamente limpa a saída antiga da tela entre os comandos. Gostaria de manter as saídas anteriores na tela, abaixo do prompt, e colocá-las para que novas saídas sejam inseridas entre o prompt e a saída antiga, empurrando a saída antiga para baixo na tela.
26615 Tom Price
Para aqueles que chegam aqui por meio de uma pesquisa na web, esse código github.com/swirepe/alwaysontop também "mantém seu prompt do bash na parte superior da tela", além de algumas outras funções. Porém, não responde à pergunta original: as saídas de comando mais antigas são excluídas como no código do cuonglm.
WillC
Uma outra desvantagem dessa solução é que você não tem comentários sobre o comando que foi executado pela última vez. Ou seja, cat filemostrará o fileconteúdo, mas você não receberá um feedback imediato do comando exato executado. Idealmente, o prompt seria seguido com uma versão não expandida + expandida do comando executado, seguida da saída std.
psychoslave