하위 셸이 fork에 의해 구현되었으므로 셸의 변수가 하위 셸에 상속되지 않는 이유는 무엇입니까?


0

셸 스크립트에서 셸 명령을 실행하면 하위 셸 프로세스가 생성됩니다. 프로세스가 생성되지 않습니다. fork function? 내보낼 수없는 변수가 상속되지 않는 이유는 무엇입니까? 에서 fork상위 프로세스의 모든 컨텍스트를 하위 프로세스에 복사해야합니다.


좀 더 구체적으로 우려하는 시나리오를 설명해 주시겠습니까?
Kenster

내가 들어가면 a=x; sh -c "echo $a" 나는 그것을 발견한다. x 가 올바르게 표시됩니다. 너 뭐하고 있니?
AFH

@AFH 그러나 언제 a=x 변수 정의, 하위 쉘 열기 shecho $a, a의 값은 상속되지 않습니다. 왜 그런지 알고 싶어? 하위 셸이에 의해 생성되지 않습니다 fork()?
user3872279

a 이전에 정의되지 않았으므로 a=x 그랬다. 변수를 정의하고 그 변수를 로컬 변수로 정의하면 값이 상속 되었음이 입증됩니다. 나도 몰라. fork() 또는 vfork() 하위 셸을 만드는 데 사용되지만 어느 것이 사용되는지는 예상대로 작동하는 것으로 보입니다. 상속받지 않는다고 생각하게하기 위해 당신은 무엇을하고 있습니까?
AFH

@AFH OP가 맞다. 지역 변수가 상속되지 않는다. 귀하의 사례가 있어야합니다. a=x; sh -c 'echo $a' 당신이 상속을 시험하고 싶다면.
lemonsqueeze

답변:


0

첫 번째 오류는 셸이 실행되고 있다고 생각하는 것입니다. fork() 외부 명령을 실행하고 fork() 쉘의 동작에 대한 설명이다. 실제로 부모 프로세스와 자식 프로세스는 모두 많은 추가 작업을 수행합니다. 그리고 특히 아이 호출 execve() 외부 명령을 실행합니다.

이 시점에서 매뉴얼 페이지를 execve() 빛이 시작되어야합니다. 시스템 호출에 대한 매개 변수 중 하나는 다음과 같습니다. 오버레이 된 프로세스 이미지가 가질 환경 프로그램 시작시. 분명히, 운영 체제가 지나가는 마법의 언저리 환경은 없습니다. 셸은 명시 적으로 환경을 만들어서 다음 환경으로 전달해야합니다. execvce() 자식 프로세스에서. 그 환경은 쉘이 좋아하는 것이 될 수 있습니다.

두 번째 오류가 발생합니다. 환경 변수는 쉘 변수가 아닙니다. 셸 프로그램이 시작되면 수입 환경 변수를 동일한 이름의 셸 변수로 변환합니다 (하나의 셸에서 셸 함수로). 외부 명령어를 생성 할 때, 수출 쉘 변수는 커널이 생성하고 (새로운) 환경으로 커널에 전달한다. execve(). whiles 사이에서, 당신이 스크립트로하고 대화식으로하는 모든 것 셸 변수 쉘 프로세스 환경과는 다른 변수에 영향을줍니다. (셸 프로세스의 환경은 일반적으로 프로그램 시작시 가져온 후에 크게 영향을받지 않고 사용되지 않습니다.)

- 그거야! - 왜 export 쉘 내장 "내보내기"라고합니다.

또한 다음과 같은 내장 기능이 어떻게 작동하는지 설명합니다. set unexported 변수를 참조하십시오. 쉘 프로그램을 다른 프로그램과 오버레이하는 것을 포함하지 않으며, 전달할 새 환경을 설정하는 것을 포함하지 않습니다. execve(). 마찬가지로, 괄호로 서브 셸을 만드는 것은 그 자체로는 포함되지 않습니다. execve() 환경을 만들기 위해 셸 변수를 내보내는 것을 포함하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.