리디렉션 및 반환 코드

리디렉션 및 반환 코드

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

인쇄를 피하기 위해 stderr를 리디렉션하고 싶지만 /dev/null그렇게 하면 ./segf 2>1반환 코드가 1로 설정됩니다. 이제 프로그램이 실제로 segfault를 일으키는지 아니면 오류만 반환하는지 알 수 없습니다.

반환 코드가 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) 실행하려고 하면문서호출은 1stderr을 다음으로 리디렉션합니다. 파일을 생성할 수 없으면 종료 상태가 표시됩니다 1.

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

관련 정보