为什么存储 pidof 命令的结果会产生 2 个 PID,而该命令本身会产生 1 个 PID?

为什么存储 pidof 命令的结果会产生 2 个 PID,而该命令本身会产生 1 个 PID?

这是在我的 Pi 4 上。

当我运行以下命令时:

#!/bin/bash
strScriptName=$(basename $BASH_SOURCE)

pidof -x "$strScriptName" | tr " " "\n"

pid=$(pidof -x "$strScriptName" | tr " " "\n")
echo $pid

pidof -x "$strScriptName" | tr " " "\n"

我得到这样的东西:

12703
12707 12703
12703

请解释为什么单独使用 pidof 命令会产生单个 PID,但将结果存储在变量中会产生 2 个 PID? (关闭 tr 命令会产生一个 PID,所以我猜测这与管道到另一个命令有关,但为什么在将结果存储在变量中时会得到不同的结果,这让我很烦恼)

答案1

这很可能是因为命令替换启动了一个子 shell,在 Bash 中它是 shell 进程的实际副本。因此,您将有两个 shell,它们都通过命令行显示为正在运行的进程bash scriptname.sh,因此,如果pidof查找它,就会发现有两个 shell。

(管道实际上也为管道的某些部分启动了子 shell,但您可能看不到它们,因为 shell 执行实际命令的速度非常快。)

但是,如果您想要的是脚本的 PID,则无需使用pidof此类,PID 可以作为$$.同样,您可以从 获取调用脚本的名称$0

相关内容