Mac OS X의 환경 변수


186

업데이트 : 아래 링크 에 완전한 답변이 없습니다 . 경로 나 변수를 두 위치 (GUI와 셸에 각각 하나씩)로 설정해야하는 것은 절실합니다.

중복되지 않음 : OS X에서 환경 변수 설정?


환경 변수를 설정하고 수정하기 매우 쉬운 Windows 배경 (시스템 속성> 고급> 환경 변수로 이동)에서 나오면 Mac OS 10.5에서는 그렇게 간단하지 않은 것 같습니다. 대부분의 참조는 / etc / profile 또는 ~ / .profile을 업데이트해야한다고 말합니다. 그것들은 시스템 변수와 사용자 변수에 해당합니까? 예를 들어 JAVA_HOME변수를 어디에 설정해야 합니까?


편집하다:

Eclipse와 같은 앱뿐만 아니라 터미널에서 변수에 액세스 할 수 있기를 원합니다. 또한이 기능을 적용하기 위해 다시 시작 / 로그 아웃하지 않아도되기를 바랍니다.


그리고 링크 질문에 대한 답은 여기에서 반복되지 않습니다.
dmckee --- 전 운영자 고양이

답변:


142

복제 할 필요가 없습니다. 을 사용하여 시작된 프로세스 (및 하위 프로세스, 즉 Spotlight에서 시작한 모든 프로세스)가 사용하는 환경 변수를 설정할 수 있습니다 launchctl setenv.

예를 들어, 현재 경로를 설정 한 후 .bashrc또는 어디에서나 시작한 후 현재 경로를 미러링하려면 다음을 수행하십시오 .

PATH=whatever:you:want
launchctl setenv PATH $PATH

실행중인 응용 프로그램에서 환경 변수가 자동으로 업데이트되지 않습니다. 업데이트 된 환경 변수를 얻으려면 응용 프로그램을 다시 시작해야합니다 (단, 셸에서 변수를 설정할 수는 있지만 PATH=whatever:you:want터미널을 다시 시작할 필요는 없습니다).


1
지금까지 가장 좋은 답변처럼 보입니다. 타사 앱이 필요하지 않습니다!
압둘라 지 발리

2
이것은 전역으로 보이지는 않습니다.이 방법으로 설정된 환경 변수는 사용자에게 로컬입니다. 우리는 여전히 환경 변수를 설정하기위한 글로벌 메커니즘을 가지고 있지 않습니다 .
Andrew

@Andrew 사용자에게 어떤 의미가 있습니까? 이후에 시작된 모든 프로세스가 영향을 받기를 기대합니다.
매트 커티스

@MattCurtis : 설정 한 환경 변수 launchctl setenv는 변경 한 사용자에게만 보이는 것 같습니다. 변수를 일반 사용자로 설정하면 (do를 통해) 루트로 표시되지 않으며 그 반대도 마찬가지입니다.
앤드류

2
@Andrew OK, 루트가 자체적으로 시작되었습니다- ps aux | grep launchd이것을 보여줄 것입니다. 또한 환경 을 보존 할 경우 (기본적으로) 환경 을 보존 할 man sudo문서 sudo(로 설정 sudo -E한 변수 포함 launchctl setenv)를 확인하십시오. 그런데 이것에 대한 실제 응용 프로그램이 있습니까? 그렇다면이 방법이 적합합니까?
매트 커티스

299

환경 변수를 설정할 수있는 곳이 몇 군데 있습니다.

  • ~/.profile: 터미널에서 시작된 모든 프로그램에서 설정하려는 변수에이 값을 사용하십시오 (Linux와 달리 Terminal.app에서 열린 모든 쉘은 로그인 쉘임).
  • ~/.bashrc: 로그인 쉘이 아닌 쉘에 대해 호출됩니다. 상속 된 환경 변수가 아닌 서브 쉘에서 재정의해야하는 별명 및 기타 항목에이를 사용하십시오.
  • /etc/profile: ~ / .profile 전에로드되지만 그렇지 않은 경우에는 동일합니다. 변수를 시스템의 모든 사용자가 시작한 터미널 프로그램 (bash를 사용한다고 가정)에 적용하려는 경우이 변수를 사용하십시오.
  • ~/.MacOSX/environment.plist: 로그인시 loginwindow로 읽습니다. 10.5 (10.6 아님)에서 Spotlight가 시작한 응용 프로그램을 제외하고 GUI 응용 프로그램을 포함한 모든 응용 프로그램에 적용됩니다. 변경 사항을 적용하려면 로그 아웃했다가 다시 로그인해야합니다. 이 파일은 OS X 10.8부터 더 이상 지원되지 않습니다.
  • 사용자 launchd인스턴스 : 이는 사용자, GUI 및 CLI가 시작한 모든 프로그램에 적용됩니다. 의 setenv명령을 사용하여 언제든지 변경 사항을 적용 할 수 있습니다 launchctl. 이론적으로 , 당신은 넣을 수 있어야 setenv에서 명령을 ~/.launchd.conf하고, launchd사용자가 로그인 할 때 자동으로 읽어 것이지만,이 파일에 대한 연습 지원에 구현되지 않았습니다. 대신 다른 메커니즘을 사용하여 로그인시 스크립트를 실행하고 해당 스크립트를 호출 launchctl하여 launchd환경 을 설정할 수 있습니다.
  • /etc/launchd.conf: 이것은 시스템을 시작할 때와 사용자가 로그인 할 때 시작하여 읽습니다. 시작된 프로세스는 루트 프로세스이므로 시스템의 모든 단일 프로세스에 영향을줍니다. 실행중인 루트 시작에 변경 사항을 적용하기 위해 명령을에 파이프 할 수 있습니다 sudo launchctl.

