Ubuntu को Bash स्क्रिप्ट के साथ सेट अप करने के बारे में मेरी हालिया पोस्ट में, मैंने .bashrc के जादू का संक्षेप में उल्लेख किया। यह वास्तव में इसके साथ न्याय नहीं करता था, इसलिए यहां एक त्वरित पोस्ट है जो Bash कॉन्फ़िगरेशन फाइल क्या कर सकती है, इसके बारे में थोड़ा अधिक विवरण प्रदान करती है।
मेरा वर्तमान कॉन्फ़िगरेशन मेरे वर्कफ़्लो को काफी हद तक सुधारता है, और मुझे उन कीस्ट्रोक्स के 50% से अधिक की बचत करता है जिन्हें मुझे इसके बिना उपयोग करना पड़ता! आइए एलियास, फंक्शन, और प्रॉम्प्ट कॉन्फ़िगरेशन के कुछ उदाहरण देखें जो हमें कम कुंजी दबाकर अधिक कुशल होने में मदद करके हमारे वर्कफ़्लो को सुधार सकते हैं।
Bash एलियास
एक स्मार्ट तरीके से लिखी गई .bashrc बहुत सारे कीस्ट्रोक्स बचा सकती है। हम इसका लाभ शाब्दिक अर्थ में bash एलियास का उपयोग करके उठा सकते हैं, या स्ट्रिंग्स जो बड़ी कमांड में विस्तारित होती हैं। एक सांकेतिक उदाहरण के लिए, यहां टर्मिनल में फाइल कॉपी करने के लिए एक Bash एलियास है:
# हमेशा डायरेक्टरी की सामग्री को (r)िकर्सिवली कॉपी करें और (v) बताएं कि क्या किया गया
alias cp='cp -rv'
alias कमांड वह स्ट्रिंग परिभाषित करता है जिसे हम टाइप करेंगे, उसके बाद वह जिससे वह स्ट्रिंग विस्तारित होगी। हम cp जैसे मौजूदा कमांड को ओवरराइड कर सकते हैं। अपने आप में, cp कमांड केवल फाइलों को कॉपी करेगा, डायरेक्टरी को नहीं, और चुपचाप सफल होगा। इस एलियास के साथ, हमें उन दो फ्लैग को पास करना याद रखने की आवश्यकता नहीं है, न ही अपने कॉपी की गई फाइल के स्थान पर cd या ls करके पुष्टि करें कि यह वहां है! अब, सिर्फ उन दो कीस्ट्रोक्स (c और d के लिए) वह सब हमारे लिए करेंगे।
यहां सामान्य कार्यों के साथ फ्लैग पास करने के लिए कुछ और .bashrc एलियास हैं।
# फाइल प्रकारों के लिए रंगों के साथ सामग्री सूचीबद्ध करें, (A)लमोस्ट सभी छिपी फाइलें (बिना . और ..), (C)कॉलम में, क्लास इंडिकेटर (F) के साथ
alias ls='ls --color=auto -ACF'
# फाइल प्रकारों के लिए रंगों के साथ सामग्री सूचीबद्ध करें, (a)लग सभी छिपी एंट्री (। और .. सहित), (l)ॉन्ग लिस्टिंग फॉर्मेट का उपयोग करें, क्लास इंडिकेटर (F) के साथ
alias ll='ls --color=auto -alF'
# फाइल ले जाते समय बताएं (v) कि क्या किया गया
alias mv='mv -v'
# किसी भी नॉन-मौजूद (p)अरेंट डायरेक्टरी बनाएं और बताएं (v) कि क्या किया गया
alias mkdir='mkdir -pv'
# हमेशा आंशिक रूप से डाउनलोड की गई फाइल को (c)आन्टिन्यू करने का प्रयास करें
alias wget='wget -c'
लंबी कमांड टाइप करने से बचने के लिए एलियास काम आते हैं। यहां कुछ हैं जिनका मैं Python एनवायरनमेंट के साथ काम करते समय उपयोग करता हूं:
alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'
Bash एलियास समय बचाने के तरीकों पर आगे की प्रेरणा के लिए, मैं इस लेख में उदाहरणों की अत्यधिक अनुशंसा करता हूं।
Bash फंक्शन
उपरोक्त एलियास का एक नकारात्मक पक्ष यह है कि वेrather स्थिर हैं - वे हमेशा घोषित सटीक टेक्स्ट में विस्तारित होंगे। एक Bash एलियास के लिए जो आर्गुमेंट लेता है, हमें एक फंक्शन बनाने की आवश्यकता होगी। हम इसे इस तरह कर सकते हैं:
# डायरेक्टरी बदलने के बाद उसकी सामग्री दिखाएं
function cd () {
builtin cd "$1"
ls -ACF
}
मैं गिनना शुरू नहीं कर सकता कि मैंने कितनी बार cd टाइप किया है और फिर तुरंत ls टाइप किया है यह देखने के लिए कि मैं अब जिस डायरेक्टरी में हूं उसकी सामग्री क्या है। इस फंक्शन के सेट अप के साथ, यह सब सिर्फ उन दो अक्षरों के साथ होता है! फंक्शन पहले आर्गुमेंट, $1, को डायरेक्टरी बदलने के स्थान के रूप में लेता है, फिर उस डायरेक्टरी की सामग्री को फाइल प्रकार इंडिकेटर के साथ अच्छी तरह से फॉर्मेट किए गए कॉलम में प्रिंट करता है। builtin भाग Bash को इस डिफ़ॉल्ट कमांड को ओवरराइड करने की अनुमति देने के लिए आवश्यक है।
Bash फंक्शन सॉफ्टवेयर डाउनलोड या अपग्रेड करने के मामले में भी बहुत उपयोगी हैं। मैंने पहले हर कुछ हफ्तों में स्टेटिक साइट जनरेटर Hugo के नए एक्सटेंडेड वर्जन को डाउनलोड करने में कम से कम कुछ मिनट बिताए, उनकी उत्कृष्ट शिपिंग फ्रीक्वेंसी के लिए धन्यवाद। एक फंक्शन के साथ, मुझे केवल वर्जन पास करने की आवश्यकता है, और अपग्रेड कुछ सेकंड में हो जाता है।
# Hugo इंस्टॉल या अपग्रेड
function gethugo () {
wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
sudo mv -f tmp/hugo /usr/local/bin/
rm -rf tmp/
hugo version
}
$@ नोटेशन केवल दिए गए सभी आर्गुमेंट लेता है, फंक्शन में अपने स्थान को प्रतिस्थापित करता है। उपरोक्त फंक्शन को चलाने और Hugo वर्जन 0.57.2 डाउनलोड करने के लिए, हम कमांड gethugo 0.57.2 का उपयोग करते हैं।
मेरे पास Golang के लिए भी एक है:
function getgolang () {
sudo rm -rf /usr/local/go
wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
rm -rf tmp/
go version
}
या वर्तमान रिपॉजिटरी के लिए GitLab में रिमोट ओरिजिन URL जोड़ने के बारे में एक फंक्शन कैसा रहेगा?
function glab () {
git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git
git remote -v
}
glab username के साथ, हम अपने username के साथ GitLab.com पर वर्तमान Git रिपॉजिटरी के लिए एक नया origin URL बना सकते हैं। एक नए रिमोट URL पर पुश करने से ऑटोमैटिकली एक नया प्राइवेट GitLab रिपॉजिटरी बन जाता है, इसलिए यह बैकअप बनाने के लिए एक उपयोगी शॉर्टकट है!
Bash फंक्शन वास्तव में केवल स्क्रिप्टिंग की संभावनाओं द्वारा सीमित हैं, जिनमें व्यावहारिक रूप से कुछ सीमाएं हैं। यदि ऐसा कुछ है जो हम लगातार आधार पर करते हैं जिसमें टर्मिनल में कुछ लाइनें टाइप करने की आवश्यकता होती है, तो हम शायद इसके लिए एक Bash फंक्शन बना सकते हैं!
Bash प्रॉम्प्ट
डायरेक्टरी सामग्री के अलावा, यह देखना भी उपयोगी है कि हम जिस डायरेक्टरी में हैं उसका पूरा पथ। Bash प्रॉम्प्ट हमें इस पथ को दिखा सकता है, साथ ही हमारी वर्तमान Git ब्रांच जैसी अन्य उपयोगी जानकारी। इसे अधिक पठनीय बनाने के लिए, हम प्रॉम्प्ट के प्रत्येक भाग के लिए रंग परिभाषित कर सकते हैं। यहां बताया गया है कि हम .bashrc में अपना प्रॉम्प्ट कैसे सेट कर सकते हैं ताकि यह पूरा हो सके:
# रंग कोड बोझिल हैं, इसलिए आइए उन्हें नाम दें
txtcyn='\[\e[0;96m\]' # Cyan
txtpur='\[\e[0;35m\]' # Purple
txtwht='\[\e[0;37m\]' # White
txtrst='\[\e[0m\]' # Text Reset
# प्रॉम्प्ट के किस भाग के लिए कौन सा (C)रंग?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"
# हमारी ब्रांच का नाम प्राप्त करें और इसके चारों ओर पैरेंथेसिस रखें
gitBranch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# प्रॉम्प्ट बनाएं
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "
परिणाम:
~/github/myrepo (master) $
रंगों को नाम देने से यह पहचानना आसान हो जाता है कि एक रंग कहां शुरू और रुकता है, और अगला कहां शुरू होता है। हम अपने टर्मिनल में जो प्रॉम्प्ट देखते हैं वह export PS1 के बाद की स्ट्रिंग द्वारा परिभाषित होता है, जिसमें प्रॉम्प्ट के प्रत्येक घटक को एस्केप सीक्वेंस के साथ सेट किया जाता है। आइए इसे तोड़ें:
\wवर्तमान वर्किंग डायरेक्टरी प्रदर्शित करता है,\$(gitBranch)ऊपर परिभाषितgitBranchफंक्शन को कॉल करता है, जो वर्तमान Git ब्रांच प्रदर्शित करता है,\$सामान्य उपयोगकर्ता या सामान्य उपयोगकर्ता मोड में होने पर "$" प्रदर्शित करेगा, और रूट होने पर "#"।
Bash एस्केप सीक्वेंस की पूरी सूची हमें समय और तारीख सहित कई और जानकारी प्रदर्शित करने में मदद कर सकती है! Bash प्रॉम्प्ट अत्यधिक अनुकूलन योग्य और व्यक्तिगत हैं, इसलिए इसे किसी भी तरह से सेट करने के लिए स्वतंत्र महसूस करें जो आपको पसंद हो।
यहां कुछ विकल्प हैं जो जानकारी को सामने और केंद्र में रखते हैं और हमें अधिक कुशलता से काम करने में मदद कर सकते हैं।
टालमटोल-विरोधी के लिए
उपयोगकर्ता नाम और वर्तमान समय सेकंड के साथ, 24-घंटे HH:MM:SS फॉर्मेट में:
export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >
उन लोगों के लिए जो हमेशा जानना पसंद करते हैं कि वे कहां खड़े हैं
पूरा फाइल पथ एक अलग लाइन पर, और उपयोगकर्ता नाम:
export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo
user:
न्यूनतावादी के लिए
export PS1=">"
>
हम केवल बुनियादी एस्केप सीक्वेंस के साथ कई व्यावहारिक प्रॉम्प्ट बना सकते हैं; एक बार जब हम प्रॉम्प्ट के साथ फंक्शन को एकीकृत करना शुरू करते हैं, जैसे Git ब्रांच उदाहरण में, चीजें वास्तव में जटिल हो सकती हैं। यह मात्रा जटिलता आपकी उत्पादकता के लिए एक अतिरिक्त है या नुकसान, केवल आप निश्चित रूप से जान सकते हैं!
त्वरित खोज के साथ आसानी से उपलब्ध प्रोग्राम के साथ कई फैंसी Bash प्रॉम्प्ट संभव हैं। मैंने जानबूझकर यहां नमूने प्रदान नहीं किए हैं क्योंकि, ठीक है, यदि आप इस सामान के बारे में उतना ही उत्साहित हो सकते हैं जितना मैं हो सकता हूं, तो इससे पहले कि आप वापस उस चीज़ पर पहुंचें जो आप इस पोस्ट को पढ़ना शुरू करने से पहले कर रहे थे, कुछ घंटे हो सकते हैं, और मैं बस अपने विवेक पर यह नहीं रख सकता।
हमने अब अपने Bash कॉन्फ़िगरेशन फाइल से निवेश किए गए समय और प्राप्त उपयोगिता के बीच एक अच्छा संतुलन बनाने की उम्मीद की है! मुझे आशा है कि आप अपनी नई-नई कीस्ट्रोक क्षमता का उपयोग अच्छे के लिए करेंगे।