bash kịch bản hoàn thành tự động


7

Tôi đang cố gắng thiết lập tự động hoàn thành cho một lệnh, chỉ mất một tham số, tên thư mục,

Trong /secure/kernel_builds/, tôi có ba thư mục con sau:

3.5.6/ 3.6.2/ source/

Bây giờ tôi muốn hoàn thành tự động, liệt kê tất cả tên thư mục con có thể, nhưng không phải tên được đặt source, ngay bây giờ tôi đang sử dụng một cách khá ngu ngốc để làm điều đó, bằng cách kiểm tra xem từ hoàn thành có được bắt đầu bằng một số không,

_avail_kernel_builds()
{
    case $COMP_CWORD in
        1)
            if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* )
            else
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ )
            fi
            COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" )
            COMPREPLY=( "${COMPREPLY[@]%/}" )
            ;;
    esac    
}

Có cách nào tốt hơn để làm như vậy?

Câu trả lời:


1

Nội dung compgencó một -Xđối số cho mục đích này:

-X bộ lọc
    filterpat là một mẫu như được sử dụng để mở rộng tên tệp. Nó được áp dụng vào danh sách
    hoàn thành có thể được tạo bởi các tùy chọn và đối số trước đó và mỗi đối số 
    hoàn thành bộ lọc phù hợp được loại bỏ khỏi danh sách. Một sự dẫn đầu ! trong bộ lọc
    phủ định mô hình; trong trường hợp này, mọi hoàn thành không phù hợp với bộ lọc được loại bỏ.

Vì vậy, bạn có thể chỉ cần làm một cái gì đó như:

_avail_kernel_builds() {
    case $COMP_CWORD in
        1) COMPREPLY=( $(cd /secure/kernel_builds; compgen -d -X "source") ) ;;
    esac
 }

Vì vậy, compgen -dnói "liệt kê các thư mục trong thư mục hiện tại" và -X "source"nói "... nhưng lọc ra bất cứ thứ gì có tên" nguồn ".


0

Bạn có thể kiểm tra một vòng lặp cho các chuỗi bạn (không) muốn:

declare -a accept
declare -a reject
for s in "${COMPREPLY[@]}"; do
    if [[ "$s" =~ want ]]; then
        accept=( "${accept[@]}" "$s" )
    else
        reject=( "${reject[@]}" "$s" )
    fi
done
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.