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

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

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

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

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

5 ответов

Решение

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

Из FAQ по завершению Bash:

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

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

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

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

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

  1. редактировать файл: nano ~/.bash_completionдобавьте следующее:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
    
  2. сделать каталог: mkdir ~/.bash_completion.d

  3. редактировать файл: ~/.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
    
  4. источник.bash_completion: . ~/.bash_completion

Обновить

Если вы ожидаете пустой ~/.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

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

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

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 следует называть "мерзавцем".)

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

${BASH_COMPLETION_USER_DIR-~/.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
Другие вопросы по тегам