Я пытаюсь выяснить, как добавить новые флаги во время выполнения к командам, которые выполняются от терминала.
Для, например: Я недавно начал экспериментировать с Докером и нахожу это утомительным для чистки контейнеров, из которых выходят, копией, вставляющей идентификаторы. Я хочу добавить параметр командной строки clean
к docker
время выполнения, так, чтобы, когда я работаю docker clean
(или возможно docker --clean
если мы идем тем путем), я могу внутренне отобразить его для выполнения команды очистки с уже поддерживаемыми опциями временем выполнения докера (а именно, docker rm $(docker ps -a -q -f status=exited)
) Действительно ли возможно установить такое отображение?
Я знаю, что одна опция состоит в том, чтобы использовать псевдонимы, однако псевдонимы не допускают наличие пробелов / флаги командной строки на имена псевдонима, насколько я знаю. Точно так же функции оболочки не помогают, потому что они переопределяют всю функциональность (или возможно я делаю ее неправильно). Я хотел исследовать эту возможность некоторое время, таким образом, любая справка будет цениться.
Можно определить функцию удара с тем же именем как исполняемый файл и иметь его, обрабатывают дополнительный параметр и вызывают исходную функцию однозначно с помощью 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
обработать всю командную строку, а не простой переключатель/случай на $1
.
Кроме того (и более традиционно) Вы могли достигнуть того же путем записи сценария обертки и размещения его куда-нибудь, который прибывает ранее в Ваш $PATH
чем исходный исполняемый файл (такой как /usr/local/bin
или $HOME/bin
). В обертке обратитесь к исходному исполняемому файлу его полным путем.