这是在我的 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
。