zsh 함수에서 배열을 반환하는 관용적 방법은 무엇입니까?

zsh 함수에서 배열을 반환하는 관용적 방법은 무엇입니까?

이 기능이 있는데,

rpargs () {
    local i
    args=()
    for i in "$@"
    do
        test -e "$i" && args+="$(realpath --canonicalize-existing -- "$i")"  || args+="$i"
    done
}

나는 돌아오고 싶다 args. 내가 생각할 수 있는 유일한 방법은 printf '%s\0'확장 플래그를 통해 분할 하거나 (0@)위 코드와 같은 전역 변수를 사용하는 것입니다.

답변1

zsh내장 함수는 시스템 호출과 같은 32비트 부호 있는 정수만 반환 return할 수 있습니다 . _exit()이는 Bourne과 같은 대부분의 다른 쉘보다 낫지만 rc/ 쉘처럼 es임의의 문자열이나 문자열 목록을 반환 할 수는 없습니다. 반환 상태는 성공/실패 표시에 가깝습니다.

또는 함수가 채울 배열의 이름을 인수로 사용하도록 할 수 있습니다. 예를 들면 다음과 같습니다.

myfunc() {
  local arrayname=$1; shift
  # ...
  eval $arrayname'=("$elements[@]")'
  # the returned $? will be 0 here for success unless that eval command
  # fails.
}

myfunc myarray other args

귀하의 printf '%s\0'메소드는 NUL을 포함하는 배열 요소에서는 작동하지 않습니다.

대신 qq인수 확장 플래그를 사용하여 출력에서 ​​요소를 인용하고 입력에서 z(따옴표 해결) 및 (따옴표 제거)를 인용할 수 있습니다. 예를 들면 다음과 같습니다.Q

myfunc() {
   # ...
   print -r -- ${(qq)elements}
}

myarray=("${(@Q)${(z)$(myfunc)}}")

myfunc그러나 가독성이 떨어지는 것 외에도 인용/역참조하는 것 외에도 프로세스를 분기하고 출력을 파이핑하는 것을 의미하므로 효율성도 떨어집니다.

답변2

관용적인 접근 방식은 배열을 사용하는 것입니다 reply. 필요한 경우 이 (P)플래그를 사용하고 이름이 함수에 전달될 배열을 반환할 수 있습니다.

myfunc() {
  local arrayname=${1:-reply}; shift
  # ...
  : ${(PA)arrayname::="${args[@]}"}
}

관련 정보