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?
Ich glaube, Sie verwirren Änderungen an 'PATH' * in * einer Subshell mit Änderungen an' PATH' * geerbt von * einer Subshell. – chepner
@chepner: Tatsächlich habe ich übersehen, dass PATH eine Umgebungsvariable ist und nicht exportiert werden muss, damit die Änderungen effektiv sind. – sjsam
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