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?
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.
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_COMMANDlocal 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.
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!
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.
Respostas:
O Bash possui um gancho de pré-comando . Tipo de.
fonte
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.[ "$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 quelocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
está aqui?history -1
imprime a última linha de comando, com um número de histórico na frente. O filtro sed retira o número do histórico.Depois disso, toda vez que você pressionar, em returnvez de apenas escrever,
\n
ele passará para o início da linha, digite o textoclear;
, depois vá para o final e digite\n
como esperado.fonte
clear
comandos com comandos.clear
é executado antes que o comando e a saída do comando não desapareçam. No entanto, no caso de pronto, ele faz.clear;
na saída para cada extra\n
.bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
ele irá para o início, digitels;#
comentar o que estava lá e execute ols
comando corretamente! THX!de uma pergunta que fiz hoje (com crédito para a resposta do usuário @ aecolley ):
A
\C-m
simulação da tecla 'Enter', a\C-l
simulaçãoCtrl+l
como está clara e\C-j
é "nova linha e recuo", então o comando está vinculando a tecla Enter a Ctrl + l & Ctrl + jque 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.
fonte