리디렉션 및 반환 코드

리디렉션 및 반환 코드

그래서 저는 세그폴트를 할 수도 있고 안 할 수도 있는 프로그램을 가지고 있습니다(./세그프) 다른 데이터도 stderr에 씁니다. 프로그램 segfault가 발생하면 반환 코드는 139입니다(즉, 을 echo $?인쇄합니다 139).

/dev/null인쇄를 피하기 위해 stderr를 로 리디렉션하고 싶지만 그렇게 하면( ./segf 2>1) 반환 코드가 1로 설정됩니다. 이제 프로그램이 실제로 세그폴트를 수행하는지 아니면 단순히 오류를 반환하는지 구별하는 것이 불가능합니다.

반환 코드가 139인지 확인하면서 stderr의 다른 오류를 파이프하는 것이 가능합니까?

./segf >/dev/null; echo $?139개의 결과

./segf >/dev/null 2>1; echo $?결과는 1

bash -c './segf'139개의 결과

bash -c './segf' 2>1결과는 1

답변1

시도한 사항 중 어느 것도 종료 상태에 영향을 주어서는 안 됩니다. 다음과 같은 매우 간단한 스크립트로 테스트할 수 있습니다.

#!/bin/sh
echo out
echo err >&2
exit 139

이제 다양한 리디렉션을 사용하여 실행하세요.

$ foo.sh; echo $?
out
err
139

#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139

## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $? 
out
139

명령의 stderr을 리디렉션하는 방법은 단지 이지만 command 2>/dev/null리디렉션이 실패하지 않는 한 명령의 종료 상태에 영향을 주어서는 안 됩니다. 이것은 실제로 귀하의 경우에 일어난 일입니다. 현재 있는 디렉토리에 쓰기 권한이 없고 ./segf >/dev/null 2>1( 대신 ./segf >/dev/null 2>&1) 실행을 시도한 경우 해당 디렉토리에서파일stderr를 리디렉션하기 위해 호출되었습니다 1. 파일을 생성할 수 없는 경우 다음과 같은 종료 상태가 표시됩니다 1.

$ foo.sh 2>1; echo $? 
bash: 1: Permission denied
1

관련 정보