실행 파일이 현재 셸이나 하위 셸에서 "실행 중"입니까?

실행 파일이 현재 셸이나 하위 셸에서 "실행 중"입니까?

저는 hellobash라는 간단한 실행 파일을 실행하고 있습니다. 사용자에게 입력을 쿼리하고 응답을 인쇄합니다. 나는 그렇게 운영한다 ./hello.

메시지를 표시하고 사용자가 응답을 입력하는 것은 모두 현재 셸에서 발생하지만 다른 셸에서 실행되어야 한다고 생각했습니다. 소스를 사용하여 현재 셸에서 exe를 실행할 수 있기 때문에 이것을 가정했습니다.

누구든지 이것이 어떻게 작동하는지 설명할 수 있나요?

이에 대해 조사하면서 "셸 환경"과 "셸 컨텍스트"라는 용어를 자주 접했습니다. 그것들은 같은 것입니까?

답변1

현재 환경 변수를 포함하는 현재 쉘의 환경에 대해 "쉘 환경"이라고 말할 수 있습니다. 환경은 시작된 하위 프로세스(서브쉘 또는 기타)에 의해 상속됩니다.

"쉘 컨텍스트"는 일반적으로 사용되지 않는 용어이지만 "프로세스 컨텍스트"와 동일하다고 가정합니다. 쉘 스크립트의 경우 여기에는 쉘 환경뿐만 아니라 현재 쉘 변수, 파일 설명자(표준 입력, 표준 출력 및 표준 오류 및 명시적으로 열린 기타 모든 항목), 신호 처리기( 와 함께 설치됨 trap) 등이 포함됩니다. C 프로그램이라면 프로세스 컨텍스트는 에 대한 호출을 통해 상속되지만 fork()후속 exec()호출에서는 상속되지 않습니다(환경만 에 대한 호출에서 살아남습니다 exec()).

쉘 스크립트라고 가정하고 프로그램 을 실행하면 hello스크립트를 실행하는 쉘의 컨텍스트에서 입력 및 출력이 발생합니다 hello. 이것이 "현재 쉘"입니다. 입력한 셸은 ./hello상위 셸이며 hello해당 환경을 상속합니다.

내부적으로 상위 쉘은 스크립트를 실행할 쉘을 시작하기 위해 fork()및 호출을 수행합니다 .exec()hello

hello스크립트가 동일한 메시지를 표시한다는 사실단말기스크립트를 시작한 곳은 스크립트를 실행하는 셸이 현재 포그라운드 프로세스라는 것을 의미합니다. 상위 쉘은 완료되기를 기다리고 있습니다. 완료되면 상위 쉘은 다시 한번 터미널의 포그라운드 프로세스가 됩니다.

source ./hello또는 를 사용하여 스크립트를 시작하면 . ./hello해당 명령을 입력한 셸과 동일한 컨텍스트에서 스크립트가 실행됩니다. 이는 대화형 셸의 컨텍스트와 환경을 수정할 수 있음을 의미합니다. 예를 들어, 현재 작업 디렉터리를 변경하거나(환경 변경) 신호 처리기를 설치할 수 있으며(컨텍스트 변경) 해당 변경 사항은 스크립트 실행이 완료될 때에도 여전히 "활성" 상태입니다.

프로그램이 컴파일된 바이너리 인 경우 hello호출하는 셸의 환경을 상속하지만 해당 컨텍스트(파일 설명자 등)를 공유하지 않습니다. 쉘 스크립트가 아니기 때문에 서브쉘에서는 실제로 실행되지 않습니다. 상위 셸은 백그라운드로 이동하여 셸 스크립트에서와 마찬가지로 프로그램이 완료될 때까지 기다립니다. 상위 셸의 관점에서 보면 컴파일된 바이너리를 시작하는 것과 셸 스크립트를 시작하는 것 사이에는 차이가 없습니다.

쉘이 바이너리 파일을 해석하는 방법을 모르기 때문에 컴파일된 바이너리는 source또는 (점) 으로 시작할 수 없습니다 ..


이 답변에는 약간의 손짓이 있지만 기본적으로 정확하다고 생각합니다. 수정이나 추가가 필요한 부분이 있으면 댓글(또는 수정)을 남겨주세요.

관련 정보