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 .zipatau .udp.
Ekstra
Jika Anda menambahkan -o defaultpenyelesaian akan menyelesaikan / mencocokkan semua file dan direktori jika tidak ada file yang berakhiran .zipatau .udp.
Jika Anda menambahkan -o plusdirspenyelesaian akan menambah direktori apa pun selain kecocokan file yang berakhiran .zipatau .udp.
Arus
Ketika Anda menggunakan complete -p unzipAnda 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 extglobtidak diaktifkan. Aktifkan oleh:
shopt -s extglob
Periksa status saat ini dari semua shoptpengaturan dengan memasukkan:
shopt
Fungsi
Jika -F somethingitu artinya menggunakan fungsi bernama sesuatu untuk menghasilkan daftar penyelesaian.
The _filedir_xspecbiasanya 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_completionbersumber. 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_xspecoleh 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. completehanya 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 lsdibedakan test.zipdari test.upd?
Ini tidak mempengaruhi complete. Warna oleh lsdisediakan oleh $LS_COLORS. Mencoba:
echo "$LS_COLORS" | tr : '\n' | sort
Anda harus melihat sesuatu *.zip=01;31yang 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 unzipmenghasilkancomplete -f -X '!*.@(zip|udp)' unzip, danunzip <tab>melengkapi file bernamatest.zip. Namun, direktori tersebut berisi file bernamatest.updjuga yang tidak ditemukan oleh tab penyelesaianunzip. Apakah fakta izin file atau panjang nol file mungkin menjelaskan perilaku aneh ini?