OS X에서 환경 변수 설정


849

OS X에서 PATH와 같은 환경 변수를 수정하는 올바른 방법은 무엇입니까?

Google에서 조금 살펴본 후 편집 할 세 가지 파일을 발견했습니다.

  • / etc / paths
  • ~ / .profile
  • ~ / .tcshrc

나는이 파일들 중 일부조차 가지고 있지 않으며 OS X가 bash를 사용하기 때문에 .tcshrc 가 잘못되었다고 확신합니다 . 이러한 변수, 특히 PATH는 어디에 정의되어 있습니까?

나는 실행 해요 OS X 10.5 (레오파드).


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/새로운 세트 시스템 환경으로 GUI 응용 프로그램을 시작합니다.
Hong

답변:


652

브루노가 제대로 작동하고 있습니다. 나는 광범위한 연구를 수행했으며 모든 GUI 응용 프로그램에서 사용할 수있는 변수를 설정하려는 경우 유일한 옵션은 /etc/launchd.conf입니다.

참고하시기 바랍니다 environment.plist이 스포트 라이트를 통해 실행 된 응용 프로그램이 작동하지 않습니다. 이것은 Steve Sexton에 의해 문서화되어 있습니다 .

  1. 터미널 프롬프트를 엽니 다

  2. 유형 sudo vi /etc/launchd.conf(참고 :이 파일은 아직 존재하지 않을 수 있음)

  3. 다음과 같은 내용을 파일에 넣습니다.

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. vi에서 변경 사항을 저장하고 Mac을 재부팅하십시오. 또는 위의 코드 주석에 표시된 grep/ xargs명령을 사용하십시오 .

  5. 터미널 창을 열고 입력하여 변수가 작동 export하는지 확인하면 새 변수가 표시됩니다. IntelliJ IDEA 및 Spotlight를 통해 시작하는 기타 GUI 응용 프로그램에서도 사용할 수 있습니다.


3
나는 받아 들인 대답 (environment.plist)이 성공하지 못했다고 말하고 있습니다. 4 대의 컴퓨터에서 10.5 및 10.6의 launchd.conf 접근 방식을 성공적으로 사용했습니다.
Matthew McCullough

54
시스템 재부팅 없이이 작업 을 수행 할 수있는 방법이 있습니까?
sorin February

40
위에서 언급 한 제한은 MacOS X 10.5에 적용됩니다. 그러나 MacOS X 10.6에는 더 이상이 제한이 없으며 environment.plist 내부의 값을 설정하면 스포트라이트를 통해 시작된 앱에서도 제대로 작동합니다. 선택된 답변은 Snow Leopard ;-)에 적합합니다.
Louis Jacomet

5
설정 launchd.conf은 한 가지 방법이지만 재부팅 (다시 시작하려면)해야합니다. 당신이 재부팅을 피하려면, 내 대답을 참조 stackoverflow.com/questions/135688/...
매트 커티스

23
제시된 접근 방식에는 몇 가지 문제점이 있습니다. 대부분은 PATH 환경 변수에만 해당되지만 asker는 PATH를 구체적으로 언급했습니다. 1) launchd.conf의 항목은 ssh와 같은 대화식 쉘에서 시스템에 적용되지 않습니다. 2) "setenv PATH / testdir"행을 사용하면 Terminal.app의 PATH에 추가되지만 OS X 응용 프로그램 환경의 다른 모든 PATH 항목이 사라집니다. 3) /etc/launchd.conf에서 "setenv PATH $ {PATH} : / testdir"을 수행하면 기존 $ PATH가 제대로 확장되지 않습니다. 4) launchd.conf는 한 사용자가 아닌 모든 사용자에게 적용됩니다. 내가 더 좋은 솜을 가지고있는 것은 아닙니다.
NoahR

257

Spotlight에서 시작한 새 프로세스의 환경을 설정하는 방법 (재부트하지 않아도 됨)

로 시작 (및 확장으로 Spotlight에서 시작한 모든 환경)에 사용되는 환경을 설정할 수 있습니다 launchctl setenv. 예를 들어 경로를 설정하려면

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

또는 경로를 .bashrc유사 하게 설정하려면 시작시 미러링하십시오.

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

변경된 환경을 선택하려면 앱을 다시 시작해야하지만 재부팅 할 필요는 없습니다.

여기에는 Terminal.app에서 이미 실행중인 모든 셸이 포함되지만 export PATH=/opt/local/bin:/opt/local/sbin:$PATHbash 또는 zsh 와 같이 환경을 더 직접 설정할 수 있습니다 .

재부팅 후 변경 사항을 유지하는 방법

재부팅 후 변경 사항유지 하려면 다음/etc/launchd.conf 과 같이 환경 변수를 다음 과 같이 설정할 수 있습니다 .

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf 재부팅하면 자동으로 실행됩니다.

이러한 변경 사항을 지금 적용하려면이 명령을 사용하여 재 처리해야합니다 launchctl.conf(팁에 @mklement 감사합니다).

egrep -v '^\s*#' /etc/launchd.conf | launchctl

명령을 사용하여 launchctl로드하는 방법과로드 방법 에 대해 자세히 알아볼 수 있습니다 .launchd.confman launchctl


