Je voudrais configurer bash pour exécuter la commande clear
chaque fois que je tape une commande dans le terminal (avant exécuter ma commande). Comment puis-je faire cela?
Jutilise Debian Linux.
Commentaires
- Vous trouvez ce fil utile.
- Juste curieux: quelle ' appliquez-vous pour cela? Sauf quand je ' m programmes de débogage avec beaucoup de sortie, je veux généralement en garder autant que possible à lécran pour maider à garder une trace du contexte I ' je travaille.
Réponse
Bash a un hook de précommande . En quelque sorte.
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
Commentaires
- Gilles: Jai collé ce qui précède dans un terminal konsole et la sortie de chaque commande que jai entrée par la suite a été effacée avant que je puisse le lire. Est-ce que je manque quelque chose? Aussi, que se passe-t-il pour cela (et lautre réponse ci-dessous) si jappelle un script bash multiligne où plus dune ligne (ou toute ligne autre que la dernière) génère des inter esting output?
- @Joe Cela devrait effacer lécran après avoir appuyé sur
Enter
, avant dexécuter la commande. Cela fonctionne comme ça pour moi. Le hook preexec est exécuté pour chaque commande interactive, peu importe ' que la commande soit une commande intégrée ou externe ou plusieurs commandes. - @ Joe, vous devez ajouter cette ligne ci-dessous ne rien faire si vous avez terminé
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
le problème est que PROMPT_COMMAND est en cours dexécution et également intercepté après la commande réelle; Quelquun peut-il aussi me dire pourquoilocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
est ici? - @JamesAndino
history -1
imprime la dernière ligne de commande, avec un numéro dhistorique devant. Le filtre sed supprime le numéro dhistorique. - @JamesAndino Cela la fait fonctionner (et je vois que Giles la ajouté à sa réponse.)
Réponse
bind "RETURN: "\e[1~clear; \e[4~\n""
Après cela, chaque fois que vous appuyez sur return au lieu décrire simplement \n
il se déplacera au début de la ligne, saisissez le texte clear;
, puis passez à la fin et saisissez \n
comme prévu.
Commentaires
- Une nouvelle ligne entraîne l’impression de l’invite de toute façon, donc mettre le clair dans l’invite accomplit la même chose sans polluer lhistorique des commandes avec des commandes
clear
. - @ jw013 La différence est que dans mon cas
clear
est exécuté avant que la commande et la sortie de la commande ne disparaissent '. Cependant, en cas dinvite, cest le cas. - Je souhaite quil y ait un moyen de le faire sans avoir à modifier la ligne de commande elle-même – je ' je suis sûr que ce serait casser de manière intéressante sur des commandes complexes ou multilignes, mais je ne peux ' trouver un meilleur moyen de faire cela.
- @ jw013, vous avez raison, il ne casse pas pour les lignes multiples. Il insère
clear;
dans la sortie pour chaque\n
supplémentaire. - cette astuce cest très bon merci !! Javais besoin de lier un code spécifique à F2, mais parfois la ligne a une commande que jai tapée mais pas exécutée, donc avec cet exemple:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
il se déplacera au début, tapezls;#
commentant ce qui sy trouvait, et exécutez la commandels
correctement! thx!
Réponse
à une question que jai posée aujourdhui (avec crédit à lutilisateur Réponse de @aecolley » ):
bind ""\C-m": "\C-l\C-j""
La simulation de \C-m
la touche « Entrée », la \C-l
simulant Ctrl+l
car elle « est claire et le \C-j
est « newline-and-indent », donc la commande lie la touche Entrée à Ctrl + l & Ctrl + j
qui 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. De plus, cela ne pollue pas lhistorique avec des commandes « clear » toutes les autres commandes.
Commentaires
- note: si vous utilisez via ssh, vous devez lexécuter dans cet environnement ou des bizarreries se produiront.
- greate it fonctionne sur mon terminal ubuntu 16.04, merci mais comment ça marche, pourriez-vous fournir un lien ou une documentation sil vous plaît?
Réponse
Nenvisagez deffacer que lorsque vous le souhaitez
cb4() { preexec () { clear } }
Cela utilise un hook appelé preexec
, confirmé fonctionne également avec zsh
Ensuite, toute session que vous souhaitez effacer automatiquement avant chaque commande que vous exécutez : cb4
Si vous êtes certain de toujours vouloir effacer dans tous les contextes
preexec () { clear }
Et si vous souhaitez réellement réinitialiser le terminal
remplacez le mot clear
par tput reset
tput
est facultatif mais accélère le processus de réinitialisation