コマンドを.zshrc
よりきれいにしようとしている間、「他のコマンドの出力をどのように実行しますか?」という質問を偶然見つけました。これは単純な問題だと確信していますが、私が間違っていることを理解していません。
追加したい「完了」をクリック私の構成に。これを行うには、$ pip completion --zsh
次の出力を追加する必要があります.zshrc
。
$ pip completion --zsh
# pip zsh completion start
function _pip_completion {
local words cword
read -Ac words
read -cn cword
reply=( $( COMP_WORDS="$words[*]" \
COMP_CWORD=$(( cword-1 )) \
PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ))
}
compctl -K _pip_completion pip
# pip zsh completion end
今、上記の行はビューには良くありません。代わりに次の行を追加してみました.zshrc
。
eval $(pip completion --zshrc)
しかし、pipの完成は「インストール」されませんが(行自体を追加するのとは対照的に.zshrc
)エラーも発生しません。
zsh
ラインが正しく評価されていないと感じますが、どのように#
テストするのかわかりません。実行しても$ eval $(pip completion --zshrc)
エラーは表示されません。
私はどこで間違っていますか?$ pip completion --zsh
私の結果を評価するための同様の代替方法がありますか.zshrc
?
答え1
あなたは走らなければなりません
eval "$(pip completion --zsh)"
次の2つのコマンドの出力を比較します。
echo $(pip completion --zsh)
echo "$(pip completion --zsh)"
zshで「空でない場合は$VARIABLE
値を取る」を意味します。VARIABLE
しかし、$(command)
「出力を取り、余白にcommand
ある単語に分けること」を意味します。したがって、eval $(pip completion --zsh)
すべてのスペースシーケンス(改行を含む)は単語区切り文字として扱われます。次に、eval
すべてのパラメータを1つに囲み、各パラメータの間にスペースを残します。ただし、スペースは改行文字と同じではなく、eval
実行されたコードは長い一連のコメント行にすぎません。
これはサブセットです。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?:zshでは、他のsh-likeシェルとは異なり、トークン化は変数置換ではなくコマンド置換時にのみ発生します(変数置換によって生成されたスペースが削除される限られた形式を除く)、結果としてワイルドカード拡張は自動的には発生しません。 zshでは、コマンド置換と変数置換(空の単語が発生する可能性がある場合)の周囲に二重引用符を使用する必要があります。