
Estoy tratando de descubrir cómo agregar nuevos indicadores de tiempo de ejecución a los comandos que se ejecutan desde la terminal.
Por ej. : Recientemente comencé a experimentar con Docker y me resulta tedioso limpiar los contenedores salidos copiando y pegando ID. Quiero agregar una opción de línea de comando clean
al docker
tiempo de ejecución, de modo que cuando lo ejecute docker clean
(o tal vez docker --clean
si vamos por ese camino) pueda asignarlo internamente para ejecutar un comando de limpieza con opciones ya admitidas por el tiempo de ejecución de Docker (es decir, docker rm $(docker ps -a -q -f status=exited)
). ¿Es posible establecer tal mapeo?
Sé que una opción es usar alias, sin embargo, hasta donde yo sé, los alias no permiten tener espacios/indicadores de línea de comando en los nombres de los alias. De manera similar, las funciones del shell no ayudan porque anulan toda la funcionalidad (o quizás lo estoy haciendo mal). Hace tiempo que quería explorar esta posibilidad, por lo que agradeceré cualquier ayuda.
Respuesta1
Puede definir una función bash con el mismo nombre que un ejecutable y hacer que procese su parámetro adicional y llame a la función original sin ambigüedades utilizando el command
comando incorporado. De man bash
:
command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function
lookup. Only builtin commands or commands found in the PATH are
executed.
Para ilustrar,
function ls() {
case "$1" in
"foo") shift
echo "do new thing with remaining args: $@"
;;
*) command ls "$@"
;;
esac
}
Entonces
$ ls -ltr --color=always
total 12
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:16 subdir1
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir2
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir3
funciona normalmente, mientras que
$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always
(Es posible que necesites unalias
el ls
comando para probar esto).
Obviamente, una implementación del mundo real debería realizar una verificación de errores adecuada, tal vez usándola getopts
para procesar toda la línea de comando en lugar de un simple cambio/caso en $1
.
Alternativamente (y más tradicionalmente) puedes lograr lo mismo escribiendo unguión contenedory colocándolo en algún lugar anterior $PATH
al ejecutable original (como /usr/local/bin
o $HOME/bin
). Dentro del contenedor, haga referencia al ejecutable original por su ruta absoluta.