이해해야 할 기본 사항은 다음과 같습니다.

  • 환경 변수는 분기 시점에 프로세스의 자식에 의해 상속됩니다.
  • 루트 프로세스는 시작된 인스턴스이며 사용자 세션마다 별도의 시작된 인스턴스가 있습니다.
  • launchd를 사용하면 launchctl;를 사용하여 현재 환경 변수를 변경할 수 있습니다 . 업데이트 된 변수는 그때부터 분기되는 모든 새로운 프로세스에 의해 상속됩니다.

시작된 환경 변수 설정의 예 :

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

이제 변수를 사용하는 GUI 앱을 시작하십시오.

작동 ~/.launchd.conf하지 않는 사실을 해결하기 위해 다음 스크립트를 넣을 수 있습니다 ~/Library/LaunchAgents/local.launchd.conf.plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

그런 다음 setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE안에 넣을 수 ~/.launchd.conf있으며 각 로그인마다 실행됩니다.

이런 방식으로 명령 목록을 launchctl로 파이핑 할 때 공백을 포함하는 값으로 환경 변수를 설정할 수 없습니다. 필요한 경우 다음과 같이 launchctl을 호출 할 수 있습니다 launchctl setenv MYVARIABLE "QUOTE THE STRING"..

또한 로그인시 실행되는 다른 프로그램은 런치 에이전트 이전에 실행될 수 있으므로 설정 한 환경 변수가 표시되지 않을 수 있습니다.


3
사실, 대한 ~/.MacOSX/environment.plist, 내 사자에이 되는 읽기 및 사용. 방금 테스트했습니다. RCenvironment 환경 설정 창을 사용하여 유지 관리 하기 때문에 실제로 .launchd.conf 보다 선호합니다.
Gilimanjaro

5
~/.launchd.conf10.6.8에서 작동 할 수 없습니다 . 효과가 없습니다. 또한 man page에 따르면이 파일은 현재 지원되지 않습니다.
snowcrash09

4
~ / .launchd.conf은 10.7.3에서 작동하지 않는 것 중 하나 내가 그 사람의 페이지에서 볼 때 그것은 $ HOME / .launchd.conf 귀하의 launchd에 구성 파일 말한다 (현재 지원되지 않는)
비 창조적

4
10.8 (Mountain Lion)에서는 ~ / .MacOSX / environment.plist가 더 이상 지원되지 않습니다. Apple Dev에 따르면 "원하는 환경 변수가 포함 된"LSEnvironment "사전을 포함하도록 .app 자체의 Info.plist를 변경해야합니다." 자세한 내용은 apple.stackexchange.com/questions/57385/…를
pnkfelix

3
@LaC 훌륭하고 포괄적 인 게시물; 당신은 그 상태로 업데이트하십시오 수 있습니다 ~/.launchd.conf아직 지원되지 및 OS X 10.8.3의로 일을하지 않는입니까? 참조man launchd.conf
mklement0

12

OP가 찾고있는 것은 단순한 Windows와 같은 솔루션이라고 생각합니다.

여기 나중에 간다 :

https://www.macupdate.com/app/mac/14617/rcenvironment


1
와우, 멋지다. 아직 시도하지 않았지만 설명에서 필요한 것 같습니다.
압둘라 지 발리

6
btw, 내가 게시 한 이후 원래 링크가 끊어진 것 같습니다 (Apple 문제는 무엇입니까? 301은 비쌉니다). 이 링크를 대신 사용할 수 있습니다. macupdate.com/app/mac/14617/rcenvironment
Tom Teman

이건 정말 늙었 어 OS X 10.10 (Yosemite) 이상에서도 작동하는 최신 솔루션에 대한 osx-env-sync를 언급하는 다른 답변을 확인하십시오.
Warren P

1
답변의 링크에서 정보를 요약하십시오. 이미 살펴본 바와 같이, 여러 가지 이유로 링크가 끊어집니다.
user3.1415927

7

리눅스에서 읽을 수 있습니다. Mac OS X과 거의 비슷합니다. 또는 좀 더 가까운 BSD 유닉스를 읽을 수 있습니다. 대부분 리눅스와 BSD의 차이점은 그다지 중요하지 않습니다.

/etc/profile 시스템 환경 변수입니다.

~/.profile 사용자 별 환경 변수입니다.

