bash hoàn thành: liệt kê tên thư mục từ một thư mục được xác định?


3

Tôi cần tên thư mục trong / mailman / list để hoàn thành tab dưới dạng đối số (không có dấu gạch chéo) cho lệnh 'list_members' bất kể tôi đang ở đâu trong hệ thống tệp.

Trong tcsh (trên máy chủ cũ của chúng tôi), tôi đã viết một dòng để làm những gì tôi cần:

complete list_members 'p,*,F:/mailman/lists,,' #tcsh

việc thực hiện của bash dường như phức tạp hơn. Làm thế nào tôi có thể thực hiện hành vi tương tự bằng cách sử dụng bash?

Việc hoàn thành tab cần phải nhạy cảm theo ngữ cảnh để bất kỳ phần nào của đối số tôi đã nhập sẽ thu hẹp tìm kiếm, giống như hoàn thành bash tiêu chuẩn. Thí dụ:

list_members sys<TAB> #only shows names beginning with sys

Tôi đã thử một vài giải pháp sau khi xem các ví dụ, nhưng chúng không hoạt động đúng.

Một ví dụ thất bại:

function _listlists()
{
    COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}

complete -F _listlists list_members

Điều này dẫn đến lỗi:

-bash: compgen: warning: -C option may not work as you expect

Một ví dụ thất bại khác:

function _listlists()
{
    cd /mailman/lists
    COMPREPLY=( $( compgen -d ) )
    cd -
}

complete -F _listlists list_members

Điều này cho thấy tất cả các kết quả từ thư mục đó được chuyển thành 'thêm', nhưng nó không đáp ứng với đối số một phần mà tôi đã nhập.

Cảm ơn.

Câu trả lời:


3

Đồng nghiệp của tôi đã đưa ra giải pháp này ngay sau khi tôi đăng câu hỏi. Nó hoạt động tốt:

function _listlists()
{
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($( compgen -W "$(ls -d /mailman/lists/*/|cut -d "/" -f 4)" -- $cur ) )
}

complete -F _listlists list_members

1
Làm cách nào để hỗ trợ tên tệp chứa dấu cách?
Tony Barganski

2

Tôi đã thử nghiệm một giải pháp với các thư mục HOME (không có người đưa thư trên máy chủ của tôi). Đây có phải là những gì bạn đang tìm kiếm?

function _homes() {
    local homes=("/home/$2"*)
    [[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'

Cảm ơn, trở về42. Tôi xin lỗi vì tôi đã không kiểm tra giải pháp của bạn.
zenatom

Giải pháp này hiệu quả hơn với tôi khi những gì tôi đang hoàn thành có hiệu quả tương đương ls.
Colin Dean
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.