Linux에서 경로 환경 변수는 어떻게 작동합니까?

Linux에서 경로 환경 변수는 어떻게 작동합니까?

Linux에서 PATH 환경 변수가 작동하는 방식이 혼란스럽습니다. 저는 Linux Mint 15 사용자입니다.

/home/.bashrc먼저 파일 편집 및 를 실행하는 방법에 대해 읽었 지만 PATH=$PATH:/directory, 설치된 모든 소프트웨어가 셸의 어디에서나 액세스할 수 있도록
관리되는 일부 경로 항목에 대해서도 배웠습니다 ./etc/bash.bashrc
/usr/local/bin

Linux에서 경로 변수는 어떻게 작동하며 어디에 배치해야 합니까?

답변1

여기서 파악해야 할 기본 개념은 PATH가 여러 위치에서 정의될 수 있다는 것입니다. @demure가 그의 답변에서 설명 PATH=$PATH:/new/dir했듯이다음에 추가 /new_dir도착했을 때 $PATH불분명한 것으로 판명되었습니다 $PATH.

파일이 너무 많은 이유 중 하나는 쉘의 개념 login과 관련이 있습니다. non-login바라보다여기좋은 요약입니다. 다음은 bash 매뉴얼 페이지에서 가져온 것입니다(강조):

bash가 --login 옵션을 사용하여 대화형 로그인 쉘 또는 비대화형 쉘로 호출되면,파일이 존재하는 경우 먼저 /etc/profile 파일에서 명령을 읽고 실행합니다. 파일을 읽은 후 ~/.bash_profile, ~/.bash_login, ~/.profile을 순서대로 찾습니다., 첫 번째 기존 및 읽기 가능한 명령에서 명령을 읽고 실행합니다. 이 동작은 셸을 시작할 때 --noprofile 옵션을 사용하여 비활성화할 수 있습니다.

처음으로 시스템에 로그인하면 시작됩니다.로그인쉘이므로 bash는 위에 나열된 파일을 읽습니다. 대부분의 배포에는 모든 사용자에게 적용하려는 변경 사항을 적용해야 하는 시스템 전체 $PATH(모든 사용자에게 적용) 설정이 있습니다. /etc/profile이것은 내 데비안에 있습니다:

PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"

로그인 후 터미널을 열면 실행됩니다.대화형, 비로그인껍데기. 이에 대해 다음 과 같이 man bash말해야 합니다.

   When  an  interactive shell that is not a login shell
   is started, bash reads  and  executes  commands  from
   /etc/bash.bashrc and ~/.bashrc, if these files exist.

따라서 새 터미널을 열 때마다 이러한 파일을 읽습니다. 마지막 $PATH는 모든 파일의 값의 조합입니다. 일반적인 시나리오에서는 그래픽 로그인 관리자를 사용하여 로그인하고 새 세션을 시작합니다. 이 시점에서 콘텐츠는 각 파일에 정의되어 $PATH있습니다 . profile터미널을 열면 대화형 셸에 있는 것이며 bashrc내용이 $PATH.


전체적으로, 당신이 정말로 알아야 할 것은 $PATH편집 할 수 있다는 것입니다 $HOME/.profile.

답변2

홈 디렉토리에서는 .bashrc대신 가 됩니다 .bash.rc.
시스템 전체 구성 /etc/bashrc은 가 아닙니다 /etc/.bash.rc.

Unix와 Linux는 파일 경로를 사용하지 않고 파일 경로를 \some\path\here사용합니다 /some/path/here. \다른 특수 문자를 비활성화하는 데 사용되는 이스케이프 문자입니다.

( 홈 디렉토리를 나타냄) 행 $PATH에 이를 추가하여 편집 할 수 있습니다 .~/.bashrc~

PATH=$PATH:/usr/local/bin:/some/other/path
export PATH

어디

  • $PATHPATH로 설정된 모든 항목을 유지합니다.
  • :별도의 항목.
  • :/some/other/path이 두 디렉터리는 예시입니다(해당 부분 은 필요하지 않습니다 ).

/etc/bashrc직접 변경해야 하는 경우에는 시스템 전체 편집을 권장하지 않습니다.

답변3

먼저, 커널(또는 initramfs)은 프로세스에 초기 기본 PATH 값 init과 기타 환경 변수를 제공합니다. 필요한 경우 해당 내용을 볼 수 있습니다.

$ sudo strings /proc/1/environ
selinux=0
SHLVL=1
HOME=/
init=/sbin/init
TERM=linux
drop_caps=
BOOT_IMAGE=/vmlinuz-4.9.80-atom
PATH=/sbin:/usr/sbin:/bin:/usr/bin
crashkernel=384M-:128M
PWD=/
rootmnt=/root

부팅 시 시작되는 데몬 및 기타 프로세스의 경우 프로세스 init(예: 레거시 SysVinit 또는 최신 대안 중 하나 systemd)에 자체 기본 PATH가 적용되거나 단순히 커널 기본값이 전달될 수 있습니다. 이는 구성 가능하거나 불가능할 수 있습니다. 초기화 시스템에 대한 설명서를 참조하세요.

로그인 세션의 경우 PAM 설정에는 pam_env.so사용자 세션에 대한 기본 경로를 적용할 수 있는 항목이 포함될 수 있습니다 /etc/security/pam_env.conf. 또는 사용되지 않는 경우 로그인을 처리하는 프로세스(예: 기존 + pam_env.so쌍) 콘솔 또는 직렬 포트 로그인 ) 사용자 세션에 대해 자체 기본 시작 경로를 적용할 수 있습니다.sshd*gettylogin

그런 다음 사용자의 셸은 일반적으로 하나 이상의 시스템 전체 로그인 스크립트와 하나 이상의 사용자별 로그인 스크립트(있는 경우)를 실행합니다. 이들 중 하나를 기존 PATH 설정에 추가하거나 완전히 바꿀 수 있습니다.

답변4

PATH내 사용 /etc/enviroment을 위해/etc/login.defs

...

관련 정보