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


22

Vorrei configurare bash per eseguire il clearcomando ogni volta che digito un comando nel terminale (prima di eseguire il mio comando). Come lo posso fare?

Sto usando Debian Linux.


Trovi utile questa discussione.
Thor

3
Solo curioso: qual è la tua domanda per questo? Tranne quando sto eseguendo il debug di programmi con molti output, di solito voglio mantenere il più possibile sullo schermo per aiutarmi a tenere traccia del contesto in cui sto lavorando.
Joe

Risposte:


22

Bash ha un gancio di comando preliminare . Una specie di.

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: ho incollato quanto sopra in un terminale konsole e l'output di ciascun comando che ho inserito successivamente è stato cancellato prima di poterlo leggere. Mi sto perdendo qualcosa? Inoltre, cosa succede per questo (e l'altra risposta di seguito) se invoco uno script bash multilinea in cui più di una riga (o qualsiasi riga diversa dall'ultima) genera un output interessante?
Joe,

@Joe Questo dovrebbe cancellare lo schermo dopo aver premuto Enter, prima di eseguire il comando. Funziona così per me. L'hook preexec viene eseguito per ogni comando interattivo, non importa se il comando è un comando incorporato o esterno o molti comandi.
Gilles 'SO- smetti di essere malvagio' il

1
@Joe devi aggiungere questa riga qui sotto, non fare nulla se completo [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;il problema è che PROMPT_COMMAND è in esecuzione e intrappolato anche dopo il comando effettivo; Inoltre qualcuno può dirmi perché local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;è qui?
MagoProspero,

@JamesAndino history -1stampa l'ultima riga di comando, con un numero di cronologia in primo piano. Il filtro sed rimuove il numero di cronologia.
Gilles 'SO- smetti di essere malvagio' il

@JamesAndino Che l'ha fatto funzionare (e vedo che Giles l'ha aggiunto alla sua risposta.)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Dopodiché ogni volta che premi returninvece di scrivere semplicemente \nsi sposta all'inizio della riga, inserisci il testo clear;, quindi passa alla fine e inserisci \ncome previsto.


2
Una nuova riga fa sì che il prompt venga stampato comunque, quindi mettere il clear nel prompt compie la stessa cosa senza inquinare la cronologia dei clearcomandi con i comandi.
jw013,

2
@ jw013 La differenza è che nel mio caso clearviene eseguito prima che il comando e l'output del comando non scompaiano. Tuttavia, nel caso con prompt, lo fa.
precipita il

Vorrei che ci fosse un modo per farlo senza dover modificare la riga di comando stessa - Sono sicuro che questo si spezzerebbe in modo interessante su comandi complessi o multilinea ma non riesco a trovare un modo migliore per farlo.
jw013,

@ jw013, hai ragione, si rompe per le linee multiple .. Si inserisce clear;nell'output per ogni extra \n.
Peter

questo consiglio è molto buono grazie !! Avevo bisogno di associare un codice specifico a F2, ma a volte la riga ha un comando che ho digitato ma non eseguito, quindi con questo es .: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""si sposterà all'inizio, scrivendo ls;#commentando cosa c'era ed eseguendo il lscomando correttamente! grazie!
Aquarius Power

2

da una domanda che ho posto oggi (con il merito alla risposta dell'utente @ aecolley ):

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

La \C-msimulazione del tasto "Invio", la \C-lsimulazione in Ctrl+lquanto è chiara e \C-jè "newline-and-indent", quindi il comando è vincolante 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 i comandi 'clear' di ogni altro comando.


1
nota: se si utilizza over ssh, è necessario eseguirlo in quell'ambiente o si verificano stranezze.
TRB

greate funziona sul mio terminale Ubuntu 16.04, grazie ma come funziona, potresti fornire un link o della documentazione per favore?
Andrzej Rehmann,

0

Considera di cancellare solo quando vuoi

cb4() {
  preexec () {
    clear
  }
}

Questo utilizza un hook chiamato preexec, confermato funziona anche con zsh

Quindi qualsiasi sessione che desideri cancellare automaticamente prima di ogni comando che esegui: cb4

Se sei certo di voler sempre cancellare in ogni contesto

preexec () {
  clear
}

E a se in realtà si desidera ripristinare il terminale

sostituire la parola clearcontput reset

tput è facoltativo ma accelera il processo di ripristino

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.