[macos] OS X에서 환경 변수 설정

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

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

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

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

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



답변

브루노가 제대로 작동하고 있습니다. 나는 광범위한 연구를 수행했으며 모든 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 응용 프로그램에서도 사용할 수 있습니다.


답변

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


답변

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

~/.MacOSX/environment.plist

보다:

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

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


답변

단일 소스의 명령 줄 및 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)에 대한 궁극적 인 해결책이 되길 바랍니다.


답변

  1. 하다:

    vim ~/.bash_profile

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

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

    export PATH=$PATH:YOUR_PATH_HERE
  3. 운영

    source ~/.bash_profile

답변

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 전용 시설)을 별도의 스크립트에 넣으려고했습니다. .


답변

또 다른 무료 오픈 소스 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’과 같은 소리).