Mantieni input bash nella riga superiore dello schermo


12

Vorrei mantenere l' bashinput del prompt dei comandi nella parte superiore dello schermo in modo che gli output dei comandi più vecchi vengano spinti verso il basso anziché verso l'alto.

Come posso raggiungere questo obiettivo?


6
Quindi, se catun file, sarebbe in ordine inverso?
caos,

No, ma vorrei che i pezzi di output venissero spinti verso il basso
Tom Price,

1
bashnon posso farlo, perché bashnon conosce nemmeno le posizioni dello schermo: scrive solo in un file di output. Avresti bisogno di un emulatore di terminale che conosca bashil prompt interattivo per sapere quando ripristinare il cursore e quando scorrere la finestra.
Chepner,

Grazie @chepner, sto rivisitando questo problema e il tuo commento mi ha fatto guardare fuori da bash e iniziare a guardare l'intero stack di visualizzazione. Voglio rimanere all'interno delle console virtuali basate su testo (cioè senza X Windows), per ora eviterei gli emulatori di terminale, ma per le mie sessioni con la GUI lo esaminerò sicuramente. Nel caso in cui qualcuno si imbattesse in questa domanda, la mia ipotesi è che abbia a che fare con tty e attualmente sto cercando qui l'ispirazione ... linusakesson.net/programming/tty
Tom Price

Risposte:


7

Aggiungi queste righe al tuo .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashavere PROMPT_COMMAND , che contiene il comando verrà eseguito prima del bashprompt show. Qui lo impostiamo per funzionare prompt_on_top, che usa tput per impostare il cursore nella parte superiore dello schermo.

bashhanno anche un modo per eseguire un comando prima di eseguire qualsiasi comando, usando trap per gestire il segnale DEBUG. Qui lo impostiamo per funzionare pre_cmd, che cancellerà la vecchia schermata e non fare nulla se abbiamo completato ( COMP_LINE non è vuoto) o eseguiamo il comando BASH_PROMPT.


Esiste una limitazione con questo approccio, se l'output del comando è troppo lungo in una schermata, l'output verrà sostituito prompt_on_topdall'azione. In questo caso, è necessario reindirizzare l'output a un cercapersone per leggere l'intero output.


1
Grazie per la tua risposta ben spiegata, c'è molto da leggere e da imparare. Ho testato il tuo script e attualmente cancella efficacemente il vecchio output dallo schermo tra i comandi. Vorrei mantenere sullo schermo gli output precedenti, sotto il prompt, e farlo in modo che vengano inseriti nuovi output tra il prompt e il vecchio output, spingendo quindi il vecchio output sullo schermo.
Tom Price,

Per coloro che vengono qui tramite una ricerca Web, questo codice github.com/swirepe/alwaysontop "mantiene anche il prompt di bash nella parte superiore dello schermo", oltre a un paio di altre funzioni. Tuttavia, non risponde alla domanda originale: gli output dei comandi più vecchi vengono eliminati come con il codice di cuonglm.
WillC

Un altro svantaggio di questa soluzione è che non hai feedback su quale comando è stato eseguito l'ultima volta. Cioè, cat filemostrerà il filecontenuto, ma non si ottiene un feedback immediato dell'esatto comando eseguito. Idealmente, il prompt dovrebbe essere seguito con una versione non espansa + espansa del comando eseguito, seguita dallo std ouput.
psicoslave,
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.