ตัวแปรสภาพแวดล้อมใน Mac OS X


186

ปรับปรุง: การเชื่อมโยงด้านล่างไม่ได้มีคำตอบที่สมบูรณ์ ต้องตั้งค่าเส้นทางหรือตัวแปรในสองแห่ง (หนึ่งสำหรับ GUI และอีกหนึ่งสำหรับเชลล์) เป็นง่อย

ไม่ซ้ำ : การตั้งค่าตัวแปรสภาพแวดล้อมใน OS X?


มาจากพื้นหลัง Windows ที่ง่ายต่อการตั้งค่าและแก้ไขตัวแปรสภาพแวดล้อม (เพียงไปที่คุณสมบัติของระบบ> ขั้นสูง> ตัวแปรสภาพแวดล้อม) ดูเหมือนว่าจะไม่ตรงไปตรงมาบน Mac OS 10.5 การอ้างอิงส่วนใหญ่บอกว่าฉันควรอัปเดต / etc / profile หรือ ~ / .profile สิ่งเหล่านี้เทียบเท่ากับตัวแปรระบบและตัวแปรผู้ใช้หรือไม่ ตัวอย่างเช่นฉันควรตั้งค่าJAVA_HOMEตัวแปรของฉันที่ไหน


แก้ไข:

ฉันต้องการเข้าถึงตัวแปรจากเทอร์มินัลเช่นเดียวกับแอปอย่าง Eclipse นอกจากนี้ฉันหวังว่าฉันไม่ต้องรีสตาร์ท / ออกจากระบบเพื่อให้สิ่งนี้มีผล


และมีคำแนะนำบางอย่างในคำตอบของคำถามที่ลิงค์ไม่ซ้ำที่นี่ ...
dmckee --- อดีตผู้ดูแลลูกแมว

คำตอบ:


142

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

ตัวอย่างเช่นหากคุณต้องการสะท้อนพา ธ ปัจจุบันของคุณใน launchd หลังจากตั้งค่าใน.bashrcหรือที่ใดก็ตาม:

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

ตัวแปรสภาพแวดล้อมไม่ได้รับการอัพเดตโดยอัตโนมัติในแอพพลิเคชั่นที่รันอยู่ คุณจะต้องเปิดใช้งานแอปพลิเคชันใหม่เพื่อรับตัวแปรสภาพแวดล้อมที่อัปเดต (แม้ว่าคุณจะสามารถตั้งค่าตัวแปรในเชลล์ของคุณได้เช่นPATH=whatever:you:wantไม่จำเป็นต้องเปิดใช้งานเทอร์มินัลใหม่)


1
ดูเหมือนว่าจะเป็นคำตอบที่ดีที่สุดไม่จำเป็นต้องมีแอพของบุคคลที่สาม!
Abdullah Jibaly

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

@Andrew คุณหมายถึงอะไรในพื้นที่สำหรับผู้ใช้ ฉันคาดว่ากระบวนการทั้งหมดเริ่มต้นจาก launchd เพื่อรับผลกระทบ
Matt Curtis

@MattCurtis: ตัวแปรสภาพแวดล้อมที่กำหนดผ่านlaunchctl setenvดูเหมือนจะปรากฏต่อผู้ใช้ที่ทำการเปลี่ยนแปลงเท่านั้น หากฉันตั้งค่าตัวแปรเป็นผู้ใช้ทั่วไปจะไม่สามารถเห็นรูท (ผ่าน sudo) และในทางกลับกัน
แอนดรู

2
@ แอนดรูว์ตกลงรูทมี launchd ของตัวเอง - ps aux | grep launchdจะแสดงสิ่งนี้ ตรวจสอบman sudoด้วยว่าเอกสารใดsudo(โดยค่าเริ่มต้น) จะทำการรีเซ็ตสภาพแวดล้อมโดยจงใจหากคุณsudo -Eจะรักษาสภาพแวดล้อม (รวมถึงตัวแปรที่คุณตั้งไว้ด้วยlaunchctl setenv) คุณมีแอปพลิเคชันจริงสำหรับสิ่งนี้หรือไม่? ถ้าเป็นเช่นนั้นวิธีนี้ใช้ได้กับคุณหรือไม่?
Matt Curtis

299

