ใน OSX Yosemite ทำไมฉันถึงตั้งค่าตัวแปรสภาพแวดล้อมมากมายสำหรับแอพ GUI แต่ไม่สามารถตั้งค่า PATH ตัวแปรที่เฉพาะเจาะจงได้


16

หลังจากที่ฉันแยกแยะปัญหา PATH ของ OSXจนถึงรุ่น Mavericks ปัญหากลับมาที่ Yosemite !!!

ดังนั้นผมจึงต้องการที่จะเลียนแบบเก่าlaunch.confคุณลักษณะใหม่ใน Mac OSX 10.10 Yosemite ปล่อยเพื่อให้มีตัวแปรสภาพแวดล้อมของเส้นทางใน GUI ปพลิเคชันเช่นคาร์บอน EmacsหรือRStudioใช้ได้ ผมใช้ความคิดที่ดีของผู้ใช้ StackOverflow Ursalaunchctlการตั้งค่าเชลล์สคริปต์ซึ่งกำหนดค่าตัวแปรสภาพแวดล้อมผ่าน (โปรดดูคำตอบ StackOverflow ของเขาที่นี่ .) งานนี้สำหรับตัวแปรสภาพแวดล้อมมากที่สุดแต่ไม่ได้สำหรับตัวแปรเส้นทาง

1. ฉันได้ทำอะไรไปแล้ว

ครั้งแรกที่ฉันเขียน /etc/environment.rcสคริปต์ดูเหมือนว่า:

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

จากนั้นฉันสร้าง Plists สำหรับlaunchd(รายการเหล่านี้และสคริปต์อื่น ๆ ที่กล่าวถึงในภาคผนวกด้านล่าง) จากนั้นฉันก็เปิดใช้งานพวกเขาด้วย

$ sudo launchctrl load ...

จากนั้นฉันปิดการใช้งานpath_helperยูทิลิตี้ใน/etc/โปรไฟล์ไฟล์เชลล์ init เพื่อที่จะไม่เขียนทับการenvironment.rcตั้งค่า และในที่สุดฉันก็รีสตาร์ทเครื่อง

2. ผลกระทบคืออะไร

เมื่อฉันเริ่มต้น Terminal ตัวแปรสภาพแวดล้อมใหม่JAVA_HOMEและได้ENVIRONMENT_RCรับการตั้งค่าตามenvironment.rcแต่เส้นทางถูกตั้งค่าเป็น

/ usr / bin: / bin

ในการสั่งซื้อเพื่อให้แน่ใจว่าไม่มีbashไฟล์ init ได้ในทางที่ผมเขียนสคริปต์หลามน้อยแทน (ในภาคผนวกเช่นกัน) จะแสดงตัวแปรในสภาพแวดล้อมปัจจุบันและฉันดำเนินการนี้โดยตรงโดยคลิกคู่Platypusเสื้อคลุม ตัวแปรใหม่ถูกตั้งค่าอีกครั้งในขณะที่ PATH มีค่าเริ่มต้นของระบบ

เหตุใดฉันจึงตั้งค่าตัวแปรอื่น แต่ไม่ใช่ตัวแปร PATH และฉันจะแก้ปัญหานี้ด้วยวิธีรวมเป็นหนึ่งได้อย่างไร

ปรับปรุง:

สถานการณ์น่างงมาก: เชลล์ ( bashอย่างน้อยที่สุด) ใน Terminal หรือ Emacs จะเลือก PATH ที่คุณตั้งค่าผ่านทางlaunchctlแต่แอพ GUI อื่น ๆ จะไม่ทำเช่นสคริปต์ python ขนาดเล็กที่กล่าวถึงตรงที่เรียกผ่าน Platypus จะไม่แสดงที่กำหนดเองของคุณ เส้นทาง. และแม้แต่ Emac เองเองก็ไม่ทราบเส้นทางที่ถูกต้อง: คุณสังเกตเห็นสิ่งนี้เช่นเมื่อคุณออกคำสั่ง Emacs M-x ispell-buffer; เครื่องมือ unix ispellที่ emacs พยายามโทรหาจะไม่พบถ้ามันอยู่บนเส้นทางที่คุณกำหนดเอง


ภาคผนวก

net.halloleo.environment.plistไฟล์เรียกทำงาน config ใน/Library/LaunchDaemons/:

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plistไฟล์เรียกทำงาน config ใน/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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profileไฟล์ bash start-up ที่แก้ไขแล้ว:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.pyสคริปต์แสดงตัวแปรสภาพแวดล้อมทั้งหมด:

import os
print (os.environ)

คำตอบ:


3

PATH ใน Yosemite สามารถและควรตั้งค่าไว้ในไฟล์ / etc / path เพียงเพิ่มเส้นทางของคุณที่ท้ายไฟล์นี้:

/usr/bin
/bin
/your/custom/path

สคริปต์ / etc / environment ในโพสต์ดั้งเดิมให้การสนับสนุนตัวแปร PATH ในแอปพลิเคชัน GUI (ทดสอบด้วย Emacs)


5
นี้ไม่เพียง แต่การทำงานสำหรับเปลือกหอยซึ่งเรียก/usr/libexec/path_helperในระหว่างกระบวนการ initialisation ของพวกเขา แอพ GUI ไม่ได้รับเส้นทางตาม/etc/paths- และฉันถามเฉพาะเกี่ยวกับแอพ GUI
halloleo

ฉันได้อัปเดตคำตอบและ / / / สคริปต์สภาพแวดล้อมในโพสต์ต้นฉบับ
ursa

นี่คือคำตอบสองข้อที่คุณให้ - นอกจากนี้ OP บอกว่า / etc / environment ไม่ทำงาน
user151019

@mark (1) หลังจากคำถามนี้ได้รับการปรับปรุงฉันได้อัปเดต / etc / environment และตอนนี้รองรับ PATH (2) คำตอบที่นี่คือการใช้ / etc / path
ursa

2
@ เครื่องหมายใช่และนั่นคือจุดประเด็นปัญหาและคำถามของฉัน: ฉันจะตั้งค่าตัวแปรสภาพแวดล้อม PATH ของแอพ GUI เองได้อย่างไรเมื่อเปิดตัวผ่าน Finder ยังคงไม่มีจริงโดยทั่วไปวิธีการนี้ในสายตา ...
halloleo

2

สิ่งนี้ทำให้ฉันงุนงงมานาน (ดีสองสามชั่วโมงสุดท้าย) ในที่สุดฉันก็พบรายงานข้อผิดพลาดนี้ซึ่งดูเหมือนจะอธิบายปัญหาของฉันอย่างแน่นอน (ฉันไม่แน่ใจว่าสิ่งที่ขยายออกไปเกี่ยวข้องกับปัญหาของคุณ แต่ดูเหมือนจะมีข้อผิดพลาดใน Yosemite / launchd ร่วมกับ PATH และสคริปต์เช่น เป็นงูหลาม:

http://www.openradar.me/18945659

การแก้ปัญหาดูเหมือนว่าจะเริ่มเชลล์สคริปต์ซึ่งเริ่มต้นหลาม ไม่ใช่สิ่งที่ฉันชอบจริงๆ แต่มันเป็นอย่างที่มันเป็น ....


ขอบคุณสำหรับลิงก์ไปยังรายงานข้อผิดพลาด ดีที่ตอนนี้มันเป็นข้อผิดพลาดที่แท้จริง ฉันพบคลัชอีกรอบ ฉันจะโพสต์ไว้ที่นี่
halloleo

1

ปัญหาคือการที่ launchd ผนวกตัวแปร PATH อื่นแทนการแทนที่หนึ่งในสภาพแวดล้อม โปรแกรมส่วนใหญ่ใช้getenvซึ่งจะส่งกลับการเกิดขึ้นครั้งแรกของตัวแปรเชลล์แทนการวนซ้ำผ่านตัวแปรสภาพแวดล้อมทั้งหมดและนำเข้าเป็นตัวแปรท้องถิ่นดังนั้นจึงเขียนทับอินสแตนซ์ก่อนหน้าด้วยอินสแตนซ์สุดท้าย

เห็นได้ชัดว่านี่เป็นข้อผิดพลาดใน launchd ตัวแปรสภาวะแวดล้อมที่ส่งผ่านไปยังโปรแกรมควรไม่ซ้ำกัน


1
คำตอบพื้นหลังเด็ด! ฉันเดาว่า theer ไม่ใช่วิธีที่อยู่รอบ ๆ ตัวมันในกระสุนหรือมี?
halloleo

@ halloleo คุณสามารถเรียกใช้คำสั่งsh -c 'YOUR ORIGINAL COMMAND'ที่ส่งผ่านไปถึงแม้ว่า shell เลือกPATHชุดใน launchd
StenSoft
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.