การตั้งค่าตัวแปรสภาพแวดล้อมใน OS X สำหรับแอปพลิเคชัน GUI


18

วิธีหนึ่งตั้งค่าตัวแปรสภาพแวดล้อมใน Mac OS X เช่นนั้นจะพร้อมใช้งานสำหรับแอปพลิเคชัน GUI โดยไม่ใช้~ / .MacOSX / environment.plistหรือLogin Hooks (เนื่องจากสิ่งเหล่านี้เลิกใช้แล้ว )


@ ersin-er คำตอบจาก StackOverflow "โซลูชันสำหรับทั้งบรรทัดคำสั่งและแอพ GUI จากแหล่งเดียว (ใช้ได้กับ Yosemite & El Capitan)"อาจเป็นที่สนใจของผู้ที่พบคำถามนี้
l --marc l

คำตอบ:


16

บนภูเขาสิงโตทั้งหมด/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: แน่นอนคุณต้องปรับรายการเส้นทางให้ตรงกับเส้นทางที่คุณต้องการ


1
ขอขอบคุณ! นี่คือที่สมบูรณ์แบบสำหรับฉัน ใน 10.11 (El Capitan) ฉันต้องเรียกใช้คำสั่งจาก Matthewเพื่อดูการเปลี่ยนแปลงของฉันที่จะInfo.plistมีผล
dsedivec

8

โซลูชันใช้ฟังก์ชันการทำงานของ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สามารถมองเห็นต้นไม้ของฉันเองได้ สิ่งที่สามารถปรับปรุงได้:

  1. เชลล์สคริปต์มี#filename="$1"อยู่ในนั้น นี่ไม่ใช่อุบัติเหตุเนื่องจากชื่อไฟล์ควรถูกป้อนเข้าสคริปต์โดยเอเจนต์เรียกใช้เป็นอาร์กิวเมนต์ แต่ไม่ได้ผล

  2. ดังที่กล่าวไว้ที่นี่ (ภาษาเยอรมันและอยู่ด้านหลังของ paywall!) เป็นไปได้ที่จะวางสคริปต์ในตัวแทนการเปิดตัวของมันเอง

  3. ฉันไม่แน่ใจว่าโซลูชันนี้มีความปลอดภัยเพียงใดเนื่องจากใช้evalกับสตริงที่ผู้ใช้ระบุ

  4. ฉันคิดว่าต้องจำไว้ว่าคำจำกัดความของ MANPATH ที่ใช้วิธีนี้ทำงานได้ไม่ดี แต่ฉันไม่แน่ใจ

ควรกล่าวถึงว่า Apple ตั้งใจใช้วิธีที่คล้ายกันโดยใส่ข้อมูลใน in / launchd.confแต่ปัจจุบันยังไม่รองรับตามวันที่และระบบปฏิบัติการ (ดู manpage ของlaunchd.conf) ฉันเดาว่าสิ่งต่าง ๆ เช่นการโค้งงอจะไม่ทำงานอย่างที่พวกเขาทำในข้อเสนอนี้ และแน่นอนหนึ่งสามารถใส่ไฟล์เหล่านี้ได้ทุกอย่างอื่นยกเว้นตัวแทนเปิดตัวซึ่งจะต้องอาศัยอยู่ใน/ Library / LaunchAgents /หรือ~ / Library / LaunchAgents /

สุดท้ายผมควรจะพูดถึงแหล่งที่มาที่ผมใช้เป็นข้อมูลเกี่ยวกับตัวแทนที่เปิดตัว: 1 , 2 , 3 , 4

อัปเดต : ไม่สามารถใช้งานได้ในเวอร์ชัน 10.8 ในขณะนี้ วิธีการแก้ปัญหาบนพื้นฐานการประยุกต์ใช้ต่อได้อธิบายไว้ที่นี่และที่นี่


อย่างไรก็ตามถ้าใครต้องการกำหนด PATH-Variable ในสภาพแวดล้อมของ Terminal และใช้ตัวแทนการเปิดตัวนี้ฉันขอแนะนำให้เขียนexport PATH=.:"$(launchctl getenv PATH)"ใน ~ / .bash_profile (คล้ายกับเชลล์อื่น ๆ ) สิ่งนี้เป็นไปได้เนื่องจากpath_helperถูกเรียกในเชลล์สคริปต์ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตัวแปร PATH ใน OS X ให้ตรวจสอบคำตอบนี้
Percival Ulysses

3

คำตอบที่ @flori จัดทำขึ้นสำหรับฉันบน Maverick ที่ให้ไว้ฉันเรียกใช้คำสั่งต่อไปนี้ใน Terminal หลังจากเปลี่ยนไฟล์ plist

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder

ฉันมีพฤติกรรมแบบเดียวกันกับ El Capitan และฉันได้เพิ่มประเด็นของคุณในคำตอบของ @ flori
Seki

2

คำตอบที่ได้รับจาก @ 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ไฟล์


0

/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 exportlaunchctl export

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