2016-06-30 16 views
2

Hintergrund

Diese [ article ] sagt:

Der Befehl Substitution auf die Ausgabe von Befehlen erweitert. Diese Befehle werden in einem Subshell ausgeführt ..

Aber das bash Handbuch sagt nichts über ein subshell in seinem Befehl Ersetzabschnitt.

Mein Test unter

$ ps 
    PID TTY   TIME CMD 
26483 pts/25 00:00:00 bash 
26866 pts/25 00:00:00 ps 
$ hpid="$(ps | grep bash)" 
$ echo "$hpid" 
26483 pts/25 00:00:00 bash 
26899 pts/25 00:00:00 bash 

zeigt, dass eine neue Schale mit pid 26899 während der Kommandosubstitution hervorgebracht wurde. An dieser Stelle habe ich die Umgebungsvariable PATH geändert.

$ PATH="/some/rogue/path" 

tat das unten stehende Material:

VAR="$(echo "Do|Die" | cut -d"|" -f 2)" 

und bekam den folgenden Fehler:

Command 'cut' is available in '/usr/bin/cut' 
The command could not be located because '/usr/bin' is not included in the PATH environment variable. 
cut: command not found 

Ich verstehe, dass der Fehler aufgrund der Änderung der Umgebungsvariable PATH ist, die die Schale hilft Lokalisieren Sie die Binärdateien. Ich bin jedoch verwirrt, wenn ich dies zusammen mit der Befehlsersetzung lese.

Wenn durch $(..) eine Subshell hervorgebracht wird, dann Umgebungsvariable PATH sollte intakt sein und auf den binären (cut in diesem Fall) anweisen und so beschwert schlag soll nicht, dass sie die binären cut nicht finden können.

Frage

Wie die Modifikation der PATH hat keinen Einfluss auf den Befehl Substitution hier?

+1

Ich glaube, Sie verwirren Änderungen an 'PATH' * in * einer Subshell mit Änderungen an' PATH' * geerbt von * einer Subshell. – chepner

+0

@chepner: Tatsächlich habe ich übersehen, dass PATH eine Umgebungsvariable ist und nicht exportiert werden muss, damit die Änderungen effektiv sind. – sjsam

+2

Ah, OK. Denken Sie daran, dass das "Exportieren" einer Variablen wirklich nur bedeutet, ihren Namen so zu markieren, dass der mit diesem Namen verbundene * Wert * der Umgebung von untergeordneten Prozessen hinzugefügt wird. Eine Umgebungsvariable, die eine aus der Umgebung initialisierte Variable ist, wird automatisch exportiert. – chepner

Antwort

4

Betrachten Sie unter Beispiel:

$ export PS1='\$\$=$$ \$ ' 
$$=30862 $ a=123 # Note: No export a here. 
$$=30862 $ echo $a 
123 
$$=30862 $ bash 
$$=31133 $ echo $a # Subshell explicitly created does not have it. 

$$=31133 $ exit 
$$=30862 $ echo $(eval 'echo $a') # This subshell however does inherit it. The single quote ensures that this is not evaluated by parent shell. 
123        # echo $(echo $a) would probably cause $a to be evaluated by parent shell. 
$$=30862 $ 

Kurz, Subshells gelaicht von $(...) inherit gleichen Umgebung wie Eltern-Shell, auch wenn die Variable exportiert nicht. (Sogar $$ ist gleich wie die Eltern-Shell.)

+0

Perfekt! Könnten Sie bitte aus einer Dokumentation "die gleiche Umgebung wie die Eltern-Shell erben" zitieren. – sjsam

+0

^^ Das konnte ich nicht finden ': - /'. Probieren Sie es erneut ... – anishsane

+0

Keine Probs .. Nehmen Sie sich Zeit. – sjsam