この機能がありますが、
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[@]}"}
}