명령 대체를 사용하여 전역 스키마의 중첩 부분 생성

명령 대체를 사용하여 전역 스키마의 중첩 부분 생성

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

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

관련 정보