exec를 사용하여 일부 출력을 리디렉션하는 안전한 방법

exec를 사용하여 일부 출력을 리디렉션하는 안전한 방법

나는 다소 "시끄러운" 스크립트를 가지고 있습니다. 스크립트 출력의 대부분이 로그 파일에 들어가고 사용자는 시작 메시지와 스크립트 끝의 메시지만 볼 수 있도록 출력을 정리하라는 요청을 받았습니다. 이를 위해 다음과 같이 exec를 사용합니다.

#! /bin/bash
echo "Welcome! set up has begun, this may take a few moments..."
exec 3>&1 4>&2 1>> script.log 2>&1
# Call a bunch of other programs - stderr and stdout must
# be written to a log file to diagnose programs, but nothing out the console...
exec 1>&3 2>&4
echo "Your system is ready to use!"

그러나 이 스크립트의 로깅 부분에 있는 프로그램 중 하나가 실패하여(이러한 프로그램에 대한 제어 권한이 별로 없음) 메인 스크립트가 실패하게 되면 어떻게 될지 걱정됩니다. 이 줄이 exec 1>&3 2>&4실행되지 않으면 사용자가 stderr 및 stdout 리디렉션으로 인해 터미널을 사용할 수 없게 될 수 있습니다! 이 문제를 처리하는 더 안전한 방법이 있습니까?

답변1

스크립트가 별도의 프로그램으로 실행되는 경우 모든 리디렉션은 프로세스가 끝난 후에도 유지되지 않습니다. /bin/bash yourscript.sh사용자가 실행 중인 대화형 셸에는 적용되지 않고 암시적으로만 적용됩니다. 이것은 정상입니다. 문제를 일으킬 수 있는 유일한 방법은 source yourscript.sh일반적으로 수행해서는 안 되는 또는 이와 유사한 를 사용하여 스크립트를 읽는 것입니다 .

관련 정보