2
아주 좋은 것! environment.plist 사용의 이점은 OS X가 터미널을 먼저 시작하지 않아도 파일의 내용을 존중한다는 것입니다. 어쨌든, 당신의 대답은 주로 재부팅의 필요성을 피하는 데 집중되어 있다고 생각합니다.
fotNelton

2
@kapuzineralex 예. 재부팅을 피하고 Spotlight에서 시작한 프로그램의 환경을 변경합니다 environment.plist.
매트 커티스

2
이 방법으로 환경을 설정하면 재부팅 할 때까지만 작동했습니다. Mac을 재부팅 한 후 환경 변수가 지속되지 않았습니다. 마태의 대답은 나를 위해 완벽하게 작동했습니다.
Shamal Karunarathne

8
@ Shamal : 귀하의 의견을 +1했지만 Matthew의 답변 에는 재부팅이 필요 하지만 재부팅하지 않고 올바른 방법으로 변경해야한다는 점 을 명심 하십시오. 둘 다 원하는 경우 경로 설정을 launchd.conf에 넣고 (다시 부팅해도 지속됨) "source /etc/launchctl.conf; launchctl setenv PATH $ PATH"와 같은 스크립트를 사용하는 것이 좋습니다. 재부팅하지 않으려는 경우 "새로 고침"할 수도 있습니다.
매트 커티스

5
@MattCurtis 재부팅이 필요하지 않지만 재부팅 후 변경 사항이 실제로 손실 된다는 것을 분명히하기 위해 직접 답변을 편집 해 주 시겠습니까? 또한 재부팅 전에 변경 사항을 적용하는 올바른 방법 은 @ MatthewMcCullough 's answer의 접근 방식을 사용하는 것 입니다. etc/launchd.confegrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl
mklement0

106

OS X v10.7 (Lion) 이하 포함하여 다음을 설정할 수 있습니다.

~/.MacOSX/environment.plist

보다:

터미널의 PATH의 경우 .bash_profile또는 설정 할 수 있어야합니다 .profile(아마도 만들어야합니다)

대한 OS X의 v10.8 (산 사자) 이후 사용할 필요 launchd하고launchctl .


4
이것은 실제로 그래픽 응용 프로그램에서 사용할 것으로 예상되는 경우에만 해당됩니다. 이들은 일반적으로 환경 변수를 사용하지 않으므로 설정하기에 좋지 않습니다.
Chris Hanson

18
환경 변수를 사용하는 그래픽 앱의 좋은 예가 있습니다. 예를 들어 IntelliJ는 M2_HOME을보고 Maven이 어디에 있는지 알고 싶어합니다. 변수를 확인하려면 environment.plist 대신 /etc/launchd.conf에서 변수를 설정해야합니다.
Matthew McCullough

3
참고로 : preferences.plist당시 preferences.plist스포트라이트를 통해 시작된 응용 프로그램에 대해 읽지 않았기 때문에 OS X 10.5에서 사용하는 것이 이상적이지 않았습니다. Louis의 Matthew의 답변과 전자 메일에 대한 주석을 참조하십시오. /002113.html . OS X 10.6의 경우 environment.plist와 동일하게 작동합니다.
야누스

16
이것은 더 이상 OSX 10.8에 적용 할 수 없습니다 apple.stackexchange.com/questions/57385/...
thatsmydoing

1
@tim_yates 당신은 편집 "까지 읽을 수있는 답의 첫 번째 줄 시겠어요 포함하고 사자 맞습니다 무엇 주어진 (10 * 7 *)를"? 나는 원래의 모호한 "Up to Mountain Lion"을 편집하려고했으며 리뷰어들은 그것을 수정했습니다.
mklement0

67

단일 소스의 명령 줄 및 GUI 응용 프로그램을위한 솔루션 ( Mac OS X v10.10 (Yosemite) 및 Mac OS X v10.11 (El Capitan)에서 작동)

~/.bash_profile다음 스 니펫에서와 같이 환경 변수 정의가 있다고 가정하십시오 .

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

로그인 할 때마다 그리고 필요할 때마다 이러한 변수를 사용자 세션에로드 할 실행 에이전트 가 필요합니다 . 또한 이러한 정의를 구문 분석하고 에이전트가 실행하는 데 필요한 명령을 빌드하려면 셸 스크립트가 필요합니다.

가진 파일 만들기 plist(라는 이름의 예 접미사 osx-env-sync.plist)에 ~/Library/LaunchAgents/다음과 같은 내용으로 디렉토리를 :

<?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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-l여기서 매개 변수는 중요합니다. 그것은 함께 쉘 스크립트를 실행하는 데 필요한의 로그인 쉘 그래서 ~/.bash_profile이 스크립트가 실행되기 전에 처음에 공급된다.

이제 쉘 스크립트입니다. ~/.osx-env-sync.sh다음 내용으로 작성하십시오 .

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

쉘 스크립트가 실행 가능한지 확인하십시오.

chmod +x ~/.osx-env-sync.sh

이제 현재 세션에 대한 런치 에이전트를로드하십시오.

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(다시) GUI 응용 프로그램을 시작하고 환경 변수를 읽을 수 있는지 확인하십시오.

설정이 영구적입니다. 재시작 및 재 로그인 후에도 유지됩니다.

