이해할 수 없는 쉘 동작을 발견했습니다. 당신이 실행할 때
echo foo > /tmp/bar & exit
, 터미널이 폐쇄되었습니다. 하지만 실행하면
exit & echo foo > /tmp/bar
, 터미널은 다음과 유사하게 열려 있습니다.
[1] 4001
그것에 인쇄되어 있습니다.
다음을 사용하여 다른 계정 에 로그인하면 첫 번째 버전의 출력을 su
볼 수도 있습니다. su
다음과 같이 진행됩니다.
[2] 13777
exit
[1]+ Done exit
exit
첫 번째 명령이라면 세션이 종료되지 않는 이유는 무엇입니까?
Unix 시스템에서 이것을 재현할 수 없는 경우를 대비해 저는 Ubuntu 16.04를 사용하고 있습니다.
답변1
첫 번째 명령,
echo foo > /tmp/bar & exit
백그라운드에서 실행할 서브셸을 시작한 echo foo > /tmp/bar
다음 종료합니다(전경 셸). 간단히 입력하는 것처럼 터미널이 닫힙니다 exit
. 배경 셸은 오랫동안 유지되지 않으므로 경쟁이 발생하지 않습니다. 그러나 더 오래 실행되는 명령으로 이 작업을 수행하면 셸 및 옵션에 따라 다른 동작이 발생합니다.
sleep 60 & exit
종료되지 않을 수도 있지만 작업을 실행하고 있다고 불평합니다.
두 경우 모두 쉘은 양식의 한 줄을 인쇄 [1] 7149
하지만 터미널이 닫혀 있으면 이를 볼 시간이 없습니다.
두 번째 명령은
exit & echo foo > /tmp/bar
백그라운드에서 실행할 서브셸을 시작하고 exit
, 서브셸이 종료되고(서브셸에서) 실행됩니다 echo foo > /tmp/bar
. 따라서 "기본" 셸은 종료되지 않고 터미널은 계속 열려 있습니다.
[2] 13777
이어서
exit
(종료 쉘에 의해 인쇄됨)
[1]+ Done exit
(백그라운드 쉘이 종료될 때 메인 쉘에 의해 인쇄됩니다.)