มีหลายที่ที่คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมได้

  • ~/.profile: ใช้สิ่งนี้สำหรับตัวแปรที่คุณต้องการตั้งค่าในทุกโปรแกรมที่เรียกใช้จากเทอร์มินัล (โปรดทราบว่าเชลล์ทั้งหมดที่เปิดใน Terminal.app ต่างจากเชลล์ในลีนุกซ์ซึ่งแตกต่างจากบน Linux)
  • ~/.bashrc: สิ่งนี้ถูกเรียกใช้สำหรับเชลล์ที่ไม่ใช่ล็อกอินเชลล์ ใช้สิ่งนี้สำหรับนามแฝงและสิ่งอื่น ๆ ที่จำเป็นต้องกำหนดใหม่ใน subshells ไม่ใช่สำหรับตัวแปรสภาพแวดล้อมที่สืบทอด
  • /etc/profile: จะโหลดก่อน ~ / .profile แต่จะเทียบเท่ากัน ใช้มันเมื่อคุณต้องการให้ตัวแปรนำไปใช้กับโปรแกรมเทอร์มินัลที่เปิดตัวโดยผู้ใช้ทั้งหมดในเครื่อง (สมมติว่าพวกเขาใช้ bash)
  • ~/.MacOSX/environment.plist: นี่คืออ่านโดย loginwindow เมื่อเข้าสู่ระบบ มันใช้กับแอปพลิเคชันทั้งหมดรวมถึง GUI ยกเว้นว่าเปิดใช้โดย Spotlight ใน 10.5 (ไม่ใช่ 10.6) คุณต้องออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่อให้การเปลี่ยนแปลงมีผล ไฟล์นี้ไม่รองรับอีกต่อไปตั้งแต่ OS X 10.8
  • launchdอินสแตนซ์ของผู้ใช้ของคุณ: สิ่งนี้ใช้กับโปรแกรมทั้งหมดที่เปิดตัวโดยผู้ใช้ GUI และ CLI คุณสามารถใช้การเปลี่ยนแปลงได้ตลอดเวลาโดยใช้คำสั่งในsetenv ในทางทฤษฎีคุณควรจะสามารถใส่คำสั่งและจะอ่านโดยอัตโนมัติเมื่อผู้ใช้เข้าสู่ระบบ แต่ในทางปฏิบัติสนับสนุนไฟล์นี้ไม่เคยดำเนินการ แต่คุณสามารถใช้กลไกอื่นเพื่อรันสคริปต์เมื่อเข้าสู่ระบบและให้เรียกใช้สคริปต์เพื่อตั้งค่าสภาพแวดล้อมlaunchctlsetenv~/.launchd.conflaunchdlaunchctllaunchd
  • /etc/launchd.conf: นี่ถูกอ่านโดย launchd เมื่อระบบเริ่มทำงานและเมื่อผู้ใช้ล็อกอินซึ่งจะมีผลกับทุกกระบวนการในระบบเพราะ launchd เป็นกระบวนการรูท เพื่อใช้การเปลี่ยนแปลงไปยังรากทำงาน launchd sudo launchctlคุณสามารถท่อคำสั่งลง

สิ่งพื้นฐานที่ต้องเข้าใจคือ:

  • ตัวแปรสภาพแวดล้อมได้รับการถ่ายทอดโดยเด็ก ๆ ของกระบวนการในเวลาที่พวกเขาแยกกัน
  • กระบวนการรูทเป็นอินสแตนซ์ launchd และยังมีอินสแตนซ์ launchd แยกต่างหากต่อเซสชันผู้ใช้
  • launchd ช่วยให้คุณสามารถเปลี่ยนตัวแปรสภาพแวดล้อมในปัจจุบันใช้launchctl; จากนั้นตัวแปรที่ได้รับการปรับปรุงจะถูกสืบทอดโดยกระบวนการใหม่ทั้งหมดที่จะดำเนินการจากนั้นเป็นต้นไป

ตัวอย่างการตั้งค่าตัวแปรสภาพแวดล้อมด้วย launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

ตอนนี้เปิดแอพ GUI ของคุณที่ใช้ตัวแปรและ voila!

เพื่อหลีกเลี่ยงความจริงที่~/.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.plistLion ของฉันมันถูกอ่านและใช้งาน เพิ่งทดสอบ ฉันชอบมันมากกว่า. launchd.conf เพราะฉันใช้บานหน้าต่างการตั้งค่าRCenvironmentเพื่อรักษามันไว้
Gilimanjaro

