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ただし、読みやすさの低下に加えて、引用/逆参照に加えて、プロセスを分岐して出力をパイプすることを意味するため、効率も低下します。

おすすめ記事