bash 스크립트에서 출력을 로그 파일 및 콘솔로 리디렉션하는 중에 문제가 발생했습니다.

bash 스크립트에서 출력을 로그 파일 및 콘솔로 리디렉션하는 중에 문제가 발생했습니다.

모든 출력을 로그 파일과 stdout(콘솔) 모두로 성공적으로 리디렉션하는 쉘 스크립트가 있습니다. 그런데 종료할 때 키보드에서 어떤 사용자 입력을 기다리는 것 같고(실험적으로는 아무 키나 작동하는 것 같습니다)... 그래서 스크립트를 실행하고 출력을 보면 종료되고 키를 눌러야 하는 것 같습니다. 터미널 프롬프트에서 먼저 스페이스 바 기호가 다시 나타납니다. 그런 다음 입력하면 echo $?올바른 종료 코드가 제공됩니다.

이 스크립트의 기본 사항은 다음과 같습니다.

#!/bin/bash
LOG="./test.log"
rm -f $LOG
exec > >(tee $LOG) 2>&1
if [[ "$1" = "T" ]]; then
 echo "twas true..."
 exit 0
else
 echo "twas false..."
 exit 100
fi

도움을 주셔서 감사합니다... 스페이스바를 누르고 싶지 않을 뿐만 아니라 무슨 일이 일어나고 있는지 이해하고 싶나요?

개정: 싸워야 할 것 같아입력하다터미널 프롬프트를 복원합니다. 나의 제한된 경험을 바탕으로메모명령은 내 스크립트가 종료된 것처럼 보이며세게 때리다쉘이 중단 가능한 절전 상태에 있습니다.에스. 터미널 프롬프트 출력이 소비되었거나 잘못 리디렉션된 것 같습니다. 왜인지 이해가 안가네요......

답변1

내 컴퓨터에서 문제를 재현할 수 있습니다. $PS1실행 중에는 인쇄되지만 tee $LOG스크립트가 끝난 후에는 인쇄되지 않는 것을 볼 수 있습니다 . 스크립트를 실행한 후 명령 프롬프트는 비어 있지만 실제로 다음 명령을 입력하면 실행됩니다.

>()프로세스 교체가 백그라운드에서 실행 중인 것 같습니다 . tee그러면 모든 출력이 exec해당 백그라운드 프로세스로 리디렉션됩니다. 그러나 tee배경은 여전히 ​​출력을 터미널에 인쇄합니다. 달리면 이런게 보일거에요syslog | tee&

모든 쉘 출력이 백그라운드 프로세스에 도달하면 teebash는 명령 프롬프트를 인쇄합니다 $PS1. 이는 이미 새 명령을 입력할 수 있음을 의미합니다. 그리고 명령 프롬프트를 인쇄한 후에만 echo명령이 출력을 백그라운드 프로세스에 인쇄한 tee다음 tee터미널에 인쇄합니다.

마치 전체 스크립트를 백그라운드에서 실행한 것과 같습니다.

이것이 전체 스크립트가 실행된 후에 명령 프롬프트가 인쇄되지 않는 이유를 이해한 것입니다. 좋다 echo "twas true..." | tee $LOG&. 여기서 의미하는 것은 &"백그라운드에서 이전 명령을 실행합니다"입니다.

다음 코드를 시도해 보세요. 동일한 작업을 수행하지만 이 문제는 발생하지 않습니다.

#!/bin/bash
LOG="./test.log"
rm -f $LOG
{
    if [[ "$1" = "T" ]]; then
     echo "twas true..."
     exit 0
    else
     echo "twas false..."
     exit 100
    fi
} | tee $LOG 2>&1

반품. 파일은 기본적으로 다시 작성되므로 필요 tee하지 않은 것 같습니다 rm -f $LOG.

관련 정보