Mantenga la entrada bash en la línea superior de la pantalla

12

Me gustaría mantener la bashentrada del símbolo del sistema en la parte superior de la pantalla para que las salidas de los comandos más antiguos se empujen hacia abajo en lugar de hacia arriba.

¿Cómo puedo conseguir esto?

Tom Price
fuente
66
Entonces, si tiene catun archivo, ¿sería un orden inverso?
caos
No, pero me gustaría que los trozos de producción se empujaran hacia abajo
Tom Price
1
bashno puede hacer esto, porque bashni siquiera sabe acerca de las posiciones de la pantalla: simplemente escribe en un archivo de salida. Necesitaría un emulador de terminal que conozca bashla solicitud interactiva para saber cuándo restablecer el cursor y cuándo desplazar la ventana.
chepner
Gracias @chepner, estoy revisando este problema y tu comentario me hizo mirar fuera de bash y comenzar a mirar toda la pila de pantallas. Quiero permanecer dentro de las consolas virtuales basadas en texto (es decir, no X Windows) por lo que estaría evitando emuladores de terminal por ahora, pero para mis sesiones de GUI ciertamente lo investigaré. En caso de que alguien se encuentre con esta pregunta, supongo que tiene que ver con tty y actualmente estoy buscando inspiración aquí ... linusakesson.net/programming/tty
Tom Price

Respuestas:

7

Agregue estas líneas a su .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

bashtener PROMPT_COMMAND , que contiene el comando se ejecutará antes de bashmostrar el mensaje. Aquí lo configuramos para que funcione prompt_on_top, que usa tput para establecer el cursor en la parte superior de la pantalla.

bashTambién tiene una forma de ejecutar un comando antes de ejecutar cualquier comando, utilizando trap para manejar la señal DEBUG. Aquí lo configuramos para que funcione pre_cmd, lo que borrará la pantalla anterior y no hará nada si completamos ( COMP_LINE no está vacío) o ejecutamos el comando BASH_PROMPT.


Hay un límite con este enfoque, si la salida del comando es demasiado larga y no cabe en una pantalla, la salida se anulará por prompt_on_topacción. En este caso, debe canalizar la salida a un localizador para leer la salida completa.

Cuonglm
fuente
1
Gracias por su respuesta bien explicada, hay muchas cosas para leer y aprender. He probado su secuencia de comandos, y actualmente borra efectivamente la salida anterior de la pantalla entre comandos. Me gustaría mantener las salidas anteriores en la pantalla, debajo de la solicitud, y tenerlas de modo que se inserten nuevas salidas entre la solicitud y la salida anterior, por lo tanto, empuje la salida anterior hacia abajo en la pantalla.
Tom Price
Para aquellos que vienen aquí a través de una búsqueda en la web, este código github.com/swirepe/alwaysontop también "mantiene su aviso de bash en la parte superior de la pantalla", además de un par de otras funciones. Sin embargo, no responde la pregunta original: las salidas de comandos anteriores se eliminan como con el código de cuonglm.
WillC
Otro inconveniente de esta solución es que no tiene comentarios sobre qué comando se ejecutó por última vez. Es decir, cat filemostrará filecontenido, pero no obtendrá una respuesta inmediata del comando exacto ejecutado. Idealmente, la solicitud se seguiría con una versión no expandida + expandida del comando ejecutado, seguida de la salida estándar.
psychoslave