Kullanıcı tanımlı bash_completion.d scriptleri için standart yer?


47

Bazı bash scriptleri ve karşılık gelen bash autocompletion kurallarını geliştirdiğim bir Linux (Suse) makinesine kullanıcı erişimim (root yok) var.

Komut dosyaları yalnızca benim kullanıcıya ait olduğundan ve bu nedenle benim için yalnızca "etkin" olan tam kurallara ihtiyacım olduğu için (root yazma erişimim olmadığı gerçeğinin bir parçası), bash_completion komut dosyasını /etc/bash_completion.d/klasöre yerleştirmek bir seçenek değildir.

Şu anda dosyamı adlandırdım .bash_completion.myscriptve doğrudan benden kaynakladım .bashrc, ancak bu sonuçları elde etmenin başka bir "standart" yolu olup olmadığını, zaten bash uygulamasında göz önünde bulunduğunu merak ediyorum.

Örneğin, bir klasör oluşturma /home/myuser/.bash_completion.d/?

Yanıtlar:


36

Bir ~/.bash_completiondosya kullan .

Gönderen Bash Tamamlama SSS :

S. Ne
zaman yeni bir sürüm yayımladığınızda bunları tekrar eklemek zorunda kalmadan kendi yerel tamamlamalarımı ekleyebilirim ?

A. Bunları
ana tamamlama komut dosyasının sonunda ayrıştırılan ~ / .bash_completion dizinine koyun . Ayrıca bir sonraki soruya bakınız.

S. X paketini yazar / bakımını yaparım ve
bu paket için kendi tamamlama kodumu korumak istiyorum .
Etkileşimli bash mermilerinin bulacağından ve kaynaklayacağından emin olmak için nereye koymalıyım ?

A.
bash-tamamlama pkgconfig dosya değişkenlerinin gösterdiği dizinlerden birine kurun . İki vardır
alternatifler: tavsiye edilen bir 'completionsdir' (ile olsun
hangi "pkg-config --variable = completionsdir bash tamamlama")
, tamamlamaları çağrılan komutları adlarına göre talep üzerine yüklenir
böylece isim emin olmak sizin buna göre tamamlama dosyasını ve
örneğin
birden fazla komut için tamamlama sağlaması durumunda, örneğin sembolik bağları dahil etmek .
Geriye dönük uyumluluk nedeniyle mevcut olan diğeri 'compatdir' (
“pkg-config --variable = compatdir bash-tamamlama” ile alın)


Sormadan önce googled ve serverfault içinde çok şey aradım, ancak en temel adım hakkında düşünmedim: RTFM! Cevap için çok teşekkürler!
Sala Sala,

4
Bunun .bash_completionbir dosya olduğunu ve bir dizin olmadığını belirtmek isteyebilir . Yana bash_completion.dbir dizindir ben tekini kabul scpbenim yerel bash_completion.dve uzak sunucu üzerinde yeniden adlandırın, ama bana bir sonraki girişte bir dosya olması gerekiyordu.
NobleUplift

3
@NobleUplift Bash Tamamlama SSS değişti ve şimdi kullanıcının Bash tamamlamalarını istek üzerine bir dizinden yüklemek için bir yol hakkında bilgi içeriyor. Bu, bash-tamamlama sürüm 2.8, en azından 2.1 ile çalışıyor gibi görünüyor. Dizindeki dosyalar tam olarak oldukları komutla aynı şekilde adlandırılmalıdır, aksi halde sembolik bağlantılar bu amaç için kullanılabilir.
jarno

@ jarno Sistemimizdeki tüm özel programlar ve scriptler için bash bitirme kodlarını kodladım, ancak üst düzey geliştiricilerim onları vurdu :(
NobleUplift

@NobleUplift neden? Zaten bunları kendiniz için kullanabilirsiniz.
jarno

49

Yerel bir kullanıcının çalışma ~/.bash_completion.d/dizinine nasıl sahip olabileceği aşağıda açıklanmaktadır .

  1. dosyayı düzenle:, nano ~/.bash_completionaşağıdakileri ekleyin:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. dizin yap: mkdir ~/.bash_completion.d

  3. dosyayı düzenle:, ~/.bash_completion.d/myscriptaşağıdakileri ekleyin:

    _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. kaynak .bash_completion: . ~/.bash_completion

Güncelleme

Boş bir ~/.bash_completion.d/dizine sahip olmayı düşünüyorsanız ve hata mesajını görmekten kaçınmak istiyorsanız bash: /home/<username>/.bash_completion.d/*: No such file or directory, ile birlikte bir dosya türü testi ekleyin [ -f "$bcfile" ].

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

2

Russell E Glaue tarafından verilen cevap harika, ancak ~/.bash_completioneksik.

Sorun ne zaman ~/.bash_completion.d/boş ve daha sonra for f in ~/.bash_completion.d/*aşağıdaki hata iletisini yazdırıyor:

-bash: /home/user/.bash_completion.d/*: Böyle bir dosya veya dizin yok

En basit, taşınabilir çözüm, dizin boşsa döngüyü atlamaktır:

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

Daha basit bir çözüm nullglob seçeneğini kullanmaktır. Bu taşınabilir olmasa da, bash tamamlamaları da değildir. Yani taşınabilirlik önemli değil.

Ayrıca, kaynak yaparken değişken etrafında tırnak kullanmak isteyeceksiniz. Bu, dosyanın diğer özel karakterlerde boşluk bıraktığı durumu işler.

shopt -s nullglob

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

1
Bilginize, gösterilen bir şey hakkında açıklama (veya dokümanlar bağlantısı) nullglobokuyucuya yardımcı olacaktır.
Cometsong

1

En azından bash tamamlama 2.8 ve üstü, yerel Bash tamamlamalarını dizine yerleştirme seçeneğini etkinleştirir

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

Tamamlama dosyası adları veya sembolik bağlantı adları, ilgili komut adlarıyla eşleşmelidir. Bu tamamlamalar sadece talep üzerine yüklenir. Dosyada saklanan tamamlamalar ~/.bash_completionher zaman yüklenir.

Referans: Bkz. "S. Kendi yerel tamamlamalarımı nereye kurmalıyım?" içinde https://github.com/scop/bash-completion/blob/master/README.md

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.