วิธีหนึ่งตั้งค่าตัวแปรสภาพแวดล้อมใน Mac OS X เช่นนั้นจะพร้อมใช้งานสำหรับแอปพลิเคชัน GUI โดยไม่ใช้~ / .MacOSX / environment.plistหรือLogin Hooks (เนื่องจากสิ่งเหล่านี้เลิกใช้แล้ว )
วิธีหนึ่งตั้งค่าตัวแปรสภาพแวดล้อมใน Mac OS X เช่นนั้นจะพร้อมใช้งานสำหรับแอปพลิเคชัน GUI โดยไม่ใช้~ / .MacOSX / environment.plistหรือLogin Hooks (เนื่องจากสิ่งเหล่านี้เลิกใช้แล้ว )
คำตอบ:
บนภูเขาสิงโตทั้งหมด/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: แน่นอนคุณต้องปรับรายการเส้นทางให้ตรงกับเส้นทางที่คุณต้องการ
Info.plist
มีผล
โซลูชันใช้ฟังก์ชันการทำงานของlaunchctl
รวมกับตัวแทนการเปิดใช้เพื่อเลียนแบบการขอเข้าสู่ระบบของเก่า สำหรับโซลูชันอื่น ๆ ที่ใช้ร้านค้าlaunchd
ดูการเปรียบเทียบนี้ ตัวแทนการเปิดตัวที่ใช้ที่นี่ตั้งอยู่ใน/ 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>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
สิ่งสำคัญอย่างหนึ่งคือคีย์RunAtLoadเพื่อให้ตัวแทนการเรียกใช้สามารถดำเนินการได้ในเวลาที่เร็วที่สุด การทำงานจริงเสร็จสิ้นในเชลล์สคริปต์/Users/Shared/conflaunchd.shซึ่งอ่าน~ / .conf.launchdและป้อนไปที่launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
แจ้งให้ทราบว่าการเรียกpath_helper
เพื่อตั้งค่าPATHให้ถูกต้อง สุดท้าย~ / .conf.launchdดูเหมือนว่า
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
เหล่านี้คือlaunchctl
คำสั่งดู manpage ของมันสำหรับข้อมูลเพิ่มเติม ทำงานได้ดีสำหรับฉัน (ฉันควรพูดถึงว่าฉันยังคงเป็น Snow Leopard guy), แอปพลิเคชั่น GUI เช่นtexstudioและTeXShopสามารถมองเห็นต้นไม้ของฉันเองได้ สิ่งที่สามารถปรับปรุงได้:
เชลล์สคริปต์มี#filename="$1"
อยู่ในนั้น นี่ไม่ใช่อุบัติเหตุเนื่องจากชื่อไฟล์ควรถูกป้อนเข้าสคริปต์โดยเอเจนต์เรียกใช้เป็นอาร์กิวเมนต์ แต่ไม่ได้ผล
ดังที่กล่าวไว้ที่นี่ (ภาษาเยอรมันและอยู่ด้านหลังของ paywall!) เป็นไปได้ที่จะวางสคริปต์ในตัวแทนการเปิดตัวของมันเอง
ฉันไม่แน่ใจว่าโซลูชันนี้มีความปลอดภัยเพียงใดเนื่องจากใช้eval
กับสตริงที่ผู้ใช้ระบุ
ฉันคิดว่าต้องจำไว้ว่าคำจำกัดความของ MANPATH ที่ใช้วิธีนี้ทำงานได้ไม่ดี แต่ฉันไม่แน่ใจ
ควรกล่าวถึงว่า Apple ตั้งใจใช้วิธีที่คล้ายกันโดยใส่ข้อมูลใน in / launchd.confแต่ปัจจุบันยังไม่รองรับตามวันที่และระบบปฏิบัติการ (ดู manpage ของlaunchd.conf
) ฉันเดาว่าสิ่งต่าง ๆ เช่นการโค้งงอจะไม่ทำงานอย่างที่พวกเขาทำในข้อเสนอนี้ และแน่นอนหนึ่งสามารถใส่ไฟล์เหล่านี้ได้ทุกอย่างอื่นยกเว้นตัวแทนเปิดตัวซึ่งจะต้องอาศัยอยู่ใน/ Library / LaunchAgents /หรือ~ / Library / LaunchAgents /
สุดท้ายผมควรจะพูดถึงแหล่งที่มาที่ผมใช้เป็นข้อมูลเกี่ยวกับตัวแทนที่เปิดตัว: 1 , 2 , 3 , 4
อัปเดต : ไม่สามารถใช้งานได้ในเวอร์ชัน 10.8 ในขณะนี้ วิธีการแก้ปัญหาบนพื้นฐานการประยุกต์ใช้ต่อได้อธิบายไว้ที่นี่และที่นี่
export PATH=.:"$(launchctl getenv PATH)"
ใน ~ / .bash_profile (คล้ายกับเชลล์อื่น ๆ ) สิ่งนี้เป็นไปได้เนื่องจากpath_helper
ถูกเรียกในเชลล์สคริปต์ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตัวแปร PATH ใน OS X ให้ตรวจสอบคำตอบนี้
คำตอบที่ @flori จัดทำขึ้นสำหรับฉันบน Maverick ที่ให้ไว้ฉันเรียกใช้คำสั่งต่อไปนี้ใน Terminal หลังจากเปลี่ยนไฟล์ plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
คำตอบที่ได้รับจาก @ percival-ulysses ใช้ได้กับฉันใน 10.9 Mavericks ด้วยการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ดังต่อไปนี้: แก้ไข/Users/Shared/conflaunchd.shสคริปต์ก่อนหน้าexit 0
และเพิ่มบรรทัด
killall Dock
killall SystemUIServer
เพื่อรีสตาร์ท Dock และแถบเมนู หลังจากนี้แอปพลิเคชันที่เริ่มต้นจาก Dock หรือจาก Spotlight จะรับเส้นทางที่ถูกต้อง หากคุณใช้ Finder เพื่อเริ่มแอปพลิเคชั่นที่สำคัญกับเส้นทางkillall Finder
อาจมีการเพิ่มเข้ามาด้วย
ในการ.bash_profile
ฉันใช้สาย
export PATH=`launchctl getenv PATH`
การกำหนดเส้นทางสำหรับเทอร์มิวิธีนี้เส้นทางจะถูกควบคุมจากตำแหน่งเดียวกัน~ / .conf.launchdไฟล์
/etc/launchd.conf
อีกตัวเลือกหนึ่งคือการใช้งาน ตัวอย่างเช่นฉันได้เปลี่ยนค่าเริ่มต้นPATH
โดยเพิ่มบรรทัดนี้เป็น/etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
คุณสามารถนำการเปลี่ยนแปลงไปใช้/etc/launchd.conf
โดยการเริ่มต้นใหม่หรือโดยการเรียกใช้launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
และยกเลิกและเปิดกระบวนการใหม่
การตั้งค่าที่/etc/launchd.conf
ใช้กับทั้งกระบวนการ launchd รูทและกระบวนการ launchd ต่อผู้ใช้ ตัวแปรสภาพแวดล้อมที่มีการตั้งค่าsetenv
ในการ/etc/launchd.conf
ที่จะแสดงโดยทั้งสองและsudo launchctl export
launchctl export