सवाल Zsh मार नहीं ~ / .profile


मैंने अभी अपने उबंटू सिस्टम पर zsh स्थापित किया है। ऐसा लगता है कि zsh init पर ~ / .profile निष्पादित नहीं कर रहा है। मेरी सबसे अच्छी समझ के लिए, यह एक स्वचालित व्यवहार होना चाहिए। मैं क्या खो रहा हूँ?


107
2017-09-12 07:20


मूल




जवाब:


.profile बनाम .zprofile

जेएसएच रन ~/.zprofile, नहीं ~/.profile, जब इसे लॉगिन खोल के रूप में बुलाया जाता है। इसका कारण यह है कि स्क्रिप्ट को तोड़ने के लिए zsh में मानक गोले के साथ पर्याप्त असंगतताएं होती हैं।

जेएसएच चलाता है ~/.profile अगर इसे कहा जाता है sh या ksh। लेकिन अगर आपका लॉग इन करते समय zsh प्रॉम्प्ट प्राप्त करना है, तो यह कोई मदद नहीं है।

आप बना सकते /bin/sh आपका लॉगिन खोल और शामिल करें export SHELL=/bin/zsh आपके में ~/.profile। फिर जब आप टर्मिनल खोलते हैं, टर्मिनल zsh लॉन्च करेगा (कुछ टर्मिनल अनुकरणकर्ताओं को छोड़कर इसका पालन नहीं करते हैं $SHELL सेटिंग)। लेकिन आप अभी भी होगा sh जब आप ssh पर लॉग इन करते हैं। इसे शामिल करके उपचार किया जा सकता है exec zsh के अंत में ~/.profile (यह zsh द्वारा चल रहे खोल को प्रतिस्थापित करता है), लेकिन आपको केवल इंटरैक्टिव लॉगिन के लिए ऐसा करने के लिए सावधान रहना चाहिए और जब नहीं ~/.profile एक्स स्क्रिप्ट प्रारंभ जैसी अन्य स्क्रिप्ट्स से शामिल है (एक अच्छा परीक्षण द्वारा प्राप्त मूल प्रक्रिया का नाम है ps -o comm= $PPID: अगर यह है sshd या su, तो यह सुरक्षित है exec)।

Zsh और run के साथ दोनों काम करने का सबसे आसान समाधान ~/.profile एक बनाना है ~/.zprofile जो चलते समय श्यू इम्यूलेशन मोड में प्रवेश करता है ~/.profile:

emulate sh
. ~/.profile
emulate zsh

यदि आपके पास हाल ही में पर्याप्त zsh है (उबंटू पर, इसका मतलब है कि स्पष्ट, मुझे लगता है), तो आप इसे सरल बना सकते हैं emulate sh -c '. ~/.profile'

.zprofile बनाम .zshrc

फ़ाइल ~/.profile द्वारा भरा हुआ है लॉग इन करें गोले। लॉगिन खोल पहली प्रक्रिया है जिसे आप पाठ मोड में लॉग इन करते समय प्रारंभ करते हैं, उदाहरण के लिए टेक्स्ट कंसोल पर या एसएसएच के माध्यम से। डिफ़ॉल्ट रूप से, अधिकांश लिनक्स मशीनों पर, लॉगिन खोल बैश होता है, लेकिन आप इसे बदल सकते हैं chsh आदेश, या उबंटू में "उपयोगकर्ता सेटिंग्स" जैसे किसी अन्य टूल के माध्यम से। जब यह एक लॉगिन खोल है, तो बैश पढ़ता है ~/.bash_profile यदि यह मौजूद है और ~/.profile, जबकि zsh केवल पढ़ता है ~/.zprofile (क्योंकि इसका वाक्यविन्यास पारंपरिक sh के साथ पूरी तरह से संगत नहीं है)। अधिकांश विन्यास के तहत, ~/.profile जब आप ग्राफ़िकल डिस्प्ले मैनेजर में लॉग इन करते हैं तो X सत्र स्टार्टअप स्क्रिप्ट द्वारा भी लोड किया जाता है।

जब आप टर्मिनल एमुलेटर शुरू करते हैं और शेल प्रॉम्प्ट प्राप्त करते हैं, या जब आप एक खोल को स्पष्ट रूप से प्रारंभ करते हैं, तो आपको एक खोल मिलता है जो लॉगिन खोल नहीं है। जबसे ~/.profile (या ~/.zprofile) उन आदेशों के लिए है जिन्हें आप लॉग इन करते समय निष्पादित करना चाहते हैं, एक गैर-लॉगिन खोल इस फ़ाइल को नहीं पढ़ता है। इसके बजाय, जब आप एक इंटरैक्टिव zsh शुरू करते हैं, तो यह पढ़ता है ~/.zshrc। (ज़ेड पढ़ता है ~/.zshrc सभी इंटरैक्टिव गोले में, चाहे वे लॉगिन गोले हैं; बाश, अजीब, कभी नहीं पढ़ता है ~/.bashrc लॉगिन गोले में।)

