캐리지 리턴 없이 로그할 출력/오류 캡처

캐리지 리턴 없이 로그할 출력/오류 캡처

다음 코드가 있습니다. 출력과 오류를 로그 파일과 콘솔에 캡처하려고 합니다. 코드를 실행하면 사용법이 표시되지만 캐리지 리턴을 위해 일시 ​​중지됩니다. 큰 문제는 아닙니다. 이 캐리지 리턴의 필요성을 없애는 방법이 궁금하십니까? 아래와 같이 실행 라인으로 범위를 좁혔습니다. 캐리지 리턴을 요구하지 않고 어떻게 이를 달성할 수 있습니까? 감사합니다!

#!/bin/bash

log_file=$0.log

# The following line causes need for carriage return
exec > >(tee -a ${log_file} )
exec 2> >(tee -a ${log_file} >&2)

usage()
{
  echo
  echo "usage: $0 --option1 --option2 --option3 --option4 | [-h]"
  echo
}

while [ "$1" != "" ]; do
  case $1 in
    --option1 )            shift
                           OPTION1=$1
                           ;;
    --option2 )            shift
                           OPTION2=$1
                           ;;
    --option3 )            shift
                           OPTION3=$1
                           ;;
    --option4 )            shift
                           OPTION4=$1
                           ;;
    -h | --help )          usage
                           exit
                           ;;
    * )                    usage
                           exit 1
esac
shift
done

usage
exit

답변1

스크립트의 어떤 명령도 일시 중지를 유발하지 않습니다. 스크립트가 완료될 때까지 성공적으로 실행됩니다. 명백한 일시 중지는 쉘 프롬프트가 스크립트 출력과 혼합되어 발생하고 일반적인 프롬프트 대기 지점은 에서 내보낸 마지막으로 기록된 줄 이후에 발생합니다 tee. 다음 명령을 사용하여 스크립트를 실행하는 것이 더 명확합니다 bash -x(시간/날짜/디렉터리 데이터는 표시하도록 프롬프트를 구성했기 때문에 나타납니다).

15:28:38 - mié mar 02 - Dir: ~
user@host$ bash -x testexec.sh
+ log_file=testexec.sh.log
+ exec
+ exec
++ tee -a testexec.sh.log
++ tee -a testexec.sh.log
15:28:38 - mié mar 02 - Dir: ~
user@host$
usage: /home/manto/testexec.sh --option1 --option2 --option3 --option4 | [-h]

+ '[' '' '!=' '' ']'
+ usage
+ echo
+ echo 'usage: /home/manto/testexec.sh --option1 --option2 --option3 --option4 | [-h]'
+ echo
+ exit

스크립트가 정상적으로 종료되고 커서가 마지막 스크립트 아래에 나타나고 +exit시스템이 다음 명령을 기다리고 있습니다. ENTER를 입력하고 누르면 이를 확인할 수 pwd있으며 쉘은 현재 디렉토리를 표시합니다. 반대로 Enter 키만 누르면 쉘 프롬프트가 예상대로 다시 표시됩니다.

sleep 1exit이 질문에 답할 때 시스템이 출력을 새로 고칠 시간을 갖도록 각 명령 앞에 명령을 포함하여 프롬프트를 표시할 수 있습니다 .

>()이는 프로세스 대체 [ 및 ]를 사용하여 로그 리디렉션을 >>()구성하고 tee명령이 스크립트와 동시에 실행되므로 종료 후에도 tee여전히 텍스트가 터미널 및 로그 파일로 전송되기 때문입니다.

관련 정보