¿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?
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.
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_COMMANDlocal 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.
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!
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.
Respuestas:
Bash tiene un gancho de precomando . Más o menos.
fuente
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.[ "$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í?history -1
imprime la última línea de comando, con un número de historial al frente. El filtro sed elimina el número del historial.Después de eso, cada vez que presiona en returnlugar de simplemente escribir
\n
, se moverá al comienzo de la línea, ingrese el textoclear;
, luego vaya al final e ingrese\n
como se esperaba.fuente
clear
comandos con comandos.clear
se ejecuta antes de que el comando y la salida del comando no desaparezcan. Sin embargo, en caso de aviso, lo hace.clear;
en la salida para cada extra\n
.bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
se moverá al principio, escribals;#
comentando lo que estaba allí y ejecutará ells
comando correctamente. ¡Gracias!de una pregunta que hice hoy (con crédito a la respuesta del usuario @ aecolley ):
La
\C-m
simulación de la tecla 'Enter', la\C-l
simulaciónCtrl+l
como está clara y\C-j
es "nueva línea y sangría", por lo que el comando vincula la tecla Enter a Ctrl + l & Ctrl + jeso 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.
fuente
Considere solo despejar cuando quiera
Esto usa un gancho llamado
preexec
, confirmado funciona con zsh tambiénLuego, 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
Y un si realmente desea restablecer el terminal
reemplazar la palabra
clear
contput reset
tput
es opcional pero acelera el proceso de reiniciofuente