बैश उपनामों को व्यक्तिगत घर निर्देशिकाओं में .bash_aliases
या .bashrc
फाइलों में जाना चाहिए । यदि आपको वैश्विक बैश उपनाम बनाने हैं, तो वे अंदर जा सकते हैं /etc/bash.bashrc
, लेकिन अक्सर उन्हें केवल उन फ़ाइलों .bash_aliases
या .bashrc
फाइलों में जोड़ना सबसे अच्छा होता है, /etc/skel
ताकि वे नए बनाए गए उपयोगकर्ताओं को विरासत में मिले।
यह है लगभग हमेशा गलत में में एक उपनाम परिभाषित करने के लिए .profile
, .bash_profile
या /etc/profile
।
यह समझने के लिए कि, किसी को यह समझना चाहिए कि इन फ़ाइलों में से प्रत्येक को किन परिस्थितियों से चलाया जाता है। इस बारे में गलत धारणाएं हैं, जिन्हें मैं नीचे संबोधित करता हूं।
भले ही आप कई उपयोगकर्ताओं के लिए उपनामों को परिभाषित करना चाहते हैं, आपको इस बात से परिचित होना चाहिए कि वे अलग-अलग उपयोगकर्ताओं के लिए कैसे परिभाषित किए जाते हैं, ताकि आप अपनी ज़रूरत के सर्वोत्तम तरीके पर निर्णय ले सकें।
व्यक्तिगत उपयोगकर्ताओं के लिए उपनाम
खासकर यदि आप एक GUI का उपयोग करते हैं, तो आपके अधिकांश इंटरेक्टिव गोले संभवतः गैर-लॉगिन गोले हैं। यहां तक कि अगर आप कभी GUI का उपयोग नहीं करते हैं, तो भी आप शायद कुछ आवृत्ति के साथ गैर-लॉगिन गोले का उपयोग करते हैं । आप अपने उपनामों को इन गोले में काम करना चाहते हैं।
खासकर यदि आप कभी भी गैर-रेखीय रूप से वर्चुअल कंसोल में या एसएसएच के माध्यम से लॉग इन करते हैं, तो आप शायद कुछ समय के लिए गोले का उपयोग करते हैं। तो आप चाहते हैं कि आपका उपनाम इंटरैक्टिव लॉगिन गोले में भी काम करे।
जब एक इंटरैक्टिव, गैर-लॉगिन शेल शुरू होता है , तो यह .bashrc
उपयोगकर्ता के होम डायरेक्टरी में होता है। उबंटू में डिफ़ॉल्ट रूप से, प्रत्येक उपयोगकर्ता के .bashrc
स्वयं के स्रोत .bash_aliases
, यदि यह मौजूद है।
- किसी फ़ाइल को स्रोत करने के लिए अपनी सामग्री को वर्तमान शेल में चलाने का कारण है । किसी फ़ाइल में बनाई गई शेल वातावरण में परिवर्तन, जो फ़ाइल में सभी कमांड चलने के बाद भी बना रहता है।
उबंटू के डिफ़ॉल्ट में टिप्पणियाँ पढ़ी .bashrc
पता चलता है कि यह है आधिकारिक तौर पर इरादा है कि उपनाम में जाना .bashrc
या .bash_aliases
। .bashrc
पहले से ही कुछ अन्य परिभाषाएँ हैं ( grep '^[[:blank:]]*alias' ~/.bashrc
उन्हें देखने के लिए दौड़ें ), और इस तरह की नई परिभाषाएँ कहाँ रखें, इस बारे में स्पष्ट सलाह देता है:
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
लेकिन इंटरैक्टिव लॉगिन गोले के बारे में क्या ? इसके बजाय .bashrc
, लॉगिन गोले स्रोत .profile
।
- ... जब तक
.bash_login
मौजूद नहीं है, तब तक इसके बजाय खट्टा हो जाता है।
- ... जब तक
.bash_profile
मौजूद है, तो यह बजाय sourced हो जाता है।
हालांकि, अच्छी खबर यह है कि उबंटू में डिफ़ॉल्ट रूप से, है में आदेश .bashrc
होगा भी इंटरैक्टिव लॉगिन गोले में चला क्योंकि डिफ़ॉल्ट .profile
जांच करता है कि वर्तमान खोल bash है (और यदि .bashrc
मौजूद है), और यदि हां, सूत्रों का कहना है .bashrc
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
मेरा सुझाव है कि उपयोगकर्ता .bash_aliases
अपने घर निर्देशिकाओं में नए बैश उपनामों को परिभाषित करें (यदि यह पहले से मौजूद नहीं है तो इसे बनाना)। यह एक विशेष रूप से स्वच्छ और सरल तरीका है, जो प्रति उपयोगकर्ता स्तर पर उपनाम की परिभाषा को स्थायी बनाता है।
उपनामों को परिभाषित नहीं किया जाना चाहिए.profile
क्योंकि वे गैर-लॉगिन गोले में अपरिभाषित रहेंगे। बैश शेल के अधिकांश वातावरण के विपरीत, एलियाज़ को बच्चे के गोले में निर्यात नहीं किया जाता है:
ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found
विशेष रूप से, डिफ़ॉल्ट रूप से अधिकांश डेस्कटॉप वातावरण .profile
चित्रमय लॉगिन पर स्रोत बनाए जाते हैं, लेकिन:
- यह आवश्यक रूप से बैश शेल द्वारा नहीं किया जाता है, इसलिए अन्य परिभाषाओं को संसाधित भी नहीं किया जा सकता है, और इससे भी महत्वपूर्ण बात
- यहां तक कि अगर उर्फ परिभाषाओं को संसाधित किया जाता है, तो वे बाल प्रक्रियाओं पर पारित नहीं होते हैं । विशेष रूप से, वे एक टर्मिनल विंडो खोलकर बनाए गए गोले पर पारित नहीं होते हैं!
उपनाम को.bash_profile
.bash_login
उसी कारण से (या ) में परिभाषित नहीं किया जाना चाहिए , बल्कि किसी अन्य कारण से भी। Naively इन फ़ाइलों में से एक बना रहा है और इसमें केवल अन्य परिभाषाएँ डाल रहा है और किसी भी कोड .profile
को चलने से रोकता है !
ऐसी स्थितियों में जहां .bash_profile
या .bash_login
वास्तव में उपयोगी है, आम तौर पर उनमें .profile
कहीं एक स्रोत है, जो उस समस्या को हल करता है। (तब केवल शेष समस्या यह है कि जैसे .profile
, उपनामों को परिभाषित करना .bash_profile
या .bash_login
सही काम नहीं करना।)
नए व्यक्तिगत उपयोगकर्ताओं के लिए उपनाम , स्वचालित रूप से
जब एक वास्तविक मानव का प्रतिनिधित्व करने के लिए इच्छित प्रकार का एक उपयोगकर्ता खाता बनाया जाता है, तो एक नई निर्देशिका आमतौर पर उनके घर की निर्देशिका के रूप में बनाई जाती है। सामग्री /etc/skel
को फिर उनके घर निर्देशिका में कॉपी किया जाता है। यह है कि कैसे कई उपयोगकर्ताओं को अपने घर निर्देशिका में कुछ इसी तरह की विन्यास फाइल के साथ शुरू करते हैं। उबंटू में, यह भी शामिल है .profile
, .bashrc
और कुछ अन्य फ़ाइलों।
नए उपयोगकर्ताओं के लिए उपनाम क्या हैं, इसे बदलने के लिए, आप बस उन्हें डाल सकते हैं /etc/skel/.bash_aliases
(आपको इसे बनाना होगा) या /etc/skel/.bashrc
।
यदि आप पहले से मौजूद फ़ाइल को संपादित करते हैं, तो आप /etc/skel
इसे पहले बैकअप देना चाहते हैं - लेकिन आपको बैकअप को नहीं रखना चाहिए /etc/skel
, या इसे नए उपयोगकर्ताओं के होम निर्देशिका में कॉपी किया जाएगा।
यह संभवतः आपके लिए कई उपयोगकर्ताओं के लिए नए उपनाम जोड़ने का सबसे अच्छा तरीका है। मौजूदा उपयोगकर्ता केवल खुद को उपनाम जोड़ सकते हैं। यदि आप उपनामों को परिभाषित करते हैं /etc/skel/.bash_aliases
, तो आप बस उन्हें उस फ़ाइल पर निर्देशित कर सकते हैं, जिसे वे अपने होम निर्देशिका में कॉपी करना चुन सकते हैं (या अपनी स्वयं की कस्टम .bash_aliases
फ़ाइल में जोड़ सकते हैं )।
यह उपयोगकर्ता के लिए एक उपनाम को अपरिभाषित करने के लिए तुच्छ है। इसके अतिरिक्त, उपनाम बेहद मजबूत नहीं हैं ; वे केवल विशेष परिस्थितियों में काम करते हैं। यदि आपको एक नई कमांड बनाने की आवश्यकता है जो हर समय काम करती है, तो सभी के लिए , आपको उस आदेश को एक उपनाम के रूप में लागू नहीं करना चाहिए। और आप सफलतापूर्वक उन उपयोगकर्ताओं पर एलियंस को मजबूर नहीं कर सकते जो उन्हें नहीं चाहते हैं - वे बस unalias
उन्हें कर सकते हैं।
वैश्विक उपनाम, सभी उपयोगकर्ताओं के लिए
यद्यपि मैं आपको इस दृष्टिकोण से बचने की सलाह देता हूं, आप वैश्विक फ़ाइल में उपनामों को परिभाषित कर सकते हैं । फिर उन्हें इंटरएक्टिव नॉन-लॉगिन शेल के लिए और इंटरेक्टिव लॉगिन शेल के लिए परिभाषित किया जाएगा। उपयोगकर्ता के होम डायरेक्टरी में किसी भी फाइल के खट्टे होने से पहले , इसका कारण है : /etc/bash.bashrc
- लॉगिन गोले (और केवल लॉगिन गोले और लॉगिन गोले की तरह व्यवहार करने वाली अन्य प्रक्रियाएं)
/etc/profile
स्वचालित रूप से कमांड चलाते हैं ।
- केवल गैर-लॉगिन शेल
/etc/bash.bashrc
स्वचालित रूप से कमांड चलाते हैं , लेकिन
- उबंटू की डिफ़ॉल्ट
/etc/profile
जाँच करता है कि रनिंग शेल बैश है (और यदि /etc/bash.bashrc
मौजूद है) और, यदि हां, तो स्रोत /etc/bash.bashrc
।
यह इस बात के अनुरूप है कि शेल .profile
प्रति .bashrc
bash (जैसा कि ऊपर विस्तृत है) प्रति डिफ़ॉल्ट उपयोगकर्ता प्रति उपयोगकर्ता कैसे करता है ।
यह देखने के लिए कि डिफ़ॉल्ट में कैसा दिखता है /etc/profile
:
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
वह ब्लॉक अन्य कार्यों को भी करता है। विशेष रूप से, बाहरी if
जांचें कि यदि शेल संवादात्मक होने की संभावना है (यह जांच कर कि शीघ्र पाठ गैर-रिक्त है), तो यह जांचता है कि क्या वर्तमान शेल बैश है और स्रोत /etc/bash.bashrc
यदि यह है, और यदि वह काम नहीं करता है, तो बैश के लिए में पहले से ही है /etc/bash.bashrc
।
आपको वैश्विक उपनामों को परिभाषित नहीं करना चाहिए /etc/profile
उसी कारण से उपयोगकर्ताओं को उन्हें अपने स्थानीय .profile
एस में परिभाषित नहीं करना चाहिए : यदि आप करते हैं, तो उन्हें केवल लॉगिन गोले के लिए परिभाषित किया जाएगा, न कि उनके बच्चे के गोले के लिए।
अंत में, ध्यान दें कि डिफ़ॉल्ट प्रति उपयोगकर्ता के विपरीत .bashrc
, डिफ़ॉल्ट /etc/bash.bashrc
फ़ाइल में उपनामों के बारे में कुछ भी नहीं है। उपयोगकर्ताओं को किसी फ़ाइल में उपनाम देना असामान्य है जहां वे उन्हें संपादित या अक्षम नहीं कर सकते। (बेशक, वे अभी भी कर सकते हैं कि करते हैं, अपने खुद के स्थानीय में उनकी परिभाषा अधिभावी द्वारा .bashrc
, .bash_aliases
, या कहीं और।)
आगे की पढाई