Vị trí chuẩn cho tập lệnh bash_completion.d do người dùng xác định?


47

Tôi có quyền truy cập của người dùng (không có root) vào máy Linux (Suse) nơi tôi đã phát triển một số tập lệnh bash và các quy tắc tự động hoàn thành bash tương ứng.

Vì các tập lệnh chỉ thuộc về người dùng của tôi và do đó tôi cần các quy tắc hoàn chỉnh chỉ "hoạt động" cho tôi (một phần từ thực tế là tôi không có tài liệu ghi gốc), nên đặt tập lệnh bash_completion của tôi vào /etc/bash_completion.d/thư mục không phải là một tùy chọn.

Hiện tại tôi đã đặt tên cho tệp của mình .bash_completion.myscriptvà lấy nguồn trực tiếp từ tệp của mình .bashrc, nhưng tôi chỉ tự hỏi liệu có bất kỳ cách "tiêu chuẩn" nào khác để đạt được các kết quả này hay không, đã được xem xét trong việc thực hiện bash.

Ví dụ, tạo một thư mục /home/myuser/.bash_completion.d/?

Câu trả lời:


36

Sử dụng một ~/.bash_completiontập tin.

Từ Câu hỏi thường gặp về Hoàn thành Bash :

H: Làm thế nào tôi có thể chèn các hoàn thành cục bộ của riêng mình mà không phải đặt
lại chúng mỗi khi bạn phát hành một bản phát hành mới?

A. Đặt chúng vào ~ / .bash_completion, được phân tích cú pháp ở cuối
tập lệnh hoàn thành chính. Xem thêm câu hỏi tiếp theo.

Q. Tôi là tác giả / duy trì gói X và muốn duy trì
mã hoàn thành của riêng tôi cho gói này. Tôi nên đặt nó ở đâu để chắc chắn
rằng các bash shell tương tác sẽ tìm thấy nó và nguồn nó?

A. Cài đặt nó trong một trong các thư mục được chỉ ra bởi
các biến tệp pkgconfig của bash-xong. Có hai
lựa chọn thay thế: cái được đề xuất là '
Completionsdir ' (lấy nó với "pkg-config --variable = Completionsdir bash-xong") từ đó các phần
hoàn thành được tải theo yêu cầu dựa trên tên của các lệnh được gọi ',
vì vậy hãy chắc chắn đặt tên của bạn hoàn thành tệp tương ứng và bao gồm
các liên kết tượng trưng ví dụ trong trường hợp tệp cung cấp hoàn thành
cho nhiều hơn một lệnh. Một cái khác hiện diện vì
lý do tương thích ngược là 'compatdir' (lấy nó với
"pkg-config --variable = compatdir bash-xong"


Tôi đã googled và tìm kiếm rất nhiều trong serverfault trước khi hỏi, nhưng không nghĩ về bước cơ bản nhất: RTFM! Rất cám ơn đã phản hồi!
Carles Sala

4
Có thể muốn xác định đó .bash_completionlà một tập tin và không phải là một thư mục. Vì bash_completion.dlà một thư mục tôi giả sử tôi chỉ có thể là scpđịa phương của mình bash_completion.dvà đổi tên nó trên máy chủ từ xa, nhưng trong lần đăng nhập tiếp theo, nó nói với tôi rằng nó phải là một tệp.
NobleUplift

3
@NobleUplift Bash Hoàn thành Câu hỏi thường gặp đã thay đổi và hiện chứa thông tin về cách tải hoàn thành Bash của người dùng từ một thư mục theo yêu cầu. Điều này dường như hoạt động bởi bash-hoàn thành phiên bản 2.8 ít nhất, nhưng không phải bởi 2.1. Các tệp trong thư mục phải được đặt tên chính xác như lệnh mà chúng dành cho hoặc các liên kết tượng trưng có thể được sử dụng cho mục đích đó.
jarno

@jarno Tôi đã mã hóa các tập lệnh hoàn thành bash cho tất cả các chương trình và tập lệnh tùy chỉnh trong hệ thống của chúng tôi nhưng các nhà phát triển cấp cao của tôi đã bắn hạ chúng :(
NobleUplift

@NobleUplift tại sao? Bạn vẫn có thể sử dụng chúng cho chính mình.
jarno

49

Đây là cách một người dùng cục bộ có thể có một ~/.bash_completion.d/thư mục làm việc .

  1. chỉnh sửa tập tin : nano ~/.bash_completion, thêm vào như sau:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. tạo thư mục: mkdir ~/.bash_completion.d

  3. chỉnh sửa tập tin : ~/.bash_completion.d/myscript, thêm vào như sau:

    _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. nguồn .bash_completion: . ~/.bash_completion

Cập nhật

Nếu bạn dự đoán có một ~/.bash_completion.d/thư mục trống và muốn tránh nhìn thấy thông báo lỗi bash: /home/<username>/.bash_completion.d/*: No such file or directory, hãy thêm kiểm tra loại tệp với [ -f "$bcfile" ].

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

2

Câu trả lời của Russell E Glaue là tuyệt vời nhưng nó ~/.bash_completionkhông đầy đủ.

Vấn đề là khi ~/.bash_completion.d/nào trống và sau đó for f in ~/.bash_completion.d/*in thông báo lỗi sau:

-bash: /home/user/.bash_completion.d/*: Không có tệp hoặc thư mục như vậy

Giải pháp di động đơn giản nhất là bỏ qua vòng lặp nếu thư mục trống:

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

Một giải pháp đơn giản hơn là sử dụng tùy chọn nullglob. Trong khi điều này không phải là di động, cũng không phải là hoàn thành bash. Vì vậy, tính di động không thành vấn đề.

Ngoài ra, bạn sẽ muốn sử dụng dấu ngoặc kép quanh biến khi tìm nguồn cung ứng. Điều này xử lý trường hợp tệp có khoảng trắng các ký tự đặc biệt khác.

shopt -s nullglob

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

1
FYI, một lời giải thích (hoặc liên kết đến các tài liệu) về một cái gì đó được hiển thị (tức là nullglob) là hữu ích cho người đọc.
Cometsong

1

Ít nhất bash-hoàn thành 2.8 và sau đó cho phép tùy chọn đặt các hoàn thành Bash cục bộ trong thư mục

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

Tên tệp hoàn thành hoặc tên liên kết tượng trưng phải khớp với tên lệnh tương ứng. Những hoàn thành này chỉ được tải theo yêu cầu. Hoàn thành được lưu trữ trong tập tin ~/.bash_completion được tải luôn.

Tham khảo: Xem "Q. Tôi nên cài đặt hoàn thành cục bộ của mình ở đâu?" trong https://github.com/scop/bash-completion/blob/master/README.md

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.