왜 "untilkill-0$PID" 대신 "whilekill-0$PID"를 사용합니까?

왜 "untilkill-0$PID" 대신 "whilekill-0$PID"를 사용합니까?

여기서 제가 바보일 수도 있지만, 프로세스가 실행되는 동안 뭔가를 하고 싶다면 왜 이렇게 해야 할까요?

while kill -0 $PID
do
    #...
done

바꾸다

until kill -0 $PID
do
    #...
done

?

kill -010프로세스가 발견되지 않으면, 프로세스가 발견되면 코드로 종료합니다 :

$ kill -0 123444
-bash: kill: (123444) - No such process
$ echo $?
1
$ screen -ls | grep rofl
    28043.rofl  (02/19/2015 02:27:56 PM)    (Detached)
$ kill -0 28043
$ echo $?
0

따라서 프로세스가 실행 중이면 while 루프는 다음과 같이 요약됩니다.

while 0
do
    #...
done

그렇다면 어느 것이 결코 처형되지 않을 것입니까?

답변1

반환 코드를 처리할 때 "0"은 성공을 나타내고 0이 아닌 경우 실패를 나타냅니다. while 루프의 구문은 다음과 같습니다.

while COMMANDS; do ...; done

while명령문은 제공된 명령 목록에서 마지막 명령의 반환 코드를 확인합니다. 마지막 예에서는 while 0"0"이라는 명령을 실행하고 해당 반환 코드를 확인하려고 시도합니다.

리터럴 0은 산술 맥락 밖에서 bash하는 데 특별하지 않습니다. 이런 맥락에서 0가짜로 간주됩니다. 예를 들어

while (( 0 )); do
  ... # never executes
end

이 경우는 키워드가 ((명령으로 처리되고 결과가 0이므로 0이 아닌 값을 반환하므로 특별합니다.

답변2

껍질은 생각만큼 확장되지 않습니다.

셸에서 오류 코드는 0명령이 성공적으로 완료되었음을 나타냅니다. 0이 아닌 오류 코드는 오류를 나타냅니다.

단순화를 위해 POSIX는 다음을 정의합니다.while 루프처럼:

while 루프는 다른 복합 목록의 종료 상태가 0인 한 계속해서 복합 목록을 실행해야 합니다.

while 루프의 형식은 다음과 같습니다.

while compound-list-1
do
    compound-list-2
done

complex-list-1이 실행되고, 종료 상태가 0이 아닌 경우 while 명령이 완료됩니다. 그렇지 않으면 complex-list-2가 실행되고 프로세스가 반복됩니다.

답변3

부울 값을 찾는 대신 "while" 명령은 명령이 성공적으로 실행되었음을 나타내는 반환 코드 "0"을 찾습니다. 따라서 while 명령의 경우 0을 반환하는 명령은 "true"이고, 그 외의 값은 "false"이다.

비교를 하고 있더라도 Bash는 비교가 참일 경우 성공 오류 코드(0)를 반환하는 명령으로 간주합니다.

답변4

종료 코드는 부울이 아니라 정수이며 관례적으로 0 값은 성공을 나타냅니다. 따라서 Bash 관점에서 보면 부정적인 논리로 생각하고 있는 것입니다.

관련 정보