출력을 stdout 또는 파일로 리디렉션(둘 다는 아님)

출력을 stdout 또는 파일로 리디렉션(둘 다는 아님)

대화형으로 호출될 때 표준 출력에 기록하지만 다른 스크립트에서 호출되고 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( -znull인지 테스트)를 사용하여 변수가 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"스크립트가 실행되는 동안 표준 출력을 리디렉션합니다.

데모:

  1. 변수가 정의되지 않았습니다. stdout으로 출력됩니다.

    $ bash interactive.sh
    Sat Jan  6 19:06:02 EST 2018
    hello world
    
  2. 변수 정의, 파일로 출력

    $ env EVENT_LOGGER="./event.logger" bash interactive.sh
    $ cat event.logger
    Sat Jan  6 19:06:13 EST 2018
    hello world
    

관련 정보