초기 설정 후 (방금 수행 한) ~/.bash_profile전체 환경 에 대한 변경 사항을 다시 전체 환경 에 반영 하려면 launchctl load ...명령을 다시 실행해도 원하는 작업이 수행되지 않습니다. 대신 다음과 같은 경고가 표시됩니다.

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

로그 아웃 / 로그인 프로세스를 거치지 않고 환경 변수를 다시로드하려면 다음을 수행하십시오.

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

마지막으로 이미 실행중인 응용 프로그램 (Terminal.app 포함)을 다시 시작하여 변경 사항을 인식하도록하십시오.

또한 여기에서 코드와 설명을 GitHub 프로젝트로 푸시했습니다 : osx-env-sync .

이것이 최신 버전의 OS X (Yosemite & El Capitan)에 대한 궁극적 인 해결책이 되길 바랍니다.


잘 작동합니다. 보안 허점이 될 경우 이것이 인기가 있는지 약간 걱정
Warren P

3
이 솔루션은 내가 제대로 작동 할 수있는 유일한 솔루션이었습니다. 훌륭한 솔루션. Mac에서 왜 이렇게 어려운지 이해할 수 없습니다 ...
JohnyTex

2
불행히도 El Capitan에서는 작동하지 않습니다. github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 의 의견 은 문제를 잘 설명합니다.
mgol

1
따라서이 솔루션이 작동하지 않고 /etc/launchd.conf는 효과가 없으며 Node.js는 바이너리를 / usr / local / bin에 설치 하며이 경로는 GUI 응용 프로그램의 경로에 없습니다. 따라서 El Capitan의 SourceTree와 같은 GUI Git 앱에서는 Node를 사용하는 Git 후크가 전혀 작동하지 않습니다. 이것은 끔찍하다.
mgol

1
문제는 PATH 변수에 관한 것입니다. 곧 해결책을 찾을 수 있기를 바랍니다.
Ersin Er

54
  1. 하다:

    vim ~/.bash_profile

    파일이 존재하지 않을 수 있습니다 (없는 경우 파일을 만들 수 있음).

  2. 이것을 입력하고 파일을 저장하십시오.

    export PATH=$PATH:YOUR_PATH_HERE
  3. 운영

    source ~/.bash_profile

exportBASH가 지원하지 않기 때문에 +1 은 제가 제안하려고하는 것입니다setenv
vol7ron

지금은 작동합니다. 이 모든 것이 생각보다 훨씬 복잡해 보입니다. 이 모든 것을 위해 더 많은 시간을 할애해야 할 것입니다. 감사.
Ruto Collins

34

OS X에서 환경 변수를 처리 할 때 해결해야 할 두 가지 문제가 있습니다. 첫 번째는 Spotlight (Mac 메뉴 / 상태 표시 줄의 오른쪽에있는 돋보기 아이콘)에서 프로그램을 호출 할 때, 두 번째는 Dock에서 프로그램을 호출 할 때 발생합니다. . 이 표준 쉘 위치에서 환경을 읽기 때문에 터미널 응용 프로그램에서 프로그램을 호출 / 유틸리티 (사소한 ~/.profile, ~/.bash_profile, ~/.bashrc, 등)

Dock에서 프로그램을 호출 할 때 요소에 일련의 요소 가있는 ~/.MacOSX/environment.plist 위치를 사용 하십시오 .<dict><key>KEY</key><string>theValue</string>

Spotlight에서 프로그램을 호출 할 때 필요한 모든 키 / 값 설정으로 시작이 설정되어 있는지 확인하십시오.

두 문제를 동시에 해결하기 위해 사용자 계정에 로그인 항목 (시스템 환경 설정 도구를 통해 설정)을 사용합니다. 로그인 항목은 물론 Emacs lisp 함수를 호출하는 bash 스크립트입니다. 물론 좋아하는 스크립팅 도구를 사용하여 동일한 작업을 수행 할 수 있습니다. 이 방법은 언제든지 작동하며 재부팅 할 필요가 없다는 추가 이점이 있습니다. 즉 ~/.profile, 일부 쉘에서 로그인 항목을 편집 하고 실행하며 Dock 또는 Spotlight에서 새로 호출 된 프로그램에 대한 변경 사항을 볼 수 있습니다.

세부:

로그인 항목 : ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

이맥스 리스프 기능 : ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

참고 :이 솔루션은 특히 Matt Curtis가 제공 한 솔루션을 추가하기 전에 오는 사람들의 합병이지만 내 ~/.bash_profile콘텐츠 플랫폼을 독립적 으로 유지 하고 launchd환경 설정 (Mac 전용 시설)을 별도의 스크립트에 넣으려고했습니다. .


20
와. 나는 이것이 효과가 없다고 말하지는 않지만 ... OS X에서 일관된 환경을 얻는 데 필요한 복잡성에
겁이 나고 있습니다.

2
이것은 내가 10.9에 대해 본 모든 솔루션 중에서 가장 잘 작동합니다. 유일한 결함은 로그인 항목이 불확실한 순서로 실행되기 때문에 Emacs (예를 들어)가 로그인시 시작된 경우 (예 : 로그 아웃시 열었 기 때문에) 다시 시작하지 않으면 반드시 환경 변수를 가질 필요가 없다는 것입니다. 스크립트가 시작되기 전에 시작되기 때문입니다.
telotortium

22

