如何将一个脚本的多个输出传递到另一个脚本
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)}"
正在发生的事情的细分:
$(foo)
评估为包含嵌入式换行符的单个字符串。 (警告:任何 trailing 换行符都将被丢弃;不过这应该不是问题。)
${:-whatever}
扩展为 :-
之后的字符串。它本质上是默认值扩展,但是您省略了要扩展的参数的名称,因此它 always 扩展为默认值。这看起来毫无意义,但它允许我们将参数扩展标志应用于任意文本(例如步骤 1 中的命令替换)
${(f)...}
在换行符上将字符串拆分为多个单词。
一起,单个扩展的行为类似于:
lines=()
while read line; do
lines+=( $line )
done < <(foo)
bar $lines[@]
或者,将 bar
定义为
bar () {
printf "Arg: %s\n" "${(f)1}"
}
得到与
相同的结果
bar "$(foo)"
(引号,至少,仍然是必要的)。
我有一个 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)}"
正在发生的事情的细分:
$(foo)
评估为包含嵌入式换行符的单个字符串。 (警告:任何 trailing 换行符都将被丢弃;不过这应该不是问题。)${:-whatever}
扩展为:-
之后的字符串。它本质上是默认值扩展,但是您省略了要扩展的参数的名称,因此它 always 扩展为默认值。这看起来毫无意义,但它允许我们将参数扩展标志应用于任意文本(例如步骤 1 中的命令替换)${(f)...}
在换行符上将字符串拆分为多个单词。
一起,单个扩展的行为类似于:
lines=()
while read line; do
lines+=( $line )
done < <(foo)
bar $lines[@]
或者,将 bar
定义为
bar () {
printf "Arg: %s\n" "${(f)1}"
}
得到与
相同的结果bar "$(foo)"
(引号,至少,仍然是必要的)。