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 quelocal 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, digitels;#
comentando o que estava lá e execute o comandols
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