我在 Bash 中有一个名为 的脚本Script.sh
,它需要知道自己的 PID(即我需要在 Script.sh 中获取 PID)
知道怎么做吗?
该变量$$
包含 PID。
使用$BASHPID
或$$
有关更多信息,包括两者之间的差异,请参阅 [手册][1]。
TL;DRTFM
$$
扩展为 shell 的进程 ID。
()
子shell 中,它扩展为调用shell 的进程ID,而不是子shell。$BASHPID
扩展为当前 Bash 进程的进程 ID(bash 4 的新功能)。
()
子外壳中,它扩展为子外壳 [1] 的进程 ID:http ://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables除了Jefromi引用的Advanced Bash Scripting Guide中给出的示例之外,这些示例还显示了管道如何创建子外壳:
$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656
PID 存储在$$
.
示例:kill -9 $$
将杀死调用它的 shell 实例。
您可以使用该$$
变量。
如果进程是子进程且没有设置$BASHPID,则可以查询正在运行的进程创建的子进程的ppid。它可能有点难看,但它有效。例子:
sleep 1 &
mypid=$(ps -o ppid= -p "$!")
无论您身在何处(在交互式命令行或脚本中),并且在您无权访问 $BASHPID 的情况下,您都可以使用以下命令访问您当前的 shell pid:
bash -c '回声 $PPID'
其中简单的引号对于防止过早的字符串解释至关重要(以确保解释发生在子进程中,而不是当前进程中)。原理就是创建一个子进程并询问其父pid,即“我自己”。此代码比基于 ps 的 Joakim 解决方案更简单。