ดูเหมือนว่าlaunchd.conf
จะไม่โหลดตัวแปรสภาพแวดล้อมของฉันอีกต่อไป มีใครสังเกตเห็นบ้างไหม?
มีวิธีอื่นในการตั้งค่าตัวแปรสภาพแวดล้อมอย่างถาวรหรือไม่
ดูเหมือนว่าlaunchd.conf
จะไม่โหลดตัวแปรสภาพแวดล้อมของฉันอีกต่อไป มีใครสังเกตเห็นบ้างไหม?
มีวิธีอื่นในการตั้งค่าตัวแปรสภาพแวดล้อมอย่างถาวรหรือไม่
คำตอบ:
สร้างenvironment.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>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
คุณสามารถเพิ่มlaunchctl
คำสั่งมากมายใน<string></string>
บล็อก
plist
จะเปิดใช้งานหลังจากรีบูตระบบ คุณยังสามารถใช้launchctl load ~/Library/LaunchAgents/environment.plist
เพื่อเปิดใช้ทันที
[แก้ไข]
โซลูชันเดียวกันทำงานใน El Capitan เช่นกัน
Xcode 7.0+ ไม่ได้ประเมินตัวแปรสภาพแวดล้อมตามค่าเริ่มต้น พฤติกรรมเก่าสามารถเปิดใช้งานด้วยคำสั่งนี้:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[แก้ไข]
มีบางสถานการณ์ที่ไม่ได้ผล หากคอมพิวเตอร์รีสตาร์ทและเลือก "เปิดหน้าต่างอีกครั้งเมื่อลงชื่อเข้าใช้" หน้าต่างที่เปิดใหม่อาจไม่เห็นตัวแปร (บางทีพวกเขาจะถูกเปิดก่อนที่เอเจนต์จะทำงาน) นอกจากนี้หากคุณเข้าสู่ระบบผ่าน ssh ตัวแปรจะไม่ถูกตั้งค่า (ดังนั้นคุณจะต้องตั้งค่าเป็น ~ / .bash_profile) ในที่สุดสิ่งนี้ดูเหมือนจะไม่สามารถใช้ได้กับ PATH บน El Capitan และ Sierra ต้องมีการตั้งค่าผ่าน 'เส้นทางผู้ใช้ configctl config ... ' และใน / etc / path
UseSanitizedBuildSystemEnvironment
)
[ คำตอบดั้งเดิม ]: คุณยังสามารถใช้launchctl setenv variablename value
เพื่อตั้งค่าตัวแปรเพื่อให้รับได้จากแอปพลิเคชันทั้งหมด (แอปพลิเคชันกราฟิกที่เริ่มต้นผ่าน Dock หรือ Spotlight นอกเหนือจากที่เริ่มต้นผ่านเทอร์มินัล)
แน่นอนคุณจะไม่ต้องการทำเช่นนี้ทุกครั้งที่คุณเข้าสู่ระบบ
[ แก้ไข ]: เพื่อหลีกเลี่ยงปัญหานี้ให้เรียกใช้AppleScript Editor
งานป้อนคำสั่งดังนี้:
do shell script "launchctl setenv variablename value"
(ใช้หลายบรรทัดหากคุณต้องการตั้งค่าหลายตัวแปร)
ตอนนี้บันทึก ( ⌘
+ s
) เป็นรูปแบบไฟล์: แอพลิเคชัน ในที่สุดก็เปิดSystem Settings
→ ผู้ใช้ & กลุ่ม → รายการเข้าสู่ระบบและเพิ่มแอปพลิเคชันใหม่ของคุณ
[ คำตอบเดิม ]: เพื่อหลีกเลี่ยงสถานที่นี้ตัวแปรทั้งหมดที่คุณต้องการที่จะกำหนดในเชลล์สคริปต์สั้น ๆ แล้วต้องดูที่นี้คำตอบก่อนหน้าเกี่ยวกับวิธีการเรียกใช้สคริปต์บน MacOS เข้าสู่ระบบ ด้วยวิธีนี้สคริปต์จะถูกเรียกใช้เมื่อผู้ใช้ล็อกอิน
[ แก้ไข ]: ไม่มีวิธีแก้ปัญหาที่สมบูรณ์แบบเนื่องจากตัวแปรจะถูกตั้งค่าสำหรับผู้ใช้เฉพาะนั้นแต่ฉันหวัง / คาดเดาว่าอาจเป็นสิ่งที่คุณต้องการ
หากคุณมีผู้ใช้หลายคนคุณสามารถตั้งค่ารายการเข้าสู่ระบบด้วยตนเองสำหรับผู้ใช้แต่ละคนหรือวางสำเนาของcom.user.loginscript.plistในไดเรกทอรีLibrary / LaunchAgentsแต่ละโลคัลชี้ไปที่เชลล์สคริปต์เดียวกัน
ที่ได้รับค่าการแก้ไขปัญหาเหล่านี้เป็นความสะดวกที่/etc/launchd.conf
[ แก้ไขเพิ่มเติม ]: ผู้ใช้ด้านล่างระบุว่าสิ่งนี้ไม่ได้ผลสำหรับเขา อย่างไรก็ตามฉันได้ทำการทดสอบกับเครื่องโยเซมิตีหลายเครื่องและมันก็ใช้งานได้สำหรับฉัน หากคุณกำลังมีปัญหาโปรดจำไว้ว่าคุณจะต้องรีสตาร์ทแอปพลิเคชันเพื่อให้สิ่งนี้มีผล นอกจากนี้ถ้าคุณตั้งค่าตัวแปรใน terminal ผ่าน~ / .profileหรือ~ / .bash_profileพวกเขาจะแทนที่สิ่งที่ตั้งค่าผ่านทางlaunchctl setenvสำหรับการใช้งานเริ่มต้นจากเปลือก
เป็นไปได้ที่จะตั้งค่าตัวแปรสภาพแวดล้อมบน Mac OS X 10.10 Yosemite ด้วย 3 ไฟล์ + 2 คำสั่ง
ไฟล์หลักที่มีการกำหนดตัวแปรสภาพแวดล้อม:
$ ls -la /etc/environment
-r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh
set -e
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv MAVEN_HOME /opt/local/share/java/maven3
if [ -x /usr/libexec/path_helper ]; then
export PATH=""
eval `/usr/libexec/path_helper -s`
launchctl setenv PATH $PATH
fi
osascript -e 'tell app "Dock" to quit'
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"
ข้อกำหนดบริการเพื่อโหลดตัวแปรสภาพแวดล้อมสำหรับแอปพลิเคชันผู้ใช้ (เทอร์มินัล, IDE, ... ):
$ ls -la /Library/LaunchAgents/environment.user.plist
-rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.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>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
นิยามบริการเดียวกันสำหรับแอปพลิเคชันผู้ใช้รูท:
$ ls -la /Library/LaunchDaemons/environment.plist
-rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
และในที่สุดเราควรลงทะเบียนบริการเหล่านี้:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
สิ่งที่เราได้รับ:
ปัญหา / ปัญหา:
เพื่อให้ตัวแปร env ของคุณถูกใช้อย่างถูกต้องโดยแอปพลิเคชันหลังจากรีบูตระบบคุณจะต้อง:
สิ่งนี้เกิดขึ้นเนื่องจาก Apple ปฏิเสธการสั่งซื้อบริการที่โหลดอย่างชัดเจนดังนั้นตัวแปร env จะถูกลงทะเบียนควบคู่กับการประมวลผลของ "เปิดคิวอีกครั้ง"
แต่จริงๆแล้วฉันรีบูทระบบของฉันปีละหลายครั้งเท่านั้น (ในการอัปเดตครั้งใหญ่) ดังนั้นจึงไม่ใช่เรื่องใหญ่
JAVA_HOME
) แต่ไม่ใช่สำหรับPATH
ตัวแปร (ดูคำถามของฉันในการถามที่แตกต่างกัน )
launchd
แต่ไม่สามารถโหลด Daemons เหล่านั้นตอนบูตได้ (เช่นก่อนเข้าสู่ระบบ) หรือไม่ ที่ควรหลีกเลี่ยงปัญหาทั้งหมดที่คุณพูดถึง
อ้างจาก
Apple Developer Relations
10-Oct-2014 09:12 PM
หลังจากการไตร่ตรองอย่างถี่ถ้วนแล้ววิศวกรรมได้ลบคุณลักษณะนี้ออกไป ไฟล์
/etc/launchd.conf
ถูกลบโดยเจตนาเพื่อเหตุผลด้านความปลอดภัย ในฐานะที่เป็นวิธีแก้ปัญหาที่คุณสามารถเรียกใช้เป็นรากต้นในระหว่างการบูตบางทีจากlaunchctl limit
LaunchDaemon
( ... )
สารละลาย:
ใส่รหัสใน
/Library/LaunchDaemons/com.apple.launchd.limit.plist
โดย bash-script:
#!/bin/bash
echo '<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
/Library/LaunchDaemons
และแทนที่จะบอกlaunchctl
ให้รันlimit
คำสั่งบอกให้รันsetenv
คำสั่งด้วยPATH
และสตริงพา ธ เป็นอาร์กิวเมนต์ launchd
ควรรับมันโดยอัตโนมัติเมื่อเริ่มต้นและรับการแก้ไขตัวเองเกือบจะในทันที
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
นี่คือคำสั่งเพื่อคืนค่าลักษณะการทำงานเก่า:
# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh
while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh
# make it executable
chmod +x /usr/local/bin/launchd.conf.sh
# launch the script at startup
echo '<?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>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist
ตอนนี้คุณสามารถระบุคำสั่งเช่นในsetenv JAVA_HOME /Library/Java/Home
/etc/launchd.conf
ตรวจสอบกับ El Capitan
สิ่งที่ได้ผลสำหรับฉัน (ได้รับแรงบันดาลใจจาก aax 'ขอบคุณ):
วางสิ่งนี้ลงใน/Library/LaunchDaemons/com.apple.launchd.limit.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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
หากคุณต้องการทีละขั้นตอน:
⌘+v
) สิ่งนี้จะบังคับให้มีการ จำกัด ไฟล์ 16384 ต่อกระบวนการและไฟล์ทั้งหมด 16384 ไฟล์esc
แล้ว:wq
ฉันหวังว่านี่จะช่วยคุณได้
คุณสามารถลองhttps://github.com/ersiner/osx-env-sync มันจัดการทั้งบรรทัดคำสั่งและแอพ GUIจากแหล่งเดียวและทำงานร่วมกับOS X เวอร์ชันล่าสุด (Yosemite)
คุณสามารถใช้การแทนค่าพา ธ และลูกเล่นอื่น ๆ ของเชลล์ได้เนื่องจากสิ่งที่คุณเขียนคือสคริปต์ทุบตีปกติที่จะต้องจัดหาจากการทุบตีในตอนแรก ไม่มีข้อ จำกัด .. (ตรวจสอบเอกสารประกอบosx-env-syncและคุณจะเข้าใจว่ามันประสบความสำเร็จได้อย่างไร)
ฉันตอบคำถามที่คล้ายกันที่นี่ซึ่งคุณจะพบมากขึ้น
/etc/profile
การแก้ปัญหาคือการเพิ่มตัวแปรของคุณเพื่อ จากนั้นทุกอย่างทำงานตามที่คาดไว้! แน่นอนคุณต้องเป็นผู้ใช้รูทที่มี sudo nano / etc / profile หากคุณแก้ไขด้วยวิธีอื่นระบบจะร้องเรียนกับ / etc / profile ที่เสียหายแม้ว่าคุณจะเปลี่ยนสิทธิ์ในการรูทก็ตาม
ฉันเพิ่มตัวแปรใน ~ / .bash_profile ด้วยวิธีต่อไปนี้ หลังจากคุณรีสตาร์ทเสร็จแล้ว / ออกจากระบบและเข้าสู่ระบบ
export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH
หมายเหตุ: โดยไม่ต้องรีสตาร์ท / ออกจากระบบและเข้าสู่ระบบคุณสามารถใช้การเปลี่ยนแปลงเหล่านี้โดยใช้;
source ~/.bash_profile