#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
erzeugt keine Ausgabe, da Pipelines jeder ihrer Komponenten in einem Sub-Shell laufen. Subshells erben Kopien der Variablen der übergeordneten Shell, anstatt sie zu teilen. Versuchen Sie folgendes:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
Die Klammern einen Bereich Code definieren, die in einer Subshell ausgeführt wird, und $ foo behält seinen ursprünglichen Wert nach in ihnen modifiziert.
Nun ist diese versuchen:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
Die Streben rein für die Gruppierung sind, wird keine Sub-Shell erstellt, und die $ foo in den geschweiften Klammern modifiziert ist die gleiche $ foo außerhalb sie geändert.
Nun ist diese versuchen:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
Innerhalb der geschweiften Klammern, gebautet die Lese schafft $ var1 und $ var2 richtig und Sie können sehen, dass sie Echo erhalten. Außerhalb der Zahnspangen existieren sie nicht mehr. Der gesamte Code innerhalb der geschweiften Klammern wurde in einer Subshell ausgeführt, weil es eine Komponente einer Pipeline ist.
Sie können beliebigen Code in geschweifte Klammern setzen, sodass Sie diese Pipeline-in-einem-Block-Konstruktion immer dann verwenden können, wenn Sie einen Shellskriptblock ausführen müssen, der die Ausgabe von etwas anderem analysiert.
Dieses von der Wahl der Schale abhängt. Ksh93 wurde entwickelt, um den Prozessaufwand zu begrenzen.Es führt auch das letzte Element einer Pipeline * innerhalb des aufrufenden Shell-Prozesses aus, wodurch der Zustand erhalten bleibt. –
Bash 4.2 führte eine Option ein, um das Gleiche zu tun. Schalten Sie die Jobsteuerung aus ('set + m') und setzen Sie die Option' lastpipe' ('shopt -s lastpipe'). – chepner
Ich werde das untersuchen. Vielen Dank! –