आमतौर पर, ~/.profile पर्यावरण परिवर्तनीय परिभाषाएं हैं, और कुछ प्रोग्राम शुरू कर सकते हैं जिन्हें आप लॉग इन करते समय या पूरे सत्र के लिए चलाने के लिए चाहते हैं; ~/.zshrc ऐसी चीजें हैं जो प्रत्येक खोल उदाहरण के लिए की जानी चाहिए, जैसे उपनाम और फ़ंक्शन परिभाषाएं, खोल विकल्प सेटिंग्स, समापन सेटिंग्स, त्वरित सेटिंग्स, कुंजी बाइंडिंग इत्यादि।


155
2017-09-12 10:37



बहुत बढ़िया जवाब! मैंने ~ / .zprofile बनाया है और जैसा आपने सुझाव दिया है लाइन डालें, लेकिन ऐसा कुछ नहीं लगता है। शायद मुझे इसे .zshrc में रखना चाहिए? - shmichael
@shmichael: आपकी प्रतिक्रिया को देखते हुए, मैंने आपके प्रश्न का अर्थ उस तरीके से नहीं समझाया जिस तरह से आपने इसका इरादा किया था। क्या मेरे द्वारा मेरे उत्तर में जोड़ा गया दूसरा खंड मदद करता है? - Gilles
हाँ, जगह मारा। तो अगर मैं सही ढंग से समझता हूं तो मैं चाहता हूं उदा। .Zshrc पर .zprofile और उपनाम पर पैथ घोषणाएं। - shmichael
@ user1419674 सुधार के लिए धन्यवाद, लेकिन पोस्ट में परिवर्तन लॉग जोड़ें नहीं। साइट में एक अंतर्निहित संशोधन इतिहास है। - Gilles


अधीर लोगों के लिए संक्षिप्त जवाब:

  1. ~/.profile द्वारा लोड नहीं किया गया है zsh लॉगिन पर
  2. zsh भार ~/.zprofile लॉगिन पर
  3. zsh भार ~/.zshrc एक नया टर्मिनल सत्र शुरू करते समय।

अधिक जानकारी चाहिए? गिल्स के शानदार उत्तर को देखो!


42
2018-03-21 13:38



एक त्वरित, स्कैन करने योग्य उत्तर के लिए +2 - dreftymac


गिल्स के उत्तर के अलावा, ज़ेड के एक उचित हाल के संस्करण के साथ आप यह कर सकते हैं:

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

... जो प्रभावशाली रूप से zsh के sh-mod के साथ .profile फ़ाइल को स्रोत करेगा। और यह स्रोत के दौरान केवल सक्रिय है। इसलिए आपको सोर्सिंग के बाद इसे फिर से चलाने के लिए वर्तमान विकल्प स्थिति को सहेजने की आवश्यकता नहीं है।


16
2018-03-09 22:20



मेरे पास यह ~ / .zprofile में है, लेकिन किसी कारण से ~ / .profile में बयान मेरे खोल में उपलब्ध नहीं हैं। उबंटू 15.04; zsh 5.0.7 - friederbluemle
कोड के बिना निदान करना मुश्किल है। - Frank Terbeck
मैंने अभी कोशिश की, और ऐसा लगता है कि यह अब काम कर रहा है। निश्चित नहीं है कि यह किसी बिंदु पर तय किया गया था या क्या हुआ। zsh संस्करण अब 5.1.1 है। - friederbluemle


मेरे पास है .zprofile के साथ संगत .profile (केवल पैथ परिवर्तन शामिल हैं), इसलिए केवल आवश्यकता है:

ln -s .profile .zprofile

4
2018-04-14 15:30





zsh प्रलेखन मेरे हाथ में केवल उल्लेख है /etc/profile तथा ~/.profile लॉगिन गोले के लिए /क्ष अनुकूलता प्रणाली।

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

मूल मोड लॉगिन खोल (argv [0] के साथ शुरू होता है -) का उपयोग नहीं करता है ~/.profile (यह उपयोग करेगा ~/.zprofile हालांकि):

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

(उत्पादन नही)

/क्ष compatability मोड लॉगिन शैल का उपयोग करता है। प्रोफाइल:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...

0
2017-09-12 09:20