他のコマンドの複数行出力(コメントを含む)を評価します。 (完了をクリックしてください)

他のコマンドの複数行出力(コメントを含む)を評価します。 (完了をクリックしてください)

コマンドを.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では、コマンド置換と変数置換(空の単語が発生する可能性がある場合)の周囲に二重引用符を使用する必要があります。

関連情報