som*_*ing 4 bash ps shell-script session command-substitution
如果我在脚本中运行此命令,除了来自以下内容的标题外,它不会产生输出ps
:
# Taken from Advanced Bash Usage on youtube:
echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
Run Code Online (Sandbox Code Playgroud)
这是输出:
$./testing.bash
PID TTY STAT TIME COMMAND
Run Code Online (Sandbox Code Playgroud)
但在这里它在一个终端中运行,产生预期的输出:
$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
Run Code Online (Sandbox Code Playgroud)
题:
你能解释一下区别并告诉我正确的方法吗?
我尝试了很多东西并在谷歌上搜索了 4 个小时,如果您需要,我可以列出我尝试过的内容,但我认为这与此处无关。
$echo $SHELL
/bin/bash
Run Code Online (Sandbox Code Playgroud)
和:
$head -1 testing.bash
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 10
ps
'-s sessionid
选项是根据会话 ID 选择进程。
您可以使用ps -j
来查看进程的会话 ID。会话和进程组通常用于外壳作业控制(因此是-j
)。
您的终端仿真器会与该进程创建一个新会话,然后它会重新使用该会话来执行您首选的 shell。因此,在终端中,会话 id 通常与该 shell 的 pid 相同。
因此,如果您ps -j -s "$$"
在该shell 中运行,您将获得会话中的进程,因为"$$"
恰好与会话 ID 相同。
如果您在任何其他 shell 中运行该命令(例如在子进程中执行以解释您的testing
脚本的 shell),任何不是会话领导者的 shell,您将一无所获,因为没有具有对应 id 的会话该shell的pid。
$ 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
Run Code Online (Sandbox Code Playgroud)
$$
是 7239,会话领导者。因此,这ps -j -s 7239
为我提供了该会话中的所有流程。
$ 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
Run Code Online (Sandbox Code Playgroud)
第一个ps
命令不返回任何内容,因为如第二个ps
所示,没有 ID 为 21044 的会话,因为 ID 为 21044 的进程不是会话领导者。session leader还是7239,终端模拟器启动的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
Run Code Online (Sandbox Code Playgroud)
现在,我们看到会话中的所有进程。我们用来ps -o sid= -p "$$"
获取$$
所属会话的 id 。