![将生成的进程重定向到文件名中包含 pid 的临时文件](https://linux22.com/image/212644/%E5%B0%86%E7%94%9F%E6%88%90%E7%9A%84%E8%BF%9B%E7%A8%8B%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E5%8C%85%E5%90%AB%20pid%20%E7%9A%84%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6.png)
假设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