Назад | Перейти на главную страницу

Стандартное место для пользовательских скриптов bash_completion.d?

У меня есть пользовательский доступ (без root) к машине Linux (Suse), на которой я разработал несколько сценариев bash и соответствующие правила автозаполнения bash.

Поскольку скрипты принадлежат только моему пользователю, и поэтому мне нужны полные правила, только «активные» для меня (часть из-за того, что у меня нет прав на запись root), поместив мой скрипт bash_completion в /etc/bash_completion.d/ папка не вариант.

На данный момент я назвал свой файл .bash_completion.myscript и получить его прямо из моего .bashrc, но мне просто интересно, есть ли какой-нибудь другой «стандартный» способ достижения этих результатов, уже рассмотренный в реализации bash.

Например, создание папки /home/myuser/.bash_completion.d/?

Для сред без XDG и завершения bash <= 2,8

Вот как у локального пользователя может быть рабочий ~/.bash_completion.d/ каталог.

  1. редактировать файл: nano ~/.bash_completionдобавьте следующее:
for bcfile in ~/.bash_completion.d/* ; do
  . $bcfile
done
  1. сделать каталог: mkdir ~/.bash_completion.d
  2. редактировать файл: ~/.bash_completion.d/myscriptдобавьте следующее:
_myscript_tab_complete () {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    words="-f -h --etc"

    COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
    return 0
}
complete -F _myscript_tab_complete myscript
  1. источник .bash_completion: . ~/.bash_completion

ожидание пустого каталога ~ / .bash_completion.d /

Если вы ожидаете пустого ~/.bash_completion.d/ каталог и не хотите видеть сообщение об ошибке bash: /home/<username>/.bash_completion.d/*: No such file or directory, добавьте тест типа файла с помощью [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

Для сред XDG и завершения bash <= версия 2.8

(Чтобы увидеть вашу версию: rpm -qa | grep bash-completion)

Обратите внимание, что документация README для bash-completion 2.8 по-прежнему рекомендует ~/.bash_completion, Видеть https://github.com/scop/bash-completion/tree/2.8

Вы знаете, что ваша среда Linux - XDG, если xdg-usr-dir команда существует и возвращает ваш домашний каталог, а переменные среды включают XDG_*; выполнить: env | grep XDG.

Для среды XDG и bash-completion> = версия 2.9

Согласно README для завершения bash, начиная с версии 2.9 https://github.com/scop/bash-completion/tree/2.9 (27 апреля 2019 г.) теперь распознается рабочий каталог локального пользователя bash_completion. Кроме того, альтернативный файл конфигурации bash_completion уже поддерживался в нескольких предыдущих выпусках.

  • ~/.bash_completion.d -> ${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion
  • ~/.bash_completion -> ${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion

Чтобы реализовать эту конфигурацию, выполните предыдущие шаги 3,4 выше, используя $XDG_DATA_HOME/bash-completion - вы не должны изменять $XDG_CONFIG_HOME/bash_completion как описано в шаге 1, но вам может потребоваться создать $XDG_DATA_HOME/bash-completion каталог.

Примечание: Начиная с CentOS 8.2 и Fedora 32, установлено bash-completion <= 2.8.

Использовать ~/.bash_completion файл.

Из Часто задаваемые вопросы о завершении Bash:

В. Как я могу вставить свои собственные локальные дополнения без необходимости
вставлять их заново каждый раз при выпуске нового выпуска?

A. Поместите их в ~ / .bash_completion, который анализируется в конце
основной сценарий завершения. См. Также следующий вопрос.

В. Я создаю / поддерживаю пакет X и хотел бы поддерживать свой собственный
код завершения для этого пакета. Куда я должен положить это, чтобы убедиться
что интерактивные оболочки bash найдут его и отправят?

A. Установите его в один из каталогов, указанных
Переменные файла pkgconfig в bash-завершении. Есть два
альтернативы: рекомендуется 'completetionsdir' (получить с
"pkg-config --variable = completionsdir bash-completion") из которого
доработки загружаются по запросу на основе имен вызванных команд,
поэтому обязательно назовите свой файл завершения соответствующим образом и включите
например, символические ссылки, если в файле есть дополнения
для более чем одной команды. Другой, который присутствует для
Причина обратной совместимости - compatdir (получить с помощью
"pkg-config --variable = compatdir bash-completion") из каких файлов
загружаются при загрузке bash_completion.

По крайней мере, bash-Completion 2.8 и более поздние версии включают опцию для размещения локальных завершений Bash в каталог

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

Имена файлов завершения или имена символических ссылок должны совпадать с именами соответствующих команд. Эти доработки загружаются только по запросу. Завершенные работы хранятся в файл ~/.bash_completion загружаются всегда.

Ссылка: См. «В. Где мне установить собственные локальные доработки?» в https://github.com/scop/bash-completion/blob/master/README.md

Более простое решение - использовать опцию nullglob. Хотя это не переносимо, как и завершение bash. Так что портативность не имеет значения.

Кроме того, вы захотите использовать кавычки вокруг переменной при поиске. Это обрабатывает случай, когда в файле есть пробелы и другие специальные символы.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

В ответ Рассела Э. Глауэ отлично, но это ~/.bash_completion неполный.

Проблема в том, когда ~/.bash_completion.d/ пусто и впоследствии for f in ~/.bash_completion.d/* выводит следующее сообщение об ошибке:

-bash: /home/user/.bash_completion.d/*: Нет такого файла или каталога

Самое простое переносимое решение - пропустить цикл, если каталог пуст:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

В Вопросы-Ответы был обновлен. Теперь есть стандартное место для локальных доработок.

В. Где мне установить собственные локальные доработки?

A. Поместите их в подкаталог завершений $ BASH_COMPLETION_USER_DIR (по умолчанию $ XDG_DATA_HOME / bash-completion или ~ / .local / share / bash-completions, если $ XDG_DATA_HOME не установлен), чтобы они загружались по запросу. См. Также ответ на следующий вопрос, чтобы узнать об именах этих файлов, они применимы и здесь. Как вариант, вы можете записать их прямо в ~ / .bash_completion, который с нетерпением загружается нашим основным скриптом.

  1. Если он не существует, создайте каталог по адресу ~/.local/share/bash-completion/completions (или $XDG_DATA_HOME/bash-completion/completions).
$ mkdir -p ~/.local/share/bash-completion/completions
  1. Поместите свои доработки в новый каталог.
$ cp <your_completions_file> ~/.local/share/bash-completion/completions

Обратите внимание, что файл завершений должен иметь то же имя, что и команда, для которой он предоставляет завершения. (например, файл завершений для git следует называть "мерзавцем".)