zsh에는 bash의 내장 readarray와 동일한 기능이 있습니까?

zsh에는 bash의 내장 readarray와 동일한 기능이 있습니까?

나는 최근에 readarrayBash 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\0sep0ps[\0]

따라서 readarray -rd '' arraybash 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)}")cmdreadarray -t array < <(cmd)

답변2

zsh에는 다음과 같은 프로그램이 있습니다.mapfile, 그러나 그것은기준 치수을(를) 사용하려면 로드해야 하며 와 호환되지 않습니다 readarray.

zmodload zsh/mapfile
filename='...'
filelines=("${(@f)mapfile[$filename]}")

목적은 (@f)여기의 다른 답변과 동일합니다. 즉, 파일 내용을 줄 바꿈으로 분할하는 것입니다.

관련 정보