
Я пытаюсь понять, как добавить новые флаги времени выполнения к командам, запускаемым из терминала.
Например: Я недавно начал экспериментировать с 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
). Внутри оболочки ссылайтесь на исходный исполняемый файл по его абсолютному пути.