myprogram
端末を介して生成し、pid 1234(毎回異なる)を取得するとします。
stdoutとstderrを名前付き一時ファイルにリダイレクトしたいabc-$PID
(PIDが1234の場合はtempfileを使用してください)abc-1234
。
これでコードは次のようになります。
myprogram > /tmp/abc-$! 2>&1
それは動作しません
助けてください。
ベストアンサー1
通常、シェルでは、コマンドを実行する前にリダイレクトが解析され処理されます。したがって、シェルには>
構文解析時にsubPIDが何であるかを知る方法はありません。
しかし、私たちは欺くことができます...私たちは自分の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