如何仅使用单个表达式分割命令的输出并将结果分配给数组?

kjo*_*kjo 5 zsh

注意:我已经阅读了其他类似问题的答案(How to split the output and store it in an array?How to split a string into an array in bash),但没有一个回答我要问的具体问题这里。


假设某个命令的输出foo是由 10 个制表符分隔的字段组成的单行。然后

tmpvar=$( foo )
fields=( ${(ps:\t:)tmpvar} )
echo $#fields
# 10
Run Code Online (Sandbox Code Playgroud)

问:如何foo在选项卡上实现相同的 输出分割,而不需要对 进行中间分配tmpvar


FWIW,这不起作用:

fields=( ${(ps:\t:)$( foo )} )
echo $#fields
# 1
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 4

$\xc2\xa0printf \'<%s>\\n\' "${(@ps:\\t:)$(printf \'foo bar\\t\\tbaz\')}"\n<foo bar>\n<>\n<baz>\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您确实想抑制空元素,如 tempvar 方法中所示:

\n\n
$\xc2\xa0printf \'<%s>\\n\' ${(ps:\\t:)"$(printf \'foo bar\\t\\tbaz\')"}\n<foo bar>\n<baz>\n
Run Code Online (Sandbox Code Playgroud)\n\n

IOW,您需要引用命令替换。否则,适用于命令替换的分割结果的字段的s:\\t:连接(使用 的第一个字符)。$IFS$IFS

\n\n

或者,您可以设置$IFS为空字符串或单个非空白字符。

\n\n
$\xc2\xa0(IFS=; printf \'<%s>\\n\' ${(ps:\\t:)$(printf \'foo bar\\t\\tbaz\')})\n<foo bar>\n<baz>\n
Run Code Online (Sandbox Code Playgroud)\n