myprogram
터미널(bash)을 통해 생성하고 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