将生成的进程重定向到文件名中包含 pid 的临时文件

将生成的进程重定向到文件名中包含 pid 的临时文件

假设myprogram通过终端(bash)生成并获得 pid 1234(每次都不同)。

我想将 stdout 和 stderr 重定向到名为的临时文件abc-$PID(如果 PID 为 1234,则使用 tempfile abc-1234

代码现在看起来像这样:

myprogram > /tmp/abc-$! 2>&1

它不起作用

请帮忙。

答案1

通常,在 shell 中,在运行命令之前会解析并处理重定向。因此 shell 无法知道>解析时的子 PID 是什么。

但我们可以作弊...我们知道我们自己的PID,我们可以得到exec真正的程序。这样exec可以避免创建新的进程 ID,因此程序会使用与我们开始时相同的 PID 执行。

例如:

$ cat  myprogram 
#!/bin/sh
echo hello.  I am $$
echo err >&2

$ cat wrapper 
#!/bin/sh

exec myprogram > foo-$$ 2>&1

$ ./wrapper 

$ ls
foo-10285  myprogram*  wrapper*

$ cat foo-10285 
hello. I am 10285
err

相关内容