การตั้งค่าตัวแปรสภาพแวดล้อมบน OS X


849

วิธีที่เหมาะสมในการแก้ไขตัวแปรสภาพแวดล้อมเช่น PATH ใน OS X คืออะไร

ฉันดู Google นิดหน่อยและพบไฟล์ที่แตกต่างกันสามไฟล์เพื่อแก้ไข:

  • / etc / เส้นทาง
  • ~ / .profile
  • ~ / .tcshrc

ฉันยังไม่มีไฟล์เหล่านี้และฉันค่อนข้างมั่นใจว่า. tcshrcผิดเนื่องจาก OS X ใช้ bash ทันที ตัวแปรเหล่านี้อยู่ที่ใดโดยเฉพาะ PATH ที่กำหนด?

ฉันใช้OS X v10.5 (Leopard)


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/เพื่อเปิดแอปพลิเคชัน GUI ด้วยสภาพแวดล้อมระบบชุดใหม่
ฮง

ดูเพิ่มเติมที่: stackoverflow.com/questions/25385934/ …
ThomasR

คำตอบ:


652

บรูโน่ถูกต้องในการติดตาม ฉันได้ทำวิจัยอย่างกว้างขวางและถ้าคุณต้องการที่จะตัวแปรชุดที่มีอยู่ในโปรแกรม GUI /etc/launchd.confทุกตัวเลือกเดียวของคุณคือ

โปรดทราบว่าenvironment.plist ไม่สามารถใช้งานได้กับแอปพลิเคชันที่เปิดตัวผ่าน Spotlight นี้เป็นเอกสารโดยสตีฟเซกซ์ตันที่นี่

  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 และแอปพลิเคชั่น GUI อื่น ๆ ที่คุณเปิดตัวผ่าน Spotlight


3
ฉันกำลังบอกว่าคำตอบที่ยอมรับ (environment.plist) ไม่ประสบความสำเร็จสำหรับฉัน ฉันใช้วิธีการ launchd.conf สำเร็จแล้วที่ 10.5 และ 10.6 ในสี่เครื่อง
Matthew McCullough

54
มีวิธีการทำเช่นนี้ใด ๆโดยไม่ต้องทำรีบูตระบบ ?
sorin

40
ข้อ จำกัด ดังกล่าวข้างต้นใช้กับ MacOS X 10.5 อย่างไรก็ตาม MacOS X 10.6 ไม่มีข้อ จำกัด นี้อีกต่อไปและการตั้งค่าภายใน environment.plist ใช้ได้ดีแม้สำหรับแอปที่เปิดตัวผ่านสปอตไลท์ ดังนั้นคำตอบที่เลือกนั้นถูกต้องสำหรับ Snow Leopard ;-)
Louis Jacomet

5
การตั้งค่าlaunchd.confเป็นวิธีหนึ่ง แต่ต้องการการรีบูต (เพื่อรีสตาร์ท launchd) หากคุณต้องการหลีกเลี่ยงการรีบูตให้ดูคำตอบของฉันstackoverflow.com/questions/135688/…
Matt Curtis

23
มีปัญหาหลายอย่างกับวิธีการเปิดตัวที่นำเสนอ ส่วนใหญ่มีความเฉพาะเจาะจงกับตัวแปรสภาพแวดล้อม PATH แต่ผู้ถามไม่ได้กล่าวถึงเส้นทางเฉพาะ 1) รายการใน launchd.conf ไม่ได้ถูกนำไปใช้ในเชลล์แบบโต้ตอบเช่น ssh เข้าสู่ระบบ 2) การมีบรรทัด "setenv PATH / testdir" ต่อท้าย PATH ใน Terminal.app แต่จะระเบิดรายการ PATH อื่น ๆ ทั้งหมดในสภาพแวดล้อมของ OS X Applications 3) การทำ "setenv PATH $ {PATH}: / testdir" ใน /etc/launchd.conf ไม่ขยาย $ PATH 4 ที่มีอยู่เดิมอย่างถูกต้อง) launchd.conf ใช้กับผู้ใช้ทุกคนแทนที่จะเป็นเพียงหนึ่งเดียว ไม่ใช่ว่าฉันมี soln ที่ดีกว่า
NoahR

257

วิธีการตั้งค่าสภาพแวดล้อมสำหรับกระบวนการใหม่ที่เริ่มต้นโดย Spotlight (โดยไม่จำเป็นต้องรีบูต)

คุณสามารถตั้งค่าสภาพแวดล้อมที่ใช้โดย launchd (และโดยขยายสิ่งที่เริ่มต้นจากสปอตไล) launchctl setenvด้วย ตัวอย่างเช่นการตั้งค่าเส้นทาง:

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

หรือถ้าคุณต้องการตั้งค่าเส้นทางของคุณใน.bashrcหรือคล้ายกันแล้วให้มันสะท้อนใน launchd:

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:$PATHสำหรับ bash หรือ 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ไม่ได้ทำ
Matt Curtis

2
การตั้งค่าสภาพแวดล้อมด้วยวิธีนี้ใช้งานได้สำหรับฉันเท่านั้นจนกว่าฉันจะรีบูตเครื่อง ตัวแปรสภาพแวดล้อมไม่ได้อยู่หลังจากรีบูตเครื่อง mac คำตอบของแมทธิวทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Shamal Karunarathne

8
@Shamal: ฉัน +1 ความคิดเห็นของคุณ แต่โปรดจำไว้ว่าคำตอบของ Matthew จำเป็นต้องรีบูตในขณะที่ฉันชี้ให้เห็นวิธีที่ถูกต้องในการเปลี่ยนแปลงโดยไม่ต้องรีบูต หากคุณต้องการทั้งสองฉันขอแนะนำให้คุณตั้งค่าเส้นทางของคุณใน launchd.conf (เพื่อให้พวกเขายังคงมีอยู่ในการรีบูต) แล้วใช้สคริปต์กับสิ่งนี้ "source /etc/launchctl.conf"; launchctl setenv PATH $ PATH "ดังนั้น คุณสามารถ "รีเฟรช" เมื่อคุณไม่ต้องการรีบูต
Matt Curtis

5
@MattCurtis คุณช่วยกรุณาแก้ไขคำตอบของคุณโดยตรงเพื่อให้ชัดเจนว่าในขณะที่ไม่จำเป็นต้องรีบูตเครื่องการเปลี่ยนแปลงจะหายไปหลังจากการรีบูตจริงหรือไม่? นอกจากนี้วิธีที่ถูกต้องเพื่อใช้การเปลี่ยนแปลงในetc/launchd.confก่อนที่จะรีบูตจะใช้วิธีการใน @ คำตอบของ egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctlMatthewMcCullough:
mklement0

106

สูงสุดและรวมถึงOS X v10.7 (Lion)คุณสามารถตั้งค่าได้ใน:

~/.MacOSX/environment.plist

ดู:

สำหรับ PATH ใน Terminal คุณควรจะสามารถตั้งค่าใน.bash_profileหรือ.profile(คุณอาจต้องสร้างมันขึ้นมา)

สำหรับOS X v10.8 (Mountain Lion) และเกินกว่า ที่คุณจำเป็นต้องใช้launchdlaunchctlและ


4
นี่เป็นเพียงถ้าคุณคาดหวังว่าพวกเขาจะใช้แอพแบบกราฟิก เนื่องจากโดยทั่วไปแล้วสิ่งเหล่านี้จะไม่ใช้ตัวแปรสภาพแวดล้อมจึงไม่เหมาะที่จะตั้ง
Chris Hanson

18
มีตัวอย่างที่ดีของแอพกราฟิกที่ใช้ตัวแปรสภาพแวดล้อม ยกตัวอย่างเช่น IntelliJ ชอบที่จะเห็น M2_HOME เพื่อให้รู้ว่า Maven อาศัยอยู่ที่ไหน หากต้องการให้มันเห็นตัวแปรคุณจะต้องตั้งค่าเป็น /etc/launchd.conf แทน environment.plist
Matthew McCullough

3
สำหรับการอ้างอิง: การใช้preferences.plistน้อยกว่าในอุดมคติกับ OS X 10.5 เนื่องจากในขณะpreferences.plistนั้นไม่ได้อ่านสำหรับแอปพลิเคชันที่เปิดตัวผ่านสปอตไลท์โปรดดูคำตอบของ Louis ถึง Matthew และคำตอบจากemail.esm.psu.edu /002113.html สำหรับ OS X 10.6 environment.plistทำงานได้อย่างที่ควรจะเป็น
Janus

16
สิ่งนี้ไม่สามารถใช้กับ OSX 10.8 apple.stackexchange.com/questions/57385//
thatsmydoing

1
@tim_yates คุณช่วยแก้ไขบรรทัดแรกของคำตอบของคุณเพื่ออ่าน "ถึงและรวมถึง Lion (10. * 7 *)" ได้ไหมเพราะนั่นคือสิ่งที่ถูกต้อง? ฉันพยายามทำให้การแก้ไขนั้นเป็นแบบดั้งเดิมคลุมเครือ "ถึง 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

(Re) เปิดแอปพลิเคชั่น 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 ซิงค์

ฉันหวังว่านี่จะเป็นทางออกที่ดีที่สุดอย่างน้อยสำหรับ 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 และเส้นทางนี้ไม่ได้อยู่ใน PATH สำหรับแอพ GUI ดังนั้น Git hooks ใช้ Node จึงไม่สามารถใช้งานได้ในแอพ GUI Git เช่น SourceTree เลยใน El Capitan นี่มันแย่มาก
mgol

1
ปัญหาเกี่ยวกับตัวแปร PATH เท่านั้น ฉันหวังว่าเราจะสามารถหาวิธีแก้ปัญหาได้ในไม่ช้า
Ersin Er

54
  1. ทำ:

    vim ~/.bash_profile

    ไฟล์อาจไม่มีอยู่ (ถ้าไม่ใช่คุณสามารถสร้างได้)

  2. พิมพ์สิ่งนี้และบันทึกไฟล์:

    export PATH=$PATH:YOUR_PATH_HERE
  3. วิ่ง

    source ~/.bash_profile

+1 exportคือสิ่งที่ฉันอยากจะแนะนำเนื่องจาก BASH ไม่รองรับ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 ตรวจสอบให้แน่ใจว่า launchd ได้รับการตั้งค่าด้วยการตั้งค่าคีย์ / ค่าทั้งหมดที่คุณต้องการ

เพื่อแก้ปัญหาทั้งสองพร้อมกันฉันใช้รายการเข้าสู่ระบบ (ตั้งค่าผ่านเครื่องมือการตั้งค่าระบบ) ในบัญชีผู้ใช้ของฉัน รายการเข้าสู่ระบบเป็นสคริปต์ทุบตีที่เรียกใช้ฟังก์ชัน lisp ของ Emacs ถึงแม้ว่าหนึ่งในนั้นสามารถใช้เครื่องมือการเขียนสคริปต์ที่ชื่นชอบเพื่อทำสิ่งเดียวกัน วิธีการนี้มีประโยชน์เพิ่มเติมที่สามารถใช้งานได้ตลอดเวลาและไม่จำเป็นต้องรีบู๊ตเช่นสามารถแก้ไข~/.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"

ฟังก์ชั่น emacs lisp: ~/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
ปิดโดย 1

2
สิ่งนี้ได้ผลดีที่สุดจากวิธีแก้ปัญหาทั้งหมดที่ฉันเคยเห็นสำหรับ 10.9 ข้อบกพร่องเพียงอย่างเดียวคือเนื่องจากรายการเข้าสู่ระบบทำงานตามลำดับที่กำหนดไว้หากมีการเปิดตัว Emacs (ตัวอย่าง) ที่การเข้าสู่ระบบ (เช่นเปิดเมื่อออกจากระบบตัวอย่าง) จึงไม่จำเป็นต้องมีตัวแปรสภาพแวดล้อมเว้นแต่ว่าคุณจะรีสตาร์ท เพราะมันเปิดตัวก่อนที่สคริปต์ของคุณจะเป็น
telotortium

22

อีกวิธีหนึ่งฟรี opensource, Mac OS X v10.8 (Mountain Lion) การกำหนดค่าตามความชอบของบานหน้าต่าง / environment.plist คือEnvPane EnvPane

EnvPane ของรหัสที่มาที่มีอยู่บนGitHub EnvPane ดูเหมือนว่ามันมีคุณสมบัติเทียบเท่ากับRCEnvironmentอย่างไรก็ตามดูเหมือนว่ามันสามารถปรับปรุงตัวแปรที่เก็บไว้ได้ทันทีเช่นโดยไม่จำเป็นต้องรีสตาร์ทหรือเข้าสู่ระบบซึ่งยินดีต้อนรับ

ตามที่ระบุโดยนักพัฒนา:

EnvPane เป็นบานหน้าต่างการตั้งค่าสำหรับ Mac OS X 10.8 (Mountain Lion) ที่ให้คุณตั้งค่าตัวแปรสภาพแวดล้อมสำหรับโปรแกรมทั้งหมดในทั้งกราฟิกและเทอร์มินัลเซสชัน ไม่เพียง แต่จะคืนค่าการสนับสนุนสำหรับ ~ / .MacOSX / environment.plist ใน Mountain Lion เท่านั้น แต่ยังเผยแพร่การเปลี่ยนแปลงของคุณต่อสภาพแวดล้อมในทันทีโดยไม่จำเป็นต้องออกจากระบบและกลับมาใหม่ <SNIP> EnvPane ประกอบด้วย (และติดตั้งอัตโนมัติ) a เอเจนต์ launchd ที่รัน 1) ก่อนหน้าหลังจากล็อกอินและ 2) เมื่อใดก็ตามที่การเปลี่ยนแปลง ~ / .MacOSX / environment.plist เอเจนต์อ่าน ~ / .MacOSX / environment.plist และส่งออกตัวแปรสภาพแวดล้อมจากไฟล์นั้นไปยังอินสแตนซ์ launchd ของผู้ใช้ปัจจุบันผ่าน API เดียวกันกับที่ใช้โดย launchctl setenv และ launchctl unsetenv

ข้อจำกัดความรับผิดชอบ: ฉันไม่มีส่วนเกี่ยวข้องกับผู้พัฒนาหรือโครงการของเขา / เธอ

ป.ล. ฉันชอบชื่อ (ฟังดูเหมือน 'จบความเจ็บปวด')


2
EnvPane ไม่สามารถตั้งค่า PATH ในขณะนี้ สำหรับรายละเอียดเพิ่มเติมดูรายงานข้อผิดพลาดของฉัน: github.com/hschmidt/EnvPane/issues/5
Uwe Günther

ฉัน♥️สิ่งนี้ .. ข้อเสียเปรียบเท่านั้น .. ซึ่งฉันคิดว่าโซลูชันใด ๆ จะตกเป็นเหยื่อของ .. คือ - ต้องรีสตาร์ทกระบวนการ - เพื่อรับมรดก "สภาพแวดล้อม" ใหม่ Wonk wonk
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+ (10.11+ โดยเฉพาะเนื่องจากโหมด rootless ซึ่ง/usr/binไม่สามารถเขียนได้อีกต่อไป)

ฉันอ่านในหลาย ๆ ที่ที่ใช้ launchctl setenv PATH <new path>เพื่อตั้งค่าPATHตัวแปรไม่ทำงานเนื่องจากข้อผิดพลาดใน OS X (ซึ่งดูเหมือนจริงจากประสบการณ์ส่วนตัว) ฉันพบว่ามีวิธีอื่นที่PATHสามารถตั้งค่าสำหรับแอปพลิเคชันที่ไม่ได้เปิดตัวจากเปลือก :

sudo launchctl config user path <new path>

ตัวเลือกนี้ได้รับการบันทึกไว้ในหน้า man launchctl:

ระบบปรับแต่ง ค่าพารามิเตอร์ผู้ใช้

ตั้งค่าข้อมูลการกำหนดค่าถาวรสำหรับโดเมน launchd (8) เฉพาะโดเมนระบบและโดเมนผู้ใช้เท่านั้นที่สามารถกำหนดค่าได้ ตำแหน่งของหน่วยเก็บถาวรคือรายละเอียดการนำไปใช้และการเปลี่ยนแปลงหน่วยเก็บนั้นควรทำผ่านคำสั่งย่อยนี้เท่านั้น จำเป็นต้องรีบูตเพื่อให้การเปลี่ยนแปลงที่ทำผ่านคำสั่งย่อยนี้มีผล

[ ... ]

เส้นทาง

ตั้งค่าตัวแปรสภาพแวดล้อม PATH สำหรับบริการทั้งหมดภายในโดเมนเป้าหมายเป็นค่าสตริง ค่าสตริงควรเป็นไปตามรูปแบบที่ระบุไว้สำหรับตัวแปรสภาพแวดล้อม PATH ใน environ (7) โปรดทราบว่าหากบริการระบุ PATH ของตนเองตัวแปรสภาพแวดล้อมเฉพาะบริการจะมีความสำคัญกว่า

หมายเหตุ: สิ่งอำนวยความสะดวกนี้ไม่สามารถใช้เพื่อตั้งค่าตัวแปรสภาพแวดล้อมทั่วไปสำหรับบริการทั้งหมดภายในโดเมน มีการกำหนดขอบเขตของตัวแปรสภาพแวดล้อม PATH โดยเจตนาและไม่มีสิ่งอื่นใดสำหรับเหตุผลด้านความปลอดภัย

ฉันยืนยันสิ่งนี้เพื่อทำงานกับแอปพลิเคชัน GUI ที่เริ่มต้นจาก Finder (ซึ่งใช้getenvเพื่อรับ PATH) โปรดทราบว่าคุณต้องทำเช่นนี้เพียงครั้งเดียวและการเปลี่ยนแปลงจะยังคงอยู่ตลอดการบู๊ต


มันเหมาะกับฉันเช่นกัน sudo launchctl procinfo <gui-pid>แสดงPATHสภาพแวดล้อมที่ตั้งใหม่ แต่sudo launchctl config user path <new path>จริง ๆ แล้วกำหนดไว้สำหรับผู้ใช้ทั้งหมด ... (ยืนยันโดยการเพิ่มผู้ใช้ใหม่และใช้คอนโซลหลามของ Sublime Text)
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แก้ไขไม่ได้ทำให้ผลกระทบใด ๆ !

ฟอรัมนักพัฒนาของ Apple บอกว่า:

"เปลี่ยน Info.plist ของ. app เองเพื่อให้มีพจนานุกรม" 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>

(ดู: LaunchServicesKeys Documentation ที่ Apple )

ป้อนคำอธิบายภาพที่นี่

ตอนนี้แอปพลิเคชัน (ในกรณีของฉัน Sourcetree) ใช้เส้นทางที่กำหนดและทำงานกับ Git 1.9.3 :-)

PS: แน่นอนคุณต้องปรับรายการเส้นทางให้ตรงกับเส้นทางที่คุณต้องการ


3
วิธีการแก้ปัญหานี้ตรงกับมาตรฐานของการล่วงล้ำน้อยที่สุดในระบบ ขอบคุณ
John Vance

@John Vance +1 เห็นด้วยทั้งหมดการเปลี่ยนแปลงทั่วทั้งระบบมีความเสี่ยงเสมอโดย Jason T. Miller อธิบายอย่างชัดเจนในคำตอบของเขา
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 สำหรับกระบวนการทั้งหมดมีแนวโน้มที่จะทำลายสิ่งต่าง ๆ ใน OS X มากกว่าใน Windows เหตุผลที่มีแอปพลิเคชั่น OS X และซอฟต์แวร์อื่น ๆ จำนวนมาก (รวมถึงส่วนประกอบของระบบปฏิบัติการเอง) โดยอาศัยเครื่องมือบรรทัดคำสั่ง UNIX ภายใต้ประทุนและถือว่าพฤติกรรมของเวอร์ชันของเครื่องมือเหล่านี้ที่มาพร้อมกับระบบและ ไม่จำเป็นต้องใช้พา ธ สัมบูรณ์เมื่อทำเช่นนั้น (ความคิดเห็นที่คล้ายกันจะใช้กับไลบรารีที่โหลดแบบไดนามิกและตัวแปรสภาพแวดล้อม DYLD_ *) ลองพิจารณาตัวอย่างเช่นคำตอบที่ได้รับคะแนนสูงสุดสำหรับคำถาม Stack Overflow เกี่ยวกับการแทนที่ล่ามเวอร์ชัน OS X เช่น Python และ Ruby โดยทั่วไปจะพูดว่า "อย่าทำเช่นนี้"

OS X นั้นแตกต่างจากระบบปฏิบัติการ UNIX อื่น ๆ (เช่น Linux, FreeBSD และ Solaris) ในแง่นี้ เหตุผลส่วนใหญ่แอปเปิ้ลไม่ได้ให้วิธีง่ายๆในการทำเช่นนี้เป็นเพราะมันแบ่งสิ่ง ในระดับที่ Windows ไม่ได้มีแนวโน้มที่จะเกิดปัญหาเหล่านี้เกิดขึ้นเนื่องจากสองสิ่ง: (1) ซอฟต์แวร์ Windows ไม่ได้พึ่งพาเครื่องมือบรรทัดคำสั่งเท่าที่ซอฟต์แวร์ UNIX ทำและ (2) Microsoft มี ประวัติที่กว้างขวางของทั้ง "DLL hell" และปัญหาด้านความปลอดภัยที่เกิดจากการเปลี่ยนแปลงที่ส่งผลต่อกระบวนการทั้งหมดที่พวกเขาได้เปลี่ยนพฤติกรรมของการโหลดแบบไดนามิกใน Windows เวอร์ชั่นใหม่เพื่อ จำกัด ผลกระทบของตัวเลือกการกำหนดค่า "ทั่วโลก" เช่น PATH

"อ่อนแอ" หรือไม่คุณจะมีระบบที่มีเสถียรภาพมากขึ้นหากคุณ จำกัด การเปลี่ยนแปลงดังกล่าวในขอบเขตที่เล็กลง


1
การบอกให้คนอื่นไม่ทำในสิ่งที่พวกเขาถามว่าจะทำอย่างไรไม่ใช่คำตอบของคำถามที่พวกเขาถาม การป้องกันไม่ให้ผู้คนทำเช่นนี้เป็นการทำลายสิ่งต่าง ๆ วิธีการทำงานของ Apple
frabjous

การตั้งค่า PATH ใน /Applications/App.app/Contents/Info.plist ด้วย LSEnvironment key developer.apple.com/library/archive/documentation/General/ ...... อาจเป็นโซลูชันที่แนะนำในปัจจุบัน
Dave X

15

บางครั้งคำตอบก่อนหน้าทั้งหมดก็ไม่ทำงาน หากคุณต้องการเข้าถึงตัวแปรระบบ (เช่นM2_HOME) ใน Eclipse หรือใน IntelliJ IDEA สิ่งเดียวที่ใช้ได้สำหรับฉันในกรณีนี้คือ:

ขั้นแรก (ขั้นตอนที่ 1) แก้ไข/etc/launchd.confเพื่อให้มีบรรทัดเช่นนี้: "setenv VAR value" จากนั้นรีบูต (ขั้นตอนที่ 2)

เพียงแค่การแก้ไข. bash_profile จะไม่ทำงานเพราะใน OS X แอปพลิเคชันจะไม่เริ่มทำงานเหมือนใน Unix'es อื่น ๆ พวกเขาไม่สืบทอดตัวแปรเชลล์ของพาเรนต์ การดัดแปลงอื่น ๆ ทั้งหมดจะไม่ทำงานด้วยเหตุผลที่ฉันไม่ทราบ บางทีคนอื่นสามารถชี้แจงเกี่ยวกับเรื่องนี้


5
แอปพลิเคชั่นเริ่มต้นจาก Spotlight หรือวิธีการอื่น ๆ ทั้งหมดมี /etc/launchd.conf อ่านโดยกระบวนการหลักของพวกเขาดังนั้นจึงเป็นตัวเลือกที่น่าสนใจสำหรับที่ตั้งตัวแปรสภาพแวดล้อมที่สามารถมองเห็นได้ในแอพและเชลล์ทั้งหมด
Matthew McCullough

1
ดูคำตอบของฉันสำหรับโซลูชันอื่นซึ่งหลีกเลี่ยงการรีบูต - stackoverflow.com/questions/135688/…
แมตต์เคอร์ติส

เครื่อง MaxOS 10.6 ของฉันไม่มีไฟล์ /etc/launchd.conf อยู่ นี่อาจเป็นสิ่งใหม่หรือสิ่งที่ล้าสมัยในเวอร์ชันนี้หรือไม่? หรือว่าเครื่องนี้เกิดความสับสน
peterk

13

หลังจากไล่ตามบานหน้าต่างการตั้งค่าตัวแปรสภาพแวดล้อมและพบว่าการเชื่อมโยงใช้งานไม่ได้และการค้นหาในเว็บไซต์ของ Apple ดูเหมือนจะบ่งบอกว่าพวกเขาลืมไปแล้ว ... ฉันเริ่มกลับไปสู่เส้นทางของกระบวนการ launchd ที่เข้าใจยาก

ในระบบของฉัน (Mac OS X 10.6.8) ปรากฏว่าตัวแปรที่กำหนดไว้ใน environment.plist คือถูกส่งออกไปยังแอพที่เปิดใช้อย่างน่าเชื่อถือจาก Spotlight (ผ่าน launchd) อย่างน่าเชื่อถือ ปัญหาของฉันคือว่า vars เหล่านั้นไม่ได้ถูกส่งออกไปยังเซสชัน bash ใหม่ใน Terminal คือฉันมีปัญหาตรงข้ามตามที่แสดงไว้ที่นี่

หมายเหตุ: environment.plist ดูเหมือนว่า JSON ไม่ใช่ XML ตามที่อธิบายไว้ก่อนหน้านี้

ฉันสามารถรับแอพ Spotlight เพื่อดู vars โดยการแก้ไข ~ / MacOSX / environment.plist และ ฉันสามารถบังคับ vars เดียวกันให้เป็นเซสชัน Terminal ใหม่โดยเพิ่มไฟล์. profile ของฉันต่อไปนี้:

eval $(launchctl export)

2
ไม่เข้าใจยาก: RCenvironment
Gilimanjaro

เคล็ดลับที่ดีเกี่ยวกับการส่งออก Launchctl แต่ฉันจะไม่ใส่สิ่งนั้นตามที่เป็นอยู่ในโปรไฟล์. มันจะเขียนทับ $ PATH ของคุณด้วยอันที่ไม่รวม / usr / local / bin แต่คุณสามารถใช้ regex เพื่อเลือก vars ที่คุณสนใจ: `` eval $ (การส่งออก Launchctl | grep '^ my. * =')
mivk

3
สำหรับเครื่อง Mountain Lion ใหม่ของฉัน (10.8.2) สภาพแวดล้อมนั้นไม่มีค่าเลย ดูคำตอบของ Matthew ในการติดตามที่ถูกต้อง ทุกอย่างเกี่ยวกับการเปิดตัวและแอปบรรทัดคำสั่ง launchctl พร้อมกับ /etc/launchd.conf คุณสามารถอ่านตัวเองด้วยman launchd, man launchctlและman launchd.confในหน้าต่าง terminal ดีใจที่แอปเปิ้ลอัปเดต man page ให้ทันสมัยอยู่เสมอแม้ว่า Mac Developer Library จะมีความล่าช้าเล็กน้อย
รัสเซล B

10

ใด ๆ ของไฟล์ทุบตีเริ่มต้น - ~/.bashrc, ,~/.bash_profile ~/.profileนอกจากนี้ยังมีไฟล์แปลก ๆ บางประเภทที่มีชื่อ~/.MacOSX/environment.plistสำหรับตัวแปรสภาพแวดล้อมในแอปพลิเคชัน GUI


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 builtin "ส่งออก" และจะส่งออกทุกอย่างตามปกติ (คุณจะสังเกตเห็นว่าฉันส่งออก "ส่งออก" ไปด้วย!) จากนั้นตั้งค่าอย่างถูกต้องสำหรับสภาพแวดล้อมของแอป OS X ผ่าน launchctl

    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 และvoiláมันเปลี่ยนไป

  5. เช่นเดียวกับวิธีแก้ปัญหาอื่น ๆ สำหรับโลกหลังโพสต์เมาน์เทนไลออนสำหรับตัวแปรสภาพแวดล้อมใหม่ใด ๆ ที่จะมีให้สำหรับแอพคุณจะต้องเปิดตัวหรือเปิดใช้อีกครั้งหลังจากการเปลี่ยนแปลง


