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


47

У мене є доступ користувача (без кореня) до машини Linux (Suse), де я розробив кілька сценаріїв bash та відповідні правила автозаповнення bash.

Оскільки сценарії належать лише моєму користувачеві, і тому мені потрібні цілісні правила лише «активні» для мене (частина від того, що у мене немає доступу до запису кореня), розміщення мого скрипта bash_completion у /etc/bash_completion.d/папці не є варіантом.

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

Наприклад, створення папки /home/myuser/.bash_completion.d/?

Відповіді:


36

Використовуйте ~/.bash_completionфайл.

З FAQ щодо завершення Bash :

З. Як я можу вставити власні локальні доповнення, не
потребуючи їх повторного вставлення кожного разу, коли ви публікуєте новий реліз?

A. Помістіть їх у ~ / .bash_completion, який аналізується в кінці
основного сценарію завершення. Дивіться також наступне запитання.

Q. Я автор / підтримую пакет X і хотів би зберегти власний
код завершення цього пакета. Де я можу це поставити, щоб бути впевненим,
що інтерактивні бомбові снаряди знайдуть його та джерело?

A. Встановіть його в одному з каталогів, на який вказують
змінні файлу pkgconfig bash-завершення. Є дві
альтернативи: рекомендована - '
complementsdir ' (отримайте її з "pkg-config --variable = complementsdir bash-завершення"), з якої
завершення завантажуються на вимогу на основі імен виклику команд,
тому обов'язково вкажіть своє ім'я файл завершення відповідно і включати,
наприклад, символічні посилання на випадок, якщо файл забезпечує завершення
більш ніж однієї команди. Інший, який присутній із
зворотних причин сумісності, - це "compatdir" (отримайте його з
"pkg-config --variable = compatdir bash-завершення"


Я перед тим, як запитати, я гуглив і багато шукав усередині сервера за замовчуванням, але не замислювався над самим основним кроком: RTFM! Велике спасибі за відгук!
Карлес Сала

4
Ви можете вказати, що .bash_completionце файл, а не каталог. Оскільки bash_completion.dце каталог, я припускав, що я можу просто scpлокально bash_completion.dперейменувати його на віддалений сервер, але при наступному вході він сказав мені, що це повинен бути файл.
NobleUplift

3
@NobleUplift Поширені запитання про завершення Bash змінилися і тепер містять інформацію про спосіб завантаження запитів Bash користувача з каталогу за запитом. Здається, це працює як мінімум у версії 2.8, але не на 2.1. Файли в каталозі повинні бути названі так, як команда, для якої вони призначені, або символьні посилання можуть бути використані для цієї мети.
jarno

@jarno Я кодував скрипти для завершення баш для всіх користувацьких програм та сценаріїв у нашій системі, але мої старші розробники їх зняли :(
NobleUplift

@NobleUplift чому? Ви можете використовувати їх для себе в будь-якому випадку.
jarno

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. Хоча це не портативно, також не є баш завершеннями. Тому портативність не має значення.

Крім того, ви хочете використовувати лапки навколо змінної під час пошуку. Це обробляє випадок, коли у файлі є пробіли інших інших спеціальних символів.

shopt -s nullglob

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

1
FYI, пояснення (або посилання на документи) про щось, що показується (тобто nullglob), є корисним для читача.
Cometsong

1

Принаймні bash-завершення 2.8 і пізніші можливості включити опцію розміщення локальних Bash завершень у каталозі

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

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

Довідка: Див. "Q. Де я можу встановити власні локальні доповнення?" в https://github.com/scop/bash-completion/blob/master/README.md

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.