bash 변수가 bash에서 설정된 위치의 전체보기


17

나는 PATH설정되어 /etc/profile있거나 .profile홈 디렉토리에있는 파일을 읽었습니다 .

경로가 설정된 유일한 장소입니까? 더 잘 이해하고 싶습니다.

에서 /etc/profile파일, 다음 주석이 말한대로 "system-wide .profile file for the Bourne shell". 프로필 파일이 bash의 기본 구성 파일이라는 것을 의미합니까?

그 파일에서 PATHvar가 전혀 설정되어 있지 않습니다 . .profile홈 디렉토리 의 파일에는 다음 줄이 있습니다.

PATH="$HOME/bin:$PATH"

PATH이미 설정된 $PATH문자열을 $HOME/bin:올바르게 연결했기 때문에 모양으로 재설정 됩니까? 그러나 경우 etc/profile~/.profile설정 파일 만있는 PATH$PATH이 정의되어 있지 않은 경우 코드의 라인에서 오는가 /etc/profile?

경험이있는 사람이 PATH변수에 대한 광범위하고 자세한 설명을 제공 할 수 있습니까 ? 감사!

답변:


20

PATH설정할 수있는 곳이 많이 있습니다 .

login프로그램은 기본값으로 설정합니다. 이 기본값이 구성되는 방법은 시스템에 따라 다릅니다. 임베드되지 않은 대부분의 Linux 시스템에서는 /etc/login.defs루트 및 다른 사용자에 대해 다른 값을 사용하여 에서 가져옵니다 . login(1)시스템 설명서를 참조하여 해당 기능을 확인하십시오 .

PAM을 사용하는 시스템 , 특히 pam_env모듈에서 시스템 전체 파일 /etc/environment및 사용자 별 파일에서 환경 변수를 설정할 수 있습니다 ~/.pam_environment.

그런 다음 대부분의 로그인 방법 (cron 작업은 아님) 은 시스템 전체 및 사용자 별 구성 파일을 읽는 로그인 쉘 을 실행 합니다. 이러한 파일은의 값을 수정하여 PATH일반적으로 항목을 추가하지만 때로는 다른 방식으로 추가 할 수 있습니다 . 읽을 파일은 로그인 쉘이 무엇인지에 따라 다릅니다. Bourne / POSIX 스타일 쉘은 /etc/profile및을 읽습니다 ~/.profile. Bash는을 읽지 /etc/profile만 사용자 별 파일의 경우 ~/.bash_profile, ~/.bash_login및 중 첫 번째 기존 파일 만 읽습니다 ~/.profile. zsh을 읽기 /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogin~/.zlogin. 많은 GUI 세션은로드 준비 /etc/profile하고 ~/.profile있지만, 데스크탑 환경 또는 기타 세션 시작 스크립트, 어떻게 각각의 유통이 최대를 설정했습니다에, 디스플레이 관리자에 따라 달라집니다.


4

초기 PATH 변수는 보통 /etc/profile sys 관리자가 소스에 PATH 변수를 넣을 때 설정됩니다 ./etc/profile.d

로컬로 오버라이드하지 않는 한, 로그인하는 모든 사람이 기본적으로 상속하는 시스템 PATH 변수입니다. /usr/bin내 직장에서 우리가 사용 /opt하는 몇 가지 사용자 정의 위치와 광범위하게 사용되지만 일반적으로와 같은 명확한 경로 를 설정합니다.

사용자 별 로그인 계정에서 PATH는에서 정의 할 수도 있습니다 ~/.profile. 모든 사용자가 액세스 할 수있는 것은 아닙니다. 아마도 부서장이 이진을 실행할 수 /opt있지만 다른 사용자는이 이진에 신경을 쓰지 않습니다. 사용자는 해당 파일도 직접 수정할 수 있으며, .profile쉘 고유의 파일이 아니라는 점이 좋습니다 . 로그인하면 PATH 세트가 소스가됩니다.

