답변:
코멘트를 계속하지 않고…
complete -f -X '!*.@(zip|udp)' unzip
에 대한 완성을 추가해야합니다
-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
즉, 파일을 완성하고 .zip
또는로 끝나지 않는 모든 파일을 제거하십시오 .udp
.
-o default
완료 를 추가 하면 또는로 끝나는 파일 이 없는 경우 모든 파일과 디렉토리를 완료 / 일치 합니다 ..zip
.udp
당신이 추가하면 -o plusdirs
완성은 어떤 디렉토리를 추가합니다 추가로 끝나는 파일의 경기에 .zip
나 .udp
.
사용 complete -p unzip
하면 현재 패턴이 나타납니다.
귀하의 의견에서 당신이 중 하나를 누락 대부분 같은 소리 +
나 @
같이 패턴 :
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
어떤 의미 모든 파일이 그대로 끝나는 일치.(zip|udp)
. 예 :
touch 'file_test.(zip|udp)'
또한이 매뉴얼 섹션을 살펴보십시오.
가능 extglob
하지 않은 등 가능합니다. 다음으로 활성화 :
shopt -s extglob
다음 shopt
을 입력하여 모든 설정 의 현재 상태를 확인하십시오 .
shopt
그렇다면 무언가-F something
라는 함수를 사용하여 완료 목록을 생성 한다는 의미 입니다.
는 _filedir_xspec
일반적으로 데비안 기능입니다. 다음과 같은 것이있을 수 있습니다.
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
/usr/share/bash-completion/bash_completion
소싱을 의미 합니다. 여기서 해당 기능을 찾을 수 있습니다. 아래 몇 줄을 보면이 함수 / 완료가 _install_xspec
다음과 같은 이름의 함수에 의해 추가 된 것을 볼 수 있습니다 .
_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
– 유효하지 않은 아카이브 또는 파일 권한으로 인해 일치하지 않습니다.
결과에 영향을 미치지 않아야합니다. complete
규칙에서 지정한 파일 만 일치하며 파일을 처리하지 않습니다. 로 나열 할 수 있으면 ls
일치해야합니다.
부수적 으로 완전한 기능을 사용하여 이러한 기능을 추가 할 수 있습니다.
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
– 색상. 이유는 무엇입니까 ls
구분 test.zip
에서 test.upd
?
이것은 영향을 미치지 않습니다 complete
. 에 의해 색상 ls
이 제공됩니다 $LS_COLORS
. 시험:
echo "$LS_COLORS" | tr : '\n' | sort
다음과 같은 *.zip=01;31
의미가 나타납니다.
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
반면에 관련 항목이 없으므로 색상이 없습니다.
bash --norc
complete -f -X '!*.@(zip|udp)' unzip
shopt -s extglob
unzip <tab><tab>
결과?
또한 질문 아래 편집을 클릭 하고 다음 결과를 추가하십시오.
bind -V
shopt
env
도움이 될 수 있습니다.
~/bin/testing
, 2. complete -f -X '!*.@(zip|udp)' testing
, 3. testing <tab><tab>
?
shopt
.
extglob
활성화됩니다. 'testing'예제는 zip
파일 만 다시 선택 합니다. I 통지 test.zip
하면서, 빨간색으로 표시됩니다 test.upd
화이트 색상으로 표시되고 ls -l
, 두 파일이 동일한 권한 빈, ownershift 및 그룹 협회. 이유는 무엇입니까 ls
구분 test.zip
에서 test.upd
? 어쩌면 이것이 내가 가진 문제에 대한 힌트입니까?
/etc/bash_completion
어딘가에 소싱 하는 파일 에서 적어도 bash
(v4.2.25) 버전의 기본 완성 은 다음과 같습니다.
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo
전체 표현을
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo
그리고 당신의 .bash_profile
unzip <tab>
찾지 .zip
도 .upd
않습니다.
gzip
와 .gz
파일?
gunzip
과 함께 사용하면 로 .gz
끝나는 파일 만 선택 .gz
하지만 정의도 다릅니다 complete -F _filedir_xspec gunzip
.
/etc/bash_completion
을 제공 .bashrc
합니까?
shopt -s extglob
이 줄을 .bashrc에 추가하십시오.
complete -f -o default -X '!*.+(zip|udp)' unzip
.udp
파일 을 찾을 수 있지만 .zip
파일이 없는 경우에만 가능합니다 . a test.zip
와 test.udp
파일이 현재 디렉토리에 unzip <tab>
있으면 .zip
파일 만 나열 합니다. 두 파일을 모두 볼 것으로 예상됩니다 (즉, bash 완성은을 줄 것입니다 test.
).
udp
과 zip
파일을 모두 찾는 것 같습니다 . .bashrc
라인을 추가 한 후 소스 했습니까 ?
unzip <tab>
다른 문구로 끝나는 모든 파일을 나열합니다. 이제 내가 필요한 것.
complete -f -o default -X '!*.zip' unzip
와complete -f -o default -X '!*.udp' unzip
_filedir
"raw"대신에 더 잘 사용하십시오 complete
.
정당화
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
) 경로가 확장되고 있습니다/home/tux/Do<TAB><TAB>
, 답장으로 얻는 목록이 '/ home / tux'를 제거하므로 훨씬 더 컴팩트합니다.MWE
_unzip_completor()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
_filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
complete -p unzip
을 생성complete -f -X '!*.@(zip|udp)' unzip
하고unzip <tab>
라는 파일을 완성합니다test.zip
. 그러나 디렉토리test.upd
에 탭 완성으로 찾을 수없는 파일도 포함되어 있습니다unzip
. 파일 권한 또는 파일 길이가 0이라는 사실이이 이상한 동작을 설명 할 수 있습니까?