zsh if 문에서 변수를 단락하려면 괄호를 사용하세요.

zsh if 문에서 변수를 단락하려면 괄호를 사용하세요.

zsh 완성 함수에서 다음 if 문이 발생합니다.

if _cache_invalid my_data || ( [[ ${+_my_array_var} -eq 0 ]] && ! _retrieve_cache my_data ) ; then ...

아이디어는 캐시가 유효하지 않은 경우 if 블록을 입력하는 것입니다. 그렇지 않은 경우 설정되어 있는지 확인 _my_array_var하고 그렇지 않은 경우 캐시에서 검색해 보세요. 설정하지 않고 캐시 검색에 실패 하면 _my_array_varif 블록도 입력됩니다. 디버깅에 관한 한 if 문의 논리는 괜찮지만 _my_array_var변수가 캐시에서 성공적으로 검색되면 if 문의 후반부는 변수를 채우지 못합니다.

더 짧은 테스트에서 나는 괄호를 비난했다는 것을 발견했습니다

echo ${+_my_array_var}
if [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data; then echo "entered" ; fi
echo ${+_my_array_var}

이는 0당시의 상황을 반영합니다 1(즉 _my_array_var, 설정되지 않은 경우 캐시 검색이 작동한 다음 _my_array_var설정됩니다. 대괄호를 추가하면

echo ${+_my_array_var}
if ( [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data ); then echo "entered" ; fi
echo ${+_my_array_var}

이는 0두 번 반향됩니다. 즉, if 블록은 아직 입력되지 않았지만 인구는 _my_array_varif 테스트를 "떠나지" 않았습니다.

그래서 원래 코드에서는 괄호를 제거해야 할 것 같지만 표현식 계층 구조나 단락 동작을 변경하지 않고 이 작업을 수행하고 싶습니다.

괄호를 사용하지 않고 연관성을 ||설정 하는 방법은 무엇입니까?&&

답변1

모든 Bourne 유사 쉘에서 like 안의 괄호는 zsh서브쉘 실행을 나타냅니다.

명령을 그룹화하려면 다음을 사용하십시오.{ ...; } 명령 그룹대신에:

if
  _cache_invalid my_data || {
    (( $+_my_array_var == 0 )) &&
      ! _retrieve_cache my_data
  }
then ...

또는:

if
  _cache_invalid my_data || ! {
    (($+_my_array_var )) || _retrieve_cache my_data
  }
then ...

바라보다info zsh subshell세부:

( LIST )
서브셸에서 LIST를 실행합니다. LIST가 실행되면 내장 트랩에 의해 설정된 트랩이 기본값으로 재설정됩니다.

{ LIST }
실행 목록.

관련 정보