Стандартное место для пользовательских скриптов 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
файл.
В. Как я могу вставить свои собственные локальные дополнения без необходимости
вставлять их заново каждый раз, когда вы выпускаете новую версию?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/
каталог.
редактировать файл:
nano ~/.bash_completion
добавьте следующее:for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
сделать каталог:
mkdir ~/.bash_completion.d
редактировать файл:
~/.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
источник.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, который с нетерпением загружается нашим основным скриптом.
- Если он не существует, создайте каталог по адресу
~/.local/share/bash-completion/completions
(или же$XDG_DATA_HOME/bash-completion/completions
).
$ mkdir -p ~/.local/share/bash-completion/completions
- Поместите свои доработки в новый каталог.
$ 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