如何将一个脚本的多个输出传递到另一个脚本

How to pass several outputs of one script into another script

我有一个 zsh 函数,它将给定参数列表分成两行,用空格分隔:

function foo() {
    echo "a b c";
    echo "d e f";
}

$foo
a b c 
d e f

我想将输出传递给另一个函数,以便它识别正好是两个参数。

function bar() {
    for i in "$@"
    do
        echo $i;
    done
}

现在它作为:

$ bar $(foo)
a
b
c
...

我想要什么

$ bar $(foo)
a b c
d e f

我试图在 "quotes" 和“'double quotes'”中回显结果行,但没有结果。

(zsh 5.0.5 (x86_64-apple-darwin14.0))


更新:使用了bar "$(foo)"语法,现在好像只有一个参数:

function bar() {
    echo "$1=";
    echo ;
    echo "$2=";
    echo ;
}

$ bar "$(foo)"
=
a b c
d e f
=

您可以使用 zsh 的一些更高级的参数扩展功能将 foo 的输出拆分为单独的词。

foo () {
    echo "a b c"
    echo "d e f"
}

bar () {

    printf "Arg: %s\n" "$@"
}

bar "${(f):-$(foo)}"

正在发生的事情的细分:

  1. $(foo) 评估为包含嵌入式换行符的单个字符串。 (警告:任何 trailing 换行符都将被丢弃;不过这应该不是问题。)
  2. ${:-whatever} 扩展为 :- 之后的字符串。它本质上是默认值扩展,但是您省略了要扩展的参数的名称,因此它 always 扩展为默认值。这看起来毫无意义,但它允许我们将参数扩展标志应用于任意文本(例如步骤 1 中的命令替换)
  3. ${(f)...} 在换行符上将字符串拆分为多个单词。

一起,单个扩展的行为类似于:

lines=()
while read line; do
    lines+=( $line )
done < <(foo)

bar $lines[@]

或者,将 bar 定义为

bar () {
    printf "Arg: %s\n" "${(f)1}"
}

得到与

相同的结果
bar "$(foo)"

(引号,至少,仍然是必要的)。