이 기능이 있는데,
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[@]}"}
}