Thay vì tiếp tục bình luận
complete -f -X '!*.@(zip|udp)' unzip
nên thêm hoàn thành cho 
-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files
Nói cách khác: Hoàn thành các tệp và loại bỏ tất cả không kết thúc bằng .ziphoặc .udp.
Ngoài ra
Nếu bạn thêm -o defaulthoàn thành sẽ hoàn thành / khớp tất cả các tệp và thư mục nếu không có tệp kết thúc bằng .ziphoặc .udp.
Nếu bạn thêm -o plusdirshoàn thành sẽ thêm bất kỳ thư mục nào ngoài bất kỳ trận đấu nào của tệp kết thúc bằng .ziphoặc .udp.
Hiện hành
Khi bạn sử dụng, complete -p unzipbạn nhận được mô hình hiện tại.
Từ ý kiến của bạn, có vẻ như bạn đang thiếu +hoặc @theo mẫu, như trong:
# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @
có nghĩa là phù hợp với bất kỳ tập tin theo nghĩa đen kết thúc bằng.(zip|udp) . Ví dụ
touch 'file_test.(zip|udp)'
Cũng có một cái nhìn vào phần này của hướng dẫn:
có thể, ví dụ như extglobkhông được kích hoạt. Kích hoạt bằng:
shopt -s extglob
Kiểm tra trạng thái hiện tại của tất cả các shoptcài đặt bằng cách nhập:
shopt
Chức năng
Nếu đó là -F somethingnó có nghĩa là nó sử dụng một hàm có tên một cái gì đó để tạo danh sách hoàn thành.
Các _filedir_xspecthường là một hàm Debian. Bạn có thể có một cái gì đó như thế này:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Có nghĩa là có /usr/share/bash-completion/bash_completionđược nguồn gốc. Ở đây bạn sẽ tìm thấy các chức năng trong câu hỏi . Một vài dòng tiếp theo bạn thấy rằng chức năng / hoàn thành này được thêm bởi một chức năng có tên là _install_xspec: vd:
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Hướng dẫn sử dụng:
Cập nhật ý kiến 1:
- Không khớp do lưu trữ không hợp lệ hoặc quyền truy cập tệp.
Điều này sẽ không ảnh hưởng đến kết quả. completechỉ khớp với các tệp được đưa ra bởi các quy tắc và không xử lý các tệp. Nếu bạn có thể liệt kê chúng với ls, chúng sẽ phù hợp.
Là một lưu ý phụ người ta có thể thêm một chức năng như vậy bằng cách sử dụng một chức năng hoàn chỉnh:
function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
- Màu sắc. Tại sao lsphân biệt test.ziptừ test.upd?
Điều này không ảnh hưởng complete. Màu sắc lsđược cung cấp bởi $LS_COLORS. Thử:
echo "$LS_COLORS" | tr : '\n' | sort
Bạn sẽ thấy một cái gì *.zip=01;31đó có nghĩa là:
*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension
*.udp mặt khác không có mục liên quan đến nó, vì vậy không có màu.
Bước tiếp theo (nên là đầu tiên)
- Mở terminal và đi đến một thư mục với các tập tin thử nghiệm. Cả .zip và .udp
- Đi vào bash --norc
- Đi vào complete -f -X '!*.@(zip|udp)' unzip
- Đi vào shopt -s extglob
- Đi vào unzip <tab><tab>
Kết quả?
Ngoài ra, nhấp vào chỉnh sửa bên dưới câu hỏi của bạn và thêm đầu ra của:
bind -V
shopt
env
có thể hữu ích
               
              
complete -p unzipmang lạicomplete -f -X '!*.@(zip|udp)' unzip, vàunzip <tab>hoàn thành các tập tin có têntest.zip. Tuy nhiên, thư mục chứa một tệp có têntest.updcũng không được tìm thấy khi hoàn thành tabunzip. Liệu thực tế của quyền truy cập tập tin hoặc độ dài của tập tin có thể giải thích hành vi kỳ lạ này?