Vorrei configurare bash per eseguire il comando clear
ogni volta che digito un comando nel terminale (prima eseguendo il mio comando). Come posso farlo?
Sto usando Debian Linux.
Commenti
- Trovi questo thread utile.
- Semplicemente curioso: cosa ' applichi per questo? Tranne quando ' m programmi di debug con molto output, di solito desidero rimanere il più possibile sullo schermo per aiutarmi a tenere traccia del contesto I ' sto lavorando.
Risposta
Bash ha un gancio precomando . Più o meno.
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
Commenti
- Gilles: ho incollato quanto sopra in un terminale konsole e loutput di ogni comando che ho successivamente inserito è stato cancellato prima che potessi leggerlo. Mi manca qualcosa? Inoltre, cosa succede per questo (e laltra risposta sotto) se invoco uno script bash multi-riga dove più di una riga (o qualsiasi riga diversa dallultima) genera inter esting output?
- @Joe Questo dovrebbe cancellare lo schermo dopo aver premuto
Enter
, prima di eseguire il comando. Funziona così per me. Lhook preexec viene eseguito per ogni comando interattivo, non ' importa se il comando è un comando integrato o esterno o molti comandi. - @ Joe devi aggiungere questa riga sotto non fare nulla se completo
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
il problema è che PROMPT_COMMAND viene eseguito e anche bloccato dopo il comando effettivo; Qualcuno può anche dirmi perchélocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
è qui? - @JamesAndino
history -1
stampa lultima riga di comando, con un numero di storia davanti. Il filtro sed rimuove il numero di cronologia. - @JamesAndino Questo lha fatto funzionare (e vedo che Giles lha aggiunto alla sua risposta.)
Risposta
bind "RETURN: "\e[1~clear; \e[4~\n""
Dopodiché ogni volta che premi Invio invece di scrivere \n
si sposterà allinizio della riga, inserisci il testo clear;
, quindi sposta alla fine e inserisci \n
come previsto.
Commenti
- Una nuova riga fa sì che il prompt venga stampato comunque, quindi mettere il clear nel prompt ha lo stesso risultato senza inquinare la cronologia dei comandi con
clear
comandi. - @ jw013 La differenza è che nel mio caso
clear
viene eseguito prima che il comando e loutput del comando ' scompaiano. Tuttavia, nel caso in cui il prompt lo faccia. - Vorrei che ci fosse un modo per farlo senza dover modificare la riga di comando stessa – Sono ' sono sicuro che sarebbe interrompere in modi interessanti su comandi complessi o multilinea ma non posso ' trovare un modo migliore per farlo.
- @ jw013, hai ragione, si interrompe per più righe .. Inserisce
clear;
nelloutput per ogni\n
. - questo suggerimento è molto buono grazie !! Avevo bisogno di associare un codice specifico a F2, ma alcune volte la riga ha dei comandi che ho digitato ma non eseguito, quindi con questo esempio:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
si sposterà allinizio, digitals;#
commentando cosa cera ed esegui correttamente il comandols
! grazie!
Risposta
da una domanda che ho posto oggi (con credito allutente @aecolley” s answer ):
bind ""\C-m": "\C-l\C-j""
\C-m
che simula il tasto “Invio”, il \C-l
che simula Ctrl+l
come è chiaro e \C-j
è “newline-and-indent”, quindi il comando sta vincolando il tasto Invio a Ctrl + l & Ctrl + j
che funziona su GNU bash, versione 3.2.53 (1) -release (x86_64-apple-darwin14) e le altre risposte su questo thread no. inoltre, questo non inquina la cronologia con comandi “clear” ogni altro comando.
Commenti
- nota: se si utilizza over ssh, è necessario eseguirlo in quellambiente o si verificano stranezze.
- greate it funziona sul mio terminale Ubuntu 16.04, grazie ma come funziona, potresti fornire un link o della documentazione per favore?
Risposta
Considera la cancellazione solo quando vuoi
cb4() { preexec () { clear } }
Questo usa un hook chiamato preexec
, confermato funziona anche con zsh
Quindi qualsiasi sessione che vuoi cancellare automaticamente prima di ogni comando che esegui : cb4
Se sei certo di voler sempre cancellare in ogni contesto
preexec () { clear }
E se si desidera effettivamente ripristinare il terminale
sostituire la parola clear
con tput reset
tput
è facoltativo ma accelera il processo di ripristino