เมื่อฉันใช้ ZSH ฉันจะตั้งค่า PATH ใน /etc/profile.d ได้อย่างไร


22

ฉันใช้zshเป็นเปลือกของฉันและฉันพยายามกำหนดค่าสภาพแวดล้อมของฉัน

ฉันมักจะกำหนด$JAVA_HOMEตัวแปรของฉันโดยการสร้างไฟล์:

/etc/profile.d/java.sh

ด้วยเนื้อหาดังต่อไปนี้

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

จากนั้นฉันออกจากระบบและกลับมาและมันใช้งานได้ แต่ด้วยเหตุผลบางอย่างPATHตัวแปรไม่ได้ถูกตั้งค่า มันรู้จักJAVA_HOMEแต่ไม่ใหม่PATHดูตัวอย่างข้อมูลเทอร์มินัล:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

และฉันยืนยันโดยพยายามรันคำสั่งในรูปแบบ jvm

~  java -version
zsh: command not found: java

PATHไม่รวม$JAVA_HOMEเท่าที่ควร มีอะไรอีกบ้างที่ฉันควรตรวจสอบ?

ฉันได้ตรวจสอบแล้วว่าถ้าฉันทำงาน:

source /etc/profile.d/java.sh

ทุกอย่างทำงานอย่างถูกต้องและตัวแปรของฉันได้รับการตั้งค่าตามที่ควร แต่สคริปต์ไม่ควร/etc/profile.dทำงานโดยอัตโนมัติหรือไม่


คุณลองแก้ไข~/.profileและวางตัวแปรที่นั่นแทนหรือไม่? มันอาจเป็นไปได้ว่าPATHจะถูกเขียนทับอื่น ๆ /etc/profile.d/ใน
saiarcot895

คำตอบ:


27

จากมุมมองของฉันวิธีที่ดีที่สุดคือการเพิ่มบรรทัดต่อไปนี้ที่~/.zshrcไฟล์ (หากคุณยังไม่มีมันจากนั้นสร้างมันขึ้นมา):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

จากนั้นเริ่มต้นใหม่ของคุณzshหรือเพียงแค่เรียกใช้source ~/.zshrcแล้วเส้นทางของคุณควรจะตรงตามที่คุณต้องการ

หรือถ้าคุณต้องการทำการเปลี่ยนแปลงให้เป็นระบบทั้งระบบให้เพิ่มรหัสก่อนหน้านี้ลงในส่วนท้ายของ/etc/zsh/zshenvไฟล์

แต่ในกรณีใดไม่ได้ใช้สคริปต์ทำงานโดยอัตโนมัติใน/etc/profile.d zshไดเร็กทอรีนี้มีประโยชน์สำหรับbashเชลล์เท่านั้นไม่ใช่zshในกรณีของคุณ เพื่อให้เข้าใจสิ่งนี้ให้เปิด/etc/profileไฟล์ซึ่งเป็นไฟล์กำหนดค่าเริ่มต้นbashและไม่ว่าในกรณีใดไฟล์เริ่มต้นzshและคุณจะเห็นที่ท้ายไฟล์:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

ดังนั้นสคริปต์ของคุณจาก/etc/profile.dไดเรกทอรีจะทำงานโดยอัตโนมัติzshเฉพาะในกรณีที่คุณเพิ่มรหัสก่อนหน้าในไฟล์เริ่มต้น zsh เช่น/etc/zsh/zprofileตัวอย่างหรือแหล่งที่มา/etc/profileใน/etc/zsh/zprofileไฟล์


4
บางทีอาจจะดีกว่า~/.zprofile ~/.zshrc
muru

3

ฉันพบว่าการวางทุกสิ่งใน.zshenvไฟล์เดียวอย่างรวดเร็วกลายเป็นเรื่องยากที่จะจัดการ ฉันขอแนะนำให้ติดตั้งoh-my-shแล้ววางการปรับแต่งต่างๆ (env vars, ฟังก์ชั่น) ไปยัง.oh-my-sh/custom/ไดเรกทอรีเป็น.zshไฟล์แยกต่างหาก

ฉันยังค้นพบว่าวิธีการนี้ทำงานไม่มีที่ติเมื่อ ssh'ing ลงในเครื่องเมื่อแก้ไขตัวแปร env PATHเช่น นอกจากนี้ยังใช้งานได้ดีกับvcshสำหรับการสำรองข้อมูลและซิงค์


ใช้โอ้กรอบ zsh ของฉันคุณจะวางตัวแปรที่มีที่อยู่ ip (เซิร์ฟเวอร์ระยะไกล) เพื่อใช้สำหรับการเข้าถึง ssh หรือไม่ ฉันต้องการ ip สำหรับ git และสคริปต์การเข้าสู่เซิร์ฟเวอร์
Timo

1
ฮึ่ม ไม่แน่ใจว่าคุณหมายถึงอะไร ฉันจะใส่ config เช่นที่อยู่ IP และชื่อผู้ใช้สำหรับ ssh to~/.ssh/config
dvim

ฉันชอบวิธีนี้เป็นคำตอบที่ได้รับการยอมรับเพราะฉันชอบความได้เปรียบของการใช้ vcsh และโฟลเดอร์ "กำหนดเอง" สำหรับ ZSH เป็นสถานที่ที่เหมาะสำหรับสิ่งนี้
Erick Brown

1

ตั้งแต่JAVA_HOMEมีการตั้งค่าคุณได้ยืนยันว่าสคริปต์เหล่านั้นมีแหล่งที่มาโดยอัตโนมัติใช่ไหม?

คำอธิบายเชิงตรรกะเพียงอย่างเดียวPATHคือตั้งไว้ในภายหลังอย่างใด มันควรจะถูกตั้งค่าเริ่มต้นโดย PAM ที่อ่าน/etc/environmentและเท่าที่ฉันรู้ว่ามันเกิดขึ้นก่อนที่/etc/profile.d/*.shไฟล์จะมา อาจ zsh ทำงานแตกต่างกันเมื่อเทียบกับทุบตีในส่วนที่


0

เพิ่งพบปัญหานี้แบบโลคัลหลังจากรันการอัพเดต ดูเหมือนว่าปัญหารากคือ Drush ไม่รู้ว่าจะหาสำเนา php ที่มี pdo ได้ถูกต้องหรือไม่ โชคดีที่มันรองรับเส้นทางนี้ในตัวแปรสภาพแวดล้อมดังนั้นฉันจึงทำสิ่งนี้ใน commandline:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

ที่แก้ไขปัญหาดังนั้นฉันจึงแก้ไข. zshrc และเพิ่มไฟล์นั้นลงไปแก้ไขปัญหาได้


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