Alih-alih terus berkomentar ...
complete -f -X '!*.@(zip|udp)' unzip
harus menambahkan penyelesaian untuk
-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
Dengan kata lain: Lengkapi file dan hapus semua yang tidak diakhiri dengan .zip
atau .udp
.
Ekstra
Jika Anda menambahkan -o default
penyelesaian akan menyelesaikan / mencocokkan semua file dan direktori jika tidak ada file yang berakhiran .zip
atau .udp
.
Jika Anda menambahkan -o plusdirs
penyelesaian akan menambah direktori apa pun selain kecocokan file yang berakhiran .zip
atau .udp
.
Arus
Ketika Anda menggunakan complete -p unzip
Anda mendapatkan pola saat ini.
Dari komentar Anda kedengarannya sebagian besar seperti Anda hilang baik +
atau @
dalam pola, seperti di:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
yang berarti cocok dengan file apa pun yang benar-benar berakhiran.(zip|udp)
. Misalnya
touch 'file_test.(zip|udp)'
Lihat juga bagian manual ini:
mungkin misalnya extglob
tidak diaktifkan. Aktifkan oleh:
shopt -s extglob
Periksa status saat ini dari semua shopt
pengaturan dengan memasukkan:
shopt
Fungsi
Jika -F something
itu artinya menggunakan fungsi bernama sesuatu untuk menghasilkan daftar penyelesaian.
The _filedir_xspec
biasanya fungsi Debian. Anda mungkin memiliki sesuatu seperti ini:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Yang berarti /usr/share/bash-completion/bash_completion
bersumber. Di sini Anda akan menemukan fungsi yang dimaksud . Beberapa baris lebih jauh ke bawah Anda melihat bahwa fungsi / penyelesaian ini ditambahkan oleh fungsi yang dinamai _install_xspec
oleh misalnya:
_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
Entri manual:
Perbarui ke komentar 1:
- Tidak ada kecocokan karena arsip atau izin file tidak valid.
Ini seharusnya tidak mempengaruhi hasil. complete
hanya cocok dengan file yang diberikan oleh aturan dan tidak memproses file. Jika Anda dapat mendaftar mereka ls
, mereka harus cocok.
Sebagai catatan tambahan, seseorang dapat menambahkan fungsi seperti itu dengan menggunakan fungsi lengkap:
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
- Warna. Mengapa ls
dibedakan test.zip
dari test.upd
?
Ini tidak mempengaruhi complete
. Warna oleh ls
disediakan oleh $LS_COLORS
. Mencoba:
echo "$LS_COLORS" | tr : '\n' | sort
Anda harus melihat sesuatu *.zip=01;31
yang artinya:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
di sisi lain tidak ada entri yang terkait dengannya, jadi tidak ada pewarnaan.
Langkah selanjutnya (seharusnya lebih dulu)
- Buka terminal dan pergi ke direktori dengan file uji. Baik .zip dan .udp
- Memasukkan
bash --norc
- Memasukkan
complete -f -X '!*.@(zip|udp)' unzip
- Memasukkan
shopt -s extglob
- Memasukkan
unzip <tab><tab>
Hasil?
Juga, klik edit di bawah pertanyaan Anda dan tambahkan output:
bind -V
shopt
env
mungkin bermanfaat.
complete -p unzip
menghasilkancomplete -f -X '!*.@(zip|udp)' unzip
, danunzip <tab>
melengkapi file bernamatest.zip
. Namun, direktori tersebut berisi file bernamatest.upd
juga yang tidak ditemukan oleh tab penyelesaianunzip
. Apakah fakta izin file atau panjang nol file mungkin menjelaskan perilaku aneh ini?