Pokud tento příkaz spustím ve skriptu, neprodukuje výstup kromě záhlaví z ps
:
# Taken from Advanced Bash Usage on youtube:
echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
Toto je výstup:
$./testing.bash
PID TTY STAT TIME COMMAND
ale zde se spouští v terminálu, který produkuje očekávaný výstup :
$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
OTÁZKA:
Můžete mi vysvětlit rozdíl a ukázat mi správný způsob, jak toho dosáhnout?
Vyzkoušel jsem spoustu věcí a hledal jsem na Googlu 4 hodiny, pokud potřebujete, mohu uvést, co jsem zkoušel, ale nemyslím si, že je to zde relevantní.
$echo $SHELL
/bin/bash
a:
$head -1 testing.bash
#!/bin/bash
Přijatá odpověď:
ps
‘ -s sessionid
možností je vybrat procesy na základě jejich ID relace.
Můžete použít ps -j
abyste viděli ID relace procesů. Relace spolu se skupinami procesů se obecně používají pro řízení úloh shellu (proto -j
).
Váš terminálový emulátor vytvoří novou relaci s procesem, který pak znovu použije k provedení vašeho preferovaného shellu. Takže v terminálu bude ID relace obecně stejné jako pid tohoto shellu.
Pokud tedy spustíte ps -j -s "$$"
v tom shell, získáte procesy v relaci, protože "$$"
stane se být stejný jako ID relace.
Pokud tento příkaz spustíte v jakémkoli jiném shellu (jako je shell, který je spuštěn v podřízeném procesu k interpretaci vašeho testing
script), jakýkoli shell, který není vůdcem relace, nezískáte nic, protože neexistuje žádná relace s ID, které by odpovídalo pid tohoto shellu.
$ 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
$$
je 7239, vedoucí relace. Takže ps -j -s 7239
mi poskytuje všechny procesy v této relaci.
$ 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
První ps
příkaz nevrací nic, protože jako druhý ps
ukazuje, neexistuje žádná relace s id 21044, protože proces id 21044 není vedoucí relace. Vedoucí relace je stále 7239, shell spuštěný emulátorem terminálu.
$ 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
Nyní vidíme všechny procesy v relaci. Použili jsme ps -o sid= -p "$$"
získat ID relace, která $$
patří.