2017-03-16 177 views
4

假設命令alpha產生這樣的輸出:如果我運行命令bash命令輸出作爲參數

beta $(alpha) 

然後beta將與四個參數,"a""b""c"執行

a b c 
d 

"d"

但是,如果我運行命令

beta "$(alpha)" 

然後beta將與一個參數,"a b c d"執行。

我該寫些什麼才能執行beta有兩個參數"a b c""d"。也就是說,我如何強制$(alpha)alpha的每條輸出線返回一個參數?

回答

3

與anubhava的回答相似,如果您使用bash 4或更高版本。

readarray -t args < <(alpha) 
beta "${args[@]}" 
-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 
+0

這也將'。/ alpha.sh'的輸出置於路徑名的生成過程中,這可能不是我們想要的。 – chepner

+0

@chepner。減去一個,爲什麼?這是一個簡單的例子來說明如何解決這個問題,它的工作原理。很明顯,alpha.sh可以在PATH目錄中,然後你可以避免使用「./」,但是我想把注意力集中在解決問題而不是次要問題上...... – aicastell

+0

它*不工作,如果' alpha'可以輸出像「a * c」這樣的行。這不是次要問題。 – chepner

7

您可以使用:

$ alpha | xargs -d "\n" beta 
2

做,在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"