환경 변수의 출처를 결정하는 방법은 무엇입니까?


153

얼마 전에 설정 한 Linux 인스턴스가 있습니다. root환경 변수가 설정되어 있지만 시작 위치를 기억하거나 찾을 수 없으므로 실행 하고 로그인 할 때 .

  • 나는 확인했습니다 ~/.bash_profile, /etc/.bash_rc그리고 모든 시작 스크립트.
  • 나는 실행했습니다 findgrep아무 소용.

나는 분명한 곳을 보는 것을 잊어 버린 것 같아요. 이것을 알아내는 트릭이 있습니까?


6
/etc/environment또 하나입니다.
derobert

8
그리고 /etc/env.d/*파일들. 그러나하는 grep -R "YOUR_VARIABLE" /etc/것이 아마 가장 좋은 방법 일 것입니다.
rozcietrzewiacz


@rozcietrzewiacz 가장 간단한 방법 ... 변수가 실제로 / etc / 아래 어딘가에있는 경우 (내 경우와 같이); ) 당신은 대답으로 게시 할 경우, 나는 찬성 투표 것이다
라인

답변:


55

env명령을 사용하여 변수를 표시하는 경우 변수가 작성된 순서대로 표시되어야합니다. 부팅 초기에 시스템에서 설정했거나 나중에 .profile 또는 다른 구성 파일에서 설정 한 경우이 안내서를 지침으로 사용할 수 있습니다. 내 경험상, setand export명령은 변수를 알파벳 순서로 정렬하므로 목록이 유용하지 않습니다.


1
/ etc / environment에 설정된 환경 변수를 지우는 것을 찾으려고한다는 점을 제외하고는 훌륭 합니다. :-) (그리고 예, 그것은 초기에 설정되고 있습니다 ... 스크립트가 삭제되는 곳을 기록하기 위해 스크립트에 여러 줄을 추가하고 있습니다 ...)
Michael Scheper

127

경우 zsh로그인 쉘입니다 :

zsh -xl

bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

로그인 쉘을 시뮬레이션하고 zsh현재 해석중인 파일의 이름과 함께 수행 된 모든 것을 보여줍니다 (stderr로 리디렉션되는 영역 제외 ).

따라서 해당 출력에서 ​​환경 변수의 이름을 찾기 만하면됩니다. (이 script명령을 사용하면 전체 쉘 세션 출력을 저장하는 데 도움이되거나 bash접근 방식에서는 터미널 대신 출력을 저장하는 7> file.log대신 사용 ) 할 수 있습니다.7>&2xtracefile.log

변수가 없으면 시작시 셸이 변수를 상속 했으므로 PAM 구성에서와 같이 이전에 설정 ~/.ssh/environment되었거나 X11 세션 시작시 읽은 내용 ( ~/.xinitrc, ~/.xsession) 또는 로그인을 시작한 서비스 정의에 설정되었습니다. 관리자 또는 심지어 일부 부팅 스크립트에서. 그렇다면 find /etc -type f -exec grep -F THE_VAR {} +도움 이 될 수 있습니다.


4
인상적이고 도움이되었습니다. 감사합니다. 우리 n00bs의 경우, 모드에 대해 좀 더 설명해 주시면 모드에서 어떻게 벗어날 수 있습니까? 예를 들어,이 출력을 grep으로 간단히 파이프 할 수 없습니다.
Geoffrey Hale

5
@GeoffreyHale 만약 zsh -xl 2>&1stderr과 stdout 출력을 합치면 평소처럼 grep 할 수 있습니다.
Rakesh

1
fish쉘로 이것을 할 수있는 방법이 있습니까?
Nick Sweeting

을 사용하더라도 zsh -xl 2>&1어떻게 든 정상적으로 잡을 수 없습니다. 분명히 출력에는 적절한 줄 바꿈이나 무언가가 포함되어 있지 않습니다.
Xerus

나는 당신이 그냥 사용할 수 있다고 생각 PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)하고 그 임의의 파일을 grep하십시오.
bd1251252

50

먼저 살펴볼 곳 :

시스템 전체

  • /etc/environment: 환경 변수를위한 것
  • /etc/env.d/*: 환경 변수, 여러 파일로 분할
  • /etc/profile: 모든 유형의 초기화 스크립트
  • /etc/profile.d/*: 초기화 스크립트
  • /etc/bashrc, /etc/bash.bashrc: 함수 및 별명을 의미

사용자 별

  • ~/.bash_profile: 로그인 (bash-) 쉘 초기화
  • ~/.bashrc: 모든 대화식 (bash-) 셸 초기화
  • ~/.profile: 모든 껍질에 사용
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: 비 bash는 쉘 비슷

31

@Cian이 맞습니다. 사용하는 것보다 다른 findgrep, 당신이 어디에서 왔는지 발견 할 수있는 일은 거의 없다. 그것이 실제로 환경 변수라는 것을 알고, 나는 검색을 / etc /와 홈 디렉토리에 집중하려고 시도합니다. 대체 VARIABLE당신이 검색하는 적절한 변수 :

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
'당신이 할 수 있습니다'라는 대답으로 둘러싸인 '당신이 할 수 없습니다'라는 대답이이 많은 찬사를 가지고 있다는 것은 놀라운 일입니다.
Michael Scheper

변수가 설정된 위치를 실제로 결정하는 방법을 제공하는 답변이 없습니다. 유용한 단서가 있지만 일을 할 수있는 라이너는 없습니다.
앤드류 바그너

이 일은 내 시간을 해결했다. 고맙습니다.
Hassan Raza

@MichaelScheper "당신은 찾기 / 그리프 없이는 할 수 없습니다". 이후에 "당신은 할 수 있습니다"그렙 사용하여 작업을 수행하는 방법을 설명 있어요
라인을

23

당신이 두는 경우에 set -x당신에 .profile또는 .bash_profile이후의 모든 쉘 명령은 표준 오류에 기록되며, 그 중 하나가이 변수를 설정하면 당신은 볼 수 있습니다. set -x맨 위에 두어 /etc/profile추적 할 수도 있습니다. 출력은 매우 장황 할 수 있으므로 다음과 같은 파일로 리디렉션 할 수 있습니다 exec 2>/tmp/profile.log.

시스템이 PAM을 사용하는 경우 또는 pam_env에서로드 요청을 찾으십시오 . 지정된 파일에서이 모듈로드 환경 변수 또는 시스템 기본에서 파일을 지정하지 않으면 ( 그리고 데비안과 우분투). Linux에서 환경 변수 정의가있는 다른 파일은 (로 시작하는 줄을 찾습니다 )./etc/pam.conf/etc/pam.d/*/etc/environment/etc/security/pam_env.conf/etc/login.defsENV_


