다른 명령의 여러 줄 출력(주석 포함)을 평가합니다. (완료를 클릭하세요)

다른 명령의 여러 줄 출력(주석 포함)을 평가합니다. (완료를 클릭하세요)

명령을 .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)"

다음 두 명령의 출력을 비교하십시오.

echo $(pip completion --zsh)
echo "$(pip completion --zsh)"

zsh에서 " 비어 있지 않으면 $VARIABLE값을 취함"을 의미합니다 . VARIABLE그러나 $(command)"출력을 가져 command와서 여백에 있는 단어로 나누는 것"을 의미합니다. 따라서 에서는 eval $(pip completion --zsh)모든 공백 시퀀스(줄 바꾸기 포함)가 단어 구분 기호로 처리됩니다. 그런 다음 eval모든 매개변수를 하나로 묶고 각 매개변수 사이에 공백을 남겨 둡니다. 그러나 공백은 개행 문자와 동일하지 않으며 eval실행된 코드는 단지 긴 일련의 주석 행일 뿐입니다.

이는 하위 집합입니다.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?: zsh에서는 다른 sh 유사 셸과 달리 토큰화는 변수 대체가 아닌 명령 대체 시에만 발생하며(변수 대체에 의해 생성된 공백이 제거되는 제한된 형식 제외) 결과적으로 와일드카드 확장이 자동으로 발생하지 않습니다. zsh에서는 명령 대체와 변수 대체(빈 단어가 발생할 수 있는 경우) 주위에 큰따옴표를 사용해야 합니다.

관련 정보