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?
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.
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: 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.
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.
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
Réponses:
Bash a un crochet de précommande . Sorte de.
la source
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.[ "$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 pourquoilocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
est ici?history -1
imprime la dernière ligne de commande, avec un numéro d'historique devant. Le filtre sed supprime le numéro d'historique.Après cela, chaque fois que vous appuyez sur returnau lieu de simplement écrire,
\n
il se déplace au début de la ligne, saisit le texteclear;
, puis se déplace à la fin et entre\n
comme prévu.la source
clear
commandes avec des commandes.clear
est exécuté avant que la commande et la sortie de commande ne disparaissent. Cependant, dans le cas où avec invite, c'est le cas.clear;
à la sortie pour chaque extra\n
.bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
elle se déplacera au début, tapezls;#
commentant ce qui était là et exécutera lals
commande correctement! THX!à partir d'une question que j'ai posée aujourd'hui (avec crédit à la réponse de l'utilisateur @ aecolley ):
La
\C-m
simulation de la touche «Entrée», la\C-l
simulationCtrl+l
telle 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 + jcela 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.
la source
Pensez à effacer uniquement lorsque vous le souhaitez
Cela utilise un hook appelé
preexec
, fonctionne également avec zshEnsuite, 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
Et si vous voulez vraiment réinitialiser le terminal
remplacer le mot
clear
partput reset
tput
est facultatif mais accélère le processus de réinitialisationla source