bash 완성에 패턴을 추가하는 방법 (unzip 용)?


12

입력 할 때

unzip <tab>

명령 .zip으로 탭 완성의 표준 동작 인로 끝나는 모든 파일 목록을 얻습니다 unzip.

그러나 unzip파일 .udp외에도으로 끝나는 목록 파일에 대해 bash 완료를 원합니다 .zip. 지역에서 어떻게이 동작을 수행 할 수 .bashrc있습니까?

답변:


23

코멘트를 계속하지 않고…


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

수동 입력 :


의견 업데이트 1 :

– 유효하지 않은 아카이브 또는 파일 권한으로 인해 일치하지 않습니다.

결과에 영향을 미치지 않아야합니다. 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 반면에 관련 항목이 없으므로 색상이 없습니다.


다음 단계 (먼저 있어야 했음)

  1. 터미널을 열고 테스트 파일이있는 디렉토리로 이동하십시오. .zip과 .udp
  2. 시작하다 bash --norc
  3. 시작하다 complete -f -X '!*.@(zip|udp)' unzip
  4. 시작하다 shopt -s extglob
  5. 시작하다 unzip <tab><tab>

결과?

또한 질문 아래 편집을 클릭 하고 다음 결과를 추가하십시오.

bind -V
shopt
env

도움이 될 수 있습니다.


훌륭하고 긴 설명에 대해 대단히 감사하지만 여전히 효과가 없습니다. complete -p unzip을 생성 complete -f -X '!*.@(zip|udp)' unzip하고 unzip <tab>라는 파일을 완성합니다 test.zip. 그러나 디렉토리 test.upd에 탭 완성으로 찾을 수없는 파일도 포함되어 있습니다 unzip. 파일 권한 또는 파일 길이가 0이라는 사실이이 이상한 동작을 설명 할 수 있습니까?
Alex

@Alex : 비어있는 파일과 유효한 파일뿐만 아니라 권한이없는 파일에서도 완료해야합니다. 테스트 스크립트에 추가해도 같은 동작입니까? 예 : 1. 실행 세트가있는 일부 테스트 스크립트 : ~/bin/testing, 2. complete -f -X '!*.@(zip|udp)' testing, 3. testing <tab><tab>?
Runium

@Alex : 당신은 또한 다음과 같은 출력으로 Q를 업데이트 할 수 있습니다 shopt.
Runium

extglob활성화됩니다. 'testing'예제는 zip파일 만 다시 선택 합니다. I 통지 test.zip하면서, 빨간색으로 표시됩니다 test.upd화이트 색상으로 표시되고 ls -l, 두 파일이 동일한 권한 빈, ownershift 및 그룹 협회. 이유는 무엇입니까 ls구분 test.zip에서 test.upd? 어쩌면 이것이 내가 가진 문제에 대한 힌트입니까?
Alex

@Alex : 업데이트가 추가되었습니다.
Runium

3

/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않습니다.
Alex

탭을 두 번 쳐보십시오 . 다른지 확인하십시오. 다른 완성이 예상대로 작동합니까? 예를 들어 gzip.gz파일?
bsd

탭을 두 번 치는 것은 아무 것도 변경하지 않습니다. 파일 gunzip과 함께 사용하면 로 .gz끝나는 파일 만 선택 .gz하지만 정의도 다릅니다 complete -F _filedir_xspec gunzip.
Alex

에 파일 /etc/bash_completion을 제공 .bashrc합니까?
bsd

시도shopt -s extglob
Edward Falk

2

이 줄을 .bashrc에 추가하십시오.

complete -f -o default -X '!*.+(zip|udp)' unzip

이 제안으로 .udp파일 을 찾을 수 있지만 .zip파일이 없는 경우에만 가능합니다 . a test.ziptest.udp파일이 현재 디렉토리에 unzip <tab>있으면 .zip파일 만 나열 합니다. 두 파일을 모두 볼 것으로 예상됩니다 (즉, bash 완성은을 줄 것입니다 test.).
Alex

확실해? 내 배쉬를 확인했는데 파일 udpzip파일을 모두 찾는 것 같습니다 . .bashrc라인을 추가 한 후 소스 했습니까 ?
mkc

나는 새로운 터미널에서 반복하여 이제 unzip <tab>다른 문구로 끝나는 모든 파일을 나열합니다. 이제 내가 필요한 것.
Alex

이상합니다. GNU bash 버전 4.2.25를 실행 중이며 예상대로 작동합니다. 어떤 버전의 bash를 사용하고 있습니까?
mkc

당신은 두 개의 별도의 라인을 추가하려고 수 : complete -f -o default -X '!*.zip' unzipcomplete -f -o default -X '!*.udp' unzip
MKC

1

_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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.