Zsh ไม่ได้กดปุ่ม ~ / .profile


145

ฉันเพิ่งติดตั้ง zsh บนระบบ Ubuntu ของฉัน ดูเหมือนว่า zsh ไม่ได้ดำเนินการ ~ / .profile กับ init เพื่อความเข้าใจที่ดีที่สุดของฉันนี่ควรเป็นพฤติกรรมอัตโนมัติ ฉันพลาดอะไรไป

คำตอบ:


204

.profile เมื่อเทียบกับ .zprofile

Zsh รัน~/.zprofileไม่ใช่~/.profileเมื่อถูกเรียกใช้เป็นเชลล์ล็อกอิน เหตุผลก็คือ zsh มีความเข้ากันไม่ได้กับเชลล์มาตรฐานที่จะทำลายสคริปต์

zsh ไม่ทำงาน~/.profileถ้ามันจะเรียกว่าเป็นหรือsh kshแต่ถ้าวัตถุประสงค์ของคุณคือรับพรอมต์ zsh เมื่อคุณเข้าสู่ระบบนั่นไม่ช่วยอะไรเลย

คุณสามารถทำให้/bin/shเปลือกเข้าสู่ระบบของคุณและรวมอยู่ในของคุณexport SHELL=/bin/zsh ~/.profileจากนั้นเมื่อคุณเปิดเทอร์มินัลเทอร์มินัลจะเปิด zsh (ยกเว้นเทอร์มินัลอีมูเลเตอร์สองสามตัวไม่ปฏิบัติตามการ$SHELLตั้งค่า) แต่คุณจะยังคงมีshเมื่อคุณเข้าสู่ระบบมากกว่า ssh สิ่งนี้สามารถแก้ไขได้โดยการรวมexec zshที่ส่วนท้ายของ~/.profile(ซึ่งแทนที่เชลล์ที่รันโดย zsh) แต่คุณต้องระวังเฉพาะสำหรับการล็อกอินแบบอินเทอร์แอคทีฟเท่านั้นและไม่~/.profileรวมอยู่ในสคริปต์อื่นเช่นเริ่มเซสชัน X การทดสอบคือชื่อของกระบวนการพาเรนต์ที่ได้รับโดยps -o comm= $PPID: ถ้าเป็นsshdหรือsuจะปลอดภัยต่อการใช้งานexec)

ทางออกที่ง่ายที่สุดในการทำงานกับ zsh และ run ~/.profileคือการสร้าง~/.zprofileโหมดที่เข้าสู่ sh emulation ในขณะที่มันทำงาน~/.profile:

emulate sh
. ~/.profile
emulate zsh

หากคุณมี zsh ล่าสุดพอ (บน Ubuntu นั่นหมายความว่าตั้งแต่ที่ชัดเจนผมคิดว่า) emulate sh -c '. ~/.profile'คุณสามารถลดความซับซ้อนนี้

.zprofile เมื่อเทียบกับ .zshrc

ไฟล์~/.profileถูกโหลดโดยเชลล์ล็อกอิน ล็อกอินเชลล์เป็นกระบวนการแรกที่เริ่มต้นเมื่อคุณล็อกอินในโหมดข้อความตัวอย่างเช่นบนคอนโซลข้อความหรือผ่าน ssh ตามค่าเริ่มต้นบนเครื่อง Linux ส่วนใหญ่เชลล์ล็อกอินจะทุบตี แต่คุณสามารถเปลี่ยนได้ด้วยchshคำสั่งหรือผ่านเครื่องมืออื่น ๆ เช่น "การตั้งค่าผู้ใช้" ใน Ubuntu เมื่อเป็นเชลล์ล็อกอิน bash จะอ่าน~/.bash_profileว่ามันมีอยู่หรือ~/.profileไม่ในขณะที่ zsh จะอ่านเท่านั้น~/.zprofile(เนื่องจากไวยากรณ์ไม่เข้ากันกับ sh แบบดั้งเดิมอย่างสมบูรณ์) ภายใต้การกำหนดค่าส่วนใหญ่~/.profileจะถูกโหลดโดยสคริปต์เริ่มต้นเซสชัน X เมื่อคุณเข้าสู่ระบบในตัวจัดการการแสดงผลแบบกราฟิก

เมื่อคุณเริ่มโปรแกรมจำลองเทอร์มินัลและรับพร้อมต์เชลล์หรือเมื่อคุณเริ่มเชลล์อย่างชัดเจนคุณจะได้รับเชลล์ที่ไม่ใช่เชลล์ล็อกอิน เนื่องจาก~/.profile(หรือ~/.zprofile) ใช้สำหรับคำสั่งที่คุณต้องการดำเนินการเมื่อคุณลงชื่อเข้าใช้เชลล์ที่ไม่ใช่การเข้าสู่ระบบจึงไม่อ่านไฟล์นี้ แต่เมื่อคุณเริ่ม zsh ~/.zshrcโต้ตอบมันอ่าน (Zsh อ่าน~/.zshrcในเชลล์แบบโต้ตอบทั้งหมดไม่ว่าจะเป็นเชลล์การเข้าสู่ระบบไม่ใช่; bash, ตระการ, ไม่เคยอ่าน~/.bashrcในเชลล์การเข้าสู่ระบบ)

โดยทั่วไปจะ~/.profileมีคำจำกัดความของตัวแปรสภาพแวดล้อมและอาจเริ่มบางโปรแกรมที่คุณต้องการเรียกใช้ครั้งเดียวเมื่อคุณเข้าสู่ระบบหรือสำหรับเซสชันทั้งหมด ~/.zshrcมีสิ่งที่ต้องทำสำหรับทุกเชลล์อินสแตนซ์เช่นนามแฝงและคำจำกัดความของฟังก์ชั่นการตั้งค่าตัวเลือกเชลล์การตั้งค่าความสมบูรณ์การตั้งค่าที่รวดเร็วการเชื่อมโยงคีย์ ฯลฯ


คำตอบที่ดี! ฉันได้สร้าง ~ / .zprofile และใส่บรรทัดตามที่คุณแนะนำ แต่ดูเหมือนจะไม่ทำอะไรเลย บางทีฉันควรใส่ไว้ใน. zshrc
shmichael

1
@shmichael: จากปฏิกิริยาของคุณฉันอาจไม่ได้ตีความคำถามของคุณในแบบที่คุณต้องการ ส่วนที่สองที่ฉันเพิ่มลงในคำตอบช่วยได้หรือไม่?
Gilles

ใช่กดจุด ดังนั้นหากฉันเข้าใจอย่างถูกต้องฉันต้องการประกาศเช่น PATH ใน. โปรไฟล์และชื่อแทนใน. zshrc
shmichael

@ user1419674 ขอบคุณสำหรับการแก้ไข แต่อย่าเพิ่มบันทึกการเปลี่ยนแปลงไปยังโพสต์ ไซต์นี้มีประวัติการแก้ไขในตัว
Gilles

69

คำตอบสั้น ๆ สำหรับคนที่ใจร้อน:

  1. ~/.profileไม่ได้โหลดโดยzshเมื่อเข้าสู่ระบบ
  2. zshโหลด~/.zprofileเมื่อเข้าสู่ระบบ
  3. zshโหลด~/.zshrcเมื่อเริ่มต้นเซสชันใหม่ของเทอร์มินัล

ต้องการข้อมูลเพิ่มเติมหรือไม่ ดูคำตอบที่ยอดเยี่ยมของ Gilles!


คำตอบที่ดี สิ่งที่คุณต้องการ
Django Reinhardt

21

นอกจากคำตอบของ Gilles ด้วย zsh รุ่นล่าสุดที่สมเหตุสมผลแล้วคุณสามารถทำสิ่งนี้:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

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


ฉันมีสิ่งนี้ใน ~ / .zprofile ของฉัน แต่ด้วยเหตุผลบางอย่างคำสั่งใน ~ / .profile จะไม่สามารถใช้ได้ในเชลล์ Ubuntu 15.04; zsh 5.0.7
friederbluemle

ยากที่จะวินิจฉัยโดยไม่มีรหัส
Frank Terbeck

ฉันลองใหม่อีกครั้งและดูเหมือนว่ามันจะใช้งานได้ในขณะนี้ ไม่แน่ใจว่ามันได้รับการแก้ไขในบางจุดหรือเกิดอะไรขึ้น รุ่น zsh คือ 5.1.1 ในขณะนี้
friederbluemle

5

ฉัน.zprofileเข้ากันได้กับ.profile(มีการเปลี่ยนแปลงเส้นทางเท่านั้น) ดังนั้นจึงต้องการเพียง:

ln -s .profile .zprofile

0

zshเอกสารที่ผมมีในมือเพียงกล่าวถึง/etc/profileและ~/.profileเปลือกหอยเข้าสู่ระบบในการดวลจุดโทษ / kshโหมดที่เข้ากัน

% zsh --version
zsh 4.3.10 
% cat ~/.profile
echo 'Running ~/.profile...'

เชลล์โหมดการเข้าสู่ระบบแบบเนทีฟ (argv [0] เริ่มต้นด้วย-) ไม่ได้ใช้~/.profile(จะใช้~/.zprofileแม้ว่า):

% zsh -c 'exec -a -zsh zsh' </dev/null

(ไม่มีเอาต์พุต)

ดวลจุดโทษ / kshเข้ากันได้หอยโหมดเข้าสู่ระบบใช้ .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.