2017-03-16 15 views
4

angenommen, dass der Befehl alpha diese Ausgabe erzeugt:bash Befehlsausgabe als Parameter

a b c 
d 

Wenn ich den Befehl

beta $(alpha) 

laufen dann beta mit vier Parametern ausgeführt werden, "a", "b", "c" und "d".

Aber wenn ich den Befehl

beta "$(alpha)" 

dann beta wird mit einem Parameter ausgeführt werden, "a b c d".

Was soll ich schreiben, um beta mit zwei Parametern auszuführen, "a b c" und "d". Das heißt, wie erzwinge ich $(alpha), um einen Parameter pro Ausgangsleitung von alpha zurückzugeben?

Antwort

3

Ähnlich wie anubhava Antwort, wenn Sie bash 4 oder später verwenden.

-1

Script beta.sh sollte Ihr Problem beheben:

$ 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

Dies unterwirft auch die Ausgabe von './Alpha.sh' zur Erzeugung des Pfadnamens, was möglicherweise nicht wünschenswert ist. – chepner

+0

@schepner. Minus eins, warum? Es ist ein einfaches Beispiel, um zu zeigen, wie das Problem behoben werden kann, und es funktioniert. Offensichtlich kann alpha.sh auf den PATH-Verzeichnissen liegen und dann könnte man "./" vermeiden, aber ich wollte die Aufmerksamkeit auf die Behebung des Problems und nicht auf sekundäre Probleme konzentrieren ... – aicastell

+0

Es * funktioniert nicht, wenn ' alpha' kann eine Zeile wie 'a * c' ausgeben. Dies ist kein sekundäres Problem. – chepner

7

Sie verwenden können:

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

dass in bash in 2 Schritten durchführen:

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

beta "$a" "$b" 

Beispiel: