假设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