실패한 종료 상태를 생성하는 빠르고 선언적인 방법을 생각하다가 0으로 나누는 아이디어가 떠올랐습니다.bc
좋은 생각이 될 것입니다.
런타임 오류가 발생했지만 종료 상태가 여전히 0이라는 사실에 놀랐습니다.
$ echo 41 + 1 | bc
42
$ echo $?
0
$ echo 42/0 | bc
Runtime error (func=(main), adr=6): Divide by zero
$ echo $?
0
- 0이 아닌 종료 상태로 인해 bc 유틸리티가 실패하지 않는 이유는 무엇입니까?
참고: 0이 아닌 빠른 종료 상태를 위해 다음을 사용하고 있습니다.return 1
게다가,쉘 팁:
$ expr 1 / 0
expr: division by zero
$ echo $?
2
답변1
bc
구현된 반환 상태는 약간 다르지만 일반적인 아이디어는 유효한 입력을 제공하면 bc
상태 0으로 종료된다는 것입니다. 42/0
유효한 입력입니다. 구문상 유효한 표현식이라도 읽기 오류가 없으므로 bc
0이 반환됩니다. 다른 작업의 두 번째 줄을 전달하면 bc
해당 작업이 실행됩니다. 이는 expr
단일 산술 표현식을 평가하는 목적과 다릅니다. 여기서는 단일 표현식의 결과에 따라 반환 상태가 결정됩니다.
실패를 나타내는 종료 상태를 생성하는 가장 간단한 방법은 을 호출하는 것입니다 false
. 이와 같은 작업은 expr 1 / 0
난독화된 프로그래밍 대회에서만 가능합니다.
답변2
보다사양;이것은 예상된 동작입니다.
모든 입력이 올바르게 읽혀져 bc
종료 상태 0이 생성됩니다.
bc
예를 들어 존재하지 않는 파일에서 실행 하면 bc nosuchfile
다른 종료 상태가 표시됩니다.
0이 아닌 종료 상태를 설명하기 위해 ls somefile
합계를 비교 ls nosuchfile
하거나 다음과 같이 종료 상태 1과 2(1은 예상 오류 또는 실패 상태, 2는 예상치 못한 오류)의 일반적인 사용을 보여 드리겠습니다.
$ echo hello > file1
$ echo hello > file2
$ echo goodbye > file3
$ cmp -s file1 file2
$ echo $?
0
$ cmp -s file1 file3
$ echo $?
1
$ cmp -s file1 file4
$ echo $?
2
$