(エイリアス関連)sudoで始まるシェルコマンドを自動補完する方法

(エイリアス関連)sudoで始まるシェルコマンドを自動補完する方法

次のエイリアスがあるとします.bashrc

alias docker='sudo docker'

それから| →docker run -v /tmp/test:/foo …で始まり、bash端末でオートコンプリートを試みると、エイリアスは次docker run -v /tmpsudoような気の利いた動作を引き起こします。

$ドッカーの実行 -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

関連情報