(별칭 관련) sudo로 시작하는 쉘 명령을 자동 완성하는 방법

(별칭 관련) sudo로 시작하는 쉘 명령을 자동 완성하는 방법

다음과 같은 별칭이 있다고 가정합니다 .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

관련 정보