Wenn ich diesen Befehl in einem Skript ausführe, erzeugt er keine Ausgabe außer dem Header von ps
:
# Taken from Advanced Bash Usage on youtube:
echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
Dies ist die Ausgabe:
$./testing.bash
PID TTY STAT TIME COMMAND
aber hier wird es in einem Terminal ausgeführt, das die erwartete Ausgabe erzeugt :
$echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
PID TTY STAT TIME COMMAND
18289 pts/4 Ss+ 0:00 /bin/bash
17917 pts/4 S+ 0:00 \_ /bin/bash
17918 pts/4 S+ 0:00 \_ /bin/bash
17919 pts/4 S+ 0:00 \_ /bin/bash
17920 pts/4 S+ 0:00 \_ /bin/bash
17921 pts/4 R+ 0:00 \_ ps wwf -s 18289
FRAGE:
Können Sie den Unterschied erklären und mir zeigen, wie man das richtig macht?
Ich habe viele Dinge ausprobiert und 4 Stunden lang bei Google gesucht. Wenn Sie brauchen, kann ich auflisten, was ich versucht habe, aber ich denke nicht, dass das hier relevant ist.
$echo $SHELL
/bin/bash
und:
$head -1 testing.bash
#!/bin/bash
Akzeptierte Antwort:
ps
‘ -s sessionid
Die Option besteht darin, Prozesse basierend auf ihrer Sitzungs-ID auszuwählen.
Sie können ps -j
verwenden um die Sitzungs-ID von Prozessen anzuzeigen. Sitzungen zusammen mit Prozessgruppen werden im Allgemeinen zur Steuerung von Shell-Jobs verwendet (daher der -j
).
Ihr Terminalemulator erstellt eine neue Sitzung mit dem Prozess, den er dann wiederverwendet, um Ihre bevorzugte Shell auszuführen. In einem Terminal ist die Sitzungs-ID also im Allgemeinen dieselbe wie die PID dieser Shell.
Wenn Sie also ps -j -s "$$"
ausführen darin das Shell erhalten Sie die Prozesse in der Sitzung, weil "$$"
passiert mit der Sitzungs-ID identisch sein.
Wenn Sie diesen Befehl in einer anderen Shell ausführen (wie der Shell, die in einem untergeordneten Prozess ausgeführt wird, um Ihre testing
script), jede Shell, die kein Session-Leader ist, erhalten Sie nichts, weil es keine Session mit einer ID gibt, die der PID dieser Shell entspricht.
$ ps -j -s "$$"
PID PGID SID TTY TIME CMD
7239 7239 7239 pts/7 00:00:00 zsh
21002 21002 7239 pts/7 00:00:00 ps
$$
ist 7239, der Sitzungsleiter. Also ps -j -s 7239
gibt mir alle Prozesse in dieser Sitzung.
$ sh -xc 'ps -j -s "$$"; ps -j -p "$$"'
+ ps -j -s 21044
PID PGID SID TTY TIME CMD
+ ps -j -p 21044
PID PGID SID TTY TIME CMD
21044 21044 7239 pts/7 00:00:00 sh
Das erste ps
Der Befehl gibt nichts zurück, da der zweite ps
zeigt, gibt es keine Sitzung mit der ID 21044, da der Prozess der ID 21044 kein Sitzungsleiter ist. Der Sitzungsleiter ist immer noch 7239, die vom Terminal-Emulator gestartete Shell.
$ sh -xc 'ps -j -s "$(($(ps -o sid= -p "$$")))"'
+ ps -o sid= -p 21215
+ ps -j -s 7239
PID PGID SID TTY TIME CMD
7239 7239 7239 pts/7 00:00:00 zsh
21215 21215 7239 pts/7 00:00:00 sh
21217 21215 7239 pts/7 00:00:00 ps
Jetzt sehen wir alle Prozesse in der Sitzung. Wir haben ps -o sid= -p "$$"
verwendet um die ID der Sitzung zu erhalten, die $$
gehört.