โซลูชันสำหรับทั้งบรรทัดคำสั่งและแอปพลิเคชัน 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)
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
เพื่อเปิดแอปพลิเคชัน GUI ด้วยสภาพแวดล้อมระบบชุดใหม่