这里的问题是 bash 启动的每个新进程都会获得新的 PID,并且您必须在启动之前重定向该进程的输出。但是你无法知道操作系统会为该进程分配什么 PID。
解决这个问题的方法不是启动一个新进程,而是用exec的新进程替换现有的bash进程。
这是一个例子。首先,我们编写一个打印其 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 的命令行参数的新进程替换自己。
祝你好运!