কম্পিউটিং-এ, একটি ভেরিয়েবল হলো একটি শব্দ যা একটি পরিবর্তনশীল মানের প্রতিনিধিত্ব করে। আপনি প্রতিদিন সাধারণ কথাবার্তায় ভেরিয়েবল ব্যবহার করেন, যদিও আপনি সেগুলো ভেরিয়েবল হিসেবে চিন্তা করেন না। আপনি যখন "আমার গাড়ি" বলেন, আপনি "আমার গাড়ি"-কে একটি প্রকার ভেরিয়েবল হিসেবে ব্যবহার করছেন যা আপনি যে গাড়িটিmal করছেন সেটিকে নির্দেশ করে। মেক এবং মডেল নিশ্চিতরূপে আপনার জীবনের পর্যায়ে পরিবর্তন হবে পুরনো গাড়ি নতুন গাড়ি দিয়ে রিপ্লেস করলে, কিন্তু "আমার গাড়ি" ভেরিয়েবল তৈরি করলে আপনাকে প্রতিবার আপনি বর্তমানে কোন ধরনের গাড়ি মালিক সেটি বर्णনা করতে হবে না যেকোনো সময় আপনি আপনার যানবাহনকে রেফার করতে চান।
কম্পিউটারে, ভেরিয়েবলগুলো একই রকমভাবে ব্যবহার হয়।
উদাহরণস্বরূপ, কম্পিউটারে ইউজার অ্যাকাউন্টের সাথে যেকোনো ব্যক্তির একটি হোম ডিরেক্টরি থাকে যেখানে কম্পিউটার তাদের পারসোনাল ডেটা রাখে। কিন্তু প্রতিটি ইউজারের একটি স্বতন্ত্র হোম ডিরেক্টরি থাকে (/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, বা একটি গ্রাফিক্যাল অ্যাপ্লিকেশন যেমন Firefox বা Lutris, বা অন্য কিছু।
বিভিন্ন এনভায়রনমেন্ট ভেরিয়েবল বিভিন্ন সিস্টেম দ্বারা ব্যবহার হয়। আপনার 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' A colon-separated list of values controlling how commands are saved on the history list. If the list of values includes 'ignorespace', lines which begin with a space character are not saved in the history list. A value of 'ignoredups' causes lines which match the previous history entry to not be saved. A value of 'ignoreboth' is shorthand for 'ignorespace' and '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
ডুপ্লিকেট এন্ট্রিগুলো এখন এক এন্ট্রিতে কোল্যাপ্স হয়েছে আপনার নতুন এনভায়রনমেন্ট ভেরিয়েবল দিয়ে, ঠিক ইনফো পেজে স্পেসিফাইড মত।
প্রাসঙ্গিক এনভায়রনমেন্ট ভেরিয়েবল খুঁজে বের করা সাধারণত একটি বিষয় যে অ্যাপ্লিকেশন আপনি প্রভাবিত করতে চান তার ডকুমেন্টেশন পড়া। অধিকাংশ এনভায়রনমেন্ট ভেরিয়েবল স্পেসিফিক একটি অ্যাপ্লিকেশনের যা সেটি সুন্দরভাবে রান করার জন্য দরকার। সাধারণ এন্ট্রিগুলোর জন্য, আপনার শেলের ডকুমেন্টেশন লজিক্যাল জায়গা। আপনি যদি স্ক্রিপ্ট বা অ্যাপ্লিকেশন লিখেন যেগুলোর নতুন এনভায়রনমেন্ট ভেরিয়েবল দরকার, সেগুলো আপনার নিজস্ব ডকুমেন্টেশনে ডিফাইন করা নিশ্চিত করুন।