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.


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: 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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.