5

이 파일을 시작 스크립트를 확인 그들이 소스 사용 .(점) 또는 source. 해당 파일은 /etc및 이외의 다른 디렉토리에있을 수 있습니다 $HOME.


2

들어 zsh(시작시) 액세스 파일 유용 할 수 있습니다 추적 사용자, 그들은 너무 많이 있습니다 하나는 뭔가가 정의 된 위치를 하나씩 찾아 그들을 통해 볼 수있다.

zsh -o SOURCE_TRACE

0

환경 변수는 / etc / profile 파일에 저장되므로 더 많은 / etc / profile을 수행하고 원하는 env 변수를 확인하고 / etc / profile이 없으면 홈 디렉토리에서 .profile 파일을 lokk하십시오


1
환경 변수는에 저장 되지 않으며/etc/profile , 예를 들어 bash로그인 쉘로 사용될 때 시스템 전체 에서 변수 를 정의 할 수 있습니다 . 파일 및 / 또는 명령 줄에서 정의를 읽은 후 쉘 프로세스에 의해 저장됩니다.
Anthon

-2

예를 들어, HISTFILE 변수 및 해당 값을 찾거나 히스토리에 대해 정의 된 변수를 알고 싶다면 쉘에 다음을 입력하십시오.

set | grep HIST
env | grep HIST
printenv | grep HIST

이미 이름을 알고 있다면, 왜 : echo "$HISTFILE"?
Jeff Schaller

왜냐하면 $ HISTFILE 변수가 정의되어있는 곳을 찾고 싶기 때문입니다. 또한 어떤 변수가 정의되어 있는지 알고
싶다면 abou

2
불행히도, set어떤 파일이 변수를 정의했는지는 알려주지 않습니다.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.