종료 상태를 유지하면서 프로세스 출력을 필터링하는 방법

종료 상태를 유지하면서 프로세스 출력을 필터링하는 방법

내 설정 파일에는 인수에 제공된 명령줄을 호출하고 실패 시 표준 종료를 호출하는 간단한 작은 셸 함수가 있습니다.

function my_exec() {
  if [ "$1" != "" ]; then
    $*                       # WANT FILTER HERE
    my_test $? $*
  fi
}
function my_test() {
  if [ $1 -ne 0 ]; then
    ecval=$1
    shift
    if [ "$1" !- "" ]; then
      my_exit "Exited with error $ecval from $*"
    else
      my_exit "Exited with error $ecval"
    fi
  fi
}
function my_exit() {
  echo "ERROR: " $* 2>&1
  if [ `basename $0`  = "go.sub.sh" ]; then
    echo "ERROR" > go.sub.${occ}.done
  fi
  exit 1
}

이 함수에 의해 실행되는 프로세스 중 하나는 필터링하고 싶은 많은 출력을 생성합니다.

가능하다면 WANT FILTER HERE라고 표시된 줄을 다음과 같은 내용으로 바꾸고 싶습니다(실제 필터는 $1 명령의 값에 따라 달라집니다).

$* | grep -v "^INFO:" | grep -v "^NOTE:"

그러나 이것은 물론 다음 $? 테스트를 뒤집습니다. 명령 종료 코드를 잃지 않고 명령 출력을 필터링하는 방법이 있습니까? 모든 출력을 파일로 리디렉션하고, 상태를 저장하고, 파일을 역방향으로 grep하고 싶지 않습니다. 특히 사용자가 이 작업 실행을 실시간으로 지켜보며 진행 상황을 확인할 수 있기 때문입니다.

고마워요, 티

답변1

Bash PIPESTATUS배열은 파이프라인에 있는 모든 명령의 상태 코드를 보유합니다.

첫 번째 프로그램의 종료 코드의 경우:

echo "${PIPESTATUS[0]}"

함께 파이프되는 모든 프로그램의 종료 코드:

echo "${PIPESTATUS[@]}"

관련 정보