"proto://host" 형식의 URL에 bash-completion을 사용하려고 합니다. ":"가 없으면 예상되는 동작을 볼 수 있지만 ":"가 있으면 URL에 "오류"가 발생합니다.
Bash 완성을 위한 호스트 이름 함수가 있는데, 여기에는 내가 사용하고 싶은 매개변수가 _known_hosts_real
있습니다 .-p PREFIX
"잘못된" 동작을 재현하는 방법:
시스템에 "알려진" 호스트가 하나 이상 필요합니다.
예를 들어echo "gdns.google 8.8.8.8" >> /etc/hosts
기능의 예를 보려면 다음 명령을 실행하십시오.
$ unset COMPREPLY
$ _known_hosts_real -p 'http//' -- "gdn"
$ echo $COMPREPLY
http//gdns.google
작동하지 않는 예:
$ unset COMPREPLY
$ _known_hosts_real -p 'http://' -- "gdn"
$ echo $COMPREPLY
//gdns.google
유일한 차이점은 "http://"에 콜론이 추가된다는 점입니다. 여기서 문제는 접두사에 프로토콜 지정자와 콜론이 누락되어 있다는 것입니다. 이것이 예상되는 동작입니까?
답변1
이는 콜론으로 끝나는 접두사를 제거하는 예상 _known_hosts_real
되는 동작입니다 . 알려진 호스트 파일과 함께 사용 하도록 고안되었으므로 아마도 .__ltrim_colon_completions
_known_hosts_real
ssh
compgen -A hostname
답변2
@Michael_Veers는 이것이 예상되는 동작(+1)이라고 지적했으므로 내 함수를 직접 작성해야 합니다.
_known_hosts_real
하지만 대신 추가 옵션을 활성화하기 위해 bashrc에 해당 표준에 대한 패치를 작성했습니다.
-t
왼쪽 결장까지 다듬지 마십시오.-S <suffix>
맞춤 접미사 추가
존재하다 .bashrc
:
. <(type _known_hosts_real | sed -e '
1d;s/acF:p:/actS:F:p:/;
s/^.*c)/\nS)\nsuffix=$OPTARG\n;;\nt)\nnotrim=1\n;;\nc)/;
s/\(__lt\)/[ $notrim ]||\1/')
이제 예상대로 작동합니다.
$ unset COMPREPLY
$ _known_hosts_real -p "scp://" -S '/' -t -a gdn
$ echo $COMPREPLY
scp://gdns.google/