Bash 배열 $PIPESTATUS 관련 문제

Bash 배열 $PIPESTATUS 관련 문제

/var/log/accountpolicy.log*나는 기본적으로 인증 시간/횟수를 얻기 위해 로그를 구문 분석하는 스크립트(아마도 다른 것은 아닐 것임)를 작성하고 있습니다 . 초기 명령은 awk 스크립트 에 파이프하여 zgrep실행 됩니다. 명령을 실행한 후 실패한 것이 있는지, 그렇다면 어느 부분이 실패했는지 확인하는 데 사용했습니다 .sudoawk${PIPESTATUS[@]}

현재 상태의 awk 스크립트는 다음과 같습니다.

#! /usr/local/bin/awk -f

BEGIN {
  return_code = 0
  if ( length( username ) == 0 ){
    return_code = 2
    exit return_code
  }

  rows = 0
}
{ 
  if ( $8 != sprintf("\"%s\",", username ) ) next

  rows = rows+1
  print $0
} 
END {
  if ( return_code > 0 ) exit return_code
  if ( rows == 0 ) exit 3
}

awk 스크립트에는 일부 사용자 정의 값 유효성 검사 및 종료 코드가 있습니다. 반환 코드 1, 2, 3은 다음을 의미합니다.

  1. awk 실패(awk 관련 이유로)
  2. awk로 확인된 사용자 이름이 지정되지 않았습니다.
  3. 사용자 이름이 지정되었지만 값이 없습니다.

테스트 #1(잘 작동함)

실행 예(이 질문은 특히 반환 코드와 관련되어 있으므로 awk 스크립트의 출력을 숨깁니다):

$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -v username="${USER}" -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
0 0

${PIPESTATUS[@]}show 와 sudoare 성공적인 것을 볼 수 있습니다 . 이는 sudo 액세스 권한이 있고 awk 변수가 설정되어 있고 로그 항목이 있다는 awk것을 알고 있기 때문에 예상되는 결과입니다 .username

테스트 #2(잘 작동함)

이제 awk 변수를 username계정으로 변경하면존재하지 않는다, 그러면 awk 스크립트는 반환 코드와 함께 종료되어야 합니다 3.

$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -v username="fakeuser" -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
0 3

완벽한!

테스트 #3 (질문..)

위 명령을 실행했지만 usernameawk 변수 정의를 생략하면 awk 스크립트가~해야 한다반환 코드는 2 종료입니다.

$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
141 2

보시다시피 awk 스크립트는하다return 2이지만 지금은 명령의 해당 부분이 전혀 변경되지 않았음에도 불구하고 어떤 이유에서든 sudo/ zgrepreturn 입니다 ... 그게 제가 겪고 있는 문제입니다.141

출력을 숨기지 않고 명령을 실행해 보았습니다(둘 중 하나).표준 출력또는표준 오류 오류율), 결과는 동일하지만 오류는 보고되지 않습니다.

$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log*  | awk -f ./parse-accountpoliocy.awk
$ echo ${PIPESTATUS[@]}
141 2

질문

스크립트의 종료 코드는 그 안에 저장된 /command의 종료 코드를 어떻게 변경합니까 awk?sudozgrep${PIPESTATUS[@]}


환경정보

  • OSx 버전: 10.11.6(엘 캐피탄)
  • 히트 버전: 4.4.12
  • AWK 버전: GNU Awk 4.1.4

답변1

$ echo $((141-128))
13
$ kill -l | grep 13
13   PIPE Broken pipe                   29   INFO Information request
$ 

wait(2)따라서 141은 신호를 포함하는 16비트 종료 상태 단어(참고자료 참조)를 단일 숫자로 통합하는 쉘 PIPE의 방법입니다.exit 3뒤쪽에파이프로 연결되는 데이터의 처리가 완료되었습니다 ( 파이프를 통해 awk더 이상 쓸 내용이 없습니다 ). zgrep대신, 파이프하려는 데이터가 아직 남아 있는 동안 초기에 발생하므로 awk사라진 데이터를 쓰려고 할 때 a가 발생합니다 .exit 2zgrepawkzgrepPIPEawk

관련 정보