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

47

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

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

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

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

Карлес Сала
источник

Ответы:

36

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

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

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

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

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

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

Деннис Уильямсон
источник
Я гуглил и много искал внутри ошибки сервера, прежде чем спрашивать, но не думал о самом основном шаге: RTFM! Большое спасибо за ответ!
Карлес Сала
4
Может потребоваться указать, что .bash_completionэто файл, а не каталог. Так bash_completion.dкак это каталог, я предположил, что мог бы просто установить scpсвой локальный каталог bash_completion.dи переименовать его на удаленном сервере, но при следующем входе в систему он сказал, что это должен быть файл.
NobleUplift
3
@NobleUplift FAQ по дополнению Bash изменился и теперь содержит информацию о способе загрузки дополнений Bash пользователя из каталога по запросу. Кажется, это работает по крайней мере в версии 2.8 для bash-завершении, но не в версии 2.1. Файлы в каталоге должны быть названы точно так же, как команда, для которой они предназначены, или символические ссылки могут быть использованы для этой цели.
Ярно
@jarno Я кодировал скрипты завершения bash для всех пользовательских программ и скриптов в нашей системе, но мои старшие разработчики их сбили :(
NobleUplift
@NobleUplift почему? Вы можете использовать их для себя в любом случае.
Ярно
49

Вот как у локального пользователя может быть рабочий ~/.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
Рассел Е Глауэ
источник
2

Ответ Рассел E Glaue является большим , но его ~/.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
Матеуш Пиотровский
источник
1

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

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

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done
npmccallum
источник
1
К вашему сведению, объяснение (или ссылка на документы) о том, что показывается (то есть nullglob), полезно для читателя.
Cometsong
1

По крайней мере, в bash-complete 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

Ярно
источник