그래서 종료코드가 0
프로그램이 성공적으로 실행된 것으로 간주된다는 것을 잘 이해합니다. 그런 다음 이를 bash 스크립트에서 사용 AND
하고 OR
첫 번째 프로그램의 종료 상태에 따라 다음 프로그램을 실행합니다. 좋은 예는 여기에서 찾을 수 있습니다:https://unix.stackexchange.com/a/187148/454362
0
이는 true로 해석되고 0 이외의 다른 숫자는 false로 해석된다는 의미입니까 ? 이것은 내가 아는 모든 프로그래밍 언어와 반대됩니다. 그러면 bash가 내부적으로 논리를 사용하여 NOT
종료 코드를 올바른 false/true 값으로 되돌린다고 가정할 수 있습니까 ?
다음은 몇 가지 예입니다.
#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))
# should result in true, and bash shows 1 as true
echo $(( 1 || 0 ))
# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi'
# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi'
# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'
내 자신의 질문에 대답하는 것 같습니다. 하지만 누군가가 bash 처리의 내부를 알고 있는지 명확히 하고 싶었습니다.
답변1
링크한 게시물의 예는 다음과 같습니다.
false && echo "OK"
true || echo "OK"
이 경우 프로세스의 종료 상태는 yes 0
이고 나머지는 false입니다. (예, 이것은 프로그램 true
입니다 false
. 아마도 셸에 내장되어 있지만 동일한 방식으로 작동합니다.)
~에서POSIX 정의( ||
마찬가지로배쉬 문서설명하다):
AND 목록
제어 연산자 "&&"는 AND 목록을 나타냅니다. 형식은 다음과 같아야 합니다.
command1 [ && command2] ...
명령 1구현되어야합니다. 종료 상태가 0인 경우명령 2처형해야 한다 등등...
예, 이는 거의 모든 다른 컨텍스트 및 프로그래밍 언어에서 사용되는 규칙에 위배됩니다. 그런 다음 C에서는 함수가 성공 시 0을 반환하고 오류 시 0이 아닌 오류 코드를 반환하는 것이 일반적입니다. 이렇게 하면 다양한 유형의 오류를 구별할 수 있습니다 (*) . 물론, 함수가 유용한 값(예: 포인터)을 반환해야 하고 C에 관한 한 0은 거짓인 경우에는 실제로 작동하지 않습니다. 어쨌든 다릅니다.
구현에 대해 어떤 가정도 하는 것은 좋은 생각이 아니라고 생각합니다. 이 경우 0은 참이라는 점을 기억하세요. 예를 들어 (true && true)는 (true)입니다.
(*가족과 마찬가지로 Happy 시스템 호출은 모두 비슷합니다. Unhappy 시스템 호출은 각각 나름대로 불행합니다.)
그렇다면 귀하의 예는 다음과 같습니다.
#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))
&&
여기서는 종료 상태와 동일한 규칙을 따르지 않는 산술 컨텍스트에서 사용하고 있습니다 . 여기서 0은 거짓이고 1은 참입니다. (true AND false)도 마찬가지입니다 1 && 0
. 이는 (false) 또는 0입니다.
# should result in true, and bash shows 1 as true
echo $(( 1 || 0 ))
위와 유사합니다.
# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi'
이것유틸리티가 호출됩니다.false
상태 1(또는 최소한 0이 아닌 값)로 종료합니다. 이 경우 이는 잘못된 것이므로 &&
단락 논리를 통해 오른쪽을 건너뜁니다.
# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi'
같은.
# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'
여기에서 사용 했는데 1 || 0
어느 쪽이든 정확하며 산술적 맥락에서 숫자 값이 다소 손실됩니다. 다음을 시도해 봅시다:
$ echo foo && (( 0 )) && echo bar
foo
$ echo foo && (( 1 )) && echo bar
foo
bar
지금,((...))
산술 구조입니다(예: $((...))
), 여기서 0은 거짓입니다. $((...))
와는 달리 ((...))
명령이기도 하므로 종료 상태가 있습니다. 내부 표현식이 0이 아닌 값(true)으로 평가되면 0(true)으로 종료되고, 내부 표현식이 0(false)으로 평가되면 1(false)로 종료됩니다. 글쎄, 이것은 혼란스러울 수 있지만 최종 결과는 C와 같은 암시적 비교가 내부적으로 0으로 작동하고 이를 쉘의 조건부와 함께 사용할 때 동일한 진리값을 얻는다는 것입니다.
따라서 0이 될 while (( i-- )); do ...
때까지 반복하십시오 .i
( (( foo ))
표준은 아니지만 ksh/Zsh/Bash에서 지원됩니다. 표준 해석은 foo
두 개의 중첩된 하위 쉘 내의 명령이므로 "명령 'foo'를 찾을 수 없습니다" 오류가 표시될 수 있습니다.)
(( true )) && echo maybe
이와 같은 것은 아마도 아무 것도 인쇄하지 않을 것이라는 점을 지적할 가치가 있습니다 . 산술적 맥락에서 일반 단어는 변수 이름으로 처리되므로(많은 쉘에서 재귀적으로) 변수가 true
0이 아닌 값으로 설정되지 않으면 (( true ))
false가 됩니다.
(난독화 부서의 아이디어가 실행되고 있습니다 true=0; false=1; true() (exit 1); false() (exit 0);
. 이제 무엇이 인쇄 true && (( false )) || echo maybe && echo maybe not
되고 왜?.)
답변2
예, 명령 종료 상태는 정수와 true/false 개념 간의 일반적인 매핑을 반대로 바꿉니다.
그 이유는 명령이 다양한 방식으로 실패할 수 있기 때문입니다. 0 값은 하나만 있지만 0이 아닌 값이 많이 있습니다(이 경우 종료 상태의 8비트만 사용되므로 255입니다). 0이 아닌 값을 오류 표현으로 사용하면 0이 아닌 다른 값을 사용하여 다양한 유형의 오류를 인코딩할 수 있습니다.
예를 들어, grep
파일을 성공적으로 읽었을 때 종료 상태 1이 사용되지만 실제 오류가 발생하면 일치하는 항목을 찾을 수 없습니다.
애플리케이션이 오류 모드 간의 구분을 고려하지 않는 경우 또는 논리 연산자를 false
사용하여 오류 모드를 모두 처리할 수 있습니다. if
관심이 있다면 $?
명시적으로 비교를 하게 될 것입니다.
다양한 종료 상태에 다양한 의미를 할당하는 이 방법은 일반적이지 않지만 필요할 경우 유용할 수 있습니다. 1
구분이 필요하지 않으면 대부분의 프로그램에서는 이를 실패 코드로 사용합니다.
true
echo $? # 0
false
echo $? # 1
답변3
동작은 쉘에 따라 다릅니다. Bash를 사용한다고 가정하면 대답은 Bash 매뉴얼에서 나옵니다.
목록
...
AND 및 OR 목록은 각각
&&
및 제어 연산자로||
구분된 하나 이상의 파이프 시퀀스 입니다. AND 및 OR 목록은 왼쪽 연관성으로 수행됩니다. AND 목록의 형식은 다음과 같습니다.command1 && command2
command2
command1
반환 종료 상태가 0(성공)인 경우에만 실행됩니다.OR 목록의 형식은 다음과 같습니다.
command1 || command2
command2
command1
0이 아닌 종료 상태가 반환되는 경우에만 실행됩니다. AND 및 OR 목록의 반환 상태는 목록에서 마지막으로 실행된 명령의 종료 상태입니다.