5
ไม่สามารถ~/.launchd.confทำงานได้ใน 10.6.8 - ดูเหมือนว่าจะไม่มีผลกระทบใด ๆ นอกจากนี้หน้าคนบอกว่าไฟล์นี้ไม่ได้รับการสนับสนุนในขณะนี้
snowcrash09

4
~ / .launchd.conf ดูเหมือนจะไม่ทำงานบน 10.7.3 เช่นกันและเมื่อฉันดูใน man page จะมีข้อความระบุว่า $ HOME / .launchd.conf ไฟล์กำหนดค่า launchd ของคุณ(ไม่รองรับในปัจจุบัน)
uncreative

4
ใน 10.8 (Mountain Lion) ไม่รองรับ ~ / .MacOSX / environment.plist ตามที่ Apple Dev ต้อง "เปลี่ยน Info.plist ของ. app เองเพื่อให้มีพจนานุกรม" LSEnvironment "พร้อมกับตัวแปรสภาพแวดล้อมที่คุณต้องการ" สำหรับข้อมูลเพิ่มเติมดูที่apple.stackexchange.com/questions/57385/…
pnkfelix

3
@LaC เยี่ยมมากโพสต์แบบครอบคลุม; คุณช่วยกรุณาอัปเดตมันเพื่อทราบว่า~/.launchd.confยังไม่รองรับและไม่ทำงานเหมือน OS X 10.8.3? ดูman launchd.conf
mklement0

12

ฉันคิดว่าสิ่งที่ OP กำลังมองหานั้นเป็นทางออกที่เรียบง่ายเหมือนหน้าต่าง

ที่นี่คุณไป:

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


1
ว้าวนี่ดูเท่ห์ ยังไม่ได้ลอง แต่ดูเหมือนว่าสิ่งที่ฉันต้องการจากคำอธิบาย
Abdullah Jibaly

6
btw, ลิงค์เดิมดูเหมือนว่าจะเสียตั้งแต่ฉันโพสต์ (สิ่งที่เป็นสิ่งที่แอปเปิ้ล 301 มีราคาแพง?) คุณสามารถใช้ลิงค์นี้แทน: macupdate.com/app/mac/14617/rcenvironment
Tom Teman

นี่มันเก่าจริงๆ ลองดูคำตอบอื่น ๆ ที่กล่าวถึง osx-env-sync สำหรับโซลูชั่นที่ทันสมัยที่ใช้งานได้แม้ใน OS X 10.10 (โยเซมิตี) ขึ้นไป
Warren P

1
กรุณาสรุปข้อมูลจากลิงค์ในคำตอบของคุณ ดังที่เราได้เห็นไปแล้วการเชื่อมโยงแตกต่างกันด้วยเหตุผลหลายประการ
user3.1415927

7

คุณสามารถอ่านบน linux ซึ่งค่อนข้างใกล้เคียงกับ Mac OS X หรือคุณสามารถอ่าน BSD Unix ได้ซึ่งใกล้กว่านิดหน่อย ส่วนใหญ่ความแตกต่างระหว่าง Linux และ BSD ไม่ได้มีค่ามากนัก

/etc/profile เป็นตัวแปรสภาพแวดล้อมของระบบ

~/.profile คือตัวแปรสภาวะแวดล้อมเฉพาะผู้ใช้

"ฉันควรตั้งค่าตัวแปร JAVA_HOME ของฉันที่ไหน?"

  • คุณมีผู้ใช้หลายคนหรือไม่? พวกเขาสนใจหรือไม่ คุณจะทำให้ผู้อื่นสับสนโดยเปลี่ยน a /etc/profile?

โดยทั่วไปฉันไม่ต้องการยุ่งกับการตั้งค่าทั้งระบบแม้ว่าฉันจะเป็นผู้ใช้คนเดียวก็ตาม ฉันชอบที่จะแก้ไขการตั้งค่าท้องถิ่นของฉัน


5

สำหรับแอพพลิเค GUI ~/.MacOSX/environment.plistคุณจะมีการสร้างและแก้ไข รายละเอียดเพิ่มเติมที่นี่ คุณจะต้องออกจากระบบเพื่อให้สิ่งเหล่านี้มีผล ฉันไม่แน่ใจว่าพวกเขาจะส่งผลกระทบต่อแอปพลิเคชันที่เปิดใช้งานจาก Terminal หรือไม่ แต่ฉันคิดว่าจะเป็นเช่นนั้น

