कंप्यूटिंग में, एक वेरिएबल एक शब्द है जो एक ऐसे मान के लिए खड़ा होता है जो बदल सकता है। आप सामान्य भाषण में हर दिन वेरिएबल का उपयोग करते हैं, हालांकि आप उन्हें वेरिएबल नहीं मानते। जब आप "मेरी कार" कहते हैं, तो आप "मेरी कार" को एक प्रकार के वेरिएबल के रूप में उपयोग कर रहे हैं जो उस कार को संदर्भित करता है जो आपके पास उस समय होती है। मेक और मॉडल आपके जीवन के दौरान निश्चित रूप से बदल जाएगा जैसे ही आप पुरानी कार को नई से बदलते हैं, लेकिन "मेरी कार" वेरिएबल बनाकर आपको हर बार अपने वाहन का उल्लेख करने पर वर्तमान में आपके पास किस तरह की कार है इसके बारे में विस्तार से बताने की आवश्यकता नहीं है।
कंप्यूटर पर, वेरिएबल का उपयोग इसी तरह से किया जाता है।
उदाहरण के लिए, कंप्यूटर पर उपयोगकर्ता खाते वाले किसी भी व्यक्ति की एक होम डायरेक्टरी होती है जहां कंप्यूटर उनका व्यक्तिगत डेटा रखता है। लेकिन प्रत्येक उपयोगकर्ता की एक अलग होम डायरेक्टरी होती है (/home/seth सेथ के लिए, /home/tux टक्स के लिए, और इसी तरह प्रत्येक उपयोगकर्ता के लिए), इसलिए जब आप जेनेरिक रूप से होम डायरेक्टरी को संदर्भित करना चाहते हैं, तो आप $HOME वेरिएबल का उपयोग कर सकते हैं ताकि वर्तमान उपयोगकर्ता की होम डायरेक्टरी को इंगित किया जा सके, भले ही उपयोगकर्ता का लॉगिन नाम कुछ भी हो।
एनवायरनमेंट वेरिएबल विशेष वेरिएबल हैं (जैसे $HOME) जिनमें आपके लॉगिन सत्र के बारे में जानकारी होती है। वे सिस्टम शेल द्वारा कमांड निष्पादित करते समय उपयोग के लिए स्टोर किए जाते हैं। वे मौजूद हैं चाहे आप लिनक्स, मैक, या विंडोज का उपयोग कर रहे हों। इनमें से कई वेरिएबल डिफ़ॉल्ट रूप से इंस्टॉलेशन या उपयोगकर्ता निर्माण के दौरान सेट होते हैं।
जबकि एनवायरनमेंट वेरिएबल सभी आधुनिक सिस्टम पर लागू होते हैं, यह लेख विशेष रूप से लिनक्स, BSD, मैक, और Cygwin पर बैश शेल में एनवायरनमेंट वेरिएबल को संबोधित करता है।
एनवायरनमेंट वेरिएबल को समझना
एनवायरनमेंट वेरिएबल तकनीकी रूप से वेरिएबल से अलग नहीं हैं। उन्हें वेरिएबल के लिए उपयोग किए जाने वाले ठीक उसी सिंटैक्स के साथ सेट, याद किया और क्लियर किया जा सकता है। यदि आप बैश में वेरिएबल का उपयोग करने के आदी नहीं हैं, तो जारी रखने से पहले मेरा बैश में वेरिएबल लेख पढ़ें।
आप अक्सर एनवायरनमेंट वेरिएबल का सीधे उपयोग नहीं करते हैं। उन्हें व्यक्तिगत एप्लिकेशन और डेमन द्वारा आवश्यकतानुसार संदर्भित किया जाता है। उदाहरण के लिए, जब आप लॉग इन करते हैं तो आपकी होम डायरेक्टरी एक एनवायरनमेंट वेरिएबल के रूप में सेट होती है। उदाहरण के लिए, लिनक्स पर आप अपने HOME एनवायरनमेंट वेरिएबल की सामग्री को इस तरह देख सकते हैं:
$ echo $HOME
HOME=/home/seth
मैक पर:
$ echo $HOME
HOME=/Users/bogus
विंडोज पर:
C:\Users\bogus
आप env कमांड के साथ अपने सिस्टम पर सेट सभी एनवायरनमेंट वेरिएबल देख सकते हैं। सूची लंबी है, इसलिए आउटपुट को more के माध्यम से पाइप करें ताकि इसे पढ़ना आसान हो:
$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=https://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]
एनवायरनमेंट वेरिएबल तब उपयोगी हो सकते हैं जब आप डिफ़ॉल्ट सेटिंग्स को ओवरराइड करना चाहते हैं, या जब आपको नई सेटिंग्स प्रबंधित करने की आवश्यकता होती है जिन्हें आपके सिस्टम के पास अपने आप बनाने का कोई कारण नहीं है। उदाहरण के लिए, जब आप एक कमांड टाइप करते हैं, तो आपके कंप्यूटर को यह जानने का एकमात्र कारण कि उस कमांड से मेल खाने वाले एप्लिकेशन को कैसे ढूंढना है, वह है कि PATH एनवायरनमेंट वेरिएबल उसे बताता है कि कहां देखना है। यह वेरिएबल आपके ऑपरेटिंग सिस्टम के लिए कमांड खोजने के लिए वैध डायरेक्टरी को सूचीबद्ध करता है, चाहे वह कमांड ls या cp हो, या फायरफॉक्स या ल्यूट्रिस जैसे ग्राफिकल एप्लिकेशन, या कुछ और।
विभिन्न एनवायरनमेंट वेरिएबल विभिन्न सिस्टम द्वारा उपयोग किए जाते हैं। आपका PATH वेरिएबल आपके टर्मिनल एमुलेटर के लिए महत्वपूर्ण है, उदाहरण के लिए, लेकिन जावा के लिए बहुत कम महत्वपूर्ण (जिसके अपने पाथ हैं, जो महत्वपूर्ण जावा लाइब्रेरी की ओर इंगित करते हैं)। हालांकि, USER वेरिएबल का उपयोग कई सिस्टम द्वारा यह पहचानने के तरीके के रूप में किया जाता है कि सेवा का अनुरोध कौन कर रहा है। उदाहरण के लिए, यदि आप मल्टी-यूजर सिस्टम पर हैं और अपने स्थानीय मेलबॉक्स की जांच करने की आवश्यकता है, तो आपका मेल कमांड जानता है कि MAIL और USER वेरिएबल के आधार पर किस मेल स्पूल को पुनः प्राप्त करना है।
एनवायरनमेंट वेरिएबल सेट करना
आमतौर पर, इंस्टॉलर प्रोग्राम, चाहे वह फेडोरा पर dnf हो, उबंटू पर apt, मैक पर brew, या एक कस्टम इंस्टॉलर, एक नए एप्लिकेशन के लिए आपके एनवायरनमेंट वेरिएबल को अपडेट करता है। कभी-कभी, हालांकि, जब आप अपने डिस्ट्रीब्यूशन के इच्छित टूलसेट के बाहर कुछ इंस्टॉल कर रहे होते हैं, तो आपको एनवायरनमेंट वेरिएबल को स्वयं प्रबंधित करना पड़ सकता है। या आप अपनी प्राथमिकताओं के अनुरूप एक एनवायरनमेंट वेरिएबल जोड़ना चुन सकते हैं। यदि आप तय करते हैं कि आप अपने होम डायरेक्टरी में स्थित bin फोल्डर में कुछ एप्लिकेशन रखना चाहते हैं, तो आपको उस डायरेक्टरी को अपने PATH में जोड़ना होगा ताकि आपका ऑपरेटिंग सिस्टम जान सके कि जब आप कमांड जारी करते हैं तो वहां एप्लिकेशन ढूंढने के लिए।
अस्थायी एनवायरनमेंट वेरिएबल
आप अपने पाथ में एक स्थान को उसी तरह जोड़ सकते हैं जैसे आप थ्रो-अवे वेरिएबल बनाते हैं। यह काम करता है, लेकिन केवल तब तक जब तक आप अपने सिस्टम पाथ को संशोधित करने के लिए उपयोग किए गए शेल खुला रहता है। उदाहरण के लिए, एक बैश शेल खोलें और अपने सिस्टम पाथ को संशोधित करें:
$ export PATH=$PATH:/home/seth/bin
परिणाम की पुष्टि करें:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
सत्र बंद करें:
$ exit
एक नया खोलें और PATH वेरिएबल पर एक नज़र डालें:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
यह वेरिएबल अपनी डिफ़ॉल्ट स्थिति में वापस आ गया है क्योंकि PATH प्रत्येक नए शेल के साथ सेट नहीं हो रहा है। उसके लिए, आपको अपने वेरिएबल को कॉन्फ़िगर करना होगा ताकि वे हर बार शेल लॉन्च होने पर लोड हों।
स्थायी एनवायरनमेंट वेरिएबल
आप अपने स्वयं के स्थायी एनवायरनमेंट वेरिएबल को अपनी शेल कॉन्फ़िगरेशन फाइल में सेट कर सकते हैं, जिनमें से सबसे आम ~/.bashrc है। यदि आप कई उपयोगकर्ताओं को प्रबंधित करने वाले सिस्टम एडमिनिस्ट्रेटर हैं, तो आप /etc/profile.d डायरेक्टरी में रखी स्क्रिप्ट में एनवायरनमेंट वेरिएबल भी सेट कर सकते हैं।
कॉन्फ़िगरेशन फाइल द्वारा वेरिएबल सेट करने का सिंटैक्स आपके शेल में वेरिएबल सेट करने के समान ही है:
export PATH=$PATH:/snap/bin:/home/seth/bin
वर्तमान शेल को बंद करें, या फिर इसे अपडेटेड कॉन्फ़िगरेशन लोड करने के लिए मजबूर करें:
$ . ~/.bashrc
अंत में, अपने सिस्टम पाथ पर एक और नज़र डालें:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
यह अब आपके अतिरिक्त कस्टम डायरेक्टरी को शामिल करने के लिए सही ढंग से सेट है।
अन्य एनवायरनमेंट वेरिएबल खोजना
आप इच्छानुसार एनवायरनमेंट वेरिएबल बना सकते हैं और हेरफेर कर सकते हैं, और कुछ एप्लिकेशन ठीक यही करते हैं। इस तथ्य का अर्थ है कि आपके कई एनवायरनमेंट वेरिएबल आपके अधिकांश एप्लिकेशन द्वारा उपयोग नहीं किए जाते हैं, और यदि आप अपने स्वयं के मनमाने वेरिएबल जोड़ते हैं तो कुछ किसी भी चीज़ द्वारा उपयोग नहीं किए जा सकते हैं। तो सवाल है: आप कैसे पता लगाते हैं कि कौन से एनवायरनमेंट वेरिएबल सार्थक हैं?
जवाब एक एप्लिकेशन के डॉक्यूमेंटेशन में निहित है। उदाहरण के लिए, अपने सामान्य बैश एनवायरनमेंट के लिए आपके पास कौन से विकल्प उपलब्ध हैं, यह जानने के लिए, आप बैश डॉक्यूमेंटेशन पढ़ सकते हैं। जबकि बैश मैन पेज कई महत्वपूर्ण वेरिएबल का उल्लेख करता है, बैश के लिए GNU इन्फो पेज बोर्न शेल और बैश एनवायरनमेंट वेरिएबल की दो विस्तृत सूचियां और प्रत्येक का उपयोग कैसे किया जाता है, पेश करता है।
उदाहरण के लिए, इन्फो पेज सूची में:
'HISTCONTROL'
एक कोलन-सेपरेटेड मानों की सूची जो नियंत्रित करती है कि कमांड कैसे सेव की जाती हैं
हिस्ट्री लिस्ट पर। यदि मानों की सूची में 'ignorespace' शामिल है,
जो लाइनें स्पेस कैरेक्टर से शुरू होती हैं वे सेव नहीं होतीं
हिस्ट्री लिस्ट में। 'ignoredups' मान कारण बनता है कि लाइनें जो मेल खाती हैं
पिछली हिस्ट्री एंट्री से उन्हें सेव नहीं किया जाता। 'ignoreboth' मान
'ignorespace' और 'ignoredups' का संक्षिप्त रूप है।
[...]
यह आउटपुट आपको बताता है कि HISTCONTROL एनवायरनमेंट वेरिएबल नियंत्रित करता है कि आपका बैश इतिहास कैसे प्रस्तुत किया जाता है, और आप उस अनुभव को अनुकूलित करने के लिए किन मूल्यों का उपयोग कर सकते हैं। इस उदाहरण में, ignoredups मान history कमांड के आउटपुट को डुप्लिकेट लाइनों को अनदेखा करने के लिए कहता है।
आप इसे आसानी से टेस्ट कर सकते हैं। पहले, वही कमांड लगातार दो बार जारी करें:
$ echo "hello world"
hello world
$ echo "hello world"
hello world
अपना इतिहास देखें, या कम से कम हाल की प्रविष्टियां:
$ history | tail -5
996 man bash
997 info bash
998 echo "hello world"
999 echo "hello world"
1000 history
आप देख सकते हैं कि डुप्लिकेट प्रविष्टियां वास्तव में अभी सूचीबद्ध हैं।
इन्फो पेज में पढ़ी गई बातों के आधार पर अपने .bashrc फाइल में एक नया एनवायरनमेंट वेरिएबल सेट करें:
export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups
सेव करें और फिर अपना नया कॉन्फ़िगरेशन लोड करें:
$ source ~/.bashrc
लगातार दो बार दो कमांड जारी करें:
$ echo "hello once"
hello once
$ echo "hello once"
hello once
अपने इतिहास में हाल की प्रविष्टियां देखें:
$ history | tail -5
1000 history
1001 emacs ~/.bashrc
1002 source ~/.bashrc
1003 echo "hello once"
1004 history
डुप्लिकेट प्रविष्टियां अब आपके नए एनवायरनमेंट वेरिएबल के कारण एक प्रविष्टि में संकुचित हो गई हैं, जैसा कि इन्फो पेज ने निर्दिष्ट किया था।
प्रासंगिक एनवायरनमेंट वेरिएबल ढूंढना आमतौर पर उस एप्लिकेशन के डॉक्यूमेंटेशन को पढ़ने का मामला है जिसे आप प्रभावित करना चाहते हैं। अधिकांश एनवायरनमेंट वेरिएबल विशिष्ट हैं कि एक एप्लिकेशन को सुचारू रूप से चलाने के लिए क्या चाहिए। सामान्य प्रविष्टियों के लिए, आपके शेल का डॉक्यूमेंटेशन देखने का तार्किक स्थान है। यदि आप स्क्रिप्ट या एप्लिकेशन लिखते हैं जिन्हें नए एनवायरनमेंट वेरिएबल की आवश्यकता होती है, तो उन वेरिएबल को अपने स्वयं के डॉक्यूमेंटेशन में परिभाषित करना सुनिश्चित करें।