쉘이 명령을 실행할 하위 프로세스를 생성하기 전이나 후에 임시 환경 변수가 추가됩니까?

쉘이 명령을 실행할 하위 프로세스를 생성하기 전이나 후에 임시 환경 변수가 추가됩니까?

Bash에서 실행할 때

myvar=val mycommand myargs

myvar=val실행 환경에 추가됩니다 mycommand.

bash 프로세스 호출이 fork()실행할 하위 프로세스 mycommand, 즉 mycommand외부 실행 파일 또는 스크립트 파일을 생성한다고 가정합니다.

myvar=valbash 쉘 호출 전후에 언제 환경에 추가됩니까 fork()? 즉, 다음 두 가지 가능성 중 실제로 발생한 것은 무엇입니까?

  • Bash 프로세스는 myvar=val 자체 환경에 추가된 다음 실행을 호출 하고 Bash 프로세스 환경의 일부로 하위 프로세스 환경에 상속되는 fork()하위 프로세스를 생성하기 위해 호출됩니다. 하위 프로세스가 실행을 완료하고 종료 되면 bash 프로세스는 자체 환경에서 종료됩니다.execve()mycommandmyvar=valmycommandmyvar=val

  • bash 프로세스 호출은 fork()실행될 하위 프로세스를 생성하고 mycommand해당 하위 프로세스를 myvar=val자체 환경에 추가한 다음 execve()실행을 호출합니다 mycommand.

내 질문의 동기는 다음과 같습니다.내 이전 게시물에 대한 Stephen의 답변.

Bash에서는 _명령을 구문 분석할 때마다 마지막 매개변수의 값으로 설정되는 특수 매개변수입니다. 또한 명령이 실행될 때마다 적용되는 내보낼 수 없는 특수 속성도 있습니다(참조:bind_lastargBash 소스 코드에서).

bash 프로세스가 언제 명령을 실행하는지 알고 싶습니다. bash가 _자체 환경에 추가되지 않은 경우 자체 환경에서 제거해야 하는 이유는 무엇입니까?

감사해요.

답변1

현실은 당신이 설명하는 두 가지 가능성 사이 어딘가에 있습니다. Bash는 자체 환경을 추가하지 않습니다 myvar. 적어도 우리가 일반적으로 완전한 셸 환경이라고 생각하는 myvar환경일시적인환경. 그런 다음 임시 환경뿐만 아니라 현재 변수 컨텍스트 및 셸 함수로부터 내보내기 환경, 특히 새 명령을 빌드합니다.앞으로하위 명령을 실행해야 하는 경우 포크하세요. 로 생각하시면 됩니다maybe_make_export_env소스 코드에서 Bash를 호출하세요 .. 아이가 시작한 후 임시 환경을 정리합니다 dispose_used_env_vars.

실제로는 아무런 차이가 없습니다. 하위 명령은 수신해야 하는 환경을 가져오며, Bash를 변경하지 않는 한 제어권을 다시 얻은 후에는 상위 환경이 해당 상태에 있어야 합니다. 그게 전부입니다.

관련 정보