대화형으로 호출될 때 표준 출력에 기록하지만 다른 스크립트에서 호출되고 EVENT_LOGGER 변수가 호출 스크립트에 의해 정의되는 경우 EVENT_LOGGER 파일에 기록하는 스크립트를 생성하고 싶습니다.
아마도 이 작업을 수행하는 쉬운 방법이 있을 것입니다. 하지만 저는 그것을 모릅니다. 물론 출력이 생성되는 모든 위치에 이 논리를 추가할 수 있습니다.
if [[ -f $EVENT_LOGGER ]]
then
echo "Some message" >> $EVENT_LOGGER
else
echo "Some message"
fi
그러나 이렇게 하면 스크립트에 많은 양이 추가됩니다.
다음과 같이 할 수 있었으면 좋겠습니다.
if [[ ! -f $EVENT_LOGGER ]]
then
EVENT_LOGGER = "&1"
fi
그러면 모든 출력 명령은 다음과 같습니다.
echo "Some message" >> $EVENT_LOGGER
EVENT_LOGGER가 가리키는 파일이나 표준 출력으로 이동합니다.
그건 작동하지 않습니다. $EVENT_LOGGER를 stdout으로 구문 분석하는 다른 방법이 있습니까?
AIX 7.1에서 ksh93을 사용하고 있습니다.
답변1
많은 Unix 변형에서는 filename 을 통해 표준 출력에 액세스할 수 있습니다 /dev/stdout
.
if [[ -z $EVENT_LOGGER ]]; then
EVENT_LOGGER=/dev/stdout
fi
…
echo >>"$EVENT_LOGGER" 'This is a log message'
하지만 AIX에서도 작동할지는 잘 모르겠습니다. 바라보다"> /dev/stdout" 이식성그리고Unix 시스템에는 /dev/stdin, /dev/stdout 및 /dev/stderr이 없습니까?
또는 모든 로깅을 표준 출력으로 두고 선택적으로 표준 출력을 파일로 리디렉션합니다. exec
명령 이름은 없지만 리디렉션을 사용하여 내장 함수를 호출하면 나머지 스크립트에 대해 리디렉션이 설정됩니다.
if [[ -n $EVENT_LOGGER ]]; then
exec >>"$EVENT_LOGGER"
fi
…
echo 'This is a log message'
스크립트에 의해 호출된 프로그램의 출력은 동일한 로그 파일로 이동됩니다. 이 작업을 원하지 않으면 다른 파일 설명자에 로그온하십시오.
if [[ -n $EVENT_LOGGER ]]; then
exec 3>>"$EVENT_LOGGER"
else
exec 3>&1
fi
…
echo >&3 'This is a log message'
또 다른 접근 방식은 필요에 따라 기능을 다르게 정의하는 것입니다.
if [[ -n $EVENT_LOGGER ]]; then
log () {
echo "$*" >>"$EVENT_LOGGER"
}
else
log () {
echo "$*"
}
fi
…
log 'This is a log message'
무엇을 하든 함수를 사용하는 것이 좋습니다. 이렇게 하면 로깅 작동 방식을 변경하려는 경우(예: 터미널 및 파일에 로그, 색상 추가, 조건부로 만들기...) 훨씬 더 쉬울 것입니다.
몇 가지 일반적인 참고사항:
- 이 테스트는
-f
파일이 존재하는지 테스트합니다. 이것은 좋은 테스트가 아닙니다. 대신-n
(-z
null인지 테스트)를 사용하여 변수가 null이 아닌지 테스트하세요. =
변수 할당에서는 기호 주위에 공백을 배치할 수 없습니다.
답변2
당신은 이것을 원합니다 :
$ cat interactive.sh
#!/bin/bash
if [[ -n "$EVENT_LOGGER" ]]; then
exec 1>>"$EVENT_LOGGER"
fi
date
echo "hello world"
마법: exec 1>>"$EVENT_LOGGER"
스크립트가 실행되는 동안 표준 출력을 리디렉션합니다.
데모:
변수가 정의되지 않았습니다. stdout으로 출력됩니다.
$ bash interactive.sh Sat Jan 6 19:06:02 EST 2018 hello world
변수 정의, 파일로 출력
$ env EVENT_LOGGER="./event.logger" bash interactive.sh $ cat event.logger Sat Jan 6 19:06:13 EST 2018 hello world