다음과 같은 별칭이 있다고 가정합니다 .bashrc
.
alias docker='sudo docker'
그런 다음 | → docker run -v /tmp/test:/foo …
로 시작하여 bash 터미널에서 자동 완성을 시도하면 docker run -v /tmp
별칭으로 인해 sudo
다음과 같은 산만한 동작이 발생합니다 .
$ 도커 실행 -v /tmpTAB $ docker run -v /tmp[sudo] 사용자 비밀번호:
Ctrl+C이 시점에서는 실행 및 재시작 이상으로 명령줄을 편집하는 것이 거의 불가능합니다.
이 문제를 극복할 수 있는 솔루션이 있습니까? 즉, sudo
별칭에 암시적 콘텐츠를 유지하되 정기적인 자동 완성을 기대할 때는 비밀번호 프롬프트를 피하세요.
해당 함수와 독립적인 솔루션이 alias
좋을 것입니다(여기서 제기된 문제는 직접 입력할 때도 발생한다는 점을 고려 $ sudo command …
).
답변1
컴퓨터에 비밀번호 프롬프트가 표시되지 않게 하려면 sudo
이 -n
옵션을 사용해 보세요.
매뉴얼 페이지는 다음과 같습니다 sudo
.
-n, --비대화형
사용자에게 어떤 유형의 입력도 요청하지 마세요. 명령을 실행하는 데 비밀번호가 필요한 경우 sudo는 오류 메시지를 표시하고 종료됩니다.
답변2
@ApolloXI의 조언에 의지 sudo -n
하고 더 많은 실험을 하면서 기사에서 언급한 단점을 극복할 수 있었습니다.이전 댓글.
요약하자면, docker …
명령을 자동으로 완료하면 다음 코드가 로드됩니다.
- /etc/bash.bashrc에서:
. /usr/share/bash-completion/bash_completion
; - /usr/share/bash-completion/bash_completion에서:
__load_completion docker
,- 그 다음에
. /usr/share/bash-completion/completions/docker
;
- /usr/share/bash-completion/completions/docker에서:
docker version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}
, 등.docker
명령(또는 별칭이 있는 경우)을 다시 실행합니다 .
따라서 작동하는 해결책은 내 별칭을 bash 기능으로 바꾸는 것입니다.bash 완료 함수에서 호출되었는지 감지. 이는 배열을 읽어서 수행할 수 있습니다 BASH_SOURCE
.
따라서 우리는 다음과 같은 솔루션을 채택할 수 있습니다.
docker() {
if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
sudo -n docker "$@"
else
sudo docker "$@"
fi
}
또는 래퍼를 쉽게 비활성화하려면 다음과 같이 작성할 수 있습니다.
__docker() {
if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
docker "$@"
else
sudo docker "$@"
fi
}
alias docker=__docker
그런 다음 sudo -n
접두사는 더 이상 필요하지 않으며 다음과 같이 실행할 수 있습니다.
$ \docker run --help