다음 코드가 있습니다. 출력과 오류를 로그 파일과 콘솔에 캡처하려고 합니다. 코드를 실행하면 사용법이 표시되지만 캐리지 리턴을 위해 일시 중지됩니다. 큰 문제는 아닙니다. 이 캐리지 리턴의 필요성을 없애는 방법이 궁금하십니까? 아래와 같이 실행 라인으로 범위를 좁혔습니다. 캐리지 리턴을 요구하지 않고 어떻게 이를 달성할 수 있습니까? 감사합니다!
#!/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 1
exit
이 질문에 답할 때 시스템이 출력을 새로 고칠 시간을 갖도록 각 명령 앞에 명령을 포함하여 프롬프트를 표시할 수 있습니다 .
>()
이는 프로세스 대체 [ 및 ]를 사용하여 로그 리디렉션을 >>()
구성하고 tee
명령이 스크립트와 동시에 실행되므로 종료 후에도 tee
여전히 텍스트가 터미널 및 로그 파일로 전송되기 때문입니다.