종종 파일 이름(현재 디렉터리에서 탭 완성이 가능한 유일한 파일)을 명령 앞에 전달한 다음 여러 탭을 (잘못) 누르면 동일한 파일 이름이 여러 번 완성되고 삭제 또는 취소하고 다시 시작했습니다.
다른 파일을 생성하거나 숨기지 않고 이 동작을 비활성화할 수 있는 방법이 있습니까?
ls <Tab>filename <Tab>filename <Tab>filename
답변1
nospace
한 가지 해결책은 옵션을 사용하는 것입니다.complete
내장.
먼저 완성을 정의하는 방법을 알아야 합니다.ls
$ complete -p ls
complete -F _longopt ls
그런 다음 추가하여 수정합니다.-o nospace
$ complete -o nospace -F _longopt ls
따라서 여러 번 누르더라도 Tab ↹일치하는 항목이 없으며 명령줄에 매개변수가 추가되지 않습니다.
부작용: 에 다른 매개변수를 추가하려면 줄 끝에 공백을 수동으로 추가해야 합니다 ls
.
이러한 부작용을 피하려면 _longopt
함수를 수정하여 동일한 인수가 두 번 일치하지 않도록 할 수 있습니다(이는 사소한 일이 아닐 수 있음).
다른 명령에 적용하고 영구적으로 만드는 방법
일치 항목 뒤에 후행 공백을 추가하는 것이 기본 동작입니다. -o nospace
지정된 완성 규칙을 사용할 때 사용하는 것 외에 다른 방법이 있는지 모르겠습니다 complete
.
또한 내장 명령에 대해서도 완료 규칙이 어딘가에 지정되어 있다는 점을 명심하십시오(내 노트북의 이 폴더에 있음: ) /usr/share/bash-completion
. 파일을 보면 /usr/share/bash-completion/bash-completion
완성이 정의된 위치를 볼 수 있습니다 ls
.
complete -F _longopt a2ps awk base64 bash bc bison cat chroot colordiff cp \
csplit cut date df diff dir du enscript env expand fmt fold gperf \
grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
texindex touch tr uname unexpand uniq units vdir wc who
동일한 규칙이 다양한 명령(예: cp
, mv
, rm
...)에 적용되므로 을 추가하여 수정하면 변경 사항이 다른 모든 명령 -o nospace
에 영향을 미칩니다 .ls
전역 설정을 수정하는 것이 불편하다면(루트 액세스가 필요함) ~/.bash_completion
다음과 같이 작성할 수 있습니다(존재하지 않는 경우 이 파일을 생성).
complete -F _longopt -o nospace a2ps awk base64 bash bc bison cat chroot colordiff cp \
csplit cut date df diff dir du enscript env expand fmt fold gperf \
grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
texindex touch tr uname unexpand uniq units vdir wc who
/usr/share/bash-completion/bash-completion
여기에 나열되지 않은 다른 명령의 완성을 수정하려면 파일이나 폴더에서 해당 명령을 찾으십시오 /usr/share/bash-completion/completions
.