여기서 제가 바보일 수도 있지만, 프로세스가 실행되는 동안 뭔가를 하고 싶다면 왜 이렇게 해야 할까요?
while kill -0 $PID
do
#...
done
바꾸다
until kill -0 $PID
do
#...
done
?
kill -0
1
0
프로세스가 발견되지 않으면, 프로세스가 발견되면 코드로 종료합니다 :
$ 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 관점에서 보면 부정적인 논리로 생각하고 있는 것입니다.