또 다른 무료 오픈 소스 Mac OS X v10.8 (Mountain Lion) 환경 설정 창 /environment.plist 솔루션은 EnvPane 입니다.

EnvPane의 소스 코드GitHub에서 사용할 수 있습니다 . EnvPane은에 필적하는 기능을 가지고처럼 보이는 RCEnvironment 그러나, 즉, 그것으로 즉시 저장 변수를 업데이트 할 수 있습니다 것 없이 환영 다시 시작 또는 로그인에 대한 필요성.

개발자가 언급 한대로 :

EnvPane은 Mac OS X 10.8 (Mountain Lion)의 환경 설정 패널로 그래픽 및 터미널 세션에서 모든 프로그램의 환경 변수를 설정할 수 있습니다. Mountain Lion에서 ~ / .MacOSX / environment.plist에 대한 지원을 복원 할뿐만 아니라 로그 아웃했다가 다시 로그인 할 필요없이 변경 사항을 환경에 즉시 게시합니다. <SNIP> EnvPane에는 다음이 포함됩니다 (자동 설치). 1) 로그인 후 일찍 및 2) ~ / .MacOSX / environment.plist가 변경 될 때마다 실행되는 에이전트를 시작했습니다. 에이전트는 ~ / .MacOSX / environment.plist를 읽고 launchctl setenv 및 launchctl unsetenv에서 사용하는 동일한 API를 통해 해당 파일의 환경 변수를 현재 사용자의 시작된 인스턴스로 내 보냅니다.

면책 조항 : 나는 결코 개발자 또는 그의 프로젝트와 관련이 없습니다.

추신 : 나는 그 이름을 좋아합니다 ( 'Ends Pain'과 같은 소리).


2
EnvPane은 현재 PATH를 설정할 수 없습니다. 자세한 내용은 내 버그 보고서를 참조하십시오 : github.com/hschmidt/EnvPane/issues/5
Uwe Günther

나는 ♥ ️이 일 .. 단지 단점은 .. 어떤 해결책이라도 희생자가 될 것이라고 생각 한다.-프로세스를 다시 시작해야한다-새로운 "환경"을 물려받는 것이다. 원크 원크.
Alex Gray

2
@sorin : GitHub 사이트에서 발생한 문제에 대한 설명과 함께 문제를 열 ​​수 있습니까? EnvPane은 10.10에서 나를 위해 일합니다. 면책 조항 : 저는 EnvPane의 저자입니다.
Hannes

17

업데이트 (2017-08-04)

(적어도) macOS 10.12.6 (Sierra)부터이 방법은 Apache httpd ( system및의 user옵션 과 옵션 모두)에서 작동을 중지 한 것으로 보입니다 launchctl config. 다른 프로그램은 영향을받지 않는 것 같습니다. 이것이 httpd의 버그 인 것으로 생각됩니다.

원래 답변

이것은 OS X 10.10+ (특히 /usr/bin더 이상 쓸 수없는 루트없는 모드로 인해 10.11+ )와 관련이 있습니다.

OS X의 버그로 인해 변수 launchctl setenv PATH <new path>를 설정 하는 데 사용할 수없는 곳을 여러 곳에서 읽었습니다 PATH(개인 경험에서는 사실처럼 보입니다). 쉘에서 시작되지 않은 응용 프로그램에PATH 대해 설정할 수있는 또 다른 방법이 있다는 것을 알았습니다 .

sudo launchctl config user path <new path>

이 옵션은 launchctl 매뉴얼 페이지에 설명되어 있습니다.

구성 시스템 | 사용자 매개 변수 값

launchd (8) 도메인에 대한 지속적인 구성 정보를 설정합니다. 시스템 도메인과 사용자 도메인 만 구성 할 수 있습니다. 지속적 스토리지의 위치는 구현 세부 사항이며 해당 스토리지에 대한 변경은이 하위 명령을 통해서만 수행해야합니다. 이 부속 명령을 통해 작성된 변경 사항을 적용하려면 재부팅이 필요합니다.

[...]

통로

대상 도메인 내의 모든 서비스에 대한 PATH 환경 변수를 문자열 값으로 설정합니다. 문자열 값은 environ (7)의 PATH 환경 변수에 대해 설명 된 형식을 따라야합니다. 서비스가 고유 한 PATH를 지정하면 서비스 별 환경 변수가 우선합니다.

참고 :이 기능을 사용하여 도메인 내의 모든 서비스에 대한 일반 환경 변수를 설정할 수는 없습니다. 의도적으로 PATH 환경 변수 범위에 속하며 보안상의 이유로 다른 것은 없습니다.

Finder에서 시작한 GUI 응용 프로그램 ( getenvPATH를 얻는 데 사용) 으로 작동한다는 것을 확인했습니다 . 이 작업은 한 번만 수행하면 변경 사항이 재부팅을 통해 지속됩니다.


나에게도 효과가 있습니다. sudo launchctl procinfo <gui-pid>새로 설정된 PATH환경을 보여줍니다 . 그러나 sudo launchctl config user path <new path>실제로 모든 사용자를 위해 설정 ... (새 사용자 추가 및 Sublime Text의 Python 콘솔을 사용하여 확인)
Bossliaw

1
이것은 로그인 할 때 다시 열린 응용 프로그램의 PATH 환경 변수에 영향을 미치지 않는 것 같습니다 (종료시 열림).
Brecht Machiels

