ตั้งค่าตัวแปร PATH เพื่อให้สามารถตรวจพบได้ในทุกแอปพลิเคชันแม้จะอยู่นอกอาคาร (กัปตันเอล)


7

~/etc/pathหน้าตาของฉันเป็นดังนี้:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

ปัญหา:

เมื่อฉันพิมพ์echo $PATHเทอร์มินัลฉันจะกลับมา:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

และสิ่งนี้ยังคงมีอยู่สำหรับทุกแอปพลิเคชันที่เริ่มต้นในเทอร์มินัล ตัวอย่างเช่นถ้าฉันพิมพ์emacsแล้วทำ:

M-x getenv PATH

ผลลัพธ์ของฉันคือ:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

แต่ถ้าฉันเริ่มต้นขึ้น emacs ใช้ Launchpad แทนขั้วและอีกครั้งที่ใส่เอาท์พุทของฉันคือแทนM-x getenv PATH/usr/bin:/bin:/usr/sbin:/sbin

ในขณะที่คุณสามารถเห็นการเปลี่ยนแปลงของฉัน~/etc/pathซึ่งเป็นส่วนที่เพิ่มของ/usr/local/binหายไป

ตัวอย่างอื่น:

ฉันใช้ปลั๊กอิน Firefox ที่เรียกว่าvimperatorซึ่งเลียนแบบฟังก์ชั่น vim ใน Firefox มันมีคุณสมบัติที่ช่วยให้ผู้ใช้สามารถแก้ไขการป้อนข้อมูลหน้าเว็บในกลุ่ม แต่นี้ไม่ได้ดูเหมือนจะทำงานบน OS X ได้ในลางสังหรณ์ผมพิมพ์คำสั่ง!echo $PATHลงใน vimperator /usr/bin:/bin:/usr/sbin:/sbinและดูต่อไปนี้: แน่นอนตั้งแต่ symlink ที่เรียกว่าgvimซึ่งชี้ไปที่macvimถูกสร้างขึ้นและวางไว้/usr/local/binโดยชงพฤติกรรมนี้ทำให้รู้สึก สิ่งที่ฉันไม่เข้าใจคือเหตุผลที่PATHอ่านในแบบที่มันเป็น

วิธีแก้ปัญหาที่ฉันได้ลอง:

  • เห็นได้ชัดว่าฉันได้รีสตาร์ทเครื่อง

แก้ไข (ตามที่ร้องขอโดยความคิดเห็นที่ถูกลบตอนนี้):

การใช้งานsysctl user.cs_pathในเครื่องปลายทาง:

user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

@ fd0 แน่นอน ฉันเสร็จแล้วและนี่คือเส้นทางที่แน่นอนที่ฉันได้รับ
FabulousGlobe

คำตอบ:


8

loginwindowกระบวนการกำหนดสภาพแวดล้อมของผู้ใช้ มันตั้งค่าตัวแปร TMPDIR และ PATH ให้คำปรึกษาบริการไดเรกทอรีและตั้ง SHELL HOME USER LOGNAME PATH ตั้งค่าเป็น/usr/bin:/bin:/usr/sbin:/sbinเว้นแต่จะมีการแก้ไขโดย launchd (ใน OS X เวอร์ชันปัจจุบันมากกว่า) นี่คือตัวแปร PATH สำหรับกระบวนการของผู้ใช้เว้นแต่จะได้รับการแก้ไขโดยกระบวนการเฉพาะนั้น ( cronตัวอย่างเช่นตั้งค่า PATH เป็น/bin:/usr/bin)

แอปพลิเคชั่นเทอร์มินัลอีมูเลเตอร์สตาร์ทเชลล์ของคุณเป็นเชลล์ล็อกอินดังนั้น PATH จะถูกแก้ไขโดยการอ่านไฟล์สตาร์ทอัพเชลล์ต่างๆ กระบวนการใด ๆ ที่เริ่มต้นโดยเชลล์ของคุณจะสืบทอดตัวแปร PATH ใหม่ แอปพลิเคชันอื่น ๆ ที่ใช้เชลล์ไม่อ่านไฟล์ config ของเชลล์และใช้ตัวแปรสภาพแวดล้อมเหล่านั้นที่มีอยู่ในสภาพแวดล้อมปัจจุบัน โปรแกรมประยุกต์อาจปรับเปลี่ยนสภาพแวดล้อมโดยใช้กุญแจสำคัญในการของพวกเขาLSEnvironmentInfo.plist

ในฐานะของโยเซมิตีคุณสามารถเปลี่ยนตัวแปร PATH ในแบบฟอร์มต่อไปนี้

sudo launchctl config user path <path>

ในกรณีของคุณคุณต้องการ / usr / local / bin ที่ด้านหน้าของเส้นทาง

sudo launchctl config user path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

rebootloginwindowระบบและเส้นทางใหม่ของคุณจะถูกกำหนดโดย


-1

เรียกใช้สิ่งนี้:

launchctl setenv PATH "$PATH"

แก้ไข : ที่ไม่ทำงานอีกต่อไป ใช้สิ่งนี้กับ Bash แทน:

CURRENT="$(/usr/libexec/PlistBuddy -c "Print PATH" ~/.MacOSX/environment.plist)"
/usr/libexec/PlistBuddy -c "Set PATH $CURRENT:/your/path/here:/another/path/maybe" ~/.MacOSX/environment.plist

จากนั้นออกจากระบบและลงชื่อเข้าใช้อีกครั้ง

หมายเหตุ : คุณอาจต้องการแทนที่$CURRENT:/your/path/here:/another/path/maybeด้วยรายการของเส้นทางที่ชอบ:/your/path/here:/another/path/maybeแต่นั่นเป็นความคิดที่ไม่ดีเพราะมันจะลบเส้นทางทั้งหมดที่เก็บไว้แล้ว

นี้ใช้ตัวแปรสภาพแวดล้อมเซสชันของผู้ใช้


ฉันลองทั้งสองอย่างเพียงแค่รันคำสั่งรวมทั้งเพิ่มลงในทั้ง. profile และ. bash_profile ของฉัน PATH ยังคงถูกตั้งค่าเป็น/usr/bin:/bin:/usr/sbin:/sbinEclipse, Vimperator (firefox) และ Emacs สิ่งที่แปลกคือถ้าผมใช้ตัวเลือกในการรันสคริปต์เปลือกทั้งใน Emacs หรือ Vimperator วิ่งรับฉันecho $PATH /usr/bin:/bin:/usr/sbin:/sbinอย่างไรก็ตามการทำงานlaunchctl getenv PATHผลิต/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; ฉันไม่ทราบวิธีการเรียกใช้งานเชลล์สคริปต์ใน Eclipse ฉันเริ่มต้นใหม่หลังจากที่ฉันทำการเปลี่ยนแปลงกับไฟล์ dot แน่นอน
FabulousGlobe

นี่คือสิ่งที่จะปรากฏขึ้นหากฉันพิมพ์echo $PATHในเครื่อง
FabulousGlobe

1
คำสั่งนั้นควรจะทำอะไรกันแน่?
อัลลัน

@ อัลลันฉันเจอคำสั่งนั้นด้วยในขณะที่หาคำตอบ เห็นได้ชัดว่ามันใช้เพื่อตั้งค่าตัวแปรสภาพแวดล้อมกลับมาใน 10.8 ตอนนี้มันไม่ทำงาน
FabulousGlobe

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