Проблема здесь в том, что каждый новый процесс, запускаемый bash, получает новый PID, и вы должны перенаправить вывод этого процесса перед его запуском. Но вы не можете сказать, какой PID будет назначен этому процессу ОС.
Решением этой проблемы является не запуск нового процесса, а замена существующего процесса bash новым, используя exec
.
Вот пример. Сначала мы напишем простую программу на C, которая печатает свой PID:
// 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 заменяет себя новым процессом, указанным в качестве аргументов командной строки для exec
.
Удачи, взлом!