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

22

Gostaria de configurar o bash para executar o clearcomando toda vez que digitar algum comando no terminal (antes de executar o meu comando). Como eu posso fazer isso?

Estou usando o Debian Linux.

sintagma
fonte
Você acha este tópico útil.
Thor
3
Apenas curioso: qual é o seu pedido para isso? Exceto quando estou depuração de programas com muita saída, eu normalmente quer manter, tanto quanto possível na tela para me ajudar a manter o controle de contexto que eu estou trabalhando.
Joe

Respostas:

22

O Bash possui um gancho de pré-comando . Tipo de.

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
Gilles 'SO- parar de ser mau'
fonte
Gilles: Eu colei o item acima em um terminal do konsole e a saída de cada comando que eu inseri posteriormente foi limpa antes que eu pudesse lê-lo. Estou esquecendo de algo? Além disso, o que acontece para isso (e a outra resposta abaixo) se eu chamar um script bash de várias linhas em que mais de uma linha (ou qualquer outra linha que não a última) gere resultados interessantes?
Joe
@ Joe Isso deve limpar a tela depois que você pressionar Enter, antes de executar o comando. Funciona assim para mim. O gancho preexec é executado para cada comando interativo, não importa se o comando é um comando interno ou externo ou vários comandos.
Gilles 'SO- stop being evil' em
1
@Joe você precisa adicionar esta linha abaixo, não faça nada se concluir que [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;o problema é que PROMPT_COMMAND está sendo executado e também está preso após o comando real; Também alguém pode me dizer por que local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;está aqui?
MageProspero
@JamesAndino history -1imprime a última linha de comando, com um número de histórico na frente. O filtro sed retira o número do histórico.
Gilles 'SO- stop be evil'
@JamesAndino Isso tornou o trabalho (e eu vejo Giles acrescentou que a sua resposta.)
Joe
6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Depois disso, toda vez que você pressionar, em returnvez de apenas escrever, \nele passará para o início da linha, digite o texto clear;, depois vá para o final e digite \ncomo esperado.

pressa
fonte
2
Uma nova linha faz com que o prompt seja impresso de qualquer maneira, portanto, deixar claro no prompt realiza a mesma coisa sem poluir o histórico de clearcomandos com comandos.
Jw013
2
@ jw013 A diferença é que, no meu caso, clearé executado antes que o comando e a saída do comando não desapareçam. No entanto, no caso de pronto, ele faz.
apressar
Eu gostaria que houvesse alguma maneira de fazer isso sem ter que modificar a própria linha de comando - tenho certeza de que isso seria interrompido de maneiras interessantes em comandos complexos ou com várias linhas, mas não consigo encontrar uma maneira melhor de fazer isso.
Jw013
@ jw013, você está certo, ele quebra para várias linhas. Ele insere clear;na saída para cada extra \n.
precisa saber é o seguinte
essa dica é muito boa thx !! Eu precisava vincular algum código específico ao F2, mas algumas vezes a linha possui algum comando digitado, mas não executado, portanto, com este exemplo: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""ele irá para o início, digite ls;#comentar o que estava lá e execute o lscomando corretamente! THX!
Potência de Aquário
2

de uma pergunta que fiz hoje (com crédito para a resposta do usuário @ aecolley ):

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

A \C-msimulação da tecla 'Enter', a \C-lsimulação Ctrl+lcomo está clara e \C-jé "nova linha e recuo", 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 segmento não. Além disso, isso não polui o histórico com comandos 'clear' em todos os outros comandos.

TRB
fonte
1
nota: se estiver usando over ssh, você deve executá-lo nesse ambiente ou ocorrer estranheza.
TRB 24/01
greate ele funciona no meu terminal ubuntu 16.04, obrigado, mas como funciona, você poderia fornecer um link ou alguma documentação, por favor?
Andrzej Rehmann