스크립트가 현재 쉘 또는 하위 쉘에서 실행되는 프로그램입니까?

스크립트가 현재 쉘 또는 하위 쉘에서 실행되는 프로그램입니까?

다음 사항이 혼란스럽습니다. - 이름을 입력하여 현재 셸에서 스크립트를 실행하거나 프로그램을 실행하는 경우

  1. $PATH 변수를 검색하여 실행 파일의 위치를 ​​찾습니다.
  2. 일단 발견되면 현재 셸에서 실행 파일을 실행합니까, 아니면 실행 파일을 실행하기 위해 하위 셸/프로세스를 생성합니까?

실행 파일을 실행하기 위해 새로운 하위 프로세스가 생성될 것이라고 생각합니다. 그런데 하위 프로세스가 실행 파일을 실행하는 방법(실행 파일의 경로)을 어떻게 알 수 있습니까? — 실행 파일을 찾도록 상위 셸에서 PATH를 수정했지만(PATH=$PATH:/newpath/to/executable 사용) 내보내기를 수행하지 않는 경우

e.g., — I did not do an export here
$ PATH=$PATH:/path/to/executable
$ executable 

상위 셸이 실행 파일을 찾으면 다음에 무엇을 합니까(하위 프로세스 생성? 실행 파일 실행?). 그런데 편집된 PATH 환경이 하위 프로세스로 내보내지지 않은 경우 하위 프로세스는 어떻게 실행 파일을 찾습니까?

답변1

검색을 수행하는 사람은 대개 부모가 아닙니다 $PATH. 일반적으로 커널.

내부적으로 새 프로세스를 생성하는 것은 fork (새 프로세스를 생성하지만 현재 코드를 계속 실행합니다. 상위 및 하위 프로세스는 일반적으로 각 분기를 자체 분기로 프로세스합니다. if)구현하다*선택적 콘텐츠(예: 파일 설명자 리디렉션 또는 신호 설정)를 사용하여 호출됩니다(현재 프로세스 이미지를 새 프로세스 이미지로 대체).

이것구현하다* pexec 계열(exec 계열은 동일한 작업을 수행하는 다른 방법임)의 구성원은 $PATH슬래시가 없는 인수를 구문 분석할 때 커널이 환경 변수를 검색하도록 합니다.

경로가 확인되면 커널은 해당 경로를 바이너리로 실행하려고 시도하며, 전자가 실패하고 실행 파일에 shebang 라인이 있는 경우 shebang 라인을 사용합니다. Shebang 라인을 사용하면 거기에 지정된 인터프리터가 실행되고 구문 분석된 경로가 전달됩니다.

답변2

서브쉘과 서브프로세스에는 차이가 있습니다. 서브쉘에 대해 문의하셨습니다.

상위 쉘이 실행 파일을 찾을 때마다 상위 쉘의 모든 변수에 액세스할 수 있는 하위 쉘이 생성됩니다. 이것이 바로 서브쉘이 변수 PATH에 접근할 수 있는 이유입니다.

상위 셸이 하위 프로세스를 생성하면 하위 프로세스의 변수에 대한 액세스가 제한됩니다.

다음 명령어로 확인할 수 있습니다.

a=1 설정 해제
(echo "a는 하위 쉘의 $a입니다.")
sh -c 'echo "a는 하위 쉘의 $a입니다."'

자세한 내용은 링크를 참조하세요서브쉘 정보

관련 정보