.bashrc, env 및 내보내기를 이해해 보세요.

.bashrc, env 및 내보내기를 이해해 보세요.

면책조항: bash를 사용하세요.

다음 사항에 대한 이해에 대한 확인/수정이 필요합니다.

  1. env기본적으로 현재 세션 및 모든 하위 세션(예: 하위 세션에 들어가는 경우 ) bash에 액세스할 수 있는 현재 환경 변수를 표시합니다.

  2. 새 변수를 설정하면 MYMESSAGE="hello world!"해당 변수를 생성한 세션에만 표시됩니다. 예를 들어 하위 세션에 들어가면 진행할 수 없습니다 echo $MYMESSAGE.

  3. export MYMESSAGE="hello world!"하위 세션에서 액세스할 수 있도록 할 수 있습니다 . export끌어당기는 모든 항목 에 추가하는 것과 같습니다.env

  4. 하지만 export어떤 작업을 했다고 해서 세션을 닫고 터미널을 다시 시작하면 지속되지 않습니다. 로그인 시 스크립트가 실행되므로 .bashrc디렉터리를 편집 하고 새 환경 변수를 추가하세요./home/username/

지금까지 내 이해가 정확합니까?

env또한 자세한 내용이 어디서 나오는지 완전히 이해하지 못합니다 . 환경 변수 목록이 모두 일부 파일에 저장된 다음 편집/추가됩니까 .bashrc? 나는 이것이 어떻게 작동하는지 이해하고 싶습니다.

답변1

당신은 기본적으로 맞지만 몇 가지 추가 사항이 있습니다 ...

bash는 여러 "시작 파일"을 실행할 수 있습니다. 일부는 bourne-shell(sh)과의 이전 버전과의 호환성을 위한 것이고, 다른 일부는 bash를 시작한 방법에 따라 다릅니다. X에 로그인했습니까? TTY에 로그인하셨나요? bash다른 (bash-)쉘에서 시작 하시나요 ? Bash는 스크립트(비대화형)로 실행됩니까? 따라서 .bashrc는 그렇지 않습니다.언제나실행하거나 유일한 시작 파일일 수도 없습니다. 그러나 다른 시작 파일에서도 .bashrc를 "가져오고"(읽고 실행) 하는 것이 좋으므로 .bashrc의 내용이 항상 추가됩니다. bash가 시작되는 방법에 대한 섹션을 사용 man bash하고 보십시오... FILES 섹션에는 모든 시작 파일을 포함하여 bash에서 사용되는 파일도 나열됩니다. 더 깊이 이해하려면 를 시도해 보세요 info bash.

사용자 고유의 시작 파일 외에도 /etc에 해당 "기본" 전역 시작 파일이 있습니다. 이러한 파일은 일반적으로 bash사용자 고유의 시작 파일보다 먼저 읽혀지고 실행됩니다. Bash에서 정의한 환경 변수 외에도 자체 환경 변수를 정의하는 다른 프로그램이 있으며, 이는 Bash에서 설정한 환경 변수를 보완하거나 재정의할 수도 있습니다. 특히 주목해야 할 점은 X(GUI)입니다. 두 가지 모두를 설정하기 때문입니다.다른X가 VT에서 수동으로 시작되는지 여부에 따라 환경 설정( xinit또는 사용) 사용자 이름/비밀번호를 입력하기 위한 대화 상자가 표시됩니다.startxxdmkdm

그러나 다른 프로그램이 시작되기 전이나 bash사용 X하게 될 대부분의 환경(환경 변수)은 예를 들어 명령을 통해 설정됩니다 login. 이 중 대부분은 /etc/login.defs 및 기타 구성 파일에서 찾을 수 있습니다. 예를 들어, PATH 변수가 설정되며 루트인지 일반 사용자인지에 따라 달라집니다.

따라서 부팅, 초기화 및 로그인 프로세스의 일부로 실행되는 다양한 파일과 스크립트를 살펴보면 나열된 대부분의 변수를 사용할 수 있음을 알 수 있습니다 env. 그러나 일부(예: CWD현재 작업 디렉터리)는 셸(bash) 자체에 의해 자동으로 설정(및 업데이트)됩니다.

명령을 실행할 때 bash는 fork()라는 시스템 호출을 사용합니다. bash하위 프로세스가 새로운 PID(프로세스 ID)를 얻고 해당 PPID(상위 PID)가 "어머니"의 PPID(상위 PID)라는 점을 제외하면 기본적으로 자체적으로 동일한 복사본을 만듭니다. 그렇지 않으면 환경 변수도 동일합니다. 문제의 변수가 export첫 번째 ing으로 상속 가능하다고 가정합니다. 이제 두 개의 복사본 이 있습니다 bash. 그런 다음 기본적으로 하위 bash 프로세스의 "메모리에 있는" bash 프로그램을 다른 프로그램으로 대체하는 다른 시스템 호출인 exec()를 사용 ls합니다 . 변수는 여전히 존재하므로 새 프로그램은 환경을 상속받습니다 . 이 하위 항목은 이제 터미널이 종료될 때까지 터미널을 제어합니다(&를 사용하여 백그라운드에 명령을 입력하지 않는 한). 원래 bash-shell은 (기본적으로) 절전 모드로 유지됩니다. 명령이 종료되면 원래의 -shell로 돌아가서 다른 명령을 실행할 준비가 됩니다.psmuttbashbash

답변2

환경은 파일을 통해서가 아니라 새로 생성된 프로세스의 스택을 통해서 전달되는데, 이를 달성하는 방법은 시스템 exec()호출에 환경을 전달하는 것이다.

  • env는 외부 명령(셸 내장과 반대)이므로 env셸의 변수만 인쇄됩니다.exported

  • set다른 쪽에는 모든 쉘 변수가 나열됩니다. 그들 중 일부는 수출됩니다.

  • export쉘에서 내보낸 쉘 변수를 나열합니다.

그런데:

  • .bashrc로그인 셸이 아니라 모든 대화형(bash) 셸에서 실행됩니다. 다른 쉘에는 이 기능에 대한 다른 이름이 있습니다. Bourne Shell과 함께 ksh사용됩니다 ..kshrc.shrc

  • .profile로그인 쉘로 실행합니다. 이 파일은 모든 Bourne Shell 호환 쉘에서 공유됩니다.

답변3

당신의 이해가 정확합니다.

/home/username/.bashrc는 /etc/bash.bashrc의 설정을 추가하거나 재정의합니다.

/etc/profile에도 몇 가지 관련 설정이 있고 /home/username/.profile을 가질 수 있지만 이는 주로 역사적 호환성 이유로 존재합니다. (Bash의 기반이 되는 Bourne 쉘의 제품입니다.)

관련 정보