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 .zip
hoặc .udp
.
Ngoài ra
Nếu bạn thêm -o default
hoà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 .zip
hoặc .udp
.
Nếu bạn thêm -o plusdirs
hoà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 .zip
hoặc .udp
.
Hiện hành
Khi bạn sử dụng, complete -p unzip
bạ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ư extglob
khô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 shopt
cài đặt bằng cách nhập:
shopt
Chức năng
Nếu đó là -F something
nó 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_xspec
thườ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ả. complete
chỉ 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 ls
phân biệt test.zip
từ 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 unzip
mang 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.upd
cũ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?