Bash命令输出作为参数

4
假设命令alpha生成以下输出:
a b c
d

如果我运行这条命令:

beta $(alpha)

如果我运行命令,那么 beta 函数将带有四个参数执行,这四个参数是 "a", "b", "c""d"

但是,如果我运行的命令是:

beta "$(alpha)"

那么 beta 将使用一个参数执行,即 "a b c d"

我应该写什么来使用两个参数执行 beta,即 "a b c""d"。也就是说,如何强制 $(alpha)alpha 每行输出一个参数?

4个回答

8

您可以使用:

$ alpha | xargs -d "\n" beta

4

与anubhava的答案类似,如果您使用的是bash 4或更高版本。

readarray -t args < <(alpha)
beta "${args[@]}"

2

bash中,可以通过以下两个步骤来完成此操作:

IFS=$'\n' read -d '' a b < <(alpha)

beta "$a" "$b"

示例:

# set IFS to \n with -d'' to read 2 values in a and b
IFS=$'\n' read -d '' a b < <(echo $'a b c\nd')

# check a and b
declare -p a b
declare -- a="a b c"
declare -- b="d"

-1

beta.sh脚本应该可以解决您的问题:

$ cat alpha.sh
#! /bin/sh
echo -e "a b c\nd"

$ cat beta.sh
#! /bin/sh
OIFS="$IFS"
IFS=$'\n'
for i in $(./alpha.sh); do
    echo $i
done

这也会将 ./alpha.sh 的输出提交给路径名生成,这可能不是理想的。 - chepner
@chepner。减一,为什么?这只是一个简单的示例,展示如何解决问题,并且它有效。显然,alpha.sh可以在PATH目录中,然后您可以避免“./”,但我想把注意力集中在解决问题上,而不是次要问题... - aicastell
请问您能否提供一个在使用echo命令时会失败的字符串示例吗?我想进行测试。 - aicastell
1
它使用IFS,但并非您的方式。同时请阅读http://mywiki.wooledge.org/DontReadLinesWithFor,其中链接是页面上的*第一件事*。 - chepner
非常有用的链接,我很喜欢。谢谢分享! :) - aicastell
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接