In bash haben Sie diese praktische Variable: $ BASHPID, die immer die PID der aktuell ausgeführten Subshell zurückgibt. Wie kann ich die PID einer Subshell in ksh erhalten? Siehe zum Beispiel den folgenden Code:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Dies gibt Folgendes aus:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
Was ich möchte, ist die Zeile, die mit ****
der Ausgabe der PID der Subshell beginnt, im Fall des Beispiels wäre dies 5329.
quelle
$(exec sh -c 'echo $PPID')
Der anfängliche einfache Befehlsh -c 'echo $PPID'
gibt jedoch eine dritte PID an. Also danke für die Lösung. Akzeptiert.(sh -c 'echo $PPID')
, um das Erstellen einer Subshell zu vermeiden. Kontrast zu(sh -c 'echo $PPID'; true)
. Diese Optimierung wird nur$BASHPID
aktiviert, wenn Sie versuchen, als letztes vor dem Beenden der Subshell auf sie zuzugreifen, dh nur in Fällen, in denen Sie mit dem Wert nichts anfangen können. So in der Praxis können Sie ersetzen$BASHPID
mit$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Sie können erreichen, was Sie wollen, aber Sie müssen run_something in ein separates Skript einfügen. Ich bin mir nicht ganz sicher, warum, aber $$ wird nicht neu bewertet, wenn es in einer Funktion im selben Skript verwendet wird, das es aufruft. Ich vermute, dass der Wert von $$ einmal zugewiesen wird, nachdem das Skript analysiert wurde und bevor es ausgeführt wird.
run_in_background.sh
run_something.sh
Ausgabe
quelle
quelle
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(nur einer=
) undelif [[ -z ${BASHPID+_} ]]; then
(Vermeiden Sie die Verwendung des Impliziten-n
in doppelten eckigen Klammern, das alte pdksh wusste es nicht).Nach der Antwort von @Gilles, auf die ich bei der Lösung eines anderen Problems gestoßen bin, habe ich ein schnelles Testprogramm zusammengestellt, das die Theorie untermauert, dass die richtige Antwort lautet:
Ich habe festgestellt, dass es Zeiten gibt, in denen dies
exec
nicht erforderlich ist, aber ich habe bestätigt, dass es die einzige Möglichkeit ist, in allen von mir ausprobierten Shells immer die richtige PID zu erhalten. Hier ist mein Test:und seine Ausgabe
Ersetzen Sie Ihre Lieblingsschale im shebang:
sh
,bash
,mksh
,ksh
, etc ...Ich verstehe nicht, warum die Fälle 2 und 3 unterschiedliche Ergebnisse liefern oder warum sich die Ergebnisse für Fall 3 zwischen den Schalen unterscheiden. Ich habe versucht
bash
,ksh
undmksh
auf Arch Linux FWIW.quelle
quelle