这里的问题是 bash 启动的每个新进程都会获得新的 PID,并且您必须在启动之前重定向该进程的输出。但是您无法确定操作系统将为该进程分配什么 PID。
这个问题的解决方案不是启动一个新进程,而是用一个新的 bash 进程替换现有的exec
.
这是一个例子。首先,我们编写一个打印其 PID 的基本 C 程序:
// printpid.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
printf ("C process pid is %d\n", getpid());
return 0;
}
然后我们编写一个简单的 bash 脚本,它将打印其 PID 并使用 exec 将其替换为该程序:
#!/bin/bash
# printpid.sh
echo Bash process PID is $$
exec ./printpid > $$.log
现在,让我们编写一个脚本来printpid.sh
多次调用这个脚本:
#!/bin/bash
# example.sh
./printpid.sh
./printpid.sh
./printpid.sh
现在,让我们确保它有效:
$ ls
example.sh printpid printpid.c printpid.sh
$ ./example.sh
Bash process PID is 6397
Bash process PID is 6398
Bash process PID is 6399
$ ls
6397.log 6398.log 6399.log example.sh printpid printpid.c printpid.sh
$ cat 6397.log
C process pid is 6397
$ cat 6398.log
C process pid is 6398
$ cat 6399.log
C process pid is 6399
$
请注意,当您使用时,exec
您不能在脚本中添加任何其他内容,因为 bash shell 会用指定为命令行参数的新进程替换自身exec
。
祝黑客好运!