셀 고유의 로그인에, 경로가 정의 될 수도 ~/.bash_profile, ~/.bashrc또는 .cshrc또는 유사한. 사용자는 특정 쉘에 대한 특정 경로를 원하거나 모든 개인 환경 설정을 유지하려는 경우 여기에서 PATH를 설정할 수 있습니다.

요약하면 : / etc / profile 및 /etc/profile.d는 일반적으로 계단식 설정입니다. 그것들은 상속되고 일반적으로 개인 도트 파일에 추가됩니다 (사용자는 대신 대체 할 수 있지만). 개인 도트 파일은 일반적으로 사용자가 설정합니다.

물론 쉘에도 환경 변수가 있으므로 로컬 환경 변수는 구성 파일에서 기본 PATH를 추가하거나 무시할 수 있습니다.


방금 언급 한 모든 파일을 확인했지만 ~ / .bash_profile 및 .cshrc는 존재하지 않습니다. /etc/profile.d 디렉토리에있는 3 개의 스크립트 파일 : appmenu-qt5.sh, bash_completion.sh 및 vte.sh는 PATH 변수도 설정하지 않습니다. 바이너리가 / bin / bash 프로그램에 설정된 기본 PATH가 "쉘에 환경 변수도 있음"이란 무엇입니까? echo $ PATH를 입력하면 / usr / local / sbin : / usr / local / bin : / usr / sbin : / usr / bin : / sbin : / bin : / usr / games : / usr / local / games가 표시됩니다. 그러나 나는 그 모든 것이 실제로 어디에서 설정되고 있는지 전혀 모른다.
Larry Lawless

나는 당신의 질문을 다소 잘못 읽은 것으로 생각합니다. 경로가 설정 될 수있는 모든 위치를 요구한다고 생각했지만, 경로가 처음 설정 되는 위치에 더 관심이 있다고 생각합니다 . 이를 위해를보십시오 /etc/bashrc. 이는 모든 초기 환경 변수를 포함해야하는 BASH 시작 방법을 결정합니다. 내 시스템에서 /etc/bashrc읽었 /etc/profile.d지만 3 개의 파일 만있는 것처럼 들리 /etc/profile.d므로 배포판 에서 다르게 수행 할 수 있습니다.
Klaatu von Schlacker

1
나는 기본적으로 그것의 기능을 알고 싶다. 켄 톰슨이 나의 아버지가 되길 바란다 :)
Larry Lawless

당신은 거기에 도착할 것이다. 이 자료를 매일 한동안 사용하고 나면 모든 것이 가라 앉기 시작하고 계속 "왜?" 답을 얻기 위해 문서를 읽으면 결국 많은 것을 배웁니다!
Klaatu von Schlacker

Linux Mint 18 Cinnamon에서 /etc/profile.d/jdk_home.sh를 확인하십시오.이 파일의 이름을 jdk_home.sh.old로 바꾸면 경로가 계속 재정의되지 않고 java -version을 호출하고 Java 9를 볼 수 있습니다. 예상했다. update-aternatives --config java에서 Java 9를 올바르게 선택했지만이 jdk_home.sh 파일은 $ PATH를 계속 무시했습니다.
flyingdrifter

3

다른 답변에 추가하려면 다음을 수행하십시오.

bash설정합니다 PATH이 환경에 설정되어 있지 않은 경우 하드 코딩 된 기본값으로. Ubuntu Server 16.04.2 컴퓨터에서 다음을 얻습니다.

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

strings유틸리티를 사용하여이 값이 실제로 하드 코딩되어 있고 환경 또는 일부 파일에서 읽지 않았는지 확인할 수 있습니다 .

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

그러나 아치 리눅스 컴퓨터에서 다른 결과를 얻습니다.

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

따라서 bash바이너리가 빌드 될 때이 기본값이 선택되는 것처럼 보입니다 . 사용중인 OS / 배포판에 따라 다릅니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.