¿Agregar nuevos indicadores/opciones de tiempo de ejecución a los comandos en la terminal?

¿Agregar nuevos indicadores/opciones de tiempo de ejecución a los comandos en la terminal?

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 cleanal dockertiempo de ejecución, de modo que cuando lo ejecute docker clean(o tal vez docker --cleansi 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 commandcomando 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 unaliasel lscomando para probar esto).

Obviamente, una implementación del mundo real debería realizar una verificación de errores adecuada, tal vez usándola getoptspara 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 $PATHal ejecutable original (como /usr/local/bino $HOME/bin). Dentro del contenedor, haga referencia al ejecutable original por su ruta absoluta.

información relacionada