Puis-je configurer bash pour exécuter «clear» avant chaque commande tapée dans la console?

22

Je voudrais configurer bash pour exécuter la clearcommande chaque fois que je tape une commande dans le terminal (avant d'exécuter ma commande). Comment puis je faire ça?

J'utilise Debian Linux.

syntagme
la source
Vous trouvez ce fil utile.
Thor
3
Juste curieux: quelle est votre application pour cela? Sauf lorsque je débogue des programmes avec beaucoup de sortie, je veux généralement garder autant que possible à l'écran pour m'aider à garder une trace du contexte dans lequel je travaille.
Joe

Réponses:

22

Bash a un crochet de précommande . Sorte 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- arrête d'être méchant'
la source
Gilles: J'ai collé ce qui précède dans un terminal konsole et la sortie de chaque commande que j'ai ensuite entrée a été effacée avant de pouvoir la lire. Suis-je en train de manquer quelque chose? De plus, que se passe-t-il pour cela (et l'autre réponse ci-dessous) si j'appelle un script bash multi-lignes où plus d'une ligne (ou toute autre ligne que la dernière) génère une sortie intéressante?
Joe
@Joe Cela devrait effacer l'écran après avoir appuyé sur Enter, avant d'exécuter la commande. Cela fonctionne comme ça pour moi. Le hook preexec est exécuté pour chaque commande interactive, peu importe si la commande est une commande intégrée ou externe ou plusieurs commandes.
Gilles 'SO- arrête d'être méchant'
1
@Joe vous devez ajouter cette ligne ci-dessous ne faites rien si vous avez terminé [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;le problème est que PROMPT_COMMAND est en cours d'exécution et également piégé après la commande réelle; Quelqu'un peut-il aussi me dire pourquoi local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;est ici?
MageProspero
@JamesAndino history -1imprime la dernière ligne de commande, avec un numéro d'historique devant. Le filtre sed supprime le numéro d'historique.
Gilles 'SO- arrête d'être méchant'
@JamesAndino Cela l'a fait fonctionner (et je vois que Giles l'a ajouté à sa réponse.)
Joe
6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Après cela, chaque fois que vous appuyez sur returnau lieu de simplement écrire, \nil se déplace au début de la ligne, saisit le texte clear;, puis se déplace à la fin et entre \ncomme prévu.

se ruer
la source
2
Un retour à la ligne entraîne l'impression de l'invite de toute façon, donc la mise à zéro dans l'invite accomplit la même chose sans polluer l'historique des clearcommandes avec des commandes.
jw013
2
@ jw013 La différence est que dans mon cas clearest exécuté avant que la commande et la sortie de commande ne disparaissent. Cependant, dans le cas où avec invite, c'est le cas.
rush
Je souhaite qu'il y ait un moyen de le faire sans avoir à modifier la ligne de commande elle-même - je suis sûr que cela se briserait de manière intéressante sur des commandes complexes ou multilignes, mais je ne peux pas trouver de meilleur moyen de le faire.
jw013
@ jw013, vous avez raison, ça casse pour multi-lignes .. Il insère clear;à la sortie pour chaque extra \n.
Peter.O
cette astuce est très bonne thx !! J'avais besoin de lier du code spécifique à F2, mais parfois la ligne a une commande que j'ai tapée mais pas exécutée, donc avec cet exemple: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""elle se déplacera au début, tapez ls;#commentant ce qui était là et exécutera la lscommande correctement! THX!
Aquarius Power
2

à partir d'une question que j'ai posée aujourd'hui (avec crédit à la réponse de l'utilisateur @ aecolley ):

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

La \C-msimulation de la touche «Entrée», la \C-lsimulation Ctrl+ltelle qu'elle est claire et la \C-j«nouvelle ligne et le retrait», de sorte que la commande lie la touche Entrée à Ctrl + l et Ctrl + j

cela fonctionne sur GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin14) et les autres réponses sur ce fil ne le font pas. cela ne pollue pas non plus l'historique avec des commandes «clear» toutes les autres commandes.

TRB
la source
1
remarque: si vous utilisez over ssh, vous devez l'exécuter dans cet environnement ou une bizarrerie se produit.
TRB
greate cela fonctionne sur mon terminal ubuntu 16.04, merci mais comment ça marche, pourriez-vous fournir un lien ou de la documentation s'il vous plait?
Andrzej Rehmann
0

Pensez à effacer uniquement lorsque vous le souhaitez

cb4() {
  preexec () {
    clear
  }
}

Cela utilise un hook appelé preexec, fonctionne également avec zsh

Ensuite, toute session que vous souhaitez effacer automatiquement avant chaque commande que vous exécutez: cb4

Si vous êtes certain que vous voulez toujours effacer dans tous les contextes

preexec () {
  clear
}

Et si vous voulez vraiment réinitialiser le terminal

remplacer le mot clearpartput reset

tput est facultatif mais accélère le processus de réinitialisation

jasonleonhard
la source