환경 변수를 격리하기 위한 네임스페이스(프로세스, 사용자 등)가 있습니까?
만약 그렇게 하면 어떻게 되나요 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
다른 터미널 창의 세션 에는 나타나지 않습니다 .