Conserver la saisie bash sur la ligne supérieure de l'écran

12

Je voudrais garder l' bashentrée d'invite de commande en haut de l'écran afin que les sorties des anciennes commandes soient poussées vers le bas plutôt que vers le haut.

Comment puis-je atteindre cet objectif?

Tom Price
la source
6
Donc, si vous avez catun fichier, ce serait l'ordre inversé?
chaos
Non, mais je voudrais que les morceaux de sortie soient poussés vers le bas
Tom Price
1
bashne peut pas faire cela, car bashne connaît même pas les positions de l'écran: il écrit simplement dans un fichier de sortie. Vous auriez besoin d'un émulateur de terminal qui connaît l' bashinvite interactive de afin de savoir quand réinitialiser le curseur et quand faire défiler la fenêtre.
chepner
Merci @chepner, je revisite ce problème et votre commentaire m'a fait regarder en dehors de bash et commencer à regarder toute la pile d'affichage. Je veux rester dans les consoles virtuelles textuelles (c'est-à-dire sans X Windows), donc j'éviterais les émulateurs de terminaux pour le moment, mais pour mes sessions GUI, je vais certainement vérifier cela. Au cas où quelqu'un rencontrerait cette question, je suppose que cela a à voir avec tty et je suis actuellement à la recherche d'inspiration ... linusakesson.net/programming/tty
Tom Price

Réponses:

7

Ajoutez ces lignes à votre .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

bashavoir PROMPT_COMMAND , qui contient la commande sera exécutée avant l' bashinvite show. Ici, nous le définissons sur function prompt_on_top, qui utilise tput pour positionner le curseur en haut de l'écran.

bashont également un moyen d'exécuter une commande avant d'exécuter une commande, en utilisant trap pour gérer le signal DEBUG. Ici, nous le configurons pour fonctionner pre_cmd, ce qui effacera l'ancien écran et ne fera rien si nous avons terminé ( COMP_LINE n'est pas vide) ou exécutons la commande dans BASH_PROMPT.


Il y a une limite à cette approche, si la sortie de la commande est trop longue pour tenir dans un écran, alors la sortie sera remplacée par l' prompt_on_topaction. Dans ce cas, vous devez diriger la sortie vers un pager pour lire la sortie entière.

cuonglm
la source
1
Merci pour votre réponse bien expliquée, j'ai beaucoup à lire et à apprendre. J'ai testé votre script et, actuellement, il efface efficacement l'ancienne sortie de l'écran entre les commandes. Je voudrais garder les sorties précédentes à l'écran, sous l'invite, et les faire en sorte que de nouvelles sorties soient insérées entre l'invite et l'ancienne sortie, poussant ainsi l'ancienne sortie vers le bas de l'écran.
Tom Price
Pour ceux qui viennent ici via une recherche sur le Web, ce code github.com/swirepe/alwaysontop "conserve également votre invite bash en haut de l'écran", ainsi que quelques autres fonctions. Ne répond pas cependant à la question d'origine: les anciennes sorties de commande sont supprimées comme avec le code de cuonglm.
WillC
Un autre inconvénient de cette solution est que vous n'avez pas de retour sur la dernière commande exécutée. Autrement dit, cat fileaffichera le filecontenu, mais vous n'obtiendrez pas de retour immédiat de la commande exacte exécutée. Idéalement, l'invite serait suivie d'une version non étendue + étendue de la commande exécutée, suivie de la sortie std.
psychoslave