Pipeline nach dem Bezug eines Basicscript

469
Nikhil

ich habe einen Code

# Inside Child.sh ChildVariable=BigChild  # Inside Parent.sh source ./Child.sh  echo "ChildVariable=$" 

Ausgabe:

ChildVariable=BigChild 

Aber,

# Inside Parent.sh source ./Child.sh | sed 's/\(.*\)/\t\1/' echo "ChildVariable=$" 

Ausgabe:

ChildVariable= 

Ich muss die Ausgabe (falls vorhanden) einrücken, Child.shalso muss ich die Ausgabe an sed übergeben. Aber ich verstehe nicht warum das ChildVariablenicht eingestellt ist?

0

1 Antwort auf die Frage

2
Kamil Maciorowski

Von man 1 bash:

Jeder Befehl in einer Pipeline wird als separater Prozess (dh in einer Subshell) ausgeführt.

Sie beschaffen aus einer Subshell; Die Variable wird in der Subshell festgelegt, nicht in der laufenden Shell Parent.sh.

Dies wird Child.shin der rechten Shell angezeigt:

# Inside Parent.sh source ./Child.sh > >(sed 's/\(.*\)/\t\1/') echo "ChildVariable=$" 

obwohl nun der Ausgang sederscheinen kann, nachdem die Ausgabe von echo(a race condition ). Im Moment denke ich, der beste Weg, um mit dem Problem fertig zu werden, besteht darin, das gesamte Programm neu zu gestalten, sodass Sie die Ausgabe nicht aus einem Quell-Skript filtern müssen.

Sie haben so markiert sourceund die Substitution ( > >(…)) verarbeitet. Um diese tragbare (-ish?) Man braucht verwenden .stattsource und einige Tricks mit fifos vorstellen .

Vielen Dank! Könnten Sie bitte vorschlagen, wie Sie dieses Programm umgestalten können? Meine Absicht ist, dass die Ausgabe des Child-Skripts durch einen Tabulator eingerückt wird. Nikhil vor 5 Jahren 0
Auch im folgenden `cmd 1; cmd 2 | cnd 3 | cmd 4` werden alle diese Befehle in einem anderen Prozess ausgeführt? Ich dachte, dass mindestens cmd 1 und cmd 2 in derselben Shell vorkommen werden. Nikhil vor 5 Jahren 0
@Nikhil Es kommt darauf an, was es tut. Kannst du es in zwei Teile aufteilen? Ich meine einen Teil, der Variablen festlegt (Quelle) und einen, der die Ausgabe erzeugt (nicht Quelle). Kamil Maciorowski vor 5 Jahren 0
@Nikhil `cmd 1` wird von der aktuellen Shell 'cmd 2' in einer Subshell ausgeführt. Nehmen Sie `;` und ersetzen Sie es durch einen Zeilenumbruch - das Ergebnis wird deutlicher. Kamil Maciorowski vor 5 Jahren 0
`a =" A "echo $ a A` und` a = "A"; echo $ a A `Hier können wir sehen, dass` a = "A" `und` echo $ a` unabhängig vom Semikolon oder der neuen Zeile in derselben Shell laufen. Befehle, die durch Leerzeichen getrennt sind, werden in Zeilenumbrüchen ausgeführt. Nikhil vor 5 Jahren 0
@Nikhil Dieses `echo` ist nicht in einer Pipe, das unterscheidet es von` cmd 2`. Aber selbst wenn es sich in einer Pipe befindet (also in einer Subshell läuft), würde es den Wert der Variablen ausgeben. Kamil Maciorowski vor 5 Jahren 0