ฉันเพิ่งติดตั้ง zsh บนระบบ Ubuntu ของฉัน ดูเหมือนว่า zsh ไม่ได้ดำเนินการ ~ / .profile กับ init เพื่อความเข้าใจที่ดีที่สุดของฉันนี่ควรเป็นพฤติกรรมอัตโนมัติ ฉันพลาดอะไรไป
ฉันเพิ่งติดตั้ง zsh บนระบบ Ubuntu ของฉัน ดูเหมือนว่า zsh ไม่ได้ดำเนินการ ~ / .profile กับ init เพื่อความเข้าใจที่ดีที่สุดของฉันนี่ควรเป็นพฤติกรรมอัตโนมัติ ฉันพลาดอะไรไป
คำตอบ:
.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
มีสิ่งที่ต้องทำสำหรับทุกเชลล์อินสแตนซ์เช่นนามแฝงและคำจำกัดความของฟังก์ชั่นการตั้งค่าตัวเลือกเชลล์การตั้งค่าความสมบูรณ์การตั้งค่าที่รวดเร็วการเชื่อมโยงคีย์ ฯลฯ
~/.profile
ไม่ได้โหลดโดยzsh
เมื่อเข้าสู่ระบบzsh
โหลด~/.zprofile
เมื่อเข้าสู่ระบบzsh
โหลด~/.zshrc
เมื่อเริ่มต้นเซสชันใหม่ของเทอร์มินัลต้องการข้อมูลเพิ่มเติมหรือไม่ ดูคำตอบที่ยอดเยี่ยมของ Gilles!
นอกจากคำตอบของ Gilles ด้วย zsh รุ่นล่าสุดที่สมเหตุสมผลแล้วคุณสามารถทำสิ่งนี้:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
... ซึ่งจะแหล่งไฟล์. profile ที่มีเอฟเฟ็กต์โหมด zsh และมันจะทำงานเฉพาะในช่วงแหล่งที่มา ดังนั้นคุณไม่ต้องบันทึกสถานะตัวเลือกปัจจุบันเพื่อเล่นซ้ำอีกครั้งหลังจากการจัดหา
ฉัน.zprofile
เข้ากันได้กับ.profile
(มีการเปลี่ยนแปลงเส้นทางเท่านั้น) ดังนั้นจึงต้องการเพียง:
ln -s .profile .zprofile
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...