Tempat standar untuk skrip bash_completion.d yang ditentukan pengguna?


47

Saya memiliki akses pengguna (tanpa root) ke mesin Linux (Suse) di mana saya mengembangkan beberapa skrip bash dan aturan pelengkapan bash yang terkait.

Karena skrip hanya milik pengguna saya dan oleh karena itu saya memerlukan aturan lengkap hanya "aktif" untuk saya (bagian dari fakta bahwa saya tidak memiliki akses tulis root), menempatkan skrip bash_completion saya ke dalam /etc/bash_completion.d/folder bukan merupakan pilihan.

Saat ini saya memberi nama file saya .bash_completion.myscriptdan sumbernya langsung dari saya .bashrc, tapi saya hanya ingin tahu apakah ada cara "standar" lainnya untuk mencapai hasil ini, sudah dipertimbangkan dalam implementasi bash.

Misalnya, membuat folder /home/myuser/.bash_completion.d/?

Jawaban:


36

Gunakan ~/.bash_completionfile.

Dari FAQ Penyelesaian Bash :

Q. Bagaimana saya bisa memasukkan kelengkapan lokal saya sendiri tanpa harus
memasukkannya kembali setiap kali Anda mengeluarkan rilis baru?

A. Masukkan mereka dalam ~ / .bash_completion, yang diuraikan pada akhir
skrip penyelesaian utama. Lihat juga pertanyaan selanjutnya.

P. Saya pembuat / memelihara paket X dan ingin mempertahankan
kode penyelesaian saya sendiri untuk paket ini. Di mana saya harus meletakkannya untuk memastikan
bahwa shell bash interaktif akan menemukannya dan sumbernya?

A. Instal di salah satu direktori yang ditunjukkan oleh
variabel file pkgconfig file bash-completion. Ada dua
alternatif: yang direkomendasikan adalah 'completionsdir' (dapatkan dengan
"pkg-config --variable = completionsdir bash-completion") dari mana
penyelesaian dimuat sesuai permintaan berdasarkan nama perintah yang dipanggil,
jadi pastikan untuk menyebutkan nama Anda file penyelesaian sesuai, dan untuk memasukkan
misalnya tautan simbolis jika file menyediakan penyelesaian
untuk lebih dari satu perintah. Yang lain yang hadir karena
alasan kompatibilitas ke belakang adalah 'compatdir' (dapatkan dengan
"pkg-config --variable = compatdir bash-completion"


Saya mencari di Google dan mencari banyak di dalam serverfault sebelum bertanya, tetapi tidak memikirkan langkah paling mendasar: RTFM! Terima kasih banyak atas tanggapannya!
Carles Sala

4
Mungkin ingin menentukan itu .bash_completionadalah file dan bukan direktori. Karena bash_completion.dini adalah direktori, saya berasumsi bahwa saya hanya bisa scpmenjadi lokal saya bash_completion.ddan mengganti namanya di server jauh, tetapi pada login berikutnya ia mengatakan itu harus berupa file.
NobleUplift

3
@NobleUplift Bash Completion FAQ telah berubah dan sekarang berisi informasi tentang cara memuat penyelesaian Bash pengguna dari direktori sesuai permintaan. Ini tampaknya bekerja dengan versi 2.8 setidaknya bash-completion, tetapi tidak oleh 2.1. File-file dalam direktori harus diberi nama persis seperti perintah mereka, atau tautan simbolik dapat digunakan untuk tujuan itu.
jarno

@jarno Saya mengkodekan skrip penyelesaian bash untuk semua program khusus dan skrip di sistem kami tetapi pengembang senior saya menghapusnya :(
NobleUplift

@NobleUplift mengapa? Anda dapat menggunakannya untuk diri Anda sendiri.
jarno

49

Inilah cara pengguna lokal dapat memiliki ~/.bash_completion.d/direktori yang berfungsi .

  1. edit file:, nano ~/.bash_completiontambahkan berikut ini:

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

  3. edit file:, ~/.bash_completion.d/myscripttambahkan berikut ini:

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

Memperbarui

Jika Anda mengantisipasi memiliki ~/.bash_completion.d/direktori kosong , dan ingin menghindari melihat pesan kesalahan bash: /home/<username>/.bash_completion.d/*: No such file or directory, tambahkan tes jenis file dengan [ -f "$bcfile" ].

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

2

The jawaban dengan Russell E Glaue besar tapi ~/.bash_completiontidak lengkap.

Masalahnya adalah ketika ~/.bash_completion.d/kosong dan selanjutnya for f in ~/.bash_completion.d/*mencetak pesan kesalahan berikut:

-bash: /home/user/.bash_completion.d/*: Tidak ada file atau direktori tersebut

Solusi portabel yang paling sederhana adalah dengan melewatkan loop jika direktori kosong:

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

Solusi yang lebih sederhana adalah dengan menggunakan opsi nullglob. Meskipun ini tidak portabel, tidak ada juga penyelesaian bash. Jadi portabilitas tidak masalah.

Juga, Anda ingin menggunakan kutipan di sekitar variabel saat sumber. Ini menangani kasus di mana file memiliki spasi karakter khusus lainnya.

shopt -s nullglob

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

1
FYI, penjelasan tentang (atau tautan ke dokumen) tentang sesuatu yang ditampilkan (yaitu nullglob) sangat membantu pembaca.
Cometsong

1

Setidaknya bash-completion 2.8 dan yang lebih baru memungkinkan opsi untuk menempatkan penyelesaian Bash lokal dalam direktori

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

Nama file yang lengkap atau nama tautan simbolik harus cocok dengan nama perintah masing-masing. Penyelesaian ini hanya dimuat berdasarkan permintaan. Penyelesaian yang disimpan dalam file ~/.bash_completion selalu dimuat.

Referensi: Lihat "Q. Di mana saya harus menginstal kelengkapan lokal saya sendiri?" di https://github.com/scop/bash-completion/blob/master/README.md

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.