"JAVA_HOME 변수를 어디에 설정해야합니까?"

  • 여러 사용자가 있습니까? 그들은 상관합니까? ?를 변경하여 다른 사용자를 혼란스럽게 하시겠습니까 /etc/profile?

일반적으로 유일한 사용자 인 경우에도 시스템 전체 설정을 망설이지 않는 것이 좋습니다. 로컬 설정을 편집하고 싶습니다.


5

GUI 앱의 경우을 만들고 편집해야 ~/.MacOSX/environment.plist합니다. 자세한 내용은 여기를 참조 하십시오 . 이를 적용하려면 로그 아웃해야합니다. 그것들이 터미널에서 시작된 응용 프로그램에도 영향을 미치는지 확실하지 않지만 그럴 것이라고 가정합니다.

터미널에서 시작된 앱의 경우 ~ / .profile 파일을 편집 할 수도 있습니다.


2
예, 터미널은 터미널에서 시작된 것과 마찬가지로 변수를 상속합니다. RCenvironment 환경 설정 분할 창을 사용 하여 변수를 유지 보수 할 수 있습니다.
Gilimanjaro

1
이 솔루션은 더 이상 일부 Mac OS X v10.7 개정판에서 작동하지 않습니다. Mac OS X v10.8 이상의 개정판에는 없습니다. 대신 다음을 참조하십시오 : stackoverflow.com/a/4567308/543738
LS

3

터미널에서 ~/.profile파일을 열고 다음을 nano입력하십시오.

export PATH=whatever/you/want:$PATH

이 파일을 저장하십시오 (cmd + X 및 Y). 그런 다음 로그 아웃 / 로그인하거나 다시 터미널에서 새 탭을 열고 새 변수를 사용해보십시오.

무엇이든 / 원하는 / 뒤에 ": $ PATH"를 추가하는 것을 잊지 마십시오. 그렇지 않으면 그 전에 있던 PATH 변수의 모든 경로가 지워집니다.


4
이것은 bash 명령 환경에만 적용됩니다. 여기에서 설정 한 변수는 GUI 응용 프로그램에서 볼 수 없습니다.
Warren P

3

osx-env-sync 를 사용하여 단일 소스에서 명령 행 및 GUI 애플리케이션의 OS X 환경 변수를 동기화하십시오 .

또한 관련 질문에 대한 답변을 여기에 게시했습니다 .


환상적이다. 제안 : launchctl unload / launctl load "refresh now"항목을 스크립트에 넣으십시오. 나는 그것을 osx-env-sync-now.sh라고 불렀다. .bash_profile을 수정하고 작은 "지금 새로 고침"스크립트를 실행하고 계속하십시오. 여기에는 보안 관련 사항이 있다고 생각하므로 몇 가지 제한 사항을 고려해야합니다. 그들이 OS X에서이 기능을 해제 한 이유가 있어야합니다.
Warren P

@WarrenP 완료! 저장소를 확인하십시오.
Ersin Er

우수한. 이것은 나를 위해 많은 고통을 해결했습니다. 이것이 실제로 유용한 한 가지 사례는 SCALA로 개발하는 모든 사람에게 해당됩니다. 명령 줄 스칼라와 GUI 스칼라 (예 : netbeans) 모두에 대해 SCALA_HOME을 설정하면 실제로 고통이됩니다.
Warren P

0

macOS에서 환경 변수를 영구적으로 변경하려면로 설정하십시오 /etc/paths. 참고 이 파일은 읽기 전용 기본적으로, 당신이해야합니다, 그래서 chmod를 쓰기 권한에 대해.


이것은 나를 위해 작동하지 않습니다. 내가 가진 /usr/bin/local심지어 파일을 수정하지 않고, 그것은 기본적으로 그 방법이었다, 그 파일에 아직 내 GUI 애플리케이션은 참조 /usr/bin:/bin:/usr/sbin:/sbin. 나는 여러 번 재부팅했다.
mgol

@m_gol 당신이 달릴 때 무엇을 얻 cat /etc/paths/습니까?
IgorGanapolsky

1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin은 별도의 줄에 있습니다. 그러나 SourceTree는 첫 번째를 제외한 모든 것을 봅니다.
mgol

" macOS 에서 기본 경로 를 변경하려면"으로 편집 할 수 있습니다 . 이것은 환경 변수의보다 일반적인 문제와 관련이 없습니다.
rfay

0

2020 Mac OS X Catalina 사용자의 경우 :

다른 쓸모없는 답변은 잊어 버리십시오. 여기에는 두 단계 만 필요합니다.

  1. 이름 지정 규칙 우선 순위 appname으로 파일을 작성하십시오. 그런 다음 추가하려는 경로를 복사하여 붙여 넣습니다 PATH.

    80-vscode를 들어 /Applications/Visual Studio Code.app/Contents/Resources/app/bin/내 경우에는 내용 이 있습니다.

  2. 해당 파일을로 이동하십시오 /etc/paths.d/. 터미널에서 새 탭 (새 세션)을 열고 echo $PATH경로가 추가되었는지 확인하는 것을 잊지 마십시오 !

참고 :이 방법 은 경로 만 추가 합니다 PATH.

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