명령 루프가 중단되었지만 종료 코드가 이유가 아닙니까?

명령 루프가 중단되었지만 종료 코드가 이유가 아닙니까?

다음 명령을 실행합니다.

echo "while emacs;do echo $?;done;echo Exit code: $?;" | bash

메뉴나 닫기 버튼을 통해 emacs를 종료하면 종료 코드 0이 인쇄되고 다시 시작됩니다.

(kill-emacs 1) ctrl-x ctrl-e를 입력하여 emacs를 종료하면

Emacs가 종료되고 루프도 종료되지만 종료 코드는 여전히 0입니다.

루프에서 벗어나는 원인은 무엇입니까?

업데이트: pqnet의 제안에 따라 작은따옴표를 사용하도록 전환했으며 이제 코드는 다음과 같습니다.

echo 'while emacs;do echo Exit code: $?;done;echo "Exit code: $?";echo "Loop End."' | bash

이는 동일한 결과를 낳습니다. while 루프에서 pid 값을 저장해야 한다고 가정합니다. 그래서 나는 다음을 시도한다:

echo 'while epid=$(emacs);do echo Exit code: $epid;done;echo "Exit code: $epid";echo "Loop End."' | bash

이러한 결과를 믿어야 한다면 두 경우 모두 종료 코드는 빈 문자열(또는 보이지 않는 바이너리)이겠지만, 그것도 옳지 않다고 생각합니까? "반환 값"이 종료 코드가 잘못되었다고 가정한 것입니까, 아니면 단지 그것을 잡지 못하는 것입니까?

업데이트: 답변 중 하나는 예상한 결과를 얻지 못한 이유를 설명했지만 이제는 어떤 코드를 사용하여 emacs의 종료 코드를 볼 수 있는지 궁금합니다. 왜냐하면 내가 생각해낸 코드 중 어느 것도 그렇게 하지 않기 때문입니다. .

답변1

실시간 FM:

하지만

이 명령의 구문은 다음 while과 같습니다.

동시에 명령을 테스트하고 완료된 후속 명령을 실행합니다.

구현하다후속 명령을 텐데테스트 명령종료 상태는 0입니다. 반환 상태는 마지막으로 실행된 명령의 종료 상태입니다.후속 명령, 또는 실행되지 않으면 0입니다.

반환 값을 얻고 싶다면테스트 명령, 다른 변수에 명시적으로 할당해야 합니다.

#!/bin/bash

while
        emacs
        ret=$?
        ((ret == 0))
do
        echo "Exit code: $ret"
done
echo "Exit code: $ret"
echo "Loop End."

답변2

루프 while는 부울 값을 평가합니다. 이 경우에는 while trueor 로도 읽을 수 있습니다 while 0. 따라서 emacs마치 종료된 것처럼 다른 값이 반환 되면 1루프가 종료됩니다.

관련 정보