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


138

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

जवाबों:


193

.profile बनाम .zprofile

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

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

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

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

emulate sh
. ~/.profile
emulate zsh

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

.zprofile बनाम .zshrc

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

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

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


बहुत बढ़िया जवाब! मैंने ~ / .zprofile बनाया है और आपके द्वारा सुझाए अनुसार लाइन डाल दी है, लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है। शायद मुझे इसे .zshrc में डालना चाहिए?
श्मशील सेप

1
@ श्मशान: आपकी प्रतिक्रिया को देखते हुए, मैंने आपके प्रश्न की व्याख्या उस तरीके से नहीं की होगी जिस तरह से आपने इसे किया था। क्या दूसरा खंड जो मैंने अपने उत्तर सहायता में जोड़ा है?
गिल्स

हाँ, मौके मारा। इसलिए अगर मैं सही ढंग से समझूं तो मैं चाहूंगा कि .GH पर और PATH घोषणाएँ .zprofile और उपनाम पर।
शिखमेल

@ user1419674 सुधार के लिए धन्यवाद, लेकिन पोस्ट में परिवर्तन लॉग न जोड़ें। साइट में एक अंतर्निहित संशोधन इतिहास है।
गाइल्स

62

अधीर लोगों के लिए छोटा जवाब:

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

अधिक जानकारी की आवश्यकता है? गाइल्स का शानदार जवाब देखिए!


बहुत बढ़िया जवाब। बस आपको क्या चाहिए।
Django रेइनहार्ट

20

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

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

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


मेरे पास यह मेरे ~ / .zprofile में है, लेकिन किसी कारणवश ~ / .profile में बयान मेरे शेल में उपलब्ध नहीं हैं। उबंटू 15.04; zsh 5.0.7
फ्राइडेरब्लुमेले

कोड के बिना निदान करना मुश्किल है।
फ्रैंक टेरबेक

मैंने बस फिर से कोशिश की, और ऐसा लग रहा है कि यह अब काम कर रहा है। निश्चित नहीं है कि यह किसी बिंदु पर तय किया गया था या क्या हुआ था। zsh संस्करण 5.1.1 है।
फ्राइडेरब्लुमेले

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...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.