Добавляете ли вы новые флаги/параметры времени выполнения к командам в терминале?

Добавляете ли вы новые флаги/параметры времени выполнения к командам в терминале?

Я пытаюсь понять, как добавить новые флаги времени выполнения к командам, запускаемым из терминала.

Например: Я недавно начал экспериментировать с Docker и нахожу утомительным очищать завершенные контейнеры путем копирования и вставки идентификаторов. Я хочу добавить параметр командной строки cleanв dockerсреду выполнения, чтобы при запуске docker clean(или, возможно docker --clean, если мы пойдем этим путем) я мог внутренне сопоставить его для запуска команды очистки с уже поддерживаемыми параметрами средой выполнения Docker (а именно docker rm $(docker ps -a -q -f status=exited)). Возможно ли установить такое сопоставление?

Я знаю, что один из вариантов — использовать псевдонимы, однако псевдонимы не позволяют использовать пробелы / флаги командной строки в именах псевдонимов, насколько мне известно. Аналогично, функции оболочки не помогают, потому что они переопределяют всю функциональность (или, возможно, я делаю это неправильно). Я хотел изучить эту возможность некоторое время, поэтому любая помощь будет оценена по достоинству.

решение1

Вы можете определить функцию bash с тем же именем, что и у исполняемого файла, и заставить ее обрабатывать ваш дополнительный параметр и однозначно вызывать исходную функцию, используя commandвстроенную функцию. Из 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.

Проиллюстрировать,

function ls() { 
  case "$1" in 
    "foo")  shift
            echo "do new thing with remaining args: $@" 
            ;; 
    *)      command ls "$@"
            ;;
  esac
}

Затем

$ 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

работает как обычно, тогда как

$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always

(Вам может понадобиться unaliasкоманда ls, чтобы попробовать это).

Очевидно, что реальная реализация должна выполнять надлежащую проверку ошибок — возможно, используя getoptsдля обработки всей командной строки, а не просто switch/case on $1.


В качестве альтернативы (и более традиционно) вы можете добиться того же самого, написавскрипт-оберткаи поместив его где-нибудь в месте, которое находится раньше, $PATHчем исходный исполняемый файл (например, /usr/local/binили $HOME/bin). Внутри оболочки ссылайтесь на исходный исполняемый файл по его абсолютному пути.

Связанный контент