ファイル名にpidを含む一時ファイルとして生成されたプロセスをリダイレクトします。

ファイル名にpidを含む一時ファイルとして生成されたプロセスをリダイレクトします。

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

おすすめ記事