Posso configurar o bash para executar “ clear ” antes de cada comando digitado no console?

Eu gostaria de configurar o bash para executar clear o comando toda vez que digitar algum comando no terminal (antes executando meu comando). Como posso fazer isso?

Estou usando o Debian Linux.

Comentários

  • Você encontra este tópico é útil.
  • Apenas curiosidade: o que ' você aplica para isso? Exceto quando eu ' m depurando programas com muitos resultados, geralmente quero manter o máximo possível na tela para me ajudar a acompanhar o contexto I ' estou trabalhando.

Resposta

O Bash tem um gancho de pré-comando . Mais ou menos.

preexec () { clear } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don"t cause a preexec for $PROMPT_COMMAND local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning preexec "$this_command" } trap "preexec_invoke_exec" DEBUG 

Comentários

  • Gilles: Eu colei o acima em um terminal konsole e a saída de cada comando que eu digitei subsequentemente foi apagada antes que eu pudesse ler. Estou faltando alguma coisa? Além disso, o que acontece com isso (e a outra resposta abaixo) se eu invocar um script bash de várias linhas onde mais de uma linha (ou qualquer linha diferente da última) gera inter esting output?
  • @Joe Isso deve limpar a tela depois de pressionar Enter, antes de executar o comando. Funciona assim para mim. O gancho preexec é executado para cada comando interativo, ele ' não importa se o comando é interno ou externo ou muitos comandos.
  • @ Joe, você precisa adicionar esta linha abaixo de não fazer nada se estiver completo [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return; o problema é que PROMPT_COMMAND está sendo executado e também preso após o comando real; Além disso, alguém pode me dizer por que local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; está aqui?
  • @JamesAndino history -1 imprime a última linha de comando, com um número de histórico na frente. O filtro sed remove o número do histórico.
  • @JamesAndino Isso fez com que funcionasse (e vejo que Giles o adicionou à sua resposta).

Resposta

bind "RETURN: "\e[1~clear; \e[4~\n"" 

Depois disso, toda vez que você pressionar return em vez de apenas escrever \n ele se moverá para o início da linha, insira o texto clear;, mova para o final e insira \n conforme o esperado.

Comentários

  • Uma nova linha faz com que o prompt seja impresso de qualquer maneira, portanto, colocar o clear no prompt realiza a mesma coisa sem poluir o histórico de comandos com clear comandos.
  • @ jw013 A diferença é que no meu caso clear é executado antes do comando e a saída do comando não ' t desaparece. No entanto, no caso do prompt, ele faz.
  • Eu gostaria que houvesse alguma maneira de fazer isso sem ter que modificar a linha de comando em si – ' tenho certeza de que isso seria interromper de maneiras interessantes em comandos complexos ou de várias linhas, mas não consigo ' encontrar uma maneira melhor de fazer isso.
  • @ jw013, você está certo, quebra para várias linhas. Insere clear; na saída de cada \n extra.
  • esta dica é muito bom thx !! Eu precisei vincular algum código específico a F2, mas algumas vezes a linha tem algum comando que eu digitei mas não executei, então com este ex .: bind "\"\\eOQ\":\"\e[1~ls;#\\n\"" ele irá para o início, digite ls;# comentando o que estava lá e execute o comando ls corretamente! thx!

Resposta

de uma pergunta que fiz hoje (com crédito para o usuário @aecolley” s answer ):

bind ""\C-m": "\C-l\C-j"" 

O \C-m simulando a tecla “Enter”, o \C-l simulando Ctrl+l conforme está claro e o \C-j é “newline-and-indent”, então o comando está vinculando a tecla Enter a Ctrl + l & Ctrl + j

que funciona no GNU bash, versão 3.2.53 (1) -release (x86_64-apple-darwin14) e as outras respostas neste tópico não. além disso, isso não polui o histórico com comandos “limpar” todos os outros comandos.

Comentários

  • observação: se estiver usando sobre ssh, você deve executá-lo naquele ambiente ou algo estranho acontecerá.
  • greate it funciona no meu terminal ubuntu 16.04, obrigado, mas como funciona, você poderia fornecer um link ou alguma documentação, por favor?

Resposta

Considere limpar apenas quando quiser

cb4() { preexec () { clear } } 

Isso usa um gancho chamado preexec, confirmado que também funciona com zsh

Então, qualquer sessão que você deseja limpar automaticamente antes de cada comando executado : cb4

Se você tiver certeza de que deseja sempre limpar em todos os contextos

preexec () { clear } 

E se você realmente deseja redefinir o terminal

substitua a palavra clear por tput reset

tput é opcional, mas acelera o processo de redefinição

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *