명령 대체를 사용하여 glob 패턴의 중첩 부분 생성

명령 대체를 사용하여 glob 패턴의 중첩 부분 생성

간단한 파일 이름 생성 예제부터 시작해 보겠습니다.

echo (xx|yy|zz)*.txt  # Example 1

xx, yy 또는 zz로 시작하는 모든 txt 파일을 나열합니다. 이제 명령 대체를 사용하여 이러한 대안을 동적으로 생성해 보겠습니다. 나는 echo내가 어디로 향하고 있는지를 설명하기 위해 여기를 사용하고 있습니다. "실제" 예에서는 물론 다음과 같은 프로그램이 될 것입니다.

echo $(echo '(xx|yy|zz)')*.txt  # Example 2

위와 같이 작동합니다. 이제 까다로운 부분이 있습니다. 명령 대체는 대안 목록의 일부만 제공해야 합니다.

echo ($(echo 'xx|yy')|zz)*.txt  # Example 3 (does not work)

이것은 더 이상 작동하지 않습니다. zz로 시작하는 파일은 찾지만 yy로 시작하는 파일은 찾지 않습니다. Zsh는 문자 그대로 여기로 시작하는 파일을 검색하고 있는 것 같습니다 xx|yy.

보조 변수를 사용하면 작동하게 할 수 있습니다.

list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt   # Example 4

이제 내 질문에 :

임시 변수를 사용하지 않고 예제 4의 효과를 얻을 수 있습니까?

답변1

그냥 사용:

echo (${~"$(echo 'xx|yy')"}|zz)*.txt

zsh명령 대체 시 기본적으로 글로빙을 수행하지 않는 경우 단어 분할을 수행하는 것처럼 명령 대체 주위에 따옴표를 기록해 두십시오 . 이는 다음과 같은 경우에 유용할 수 있습니다.

echo (${~${(j:|:)$(cmd)}}).txt

출력에 단어를 결합하려면cmdwith| 하고 이를 glob으로 해석합니다. b해당 단어를 패턴 자체로 처리하지 않으려면 매개변수 확장 플래그 도 참조하세요 .

echo (${~${(j:|:)${(b)$(cmd)}}}).txt

관련 정보