라는 간단한 명령이 있습니다 th
. 다음과 같은 bash 완료 파일이 있습니다.
_th() {
COMPREPLY=()
local curr=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -f -X '!*.@(tar|tar.xz|tar.bz2|tar.gz|tbz|tgz)' -- "$curr") )
}
complete -F _th -o filenames th
대부분의 경우 이는 예상대로 작동합니다. 내 th
함수 인수의 경우 BASH는 , 로 끝나는 파일에 대해서만 탭 완성을 사용합니다 .tar
. tar.xz
두 가지 질문을 기다리고 있습니다:
일치 항목은 대소문자를 구분합니다. 모든 tar 파일에 소문자 확장자가 있는 것은 아닙니다. ( bash 완성 파일에서
shopt
set을 사용해nocaseglob
도 효과가 없습니다.)일치는 이름에 공백이 있는 파일과 같이 여러 단어로 구성된 파일 이름을 차단합니다.
[rsaw:blahb]$ ls bam.tgz boom.TGZ sad.TAR spaces in this-file.tbz [rsaw:blahb]$ th<tabtab> bam.tgz in spaces this-file.tbz [rsaw:blahb]$ th spa<tabtab> in spaces this-file.tbz [rsaw:blahb]$ th spaces<tabtab> # At this point I added a backslash and pressed tab until 4 backslashes appeared in spaces this-file.tbz [rsaw:blahb]$ th spaces\\\\<tabtab> # At this point, nothing else happened
도움을 주시면 감사하겠습니다!
답변1
이것이 여전히 문제인지는 확실하지 않지만, 중국어 자막 파일 이름을 완성하고 가능한 해결책에 대한 몇 가지 아이디어를 얻으려고 할 때 비슷한 문제가 발생했습니다.
IFS
파일 이름에 공백이 있는 문제를 수정하여 변수를 변경하는 것이 local IFS=$'\n'
시도해 볼 가치가 있을 수 있습니다.
대소문자를 구분하지 않으려면 $curr
compgen 을 사용하여 compgen을 소문자로 강제 설정할 수 있습니다 ${cur,,}
. 두 가지 변경 후 전체 기능은 다음과 같습니다.
_th() {
local IFS=$'\n'
local curr=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -f -X '!*.@(tar|tar.xz|tar.bz2|tar.gz|tbz|tgz)' -- "${curr,,}") )
}
complete -F _th -o filenames th
이렇게 하면 전체 파일 이름이 대소문자를 구분하지 않게 됩니다. 확장명에서 대소문자를 구분하지 않으려면 문자열 조작을 통해 $cur
확장명을 소문자로 만들면 됩니다.
답변2
정규식을 사용하여 파일 형식 확장자로 수행할 수 있는 작업에는 두 가지가 있습니다. 모두 대문자로 된 확장자를 정규식에 직접 추가할 수 있습니다. 즉, 검색 시 대소문자를 구분하지 않도록 플래그를 (tar|TAR)
추가할 수 있습니다 . ?i
이 가이드를 참조하세요:https://stackoverflow.com/questions/43632/can-you-make-just-part-of-a-regex-case-insensitive
따라서 여러 단어 완성에 관한 또 다른 답변은 다음과 같습니다.https://stackoverflow.com/questions/1146098/properly-handling-spaces-and-quotes-in-bash-completion (저는 개인적으로 이런 이유로 모든 파일에서 공백 대신 _를 사용합니다)