¿Puedo configurar bash para ejecutar "clear" antes de cada comando escrito en la consola?


22

Me gustaría configurar bash para ejecutar el clearcomando cada vez que escriba algún comando en la terminal (antes de ejecutar mi comando). ¿Cómo puedo hacer eso?

Estoy usando Debian Linux.


A encontrar este hilo útil.
Thor

3
Solo curiosidad: ¿Cuál es tu aplicación para esto? Excepto cuando estoy depuración de programas con una gran cantidad de la producción, por lo general quiero mantener lo más posible en la pantalla para ayudarle a mantener un seguimiento del contexto en el que estoy trabajando.
Joe

Respuestas:


22

Bash tiene un gancho de precomando . Más o menos.

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: Pegué lo anterior en una terminal de konsole y la salida de cada comando que ingresé posteriormente se borró antes de que pudiera leerla. ¿Me estoy perdiendo de algo? Además, ¿qué sucede con esto (y la otra respuesta a continuación) si invoco un script bash de varias líneas donde más de una línea (o cualquier otra que no sea la última) genera resultados interesantes?
Joe

@ Joe Esto debería borrar la pantalla después de presionar Enter, antes de ejecutar el comando. Funciona así para mí. El enlace preexec se ejecuta para cada comando interactivo, no importa si el comando es un comando incorporado o externo o muchos comandos.
Gilles 'SO- deja de ser malvado'

1
@Joe, necesita agregar esta línea a continuación, no haga nada si completa [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;el problema es que PROMPT_COMMAND se está ejecutando y también está atrapado después del comando real; También, ¿alguien puede decirme por qué local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;está aquí?
MageProspero

@JamesAndino history -1imprime la última línea de comando, con un número de historial al frente. El filtro sed elimina el número del historial.
Gilles 'SO- deja de ser malvado'

@JamesAndino Eso lo hizo funcionar (y veo que Giles lo agregó a su respuesta.)
Joe

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

Después de eso, cada vez que presiona en returnlugar de simplemente escribir \n, se moverá al comienzo de la línea, ingrese el texto clear;, luego vaya al final e ingrese \ncomo se esperaba.


2
Una nueva línea hace que la solicitud se imprima de todos modos, por lo que al borrar la solicitud se logra lo mismo sin contaminar el historial de clearcomandos con comandos.
jw013

2
@ jw013 La diferencia es que en mi caso clearse ejecuta antes de que el comando y la salida del comando no desaparezcan. Sin embargo, en caso de aviso, lo hace.
prisa el

Desearía que hubiera alguna manera de hacer esto sin tener que modificar la línea de comando en sí; estoy seguro de que esto se rompería de manera interesante en comandos complejos o de varias líneas, pero no puedo encontrar una mejor manera de hacerlo.
jw013

@ jw013, tiene razón, se rompe para líneas múltiples ... Se inserta clear;en la salida para cada extra \n.
Peter.O

este consejo es muy bueno gracias !! Necesitaba vincular un código específico a F2, pero algunas veces la línea tiene algún comando que escribí pero no ejecuté, así que con este ejemplo: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""se moverá al principio, escriba ls;#comentando lo que estaba allí y ejecutará el lscomando correctamente. ¡Gracias!
Acuario Power

2

de una pregunta que hice hoy (con crédito a la respuesta del usuario @ aecolley ):

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

La \C-msimulación de la tecla 'Enter', la \C-lsimulación Ctrl+lcomo está clara y \C-jes "nueva línea y sangría", por lo que el comando vincula la tecla Enter a Ctrl + l & Ctrl + j

eso funciona en GNU bash, versión 3.2.53 (1) -release (x86_64-apple-darwin14) y las otras respuestas en este hilo no lo hacen. Además, esto no contamina el historial con comandos 'claros' en cualquier otro comando.


1
nota: si usa más de ssh, debe ejecutarlo en ese entorno o ocurrirá algo extraño.
TRB

Bueno, funciona en mi terminal ubuntu 16.04, gracias, pero ¿cómo funciona? ¿Podría proporcionar un enlace o alguna documentación por favor?
Andrzej Rehmann

0

Considere solo despejar cuando quiera

cb4() {
  preexec () {
    clear
  }
}

Esto usa un gancho llamado preexec, confirmado funciona con zsh también

Luego, cualquier sesión que desee borrar automáticamente antes de cada comando que ejecute: cb4

Si está seguro de que siempre quiere borrar en cada contexto

preexec () {
  clear
}

Y un si realmente desea restablecer el terminal

reemplazar la palabra clearcontput reset

tput es opcional pero acelera el proceso de reinicio

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.