Posso configurare bash per eseguire “ clear ” prima di ogni comando digitato nella console?

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, digita ls;# commentando cosa cera ed esegui correttamente il comando ls! 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *