
환경 변수를 격리하는 네임스페이스(프로세스, 사용자 등)가 있나요?
그런 경우에는 어떻게 되나요 unshare
? 복제되나요? 프로세스가 기존 변수를 변경하면 어떻게 되나요?
편집 : 우분투를 사용하고 있습니다
답변1
환경 변수를 격리하기 위해 네임스페이스가 필요하지 않습니다. 이미 각 프로세스에 대해 격리되어 있고 비공개입니다. 하위 프로세스에서 환경 변수를 수정해도 상위 프로세스로 전파되지 않습니다.
Unix의 환경 변수는 프로세스의 주소 공간에 저장된 문자열 묶음일 뿐입니다. 프로세스가 분기되면 그 자식은 전체 주소 공간과 함께 해당 복사본을 "상속"하며, 프로그램이 다른 프로그램을 실행할 때(그리고 주소 공간의 전체 내용을 대체할 때) 해당 프로세스는 envp
인수 로 명시적으로 전달되어야 합니다. execve(2)
보존하려는 경우 시스템 호출 .
프로세스를 시작하려는 경우비어 있는환경에 따라 다음과 같이 시작할 수 있습니다.
env - cmd ...
그냥 호출됩니다 execve("/path/to/cmd", ["cmd", ..., NULL], [NULL])
.
또는 다음을 포함하는 환경에서 실행하려면 FOO=bar
:
env - FOO=bar cmd ...
clone(2)
시스템 호출( , unshare(2)
, ) 에 영향을 미치는 네임스페이스 setns(2)
와 명령줄 유틸리티 모두 unshare(1)
특별한 방식으로 환경을 고려하거나 영향을 주지 않습니다.
참고: 이것은 자연 법칙이 아닌 Unix에서 작동하는 방식입니다. plan9와 같은 다른 시스템(네임스페이스라는 개념이 시작된 곳이지만 모든 네임스페이스는 기본적으로산네임스페이스, 모든 것이 파일/시스템이기 때문에)환경/env
Unix와 달리 기본적으로 마운트되는 파일 시스템일 뿐입니다 .공유됨기본적으로부모와 자식 사이.
답변2
의 환경 변수는 bash
셸의 특정 인스턴스로만 범위가 지정되므로 별도의 네임스페이스를 정의할 필요가 없습니다.
데스크탑 환경에서 두 개의 터미널 창을 동시에 열면 이를 명확하게 볼 수 있습니다. 그 중 하나에 새 환경 변수를 만듭니다. 예:
TEST_VAR=34
bash
다른 터미널 창의 세션 에는 표시되지 않습니다 .