흥미 롭군 다시 열 응용 프로그램의 경우 환경 (또는 그 하위 집합)이 저장되고 있음을 의미합니다.
Max Leske

@MaxLeske 아니요, 환경 변수가 변경되기 전에 다시 열린 응용 프로그램이 시작되고 있습니다. 따라서이 작업을 수행 한 후 처음이 아닙니다 sudo launchctl config user path(이것은 가정하는 것 같습니다).
Brecht Machiels

1
@ShlomiSchwartz launchctl에서는 임의의 환경 변수를 설정할 수 없습니다 . PATH변수는 예외이다.
Max Leske

17

산 사자에 모든 /etc/paths/etc/launchd.conf편집이 영향을하지 않습니다!

애플 개발자 포럼의 말 :

".app 자체의 Info.plist를 변경하여 원하는 환경 변수가 포함 된"LSEnvironment "사전을 포함하십시오.

~ / .MacOSX / environment.plist는 더 이상 지원되지 않습니다. "

따라서 응용 프로그램을 직접 편집 Info.plist했습니다 ( "AppName.app"(이 경우 SourceTree)를 마우스 오른쪽 단추로 클릭 한 다음 " Show package contents")합니다.

패키지 내용보기

그리고 나는 다음과 같은 새로운 키 / dict 쌍을 추가했습니다 :

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

( Apple의 LaunchServicesKeys 설명서 참조 )

여기에 이미지 설명을 입력하십시오

이제 응용 프로그램 (내 경우에는 Sourcetree)은 주어진 경로를 사용하고 Git 1.9.3에서 작동합니다 :-)

추신 : 물론 특정 경로 요구에 맞게 경로 항목을 조정해야합니다.


3
이 솔루션은 시스템에 대한 최소 침입 표준을 충족합니다. 감사.
John Vance

@ 존 밴스 하나는 완전히 제이슨 T. 밀러는 그의 대답에 명확하게 설명으로 시스템 전체의 변화는 항상 위험하다, 동의
rmcsharry

