Linux 운영체제에서 제공하는 표준 환경변수(PATH, HOME 등)가 어떻게 자동으로 설정되는지 알고 싶습니다. 어떤 파일에서 읽혀지는가? 특정 사용자가 로그인할 때 이러한 변수를 설정하는 파일이 있어야 합니다.
답변1
귀하의 질문에 대한 답변은 INVOCATION
섹션에서 찾을 수 있습니다 man bash
. 관련 발췌문은 다음과 같습니다.
When bash is invoked as an interactive login shell, or as a non-inter-
active shell with the --login option, it first reads and executes com-
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable. The --noprofile option may be used when the
shell is started to inhibit this behavior.
When a login shell exits, bash reads and executes commands from the
file ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, bash
reads and executes commands from ~/.bashrc, if that file exists. This
may be inhibited by using the --norc option. The --rcfile file option
will force bash to read and execute commands from file instead of
~/.bashrc.
When bash is started non-interactively, to run a shell script, for
example, it looks for the variable BASH_ENV in the environment, expands
its value if it appears there, and uses the expanded value as the name
of a file to read and execute. Bash behaves as if the following com-
mand were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file
name.
매뉴얼 페이지에 더 많은 내용이 있으므로 읽어보는 것이 좋습니다.
답변2
쉘이 제공하는 것보다 상황이 조금 더 복잡합니다.
로그인하는 방법은 크게 세 가지가 있습니다.
- 실제 터미널(요즘은 대부분 콘솔)에서 로그인하세요.
- 의사 터미널에서 로그인(주로 네트워크 연결)
- 그래픽 환경에서 로그인
둘 다 셸을 실행하기 전에 환경을 설정하는 기능이 있으며 둘 다 수행합니다( HOME
, LOGNAME
, TERM
은 셸에서 설정하지 않을 수 있으며 PATH
시작 파일이 없더라도 셸은 일반적으로 환경 변수를 상속합니다).
실제 터미널에서 로그인하면 연결을 처리하는 프로세스가 TERM
환경 변수를 설정하고 나머지 작업을 프로그램에 위임할 수 있습니다 login
. 프로그램은 루트가 보안되지 않은 터미널에 로그인하는 것을 방지하는 것과 같은 몇 가지 확인을 수행하고 전체 환경이 TERM
깨끗한지 확인하고 HOME
, PATH
, SHELL
, TERM
, MAIL
을 초기화한 LOGNAME
다음 로그인 쉘을 시작합니다. 그러면 쉘이 자체 초기화를 수행합니다.
의사 터미널에서 로그인할 때에도 동일한 일이 발생하지만 약간 다릅니다. 일반적으로 환경은 단순한 환경 변수보다 연결을 처리하는 프로세스에서 더 많은 초기화를 가져옵니다 TERM
(네트워크 프로토콜에는 일반적으로 다른 쪽 끝에서 환경을 전송하는 방법이 있음). 따라서 login
환경을 정리하지 않는 모드에서 사용하면 정리가 필요합니다. 연결을 처리하는 프로그램이 완료되었습니다.
그래픽 환경은 일반적으로 위임하지 않지만 login
유사하게 작동합니다. 자격 증명을 확인한 후 일반 환경 변수를 사용하여 최소한 DISPLAY
올바르게 설정한 깨끗한 환경을 만든 다음 일반적으로 시스템 관리자가 제공한 스크립트를 사용하여 항목을 추가할 수 있도록 허용한 다음 데스크톱 환경에 대한 시작 스크립트를 시작할 수 있습니다. 로그인 셸에서 환경을 얻으려는 시도가 이루어지며 일반적으로 설정을 완료하기 위한 스크립트를 제공할 수도 있습니다. 따라서 데스크탑에서 프로그램을 시작할 때 해당 환경은 그래픽 로그인 프로그램, 데스크탑 환경 및 로그인 스크립트 설정의 조합입니다.
마지막 사항: 터미널 에뮬레이터를 시작하면 로그인 셸이 나타날 수 있습니다. 이 경우 셸의 로그인 스크립트가 실행되므로 최신 변경 사항의 효과를 볼 수 있지만 동일한 환경은 볼 수 없습니다. 다른 프로그램) 또는 다릅니다(이 경우 셸의 로그인 스크립트가 실행되지 않고 최신 변경 사항이 표시되지 않지만 다른 프로그램과 동일한 환경을 얻습니다. 셸은 대화형 초기화 스크립트에 의해 수정됩니다).
답변3
/etc/bash*
/etc/profile*
파일을 확인하세요 .
답변4
배포판에 따라 확인된 모든 파일을 순서대로 제공해야 하므로 bash의 매뉴얼 페이지를 확인하세요. 이 env
명령은 무엇이 설정되었는지 알려주지만 어디에 설정되어 있는지는 알려주지 않습니다. 그러나 빠른 grep을 사용하면 이러한 설정이 어디에 있는지 알 수 있습니다.