En bash, ¿puedes asignar un alias a un comando nulo para algo? En otras palabras, ¿reconoce que el usuario ha presionado solo la Entertecla en el símbolo del shell? Por ejemplo, si desea borrar la pantalla con una entrada de shell en blanco, ¿cómo le asigna un alias Enteral clear
comando?
Respuesta1
Aquí se explica cómo asignar (efectivamente) un alias a un comando vacío para algo:
Pon lo siguiente en tu .bashrc
:
command1()
{
if [ "$BASH_COMMAND" != command2 ]
then
command_flag=1
fi
return 0
}
trap command1 debug
command2()
{
if [ ! "$command_flag" ]
then
echo "clear" # Put whatever command(s) you want here.
fi
command_flag=
}
PROMPT_COMMAND=command2
Si es necesario, reemplace command1
y command2
consistentemente con palabras que es menos probable que escriba al azar.
trap command1 debug
hará que lacommand1
función se ejecute cada vez que usted (el usuario) escriba un comando.- Si el comando más reciente a ejecutar no lo fue
command2
,command1
se establecerácommand_flag
.
- Si el comando más reciente a ejecutar no lo fue
- La asignación
command2
aPROMPT_COMMAND
harácommand2
que se ejecute siempre que el shell esté a punto de emitir un mensaje.- Si
command_flag
no tiene un valor en blanco, significa quecommand1
se acaba de ejecutar, lo que significa que el usuario acaba de ejecutar un comando. En este caso, no hagas nada. - si
command_flag
lo hacenotiene un valor que no está en blanco, eso significa que el usuario acaba de presionar Enter. En este caso, haga lo que quiera (por ejemplo, borrar la pantalla). - En cualquier caso, déjelo
command_flag
en blanco para que todo funcione en el siguiente ciclo.
- Si
Nota: Estoy bastante seguro de que esto es específico de bash (es decir, no es compatible con POSIX).
Esta respuesta fue básicamente copiada de mi respuesta aAgregar espacio vertical después del comando en bash. Ver tambiéndecir si el último comando estaba vacío en PROMPT_COMMAND para otros enfoques.
Respuesta2
TL;DR: Ctrl-l
borrará la pantalla sin imprimir un carácter ni presionar enter. Esto es probablemente lo más cerca que estará de la funcionalidad deseada. Puede ejecutar un comando antes o después de cada comando, o puede crear un alias para un solo carácter. No se puede asignar un alias a la cadena vacía.
Los alias no están necesariamente diseñados para incluir todo el contenido en una línea.
alias ll='ls -l'
es un buen ejemplo de esto. Puedes hacerlo ll /path/to/other/dir
y obtener resultados.
Todo lo que hace un alias es literalmente cambiar la(s) primera(s) palabra(s) escrita(s) en la línea de comando al valor que usted le dio.
El único requisito para que un alias funcione es que debe ir seguido de un carácter no imprimible (espacio/tabulación/nueva línea). En nuestro caso, ll
por sí solo es válido, pero ll-/mypath/
no lo es, porque es posible (y se hace con frecuencia) asignar alias a algunos caracteres que pueden ser el inicio de otro comando (es decir, alias gi='git init'
solo se puede resolver exactamente gi
, no git
, que es lo que la mayoría la gente quiere y espera).
No es posible asignar un alias a algo en la cadena vacía, ya que estaría al comienzo decadaentrada de línea de comando.
Si desea que se ejecute un comando cada vez, puede usarlo PS0
(asumiendo una versión suficientemente reciente de bash) para ejecutar algo antes de cada comando o PROMPT_COMMAND
para ejecutar algo después de cada comando. Por ejemplo:
PROMPT_COMMAND='echo $?'
haría eco del valor de retorno del comando que ejecutó después de cada comando que ejecute.
Bash no tiene una buena forma de completar una acción si y sólo si has ingresado una línea vacía en la línea de comando. Bash no es sensible a los espacios en blanco de esta manera.