Se eseguo questo comando in uno script, non produce output tranne l'intestazione da ps
:
# Taken from Advanced Bash Usage on youtube:
echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
Questo è l'output:
$./testing.bash
PID TTY STAT TIME COMMAND
ma qui viene eseguito in un terminale che produce l'output atteso :
$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
DOMANDA:
Puoi spiegare la differenza e mostrarmi il modo giusto per farlo?
Ho provato molte cose e ho cercato su Google per 4 ore, se hai bisogno posso elencare quello che ho provato ma non penso che sia rilevante qui.
$echo $SHELL
/bin/bash
e:
$head -1 testing.bash
#!/bin/bash
Risposta accettata:
ps
' -s sessionid
l'opzione è selezionare i processi in base al loro ID di sessione.
Puoi usare ps -j
per vedere l'ID di sessione dei processi. Le sessioni insieme ai gruppi di processi sono generalmente utilizzate per il controllo del lavoro della shell (da cui il -j
).
Il tuo emulatore di terminale crea una nuova sessione con il processo che poi riutilizza per eseguire la tua shell preferita. Quindi, in un terminale, l'id di sessione sarà generalmente lo stesso del pid di quella shell.
Quindi, se esegui ps -j -s "$$"
in quello shell, otterrai i processi nella sessione perché "$$"
succede essere uguale all'ID della sessione.
Se esegui quel comando in qualsiasi altra shell (come la shell che viene eseguita in un processo figlio per interpretare il tuo testing
script), qualsiasi shell che non sia un leader di sessione, non otterrai nulla perché non esiste una sessione con un id che corrisponda al pid di quella shell.
$ 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
$$
è 7239, il leader della sessione. In modo che ps -j -s 7239
mi dà tutti i processi in quella sessione.
$ 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
Il primo ps
comando non restituisce nulla perché, come il secondo ps
shows, non c'è sessione con id 21044 poiché il processo di id 21044 non è un leader di sessione. Il leader della sessione è ancora 7239, la shell avviata dall'emulatore di terminale.
$ 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
Ora vediamo tutti i processi nella sessione. Abbiamo usato ps -o sid= -p "$$"
per ottenere l'ID della sessione che $$
appartiene a.