bash_completion
내 스크립트에 대한 규칙을 만들려고 합니다 rmpxe
. 스크립트는 <hostname>
이를 유일한 매개변수로 사용합니다. 그런 다음 해당 호스트 이름을 확인 <ip_address>
하고 해당 기호 링크를 제거합니다 /srv/tftp/pxelinux.cfg/<ip_address>
.
<ip_address>
심볼릭 링크의 IP 주소 /srv/tftp/pxelinux.cfg/<ip_address>
는 16진수 형식이지만 getnameinfo
이 16진수 IP 주소를 호스트 이름으로 구문 분석하는 간단한 프로그램을 C()로 작성했습니다.
따라서 내 프로그램을 사용하여 getnameinfo
16진수 IP에서 호스트 이름을 얻을 수 있습니다.
$ getnameinfo 0A6F010B
server1.mydomain.com
예를 들어 다음 명령은 심볼릭 링크를 삭제합니다./srv/tftp/pxelinux.cfg/0A6F010B
$ rmpxe server1.mydomain.com
이제 내 bash_completion
문제는 다음과 같습니다. 다음 코드를 만들었고 호스트 이름을 완성하는 대신(내 스크립트가 예상하는 대로) 16진수 IP 주소(예: 내 디렉토리 심볼릭 링크 파일에 있는 주소 /srv/tftp/pxelinux.cfg/
)를 완성하는 것을 제외하고는 잘 작동합니다. 매개 변수가 자동 완성되기 전에 먼저 호스트 이름을 확인하도록 이 코드에 통합해야 합니다.
_rmpxe()
{
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /srv/tftp/pxelinux.cfg &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(compgen -f "$word"))
popd &>/dev/null
fi
}
complete -F _rmpxe rmpxe
즉, 현재 bash 완료 작업은 다음과 같습니다.
$ ls /srv/tftp/pxelinux.cfg
0A6F010B 0A6F010C 0A6F010D 0A6F010E
$ rmpxe <tab>
0A6F010B 0A6F010C 0A6F010D 0A6F010E
그러나 다음과 같이 작동하려면 필요합니다.
$ rmpxe <tab>
server1.mydomain.com server2.mydomain.com server3.mydomain.com
답변1
을 사용했기 때문에 현재 경로 아래의 모든 파일과 디렉터리가 나열됩니다 compgen -f
. compgen
귀하의 경우 이는 0A6F010B 0A6F010C 0A6F010D 0A6F010E
.
호스트 이름을 얻으려면 현재 경로를 반복하고 각 IP를 공급하여 getnameinfo
해당 IP에 해당하는 호스트 이름을 얻고 이를 배열에 저장한 다음 와 함께 이 배열을 사용할 수 있습니다 compgen -W
.
제 환경에서 간단한 테스트를 해봤습니다. 파일을 만들었습니다 /etc/bash_completion.d/cuonglm
.
_rmpxe() {
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /home/cuonglm/test &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
HOST_ARR=()
for i in *; do
HOST_ARR+=($(/home/cuonglm/getnameinfo "$i"))
done
COMPREPLY=($(compgen -W "$(printf "%s " "${HOST_ARR[@]}")" -- "$word"))
popd &>/dev/null
fi
}
complete -F _rmpxe cuonglm
일부 수정을 거쳐 전체 기능을 사용했습니다.
- 호스트 이름을 저장하기 위해 배열을 사용하고 있습니다
HOST_ARR
. - 현재 디렉토리를 반복하면서(
pushd
이전에 감사드립니다) 각 파일 이름을getnameinfo
프로그램에 입력합니다. - 그런 다음 compgen을 사용하여
compgen -W
완성할 단어 목록을 만들었습니다.
결과는 다음과 같습니다.
$ cuonglm <Tab>
$ cuonglm server<Tab>
server1.example.com server2.example.com
두 호스트 이름 모두 동일한 부분을 갖기 때문에 server
bash는 자동으로 이 부분을 먼저 완성합니다. 다른 호스트 이름이 있는 경우 Server.example
:
$ cuonglm <Tab>
Server.example server1.example.com server2.example.com