명령 대체 결과를 추가하는 방법은 무엇입니까?

명령 대체 결과를 추가하는 방법은 무엇입니까?

예를 들어 mp3 파일 목록을 만들고 싶습니다 a 1.mp3|a 2.mp3.

몇 가지 변형을 시도했지만 echo ${(j:|:)$(echo *.mp3)}작동하지 않습니다.

# too much splitting 
01|The|Magic|Finger|01.mp3|02|The|Magic|Finger|02.mp3|03|The|Magic|Finger|03.mp3|04|The|Magic|Finger|04.mp3|05|The|Magic|Finger|05.mp3|06|The|Magic|Finger|06.mp3

# too much quoting
01 The Magic Finger 01.mp3 02 The Magic Finger 02.mp3 03 The Magic Finger 03.mp3 04 The Magic Finger 04.mp3 05 The Magic Finger 05.mp3 06 The Magic Finger 06.mp3

이 작업을 수행하기 위한 함수나 변수를 만들고 싶지 않습니다. (간편하게 할 수 있습니다.)

답변1

mp3 파일 목록을 가져와 echo공백으로 구분하여 인쇄할 수 있도록 전달한 다음 출력을 파이프하고 읽고 공백/탭/줄 바꿈/NUL로 분할한 다음 |.

다음 중 하나를 수행하십시오.

printf '%s|' *.mp3

또는

files=(*.mp3)
joined=${(j:|:)files}

이러한 파일 이름 을 패턴으로 사용하려는 경우에는 zsh와일드카드 문자를 이스케이프해야 할 수도 있습니다 . 이는 b매개변수 확장 플래그를 통해 수행됩니다.

pattern="(${(j:|:)${(b@)files}})"

답변2

set다음을 사용하여 이러한 파일을 위치 매개변수에 넣을 수 있습니다 "$*".

set -- *.mp3
(IFS=\|; echo "$*")

이 작업은 하위 쉘에서 수행되므로 IFS에 대한 변경 사항은 현재 쉘에 영향을 미치지 않습니다.

답변3

이를 수행하는 방법을 찾았지만 다음과 같은 간단한 사용 사례에는 여전히 매우 복잡합니다.

echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}

관련 정보