그래서 저는 세그폴트를 할 수도 있고 안 할 수도 있는 프로그램을 가지고 있습니다(./세그프) 다른 데이터도 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