ব্যাশ শেল কিছু ভেরিয়েবল প্রদান করে যেগুলো ‘~’ (নেমড টিল্ডা) দিয়ে প্রিফিক্সড থাকে যাকে টিল্ডা এক্সপ্যানশন বলা হয়।
এইগুলো আপনার শেলের ভিতরে অন্যান্য ভেরিয়েবলগুলোর কন্টেন্টের সিনোনিম।
টিল্ডা এক্সপ্যানশন হলো এই সংক্ষেপগুলকে ডিরেক্টরি নামগুলতে রূপান্তর করার প্রসেস যেগুলো এগুলো প্রতীকী। এই আর্টিকেলে, আমরা উদাহরণসহ টিল্ডা এক্সপ্যানশন ফিচারটি রিভিউ করব।
টিল্ডা এক্সপ্যানশন প্রয়োগ হয় ‘~’ প্লাস ক্যারেক্টারগুলোর ওপর +, – এবং N (যেটি ইন্টিজার) হোয়াইটস্পেস বা স্ল্যাশ পর্যন্ত।
টিল্ডা এক্সপ্যানশন ব্যবহার হয় বেশ কিছু নির্দিষ্ট পাথনেমে এক্সপ্যান্ড করার জন্য:
- হোম ডিরেক্টরি
- কারেন্ট/প্রিভিয়াস ওয়ার্কিং ডিরেক্টরি
- ডিরেক্টরি স্ট্যাক থেকে ডিরেক্টরি।
হোম ডিরেক্টরি
টিল্ডা এক্সপ্যানশন করেন্ট ইউজারের হোম ডিরেক্টরি বা দেওয়া ইউজারনেমের হোম ডিরেক্টরি এক্সপ্যান্ড করার উপায় প্রদান করে।
Syntax ~ Expand to the variable $HOME or home directory of the current user ~USER Expand to the home directory of the given username
উদাহরণ ১. করেন্ট ইউজার হোম
টিল্ডা(~) একটি পৃথক ওয়ার্ড হিসেবে, $HOME-এ এক্সপ্যান্ড করে যদি সেটি ডিফাইন করা থাকে, যদি $HOME ডিফাইন করা না থাকে, তবে এটি করেন্ট ইউজারের হোম ডিরেক্টরিতে এক্সপ্যান্ড করে।
এখন HOME ভেরিয়েবলের মান /home/oracle তাই cd ~ করেন্ট ডিরেক্টরিকে $HOME-এর মানে পরিবর্তন করল।
## oracle ইউজারে লগইন, যার হোম ডিরেক্টরি /home/oracle # su oracle [tmp]$ pwd /tmp [tmp]$ echo $HOME /home/oracle [tmp]$ cd ~ [~]$ pwd /home/oracle
HOME কে /sbin-এ পরিবর্তন করা হলো, এবং cd ~ শুধু $HOME ব্যবহার করলো না कि ইউজারের আসল হোম ডিরেক্টরি। $HOME আনসেট করার পর, cd ~ ডিরেক্টরি পরিবর্তন করলো /etc/passwd-এ oracle ইউজারের জন্য সেট করা হোম ডিরেক্টরির মানে। টিল্ডা এক্সপ্যানশনের জন্য, HOME আসল হোম ডিরেক্টরি ওভাররাইড করে।
[~]$ export HOME=/sbin [oracle]$ cd ~ [~]$ pwd /sbin [~]$ unset HOME [sbin]$ cd ~ [oracle]$ pwd /home/oracle
উদাহরণ ২. দেওয়া ইউজারের হোম ডিরেক্টরি
নিচের স্ক্রিপ্টটি একটি লগ ফাইলের ব্যাকআপ নেয় যার নামে বর্তমান তারিখ থাকে। এটি স্টার্টিং টাইম এবং এন্ড টাইম লগ করে backup.log ফাইলে oracle ইউজারের হোম ডিরেক্টরিতে।
#! /bin/bash echo "Initiating the backup at `date`" >> ~oracle/backup.log da=`date +%F` cp $da.log{,.bak} echo "END BACKUP at `date`" >> ~oracle/backup.log $ ls -l /home/oracle/ total 8 -rw-r--r-- 1 root root 99 Jun 4 14:23 backup.log
যদি দেওয়া ইউজারনেম এক্সিস্ট না করে, তবে এটি কিছুতে এক্সপ্যান্ড করে না। নিচের উদাহরণে, ora নামে কোনো ইউজার নেই। তাই ~ora /home/ora-তে এক্সপ্যান্ড করবে না।
$ echo ~ora ~ora
ব্যাশে ব্রেস এক্সপ্যানশন কীভাবে করবেন সেটা বুঝতে আমাদের পূর্বের আর্টিকেলটি দেখুন। অর্থাৎ ব্যাশে { } কীভাবে ব্যবহার করবেন।
ওয়ার্কিং ডিরেক্টরি
টিল্ডা + এবং – দিয়ে ওয়ার্কিং ডিরেক্টরি প্রতীকী করা হয়।
- ~+ PWD ভেরিয়েবলের মানে এক্সপ্যান্ড করে যেটি করেন্ট ওয়ার্কিং ডিরেক্টরি ধারণ করে।
- ~- OLDPWD ভেরিয়েবলের মানে এক্সপ্যান্ড করে, যেটি প্রিভিয়াস ওয়ার্কিং ডিরেক্টরি ধারণ করে। যদি OLDPWD আনসেট থাকে, ~- এক্সপ্যান্ড হয় না।
উদাহরণ ৩. ওল্ড/কারেন্ট ওয়ার্কিং ডিরেক্টরির এক্সপ্যানশন
নিচের উদাহরণটি কারেন্ট ডিরেক্টরি এবং প্রিভিয়াস ওয়ার্কিং ডিরেক্টরির ফাইল তুলনা করবে।
$ cat comp.sh #! /bin/bash set -x cd /var/opt/gg if [ -f gg.c ] then echo "File1 exists" fi cd /var/opt1/gg if [ -f gg.c ] then echo "File2 exists" cmp ~+/gg.c ~-/gg.c fi $ ./comp.sh + cd /var/opt/gg + '[' -f gg.c ']' + echo 'File1 exists' File1 exists + cd /var/opt1/gg + '[' -f gg.c ']' + echo 'File2 exists' File2 exists + cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c cmp: EOF on /var/opt1/gg/gg.c $
উপরোক্ত এক্সিকিউশনে:
- ~+/gg.c এক্সপ্যান্ড হয়েছে /var/opt1/gg/gg.c-এ
- ~-/gg.c এক্সপ্যান্ড হয়েছে /var/opt/gg/gg.c-এ
এই আর্টিকেল চলমান Bash Tutorial সিরিজের অংশ।
স্ট্যাকে ডিরেক্টরির জন্য এক্সপ্যানশন
প্রতিটি ব্যাশ প্রসেসে একটি স্ট্যাক অবজেক্ট থাকে যা ডিরেক্টরি ট্র্যাক রাখতে ব্যবহার করা যায় যা একটি স্ক্রিপ্ট ভিজিট করেছে ডিরেক্টরি কন্টেন্টের ডেটা প্রসেস করার সময়।
এটি একটি খুব সিম্পল মেকানিজম যাতে ডিরেক্টরি রেফারেন্স করা যায় বা পূর্বে ভিজিট করা ডিরেক্টরিতে ফিরে যাওয়া যায়। টিল্ডা এক্সপ্যানশন ডিরেক্টরি স্ট্যাকে ডিরেক্টরির এক্সপ্যানশনও প্রদান করে।
- ~+N ডিরেক্টরি স্ট্যাকে Nth ডিরেক্টরি এক্সপ্যান্ড করে (dirs কমান্ড অপশন ছাড়া ইনভোক করলে বাম থেকে প্রিন্ট করা লিস্ট থেকে গণনা করে), শূন্য থেকে শুরু।
- ~-N ডিরেক্টরি স্ট্যাকে Nth ডিরেক্টরি এক্সপ্যান্ড করে (dirs কমান্ড অপশন ছাড়া ইনভোক করলে ডান থেকে প্রিন্ট করা লিস্ট থেকে গণনা করে), শূন্য থেকে শুরু।
dirs, pushd এবং popd কমান্ড ব্যবহার করে ডিরেক্টরি স্ট্যাক ম্যানিপুলেট করার বুঝতে আমাদের পূর্বের আর্টিকেলটি রিভিউ করুন।
উদাহরণ ৪. ~+ ব্যবহার করে বাম থেকে Nth ডিরেক্টরি দেখানো
নিচের উদাহরণে, ডিরেক্টরি স্ট্যাকে ৪টি ডিরেক্টরি আছে। ~+2 আপনাকে বাম থেকে শূন্য থেকে শুরু করে সেকেন্ড পজিশনে উপলব্ধ ডিরেক্টরি পাথ দেবে।
$ dirs -v 0 /sbin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~+2 $ pwd /var/opt/GG/bin
কিন্তু স্ট্যাকের টপ (শূন্য পজিশন) সবসময় করেন্ট ডিরেক্টরি থাকবে। তাই উপরের এক্সিকিউশনের পর, ডিরেক্টরি স্ট্যাকে নিচের মত দেখাবে।
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root
উদাহরণ ৫. ~- ব্যবহার করে ডান থেকে Nth ডিরেক্টরি দেখানো
নিচের উদাহরণটি উপরের উদাহরণের মতো। কিন্তু, ~- করণে ডিরেক্টরি স্ট্যাকে নিচ থেকে বিবেচনা করবে।
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~-2 $ pwd /var/opt/midas $ dirs -v 0 /var/opt/midas 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root