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

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

나는 bash라는 간단한 실행 파일을 실행하고 있습니다 hello. 사용자 입력을 요청하고 응답을 인쇄합니다. 저는 이렇게 운영합니다 ./hello.

프롬프트와 사용자 입력 모두 현재 쉘에서 발생하지만 다른 쉘에서 실행해야 한다고 생각합니다. 내가 그렇게 생각하는 이유는 소스를 사용하여 현재 셸에서 exe를 실행할 수 있기 때문입니다.

이것이 어떻게 작동하는지 설명해 줄 수 있는 사람이 있나요?

이 문제를 조사하는 동안 나는 "셸 환경"과 "셸 컨텍스트"라는 용어를 자주 접했습니다. 그들은 동일합니까?

답변1

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

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

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

내부적으로 상위 셸이 실행되고 fork()호출 exec()되어 결국 스크립트를 실행할 셸을 시작합니다 hello.

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

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

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

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


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

관련 정보