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

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

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

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

3
задан 18 September 2016 в 20:01

1 ответ

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

4
ответ дан 1 December 2019 в 15:53

Другие вопросы по тегам:

Похожие вопросы: