次のエイリアスがあるとします.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