exec 명령 내부의 파이프가 작동하지 않습니다.

exec 명령 내부의 파이프가 작동하지 않습니다.

스크립트에 다음 명령이 있습니다.

exec su -s /bin/sh -c 'exec "$0" "$@"  | ts "[%Y-%m-%d %H:%M:%S]"' user -- test.python $FULLPATH   &> log & 

FULLPATH테스트 Python 파일의 경로는 어디에 있습니까? 이 명령을 사용하여 스크립트의 출력을 명령의 타임스탬프와 함께 로그 파일에 기록하고 싶습니다 ts.

이것은 실제로 발생하지 않습니다. 출력은 타임스탬프 없이 기록됩니다. 그 외에는 다음과 같이 시도했습니다.

exec su -s /bin/sh -c 'exec "$0" "$@"' user -- test.python $FULLPATH  | ts "[%Y-%m-%d %H:%M:%S]" &> log & 

이는 이전 명령과 동일한 결과를 제공합니다.

이런 일이 발생하는 이유와 가능한 해결 방법에 대한 아이디어를 주시면 감사하겠습니다. 감사합니다.

답변1

execwith를 사용하면 &(문제의 원인은 아니지만) 추가 포크를 절약할 수 있는 이점이 거의 없습니다. 파이프라인 구성요소의 경우 셸을 사용하여 포크를 저장하는 것을 볼 수 있지만 zsh마지막 파이프라인 구성요소( 더 이상 다른 파이프라인 구성요소를 기다리지 않음을 cmd1 | exec cmd2의미함 )에 적용된 경우에만 볼 수 있습니다.zsh

ts여기서는 python 스크립트 stderr을 file 로 보내더라도 리디렉션하지 않습니다 log. 다음을 수행할 수 있습니다.

su -s /bin/sh -c '
  "$0" "$@" 2>&1 |
    ts "[%Y-%m-%d %H:%M:%S]"
  ' user -- test.python "$FULLPATH" > log 2>&1 & 

답변2

의미 없는 실행기와 --다음에 명령의 절반이 전달되는 부분을 제거하세요.

su -s /bin/sh -c "test.python $FULLPATH | ts '[%Y-%m-%d %H:%M:%S]'" &> log

관련 정보