สำหรับแอพที่เปิดตัวจาก Terminal คุณยังสามารถแก้ไขไฟล์ ~ / .profile


2
ใช่เทอร์มินัลจะรับช่วงตัวแปรเช่นเดียวกับสิ่งที่เปิดตัวจากเทอร์มินัล คุณสามารถใช้บานหน้าต่างการตั้งค่าRCenvironmentเพื่อรักษาตัวแปร
Gilimanjaro

1
วิธีนี้ไม่สามารถใช้งานได้กับการแก้ไข Mac OS X v10.7 อีกต่อไป ไม่ได้มีการแก้ไขใด ๆ ของ Mac OS X v10.8 หรือสูงกว่า โปรดดู: stackoverflow.com/a/4567308/543738
LS

3

เพียงแค่เปิด~/.profileไฟล์ผ่านnanoใน Terminal และพิมพ์ที่นั่น:

export PATH=whatever/you/want:$PATH

บันทึกไฟล์นี้ (cmd + X และ Y) หลังจากนั้นโปรดออกจากระบบ / เข้าสู่ระบบอีกครั้งหรือเพียงแค่เปิดแท็บใหม่ใน Terminal และลองใช้ตัวแปรใหม่ของคุณ

โปรดอย่าลืมเพิ่ม ": $ PATH" หลังจากสิ่งใด / คุณ / ต้องการมิฉะนั้นคุณจะลบเส้นทางทั้งหมดในตัวแปร PATH ซึ่งอยู่ที่นั่นก่อนหน้านั้น


4
สิ่งนี้ใช้กับสภาวะแวดล้อมคำสั่ง bash เท่านั้น แอพพลิเคชั่น GUI จะไม่เห็นตัวแปรที่คุณตั้งไว้ที่นี่
Warren P

3

ประสาน OS X ตัวแปรสภาพแวดล้อมสำหรับบรรทัดคำสั่งและโปรแกรม GUI จากแหล่งเดียวกับOSX-env ซิงค์

ฉันยังโพสต์คำตอบของคำถามที่เกี่ยวข้องที่นี่


มันยอดเยี่ยมมาก คำแนะนำ: ใส่สิ่งที่เรียกใช้งานเปิดตัว unload / launctl load "refresh now" ลงในสคริปต์ ฉันเรียกมันว่า osx-env-sync-now.sh ฉันแก้ไข. bash_profile ของฉันและเรียกใช้สคริปต์ "รีเฟรชทันที" และดำเนินการต่อ ฉันคิดว่ามีผลกระทบด้านความปลอดภัยที่นี่ดังนั้นฉันจึงคิดว่ามีข้อ จำกัด บางประการ จะต้องมีเหตุผลที่พวกเขาปิดความสามารถนี้ใน OS X
Warren P

@WarrenP เรียบร้อยแล้ว! ตรวจสอบธุรกรรมซื้อคืน
Ersin Er

ยอดเยี่ยม การแก้ไขนี้ทำให้ฉันเจ็บปวดมาก กรณีหนึ่งที่มีประโยชน์จริงๆสำหรับทุกคนที่พัฒนาด้วย SCALA การตั้งค่า SCALA_HOME สำหรับทั้งบรรทัดคำสั่ง scala และ GUI scala (เช่นใน netbeans) เป็นความเจ็บปวดที่แท้จริง
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. สร้างไฟล์ด้วยหลักการตั้งชื่อ: priority-appname PATHจากนั้นคัดลอกวางเส้นทางที่คุณต้องการเพิ่ม

    เช่น80-vscodeมีเนื้อหา/Applications/Visual Studio Code.app/Contents/Resources/app/bin/ในกรณีของฉัน

  2. /etc/paths.d/ย้ายไฟล์ที่ อย่าลืมเปิดแท็บใหม่ (เซสชันใหม่) ใน Terminal และพิมพ์echo $PATHเพื่อตรวจสอบว่าเส้นทางของคุณจะถูกเพิ่ม!

คำเตือน: วิธีนี้จะต่อท้ายเส้นทางของคุณPATHเท่านั้น

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