Как выполнить автозаполнение команды оболочки, начинающейся с (псевдонима, включающего )sudo

От человека:

-d

Report activity for each block device<....>Device names may also be pretty-printed if option -p is used

-p

Pretty-print device names. Use this option in conjunction with option -d. By default names are printed as dev m-n where m and n are the major and minor num- bers for the device. Use of this option displays the names of the devices as they (should) appear in /dev. Name mappings are controlled by /etc/syscon- fig/sysstat.ioconf.

 sar -p -d 1 1


07:16:35 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
07:16:36 PM       sda     13.00      0.00    120.00      9.23      0.04      3.08      1.38      1.80
07:16:36 PM vg_livecd-lv_root     15.00      0.00    120.00      8.00      0.05      3.07      1.27      1.90
07:16:36 PM vg_livecd-lv_swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:16:36 PM vg_livecd-lv_home      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
1
29.11.2020, 23:21
1 ответ

Полагаясь на совет @ApolloXI относительно sudo -nи проводя дополнительные эксперименты, я смог преодолеть недостаток, о котором упоминал в своем предыдущем комментарии .

Подводя итог, при автозаполнении docker …команд загружается следующий код:

  • Из /etc/bash.bashrc:. /usr/share/bash-completion/bash_completion;
  • Из /usr/share/bash -завершение/bash _завершение :
    • __load_completion docker,
    • затем . /usr/share/bash-completion/completions/docker;
  • Из /usr/share/bash -завершение/завершения/докер :
    • docker version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}и др.
    • который re -запускает команду docker(или псевдоним, если он существует ).

Таким образом, рабочим решением будет замена моего псевдонима функцией bash, определяющей, вызывается ли она из функции завершения -bash . Это можно сделать, прочитав массив BASH_SOURCE.

В результате мы могли бы принять следующее решение:

docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
        sudo -n docker "$@"
    else
        sudo docker "$@"
    fi
}

или если мы хотим иметь возможность легко отключить обертку, напишите вместо этого:

__docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
        docker "$@"
    else
        sudo docker "$@"
    fi
}

alias docker=__docker

Тогда префикс sudo -nбольше не нужен, и можно запустить например:

$ \docker run --help
0
18.03.2021, 22:46

Теги

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