5
El Capitan에서는 효과가 없습니다. :(
mgol

High Sierra 10.13에서 응용 프로그램 Info.plist파일을 수정 하면 응용 프로그램이로드되지 않습니다.LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai

16

여기에 대한 답변이 "잘못"되지는 않지만, 다른 것을 추가 할 것입니다. OS X에서 "모든 프로세스"에 영향을 미치는 환경 변수를 변경하지 마십시오. 심지어 모든 프로세스가 지정된 사용자가 대화식으로 실행하도록 셸 외부에서도 변경하지 마십시오.

내 경험상 모든 프로세스의 PATH와 같은 환경 변수에 대한 전역 변경 사항은 Windows보다 OS X에서 문제를 일으킬 가능성이 훨씬 큽니다. 많은 OS X 응용 프로그램 및 기타 소프트웨어 (특히 OS 구성 요소 포함)는 UNIX 명령 줄 도구를 사용하고 시스템과 함께 제공된 도구 버전의 동작을 가정합니다. 그렇게 할 때 절대 경로를 반드시 사용할 필요는 없습니다 (유사한 주석은 동적으로로드 된 라이브러리 및 DYLD_ * 환경 변수에 적용됩니다). 예를 들어, Python 및 Ruby와 같은 OS X 제공 버전의 인터프리터 대체에 대한 다양한 스택 오버플로 질문에 대한 최고 등급의 답변은 일반적으로 "하지 마십시오"라고 생각하십시오.

OS X는 이와 관련하여 다른 UNIX 유사 운영 체제 (예 : Linux, FreeBSD 및 Solaris)와 실제로 다르지 않습니다. 애플이 이것을 쉽게 할 수있는 방법을 제공하지 않는 가장 큰 이유는 그것이 깨지기 때문 이다. Windows가 이러한 문제를 일으키지 않는 정도까지는 다음 두 가지 때문입니다. (1) Windows 소프트웨어는 UNIX 소프트웨어만큼 명령 줄 도구에 의존하지 않는 경향이 있으며 (2) Microsoft는 PATH와 같은 "전역"구성 옵션의 영향을 제한하기 위해 최신 Windows 버전에서 동적로드 동작을 변경 한 모든 프로세스에 영향을주는 변경으로 인해 발생한 "DLL 지옥"및 보안 문제에 대한 광범위한 기록.

"거의"여부와 상관없이 이러한 변경 사항을 더 작은 범위로 제한하면 훨씬 안정적인 시스템을 갖게됩니다.


1
사람들에게 요청한 것을하지 말라고하는 것은 그들이 묻는 질문에 대한 답이 아닙니다. 사람들이이 작업을 수행하지 못하게하는 것도 문제를 해결합니다. 애플의 모드 조작.
frabjous

LSEnvironment 키 developer.apple.com/library/archive/documentation/General/…을 사용하여 /Applications/App.app/Contents/Info.plist에서 PATH를 설정하는 것이 현재 권장되는 솔루션 일 수 있습니다.
Dave X

15

때로는 이전 답변이 모두 작동하지 않는 경우가 있습니다. M2_HOMEEclipse 또는 IntelliJ IDEA에서 시스템 변수 (예 :)에 액세스하려는 경우이 경우 나를 위해 작동하는 유일한 것은 다음과 같습니다.

먼저 (1 단계) /etc/launchd.conf"setenv VAR value"와 같은 행을 포함하도록 편집 한 다음 (2 단계) 재부팅하십시오.

OS X에서는 다른 유닉스처럼 응용 프로그램이 시작되지 않기 때문에 .bash_profile을 수정하면 작동하지 않습니다. 부모의 쉘 변수를 상속받지 않습니다. 다른 모든 수정은 나에게 알려지지 않은 이유로 작동하지 않습니다. 다른 사람이 이것에 대해 분명히 할 수 있습니다.


5
Spotlight 또는 다른 방법으로 시작된 응용 프로그램은 모두 부모 프로세스에서 /etc/launchd.conf를 읽으므로 모든 응용 프로그램 및 셸에서 환경 변수를 표시 할 위치를 선택하는 것이 좋습니다.
Matthew McCullough

1
- 재부팅을 방지 다른 솔루션에 대한 내 대답은 참조 stackoverflow.com/questions/135688/...
매트 커티스

내 MaxOS 10.6 시스템에 /etc/launchd.conf 파일이 없습니다. 이 버전에서 새롭거나 쓸모없는 것입니까? 아니면이 기계가 엉망입니까?
peterk

13

Environment Variables 환경 설정 창을 쫓아 링크가 깨졌고 Apple 사이트에서 검색 한 결과 링크를 잊어 버린 것으로 보입니다 ... 난잡한 시작 과정의 끝 부분으로 돌아갔습니다.

내 시스템 (맥 OS X 10.6.8)에 environment.plist에 정의 된 변수를 표시 하는 신뢰성 (launchd에 통해) 스포트 라이트에서 시작 응용 프로그램에 수출된다. 내 문제는 해당 vars가 터미널의 새로운 bash 세션으로 내보내지지 않는다는 것입니다. 즉, 여기에 묘사 된 것과 반대의 문제가 있습니다.

참고 : environment.plist는 앞에서 설명한 것처럼 XML이 아닌 JSON처럼 보입니다.

나는에 의해 바르보고 스포트 라이트 애플 리케이션을 얻을 수있었습니다 편집 ~ /에서라도 / environment.plist 나는 내 .profile 파일에 다음을 추가하여 새로운 터미널 세션으로 같은 바르를 강제 할 수 있었다 :

eval $(launchctl export)

2
그 애매하지 않음 : RCenvironment
Gilimanjaro

launchctl 내보내기에 대한 좋은 팁. 그러나 나는 .profile에 그대로 두지 않을 것입니다. / usr / local / bin을 포함하지 않는 $ PATH로 $ PATH를 덮어 씁니다. 그러나 정규식을 사용하여 관심있는 변수를 선택할 수 있습니다 :``eval $ (launchctl export | grep '^ my. * =').
mivk

3
새로운 Mountain Lion 머신 (10.8.2)에서 environment.plist는 완전히 쓸모가 없습니다. 올바른 길을 보려면 Matthew의 답변을 참조하십시오. /etc/launchd.conf와 함께 launchctl 명령 줄 앱이 시작되었습니다. 당신과 함께 자신까지 읽을 수 있습니다 man launchd, man launchctl그리고 man launchd.conf에서 터미널 창. Glad Apple은 Mac 개발자 라이브러리가 약간 지연 되더라도 매뉴얼 페이지를 최신 상태로 유지합니다.
Russell B

10

배쉬 시작 파일의 모든 - ~/.bashrc, ~/.bash_profile, ~/.profile. ~/.MacOSX/environment.plistGUI 응용 프로그램에는 환경 변수 라는 이름의 이상한 파일 이 있습니다.


10

Matt Curtis가 대답 한 것과 비슷하게 launchctl을 통해 환경 변수를 설정했지만 export라는 함수로 랩핑하여 내 .bash_profile에서 일반과 같은 변수를 내보낼 때마다 launchctl로 설정됩니다. 여기 내가하는 일이 있습니다.

  1. 내 .bash_profile은 한 줄로만 구성됩니다 (개인 취향 일뿐입니다).

    source .bashrc
  2. 내 .bashrc에는 다음이 있습니다.

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. 위의 내용은 Bash 내장 "export"를 오버로드하고 모든 것을 정상적으로 내보내고 ( "export"와 함께 내보내는 것을 볼 수 있습니다!), 다음 중 어느 것을 사용하든 launchctl을 통해 OS X 앱 환경에 맞게 올바르게 설정합니다.

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. 이렇게하면 매번 launchctl에 모든 변수를 보낼 필요가 없으며 .bash_profile / .bashrc를 원하는 방식으로 설정할 수 있습니다. 터미널 창을 열고 관심있는 환경 변수를 확인하고 launchctl getenv myVar.bash_profile / .bashrc에서 무언가를 변경하고 터미널 창을 닫았다가 다시 연 다음 launchctl을 사용하여 변수를 다시 확인하십시오.

  5. 다시 말하지만, 마운틴 이후 라이온 세계를위한 다른 솔루션과 마찬가지로, 새로운 환경 변수를 앱에 사용할 수 있으려면 변경 후 해당 변수를 시작하거나 다시 시작해야합니다.


1
유용한 답변-감사합니다. 방금 원래 솔루션에서 설정 한 환경 변수의 값이 그와 같은 부호를 갖는 경우를 처리하지 않았기 때문에 방금 업데이트했습니다 (예 : CXX_FLAGS = "-mmacosx-version-min = 10.9"
Steve Broberg

@SteveBroberg-단 하나의 문자 변경만으로 sed없이 Bash 정규 표현식을 수정합니다! (나를 잘못하지 마라, 나는 sed를 좋아하지만, 이것은 효과적이고 훨씬 짧다.)
courtlandj

1
나는 더 나은 방법이있을했다 생각,하지만 난 떠들썩한 전문가가 아니에요, 나는 등, ## 있었는지 %% 구글 없습니다
스티브 Broberg

10

원하는 것을 수행하는 매우 간단한 방법은 다음과 같습니다. 제 경우에는 Gradle이 작동하게되었습니다 (Android Studio 용).

  • 터미널을 엽니 다.
  • 다음 명령을 실행하십시오.

    sudo nano /etc/paths 또는 sudo vim /etc/paths

  • 프롬프트가 표시되면 비밀번호를 입력하십시오.

  • 파일 하단으로 이동하여 추가 할 경로를 입력하십시오.
  • 종료하려면 Control+ X를 누르십시오 .
  • 수정 된 버퍼를 저장하려면 'Y'를 입력하십시오.
  • 새 터미널 창을 열고 다음을 입력하십시오.

    echo $PATH

PATH 끝에 새 경로가 추가 된 것을 볼 수 있습니다.

이 게시물에서 다음 세부 정보를 얻었습니다.

Mac OS X 10.8 Mountain Lion 이상에서 PATH에 추가



7

각 파일의 용도를 간결하고 명확하게하기 위해

  • ~/.profile Terminal.app가 시작될 때마다 공급됩니다
  • ~/.bashrc "전통적으로"Bash 환경에 대한 모든 내보내기 명령문이 설정되는 위치
  • /etc/paths 모든 사용자에 대한 PATH 환경 변수를 빌드하기위한 기본 경로 목록이 포함 된 Mac OS의 기본 파일입니다.
  • /etc/paths.d/ 추가 검색 경로를 보유한 파일을 포함합니다

비 터미널 프로그램은 터미널이 수행하는 시스템 전체 PATH 및 MANPATH 변수를 상속하지 않습니다! 특정 사용자가 시작한 모든 프로세스의 환경을 설정하여 Mac OS X GUI 응용 프로그램에서 환경 변수를 사용할 수있게하려면 해당 변수를 ~/.MacOSX/environment.plist(Apple Technical Q & A QA1067)

당신을 동기화하려면 다음 명령 줄을 사용 environment.plist하여 /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

/etc/launchd.conf는 OS X v10.10 (Yosemite), OS X v10.11 (El Capitan), macOS v10.12 (Sierra) 또는 macOS v10.13 (High Sierra)에서 사용되지 않습니다.


로부터 launchctl매뉴얼 페이지

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Ask Ask ( 답변) 답변에 설명 된 방법은 (재부팅 후) 저에게 효과적입니다. Dock 또는 Spotlight에서 실행 된 응용 프로그램은에서 설정 한 환경 변수를 상속합니다 ~/Library/LaunchAgents/my.startup.plist. (내 경우에는 내가 설정하는 데 필요한 LANG로, en_US.UTF-8숭고한 텍스트 플러그인.)


재부팅시 마지막 세션의 응용 프로그램이 다시 시작되기 전에 my.startup.plist가로드되도록로드 순서가 있습니까?
kunjbhai


3

간단 해:

~ / .profile을 편집하고 다음과 같이 변수를 넣습니다.

$ vim ~ / .profile

파일에 넣어 :

MY_ENV_VAR = 값

  1. 저장 (: wq)

  2. 터미널을 다시 시작하십시오 (종료 한 후 다시여십시오).

  3. 모든 것이 괜찮은지 확인하십시오.

$ 에코 $ MY_ENV_VAR

$ 가치




3

글쎄, 나는에 대해 확실 해요 /etc/paths~/.MacOSX/environment.plist파일. 그것들은 새로운 것입니다.

그러나 Bash를 사용하면 .bashrc새로운 쉘을 호출 할 때마다 .bash_profile실행되며 시작시 한 번만 실행됩니다.

나는 이것이 Mac OS X에서 얼마나 자주 발생하는지 모른다. 나는 윈도우 시스템이 모든 것을 시작하면서 구별이 무너 졌다고 생각한다.

개인적으로 필자는 .bashrc필요한 모든 것을 갖춘 파일을 생성하여 혼란을 제거합니다 .

ln -s .bashrc .bash_profile

3

제안 된 접근 방식 외에도 OS X 10.5 (Leopard)에서는 설정 한 변수가에서 설정 한 값 launchd.conf과 병합됩니다 .profile. 이 설정에 ~/.MacOSX/environment.plist대해서도 유효 할 것으로 생각 되지만 확인되지 않았습니다.


3

Mac OS에서 PATH 환경 변수 설정

터미널 프로그램을 엽니 다 (기본적으로 응용 프로그램 / 유틸리티 폴더에 있음). 다음 명령을 실행하십시오

touch ~/.bash_profile; open ~/.bash_profile

기본 텍스트 편집기에서 파일이 열립니다.

예를 들어 Android SDK의 경우 :

Android SDK 플랫폼 도구 및 도구 디렉토리에 경로를 추가해야합니다. 이 예에서는 SDK가 설치된 디렉토리로 "/ Development / android-sdk-macosx"를 사용합니다. 다음 행을 추가하십시오.

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

파일을 저장하고 텍스트 편집기를 종료하십시오. .bash_profile을 실행하여 PATH를 업데이트하십시오.

source ~/.bash_profile

이제 터미널 프로그램을 열 때마다 PATH에 Android SDK가 포함됩니다.


3

이 작업은 정말 쉽고 빠릅니다. 먼저 터미널에서 ~ / .bash_profile 을 작성하십시오 .

touch .bash_profile

그때

open -a TextEdit.app .bash_profile

더하다

export TOMCAT_HOME=/Library/Tomcat/Home

documement를 저장하면 완료됩니다.


퍼펙 토. JAVA_HOME에 대한 단계를 수행했으며 방금 내보내기 JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Home 및 빠른 성공을 추가했습니다!
NarendraC

좋은 @ NarendraC!
CodeOverRide

2

아주 간단합니다. 파일 .profile(vi, nano , Sublime Text 또는 기타 텍스트 편집기) 파일을 편집하십시오. ~/디렉토리 (사용자 디렉토리) 에서 찾을 수 있으며 다음과 같이 설정하십시오.

export MY_VAR=[your value here]

Java 홈의 예 :

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

저장하고 터미널로 돌아갑니다.

다음과 같이 다시로드 할 수 있습니다.

source .profile

또는 터미널 창을 닫고 엽니 다.


2

여기에는 두 가지 유형의 껍질이 있습니다.

  • 비 로그인 : 새 Bash 사본을 시작할 때마다 .bashrc가 다시로드됩니다.
  • 로그인 : .profile은 로그인하거나 Bash에 명시 적으로로드하여 로그인 쉘로 사용하도록 명시한 경우에만로드됩니다.

그것은 배쉬로, 파일이 있음을 여기에 이해하는 것이 중요 .bashrc에만 대화 형 및 비 로그인 모두의 쉘에 의해 읽기, 당신은 그 사람들이 종종로드 찾을 .bashrc에서 .bash_profile이러한 한계를 극복하기.

기본 지식을 이해 했으므로 설정 방법에 대해 조언 해 드리겠습니다.

  • .profile : 존재하지 않는 것으로 작성하십시오. 거기에 PATH 설정을하십시오.
  • .bashrc : 존재하지 않는 경우 만듭니다. 모든 별명과 사용자 정의 메소드를 거기에 넣으십시오.
  • .bash_profile : 존재하지 않는 경우 작성하십시오. 거기에 다음을 넣으십시오.

.bash_file :

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

로그인 쉘

/etc/profile

쉘은 먼저 file 명령을 실행합니다 /etc/profile. 루트 권한으로 작업하는 사용자는이 파일을 설정하여 Bash를 실행하는 사용자의 시스템 전체 기본 특성을 설정할 수 있습니다.

.bash_profile
.bash_login
.profile

의 쉘 외모 다음으로 ~/.bash_profile, ~/.bash_login그리고 ~/.profile발견 한이 파일의 첫 번째의 명령을 실행, 순서대로, (~ / 홈 디렉토리에 대한 단기 손으로). 이 파일 중 하나에 명령을 넣어에서 설정 한 기본값을 무시할 수 있습니다 /etc/profile. 가상 터미널에서 실행되는 쉘은이 파일에서 명령을 실행하지 않습니다.

.bash_logout

로그 아웃하면 bash는 ~/.bash_logout파일 에서 명령을 실행합니다 . 이 파일에는 임시 파일을 제거하는 명령과 같이 세션 후에 정리하는 명령이 포함되는 경우가 많습니다.

대화식 비 로그인 쉘

/etc/bashrc

bash가 직접 호출하지는 않지만 많은 ~/.bashrc 파일 호출 /etc/bashrc합니다. 이 설정을 통해 루트 권한을 가진 사용자는 비 로그인 bash 쉘에 대한 시스템 전체 기본 특성을 설정할 수 있습니다.

.bashrc

대화식 비 로그인 셸은 ~/.bashrc 파일 . 일반적으로와 같은 로그인 셸의 시작 파일 .bash_profile은이 파일을 실행하므로 login 및 nonlogin 셸은 모두에서 명령을 실행합니다 .bashrc.

in 명령은 .bashrc여러 번 실행될 수 있으며 서브 쉘은 내 보낸 변수를 상속하므로 기존 변수에 추가하는 명령을 .bash_profile파일 에 넣는 것이 좋습니다 .


2

iOS의 모든 마술은 source환경 변수를 내보내는 파일과 함께 사용해야합니다.

예를 들면 다음과 같습니다.

다음과 같은 파일을 만들 수 있습니다.

export bim=fooo
export bom=bar

이 파일을로 저장 bimbom.env하고source ./bimbom.ev . Voilá, 환경 변수가 있습니다.

확인하십시오 :

echo $bim

1

Bash의 경우 환경 변수를 파일 /etc/profile에 추가하여 모든 사용자가 사용할 수 있도록하십시오. 재부팅 할 필요없이 새 터미널 세션을 시작하십시오.

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