zsh 명령의 위치 매개변수에 배열 요소를 삽입하는 방법은 무엇입니까?

zsh 명령의 위치 매개변수에 배열 요소를 삽입하는 방법은 무엇입니까?

런타임에만 아는 특정 확장자를 가진 모든 파일을 나열해야 합니다(예: 특정 파일). 또는 확장자가 변수에 저장됩니다.

fd명령을 사용하여 나열하고 싶습니다 . 여러 확장자를 가진 모든 파일을 나열하는 명령은 fd -e java -e c ....

나는 그것을 관리하기 위해 두 가지 방법을 시도했지만 둘 다 보기 흉해 보입니다.

!/bin/zsh
str="c java"
extensions=(${=str})
arguments=(" -e "${^extensions})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java
fd ${=arguments}
!/bin/zsh
str="c java"
extensions=(${=str})
option=(" -e ")
arguments=${option:^^extensions}
fd ${=arguments}

이런 한줄 코드가 있었으면 좋겠습니다 fd ${=${(" -e "):^^(${=str})}}.

또 다른 질문이 있습니다. 첫 번째 코드 블록에서 arguments=" -e "${^extensions};echo $arguments"-ec -e java\n" 대신 "-ec java\n"이 출력되는 이유는 무엇입니까 arguments=(" -e "${^extensions}); echo $arguments?

답변1

다시 분할하기 전에 분할 str한 다음 -e각 배열 요소에 추가합니다.

% str="c java"
% print -lr -- ${=${${=str}/#/-e }}
-e
c
-e
java

첫 번째 단계는 문자열을 목록으로 분할하는 것이므로 필요 이상으로 추악하고 취약합니다. 목록을 배열에 넣으면 앞에 추가한 다음 분할할 수 있습니다.

% a=(c java)
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java

그러나 분할은 IFS짧지만 공백이 포함된 입력(또는 더 일반적으로 문자)에서 분할되므로 올바르지 않습니다 $IFS.

% a=(c java "with spaces")
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
-e
with
spaces

매개변수 확장이 포함된 올바른 한 줄의 코드가 없다고 생각합니다. Pglob으로 한 가지를 활용하고 이를 다른 배열로 대체할 수 있는 보기 흉한 glob 한정자가 있습니다 .

% a=(c java "with spaces")
% print -lr -- .(P\''-e'\'e\''reply=($a)'\')
-e
c
-e
java
-e
with spaces

str="c java"
extensions=(${=str})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java

문자열을 생성하고 있기 때문입니다. 문자열 컨텍스트에서는 이 ^플래그가 적용되지 않습니다. 이것이 하는 일은 개별 배열 요소를 생성하는 것이지만, 컨텍스트가 배열을 허용하지 않는 경우에는 이 작업을 수행할 수 없습니다.

관련 정보