1
คำตอบที่เป็นประโยชน์ - ขอบคุณ ฉันเพิ่งอัปเดตเพราะโซลูชันดั้งเดิมของคุณไม่รองรับกรณีที่ค่าของตัวแปรสภาพแวดล้อมที่คุณตั้งค่ามีค่าเท่ากับเครื่องหมายในนั้น (เช่น CXX_FLAGS = "- mmacosx-version-min = 10.9"
Steve Broberg

@SteveBroberg - เพียงแค่การเปลี่ยนแปลงตัวละครตัวหนึ่งแก้ไขค่า Bash regexp โดยไม่จำเป็นต้องใช้! (อย่าเข้าใจฉันผิดฉันชอบความสงบ แต่สิ่งนี้ได้ผลและสั้นกว่ามาก)
courtlandj

1
ฉันคิดว่าต้องเป็นวิธีที่ดีกว่า แต่ฉันไม่ใช่กูรูที่ทุบตีและฉันไม่สามารถ google ได้ว่าอะไร %%, ## เคยเป็นต้น
Steve Broberg

10

นี่เป็นวิธีง่ายๆในการทำสิ่งที่คุณต้องการ ในกรณีของฉันมันทำให้ Gradle ทำงาน (สำหรับ Android Studio)

  • เปิด Terminal ขึ้นมา
  • รันคำสั่งต่อไปนี้:

    sudo nano /etc/paths หรือ sudo vim /etc/paths

  • ป้อนรหัสผ่านของคุณเมื่อได้รับแจ้ง

  • ไปที่ด้านล่างของไฟล์และป้อนเส้นทางที่คุณต้องการเพิ่ม
  • กดControl+ Xเพื่อออก
  • ป้อน 'Y' เพื่อบันทึกบัฟเฟอร์ที่แก้ไข
  • เปิดหน้าต่างเทอร์มินัลใหม่จากนั้นพิมพ์:

    echo $PATH

คุณควรเห็นเส้นทางใหม่ต่อท้ายเส้นทาง

ฉันได้รับรายละเอียดเหล่านี้จากโพสต์นี้:

เพิ่มไปยัง PATH บน Mac OS X 10.8 Mountain Lion ขึ้นไป



7

เพื่อให้รัดกุมและชัดเจนเกี่ยวกับสิ่งที่แต่ละไฟล์มีไว้สำหรับ

  • ~/.profile มีที่มาทุกครั้งที่เปิด Terminal.app
  • ~/.bashrc คือที่ "ตามธรรมเนียม" คำสั่งการส่งออกทั้งหมดสำหรับสภาพแวดล้อม Bash ถูกตั้งค่า
  • /etc/paths เป็นไฟล์หลักใน Mac OS ที่มีรายการเส้นทางเริ่มต้นสำหรับการสร้างตัวแปรสภาพแวดล้อม PATH สำหรับผู้ใช้ทั้งหมด
  • /etc/paths.d/ มีไฟล์ที่เก็บพา ธ การค้นหาเพิ่มเติม

โปรแกรมที่ไม่ใช่เทอร์มินัลจะไม่สืบทอดตัวแปร PATH และ MANPATH ของทั้งระบบที่เทอร์มินัลของคุณทำ! ในการตั้งค่าสภาพแวดล้อมสำหรับกระบวนการทั้งหมดที่เปิดตัวโดยผู้ใช้ที่ระบุดังนั้นการทำให้ตัวแปรสภาพแวดล้อมพร้อมใช้งานสำหรับแอปพลิเคชัน Mac OS X GUI ตัวแปรเหล่านั้นจะต้องกำหนดไว้ใน~/.MacOSX/environment.plist(Q&A QA1067 ด้านเทคนิคของ Apple)

ใช้บรรทัดคำสั่งต่อไปนี้เพื่อซิงโครไนซ์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.

วิธีการอธิบายในนี้ถามที่แตกต่างกันคำตอบที่ทำงานสำหรับฉัน (หลังจากรีบูต): การใช้งานเปิดตัวจาก Dock ~/Library/LaunchAgents/my.startup.plistหรือจากตัวแปรสภาพแวดล้อมที่เป็นมรดกที่น่าสนใจที่ผมตั้งอยู่ใน (ในกรณีของฉันฉันต้องตั้งค่าLANGเป็นen_US.UTF-8สำหรับ Sublime Text plugin)


ในการรีบูตมีคำสั่งโหลดที่ทำให้แน่ใจว่า my.startup.plist จะถูกโหลดก่อนที่จะรีสตาร์ทแอปพลิเคชันจากเซสชันล่าสุดหรือไม่
kunjbhai


3

มันง่าย:

แก้ไข ~ / .profile และวางตัวแปรของคุณดังนี้

$ vim ~ / .profile

ในไฟล์ใส่:

MY_ENV_VAR = ค่า

  1. บันทึก (: wq)

  2. รีสตาร์ทเครื่อง (เลิกแล้วเปิดใหม่อีกครั้ง)

  3. ตรวจสอบให้แน่ใจว่าทุกอย่างเรียบร้อยดี:

$ echo $ MY_ENV_VAR

ค่า $



3

สำหรับการดัดแปลงผู้ใช้คนเดียวให้ใช้~/.profileสิ่งที่คุณระบุไว้ ลิงค์ต่อไปนี้จะอธิบายเมื่อ Bash อ่านไฟล์ต่าง ๆ

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

หากคุณต้องการตั้งค่าตัวแปรสภาพแวดล้อมสำหรับแอปพลิเคชั่น gui คุณต้องใช้ไฟล์ ~ / .MacOSX / environment.plist


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

ตั้งค่าตัวแปรสภาพแวดล้อม PATH ใน Mac OS

เปิดโปรแกรม Terminal (อยู่ในโฟลเดอร์ Applications / Utilities โดยค่าเริ่มต้น) เรียกใช้คำสั่งต่อไปนี้

touch ~/.bash_profile; open ~/.bash_profile

นี่จะเป็นการเปิดไฟล์ในโปรแกรมแก้ไขข้อความเริ่มต้นของคุณ

สำหรับ Android SDK เป็นตัวอย่าง:

คุณต้องเพิ่มเส้นทางไปยังไดเรกทอรีแพลตฟอร์มเครื่องมือและเครื่องมือ Android SDK ของคุณ ในตัวอย่างของฉันฉันจะใช้ "/ Development / android-sdk-macosx" เป็นไดเรกทอรีที่ติดตั้ง SDK เพิ่มบรรทัดต่อไปนี้:

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 และคุณทำเสร็จแล้ว


Perfecto ฉันทำตามขั้นตอนสำหรับ JAVA_HOME เพิ่งเพิ่มการส่งออก JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / เนื้อหา / หน้าแรกและความสำเร็จอย่างรวดเร็วจริง ๆ !
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

ที่นี่มีเปลือกหอยสองประเภท

  • ไม่ใช่การเข้าสู่ระบบ: .bashrc จะถูกโหลดใหม่ทุกครั้งที่คุณเริ่มสำเนา Bash ใหม่
  • เข้าสู่ระบบ:. profile จะโหลดเมื่อคุณเข้าสู่ระบบเท่านั้นหรือบอก Bash ให้โหลดอย่างชัดเจนและใช้เป็นเชลล์เข้าสู่ระบบ

สิ่งสำคัญคือต้องเข้าใจที่นี่ด้วย Bash ไฟล์.bashrcจะอ่านโดยเชลล์เท่านั้นทั้งแบบโต้ตอบและไม่ใช่การเข้าสู่ระบบและคุณจะพบว่าผู้คนมักโหลด.bashrcเข้า.bash_profileมาเพื่อเอาชนะข้อ จำกัด นี้

ตอนนี้คุณมีความเข้าใจพื้นฐานแล้วเรามาดูวิธีที่ฉันจะแนะนำคุณในการตั้งค่า

  • .profile: สร้างมันไม่ใช่ที่มีอยู่ ใส่การตั้งค่าเส้นทางของคุณในนั้น
  • .bashrc: สร้างหากไม่มีอยู่ ใส่ชื่อแทนและวิธีการที่กำหนดเองทั้งหมดของคุณในนั้น
  • .bash_profile: สร้างหากไม่มีอยู่ ใส่ต่อไปนี้ในที่นั่น

.bash_file:

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

2

ล็อกอินเชลล์

/etc/profile

เชลล์สั่งการคำสั่งในไฟล์/etc/profileก่อน ผู้ใช้งานที่มีสิทธิ์ใช้งานรูทสามารถตั้งค่าไฟล์นี้เพื่อสร้างคุณสมบัติเริ่มต้นของทั้งระบบสำหรับผู้ใช้ที่ใช้ Bash

.bash_profile
.bash_login
.profile

ถัดไปมีลักษณะเปลือก~/.bash_profile, ~/.bash_loginและ~/.profile(~ / มือสั้นสำหรับไดเรกทอรีบ้านของคุณ) เพื่อที่รันคำสั่งในครั้งแรกของไฟล์เหล่านี้จะพบ /etc/profileคุณสามารถใส่คำสั่งในหนึ่งในไฟล์เหล่านี้ไปแทนที่ค่าเริ่มต้นที่ตั้งไว้ใน เชลล์ที่รันบนเทอร์มินัลเสมือนไม่เรียกใช้คำสั่งในไฟล์เหล่านี้

.bash_logout

เมื่อคุณออกจากระบบ bash จะเรียกใช้คำสั่งใน~/.bash_logoutไฟล์ ไฟล์นี้มักจะเก็บคำสั่งที่ล้างข้อมูลหลังจากเซสชันเช่นคำสั่งที่ลบไฟล์ชั่วคราว

เชลล์ Nonlogin แบบโต้ตอบ

/etc/bashrc

แม้ว่าจะไม่ได้เรียกโดยทุบตีโดยตรงหลายไฟล์เรียก~/.bashrc /etc/bashrcการตั้งค่านี้ช่วยให้ผู้ใช้ที่ทำงานด้วยสิทธิ์พิเศษในการสร้างคุณสมบัติเริ่มต้นของทั้งระบบสำหรับเปลือกหอยที่ไม่ใช่โลจิสติก

.bashrc

เชลล์แบบ nonlogin แบบโต้ตอบรันคำสั่งใน~/.bashrcไฟล์ โดยปกติไฟล์เริ่มต้นสำหรับการเข้าสู่ระบบเปลือกเช่น.bash_profileวิ่งไฟล์นี้ดังนั้นทั้งการเข้าสู่ระบบและเปลือกหอย nonlogin .bashrcเรียกใช้คำสั่งใน

เนื่องจากคำสั่งใน.bashrcอาจถูกดำเนินการหลายครั้งและเนื่องจาก subshells สืบทอดตัวแปรที่ส่งออกเป็นความคิดที่ดีที่จะวางคำสั่งที่เพิ่มลงในตัวแปรที่มีอยู่ใน.bash_profileไฟล์


2

ความมหัศจรรย์ทั้งหมดบน iOS จะใช้งานsourceกับไฟล์ซึ่งคุณส่งออกตัวแปรสภาพแวดล้อมของคุณเท่านั้น

ตัวอย่างเช่น:

คุณสามารถสร้างไฟล์เช่นนี้:

export bim=fooo
export bom=bar

บันทึกแฟ้มนี้เป็นและทำbimbom.env source ./bimbom.evใช่, คุณได้รับตัวแปรสภาพแวดล้อมของคุณแล้ว

ตรวจสอบด้วย:

echo $bim

1

สำหรับ Bash ให้ลองเพิ่มตัวแปรสภาพแวดล้อมของคุณลงในไฟล์/etc/profileเพื่อให้ผู้ใช้ทุกคนสามารถใช้งานได้ ไม่จำเป็นต้องรีบูทเพียงแค่เริ่มต้นเซสชันเทอร์มินัลใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.