나는 최근에 readarray
Bash v5.zsh에 상응하는 것이 있다는 것을 깨달았습니다.
답변1
zsh에는 내장 명령이 없지만 readarray
이를 수행하는 한 줄 표현식이 있습니다 readarray -t
.
myarray=("${(@f)$(< myfile)}")
일반 파일 대신 사용하려면 다음 stdin
을 사용해야 합니다 cat
.
myarray=("${(@f)$(cat)}")
명령의 출력을 캡처하려면 다음을 사용할 수도 있습니다.
myarray=("${(@f)$(command)}")
모든 예에서 빈 줄(명령 대체를 통해 잘린 후행 줄 제외)도 배열에 포함됩니다. 빈 줄을 유지하지 않으려면 다음과 같이 변경하세요.
myarray=(${(f)"$(< myfile)"})
myarray=(${(f)"$(cat)"})
myarray=(${(f)"$(command)"})
f
(라인 eed의 경우 )은 실제로 모든 구분 기호에 대한 분할 f
의 약어로 , 또는 및 매개변수 확장 과 같은 이스케이프 시퀀스를 허용합니다 . 바로가기 를 참조하세요 .ps[\n]
s[sep]
p
\n
\0
sep
0
ps[\0]
따라서 readarray -rd '' array
bash 4.4+는 다음과 같이 작성할 수 있습니다 array=( "${(@0)$(cat)}" )
.
그러나 중요한 차이점이 있습니다. 의 경우 readarray
구분 기호를 -d
지정 d
하고 s
매개변수 확장 플래그는 s
구분 기호를 사용합니다.
a<NUL><NUL>b<NUL>c<NUL>
readarray -td '' array
주어진 array=(a '' b c)
와 같은 입력에서 일반적으로 필요하지 않은 빈 후행 요소를 array=("${(@0)$(cat)}")
제공합니다 . array=(a '' b c '')
를 사용하여 삭제할 수 있습니다 array[-1]=()
.
NUL로 구분된 목록은 파일 경로를 저장하는 데 자주 사용되므로 제거하세요.모두빈 요소는 array=(${(0)"$(grep -rlZ pattern .)"})
이 문제를 피하는 쉬운 방법입니다.
bash와의 또 다른 주목할만한 차이점은 에서는 종료 상태가 유지된다는 readarray
것입니다 (bash와는 반대로 ).array=("${(@f)$(cmd)}")
cmd
readarray -t array < <(cmd)