У меня есть пользовательский доступ (без 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/
каталог.
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.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, который с нетерпением загружается нашим основным скриптом.
~/.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
следует называть "мерзавцем".)