파일 이름과 다른 확장자가 있다고 가정해 보겠습니다.
test.tex
test.pdf
확장자 없이 파일 이름만 입력한 다음 전체 파일 이름을 입력하는 것이 더 쉽습니다. 이는 해당 프로그램이 필요한 확장을 알고 자동으로 추가하기 때문에 가능합니다. 다음 예제는 완벽하게 작동합니다.
tex test
pdf-viewer test
그러나 여기서 bash 완성을 사용하면 뒤에 점이 추가되어 지속적으로 나를 짜증나게 합니다. 예를 들어:
tex te<TAB>
~이 되다
tex test.
하지만 오류가 발생하여 앱이 작동하지 않습니다. 클릭할 때마다 백스페이스를 눌러야 합니다 <TAB>
. :-(
자동 완성 중에 후행 점을 추가하지 않도록 bash에 어떻게 지시합니까?
답변1
더 간단한 방법이 있을 수 있지만 다음과 같이 작동하는 것 같습니다.
texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }
complete -F texfiles tex
먼저 이라는 쉘 함수를 설정하십시오 texfiles
. 두 번째 명령줄 인수( 사용자가 해당 단어에 대해 Complete를 누르기 전에 명령줄에 입력한 단어)를 사용하고 $2
일치 하는 모든 이름으로 배열을 채웁니다 .TabCOMPREPLY
"$2"*.tex
각 이름에 대해 .tex
접미사는 배열에 추가되기 전에 제거됩니다.
그런 다음 이 명령을 사용하여 complete
명령 texfiles
의 파일 이름 완성 기능을 실행하도록 쉘에 지시합니다.tex
구체적으로. 동일한 방식으로 파일을 완성 complete
해야 하는 모든 명령에 대해 .tex
동일한 명령을 반복 할 수 있습니다 . pdf-viewer
해당 함수를 만들고 싶을 수도 있기 때문입니다 pdffiles
(이러한 함수의 이름은 임의적입니다).
실제 모습은 다음과 같습니다( 키 <tab>
를 눌렀다는 의미 Tab).
bash-4.4$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Sep 28 21:43 README.txt
-rw-r--r-- 1 kk wheel 0 Sep 28 21:12 file.tex
-rw-r--r-- 1 kk wheel 0 Sep 28 21:24 file2.tex
-rw-r--r-- 1 kk wheel 0 Sep 28 21:25 hello.tex
bash-4.4$ tex <tab><tab>
file file2 hello
bash-4.4$ tex
bash-4.4$ tex f<tab>ile<tab><tab>
file file2
bash-4.4$ tex file
( ile
in은 file
쉘에 의해 삽입됩니다)
자세한 내용은 매뉴얼의 "프로그래밍 가능한 완성" 섹션을 읽어보세요 bash
.
답변2
tex
명령 에 대한 사용자 정의 완성 사양을 에 추가합니다 .bashrc
. 파일 이름 완성을 사용해야 한다고 지정한 후 tex
필터를 추가하여 인수를 제거할 수 있습니다.아니요*.tex
가능한 완료와 일치합니다.
complete -f -X '!*.tex'
이제 디렉토리에 test.tex
, test.aux
및 test.pdf
접두사가 test
있는 경우오직까지 완료 이는 바로가기 생성을 test.tex
건너뛰는 대신 필요한 파일의 전체 이름을 완성합니다 ..