zsh 완성 함수에서 다음 if 문이 발생합니다.
if _cache_invalid my_data || ( [[ ${+_my_array_var} -eq 0 ]] && ! _retrieve_cache my_data ) ; then ...
아이디어는 캐시가 유효하지 않은 경우 if 블록을 입력하는 것입니다. 그렇지 않은 경우 설정되어 있는지 확인 _my_array_var
하고 그렇지 않은 경우 캐시에서 검색해 보세요. 설정하지 않고 캐시 검색에 실패 하면 _my_array_var
if 블록도 입력됩니다. 디버깅에 관한 한 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_var
if 테스트를 "떠나지" 않았습니다.
그래서 원래 코드에서는 괄호를 제거해야 할 것 같지만 표현식 계층 구조나 단락 동작을 변경하지 않고 이 작업을 수행하고 싶습니다.
괄호를 사용하지 않고 연관성을 ||
설정 하는 방법은 무엇입니까?&&
답변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 }
실행 목록.