Standardowe miejsce dla zdefiniowanych przez użytkownika skryptów bash_completion.d?


47

Mam dostęp użytkownika (bez roota) do komputera z systemem Linux (Suse), gdzie opracowałem kilka skryptów bash i odpowiadające im reguły autouzupełniania bash.

Ponieważ skrypty należą tylko do mojego użytkownika i dlatego potrzebuję kompletnych reguł tylko „aktywnych” dla mnie (część z faktu, że nie mam dostępu do zapisu roota), umieszczenie mojego skryptu bash_completion w /etc/bash_completion.d/folderze nie jest opcją.

W tej chwili nazwałem mój plik .bash_completion.myscript i pozyskuję go bezpośrednio z mojego .bashrc, ale zastanawiam się tylko, czy istnieje jakiś inny „standardowy” sposób na osiągnięcie tych wyników, rozważany już w implementacji bash.

Na przykład tworzysz folder /home/myuser/.bash_completion.d/?

Odpowiedzi:


36

Użyj ~/.bash_completionpliku.

Z najczęściej zadawanych pytań dotyczących zakończenia Bash :

P: Jak mogę wstawić własne uzupełnienia lokalne bez konieczności
ich ponownego wstawiania za każdym razem, gdy wydajesz nowe wydanie?

A. Umieść je w ~ / .bash_completion, które jest analizowane na końcu
głównego skryptu zakończenia. Zobacz także następne pytanie.

P: Tworzę / obsługuję pakiet X i chciałbym zachować własny
kod zakończenia dla tego pakietu. Gdzie powinienem to umieścić, aby się upewnić
że interaktywne powłoki bash ją znajdą i źródło?

A. Zainstaluj go w jednym z katalogów wskazywanych przez
zmienne pliku pkgconfig bash-complete. Istnieją dwie
alternatywy: zalecaną jest „
katalog_zupełnień ” (pobierz za pomocą „pkg-config --variable = completionsdir bash-uzupełnianie”), z którego
uzupełnienia są ładowane na żądanie na podstawie nazw wywoływanych poleceń,
więc pamiętaj, aby nazwać swój odpowiednio plik ukończenia i dołączyć
na przykład dowiązania symboliczne w przypadku, gdy plik zapewnia uzupełnienia
dla więcej niż jednego polecenia. Drugim, który jest obecny ze
względu na zgodność z poprzednimi wersjami, jest „kompatybilny katalog” (pobierz go za pomocą
„pkg-config --variable = ukończenie kompilacji bash”


Zanim zapytałem, przeszukałem wyszukiwarkę i dużo szukałem wewnątrz serwera, ale nie pomyślałem o najbardziej podstawowym kroku: RTFM! Wielkie dzięki za odpowiedź!
Carles Sala

4
Może chcesz określić, że .bash_completionjest to plik, a nie katalog. Ponieważ bash_completion.djest to katalog, który, jak zakładam, mógłbym po prostu scplokalnie bash_completion.dzmienić i zmienić jego nazwę na zdalnym serwerze, ale przy następnym logowaniu powiedział mi, że to musi być plik.
NobleUplift,

3
@NobleUplift Bash Completion FAQ uległo zmianie i teraz zawiera informacje o sposobie ładowania uzupełnień Bash użytkownika z katalogu na żądanie. Wydaje się, że działa to przynajmniej w wersji bash-complete 2.8, ale nie w wersji 2.1. Pliki w katalogu powinny mieć taką samą nazwę, jak polecenie, dla którego są przeznaczone, w tym celu można by użyć dowiązań symbolicznych.
jarno

@jarno Kodowałem skrypty zakończenia bash dla wszystkich niestandardowych programów i skryptów w naszym systemie, ale moi starsi programiści zestrzelili je :(
NobleUplift

@NobleUplift dlaczego? I tak możesz z nich skorzystać.
jarno

49

Oto, w jaki sposób użytkownik lokalny może mieć ~/.bash_completion.d/katalog roboczy .

  1. edytuj plik: nano ~/.bash_completiondodaj:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. utwórz katalog: mkdir ~/.bash_completion.d

  3. edytuj plik: ~/.bash_completion.d/myscriptdodaj:

    _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. źródło .bash_completion: . ~/.bash_completion

Aktualizacja

Jeśli spodziewasz się, że masz pusty ~/.bash_completion.d/katalog i chcesz uniknąć wyświetlania komunikatu o błędzie bash: /home/<username>/.bash_completion.d/*: No such file or directory, dodaj test typu pliku za pomocą [ -f "$bcfile" ].

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

2

Odpowiedź Russell E Glaue jest wielki, ale jego ~/.bash_completionjest niekompletna.

Problem polega na tym, kiedy ~/.bash_completion.d/jest pusty, a następnie for f in ~/.bash_completion.d/*drukuje następujący komunikat o błędzie:

-bash: /home/user/.bash_completion.d/*: Brak takiego pliku lub katalogu

Najprostszym przenośnym rozwiązaniem jest pominięcie pętli, jeśli katalog jest pusty:

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

Prostszym rozwiązaniem jest użycie opcji nullglob. Chociaż nie jest to przenośne, nie są też uzupełnieniami bash. Przenośność nie ma więc znaczenia.

Podczas pozyskiwania będziesz także chciał używać cudzysłowów wokół zmiennej. To obsługuje przypadek, w którym w pliku znajdują się spacje innych znaków specjalnych.

shopt -s nullglob

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

1
Do Twojej wiadomości, wyjaśnienie (lub link do dokumentów) na temat czegoś, co jest pokazywane (tj. nullglob), Jest pomocne dla czytelnika.
Cometsong

1

Przynajmniej bash-complete 2.8 i późniejsze włączają opcję umieszczania lokalnych uzupełnień Bash w katalogu

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

Nazwy plików ukończenia lub symboliczne nazwy dowiązań muszą być zgodne z odpowiednimi nazwami poleceń. Te uzupełnienia są ładowane tylko na żądanie. Uzupełnienia zapisane w pliku ~/.bash_completion są zawsze ładowane.

Odniesienie: patrz „P: Gdzie powinienem zainstalować własne lokalne uzupełnienia?” w https://github.com/scop/bash-completion/blob/master/README.md

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.