বাশ হিস্টরি খুব শক্তিশালী। কীভাবে কার্যকরভাবে বাশ হিস্টরি এক্সপ্যানশন ফিচারগুলো ব্যবহার করতে হয় সেটি বুঝলে আপনি লিনাক্স কমান্ড লাইনে অত্যন্ত প্রোডাক্টিভ হবেন।
এই আর্টিকেলে ১৫টি উদাহরণ দিয়ে নিচের বাশ হিস্টরি এক্সপ্যানশন ফিচারগুলো ব্যাখ্যা করা হয়েছে:
- ইভেন্ট ডেজিগনেটর — ইতিহাসে একটি নির্দিষ্ট কমান্ডকে রেফার করে। এটি
!দিয়ে শুরু হয়। - ওয়ার্ড ডেজিগনেটর — একটি হিস্টরি এন্ট্রির নির্দিষ্ট ওয়ার্ডকে রেফার করে। সাধারণত এটি ইভেন্ট ডেজিগনেটরের সাথে কম্বাইন করা হয়। ইভেন্ট ডেজিগনেটর ও ওয়ার্ড ডেজিগনেটর কোলন (:) দিয়ে আলাদা থাকে।
- মডিফায়ার — ইভেন্ট বা ওয়ার্ড ডেজিগনেটরによる সাবস্টিটিউশনের ফলাফলকে মডিফাই করে।
এই আর্টিকেল আমাদের চলমান বাশ টিউটোরিয়াল সিরিজের অংশ।
আপনি ইতিমধ্যে জানেন, সকল হিস্টরি এন্ট্রি দেখতে history কমান্ড ব্যবহার করতে হয়। এটি ইতিমধ্যে এক্সিকিউট করা কমান্ডগুলো দেখাবে সেই কমান্ডের হিস্টরি টেবিলে নম্বর সহ।
$ history 1 tar cvf etc.tar /etc/ 2 cp /etc/passwd /backup 3 ps -ef | grep http 4 service sshd restart 5 /usr/local/apache2/bin/apachectl restart
বাশ হিস্টরি ইভেন্ট ডেজিগনেটর
১. নির্দিষ্ট কমান্ড এক্সিকিউট করুন হিস্টরি থেকে !n ব্যবহার করে
আপনি যদি আগে কোনো কমান্ড এক্সিকিউট করে থাকেন, তবে সেটি আবার রি-টাইপ করার বদলে, আপনি সেটি দ্রুত এক্সিকিউট করতে পারেন হিস্টরিতে সেই কমান্ডের নম্বর ব্যবহার করে।
উদাহরণস্বরূপ, কমান্ড #৪ এক্সিকিউট করতে, নিচের মত করুন। এটি হিস্ট্রি থেকে কমান্ড #৪ দেখাবে, এবং সাথে সাথে এক্সিকিউট করবে।
$ !4 service sshd restart
দুই কমান্ড আগের কমান্ডটি এক্সিকিউট করতে, নিচের মত করুন:
$ !-2
পূর্বের কমান্ডটি এক্সিকিউট করতে, নিচের যেকোনো একটি করুন:
$ !! $ !-1
আপনি <Ctrl>-P ও চাপতে পারেন (যদি ডিফল্ট ইম্যাক্স মোডে থাকেন) পূর্বের কমান্ড পেতে।
আপনি যদি ভি স্টাইল এডিটিং ইনেবল করে থাকেন set -o vi দিয়ে, তবে <Esc>-k ব্যবহার করুন পূর্বের কমান্ড পেতে।
২. কীওয়ার্ড ব্যবহার করে কমান্ড এক্সিকিউট করুন !string ও !?string দিয়ে
আপনি কীওয়ার্ড ও ব্যবহার করতে পারেন হিস্ট্রি থেকে কমান্ড এক্সিকিউট করতে।
নিচের উদাহরণটি হিস্ট্রি থেকে সার্চ করবে যে কোনো কমান্ড "ps" কীওয়ার্ড দিয়ে শুরু হয়েছে এবং সেটি এক্সিকিউট করবে। এই উদাহরণে, এটি পূর্বের কমান্ড ps -ef | grep http পিক আপ করে এবং এক্সিকিউট করে।
$ !ps ps -ef | grep http
নিচের উদাহরণটি হিস্ট্রি থেকে সার্চ করবে যে কোনো কমান্ড "apache" কীওয়ার্ড ধারণ করে এবং সেটি এক্সিকিউট করবে। এই উদাহরণে, এটি পূর্বের কমান্ড /usr/local/apache2/bin/apachectl restart পিক আপ করে এবং এক্সিকিউট করে।
$ !?apache /usr/local/apache2/bin/apachectl restart
৩. পূর্বের কমান্ড থেকে একটি স্ট্রিং রিপ্লেস করুন ^str1^str2^ ব্যবহার করে
নিচের উদাহরণে, প্রথমে আমরা ls কমান্ড এক্সিকিউট করলাম একটি ফাইল যাচাই করতে। পরে বুঝলাম আমরা ফাইলের কন্টেন্ট দেখতে চাই। পুরো ফাইলনেম আবার টাইপ করার বদলে, আমরা পোর্বের কমান্ডের "ls"-কে "cat"-দিয়ে রিপ্লেস করতে পারি নিচের মত:
$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
নোট: অতিরিক্ত বাশ হিস্টরি টিপসের জন্য, 15 Examples To Master Linux Command Line History রেফার করুন। এটি ব্যাখ্যা করে কীভাবে হিস্ট্রিতে টাইমস্ট্যাম্প দেখাবেন, এবং কীভাবে বিভিন্ন হিস্ট্রি-রিলেটেড এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করবেন যার মধ্যে HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL, এবং HISTIGNORE।
বাশ হিস্টরি ওয়ার্ড ডেজিগনেটর
ওয়ার্ড ডেজিগনেটর খুব সাহায্যকারী যখন আপনি একটি নতুন কমান্ড টাইপ করতে চান, কিন্তু আর্গুমেন্ট ব্যবহার করতে চান ইতিমধ্যে এক্সিকিউট করা একটি কমান্ডের। কিছু উদাহরণ নিচে দেওয়া হলো।
৪. একটি কমান্ডের ১ম আর্গুমেন্ট পান :^ ব্যবহার করে
নিচের উদাহরণে, !cp:^ দেওয়া হয়েছে ls -l কমান্ডের আর্গুমেন্ট হিসেবে। !cp:^ হিস্ট্রিতে পূর্বের কমান্ডটি খুঁজে বের করে যা cp দিয়ে শুরু হয়েছে এবং সেই কমান্ডের ১ম আর্গুমেন্টটি পায়।
$ cp /etc/passwd /backup $ ls -l !cp:^ ls -l /etc/passwd
নিচের উদাহরণটি পূর্বের কমান্ড থেকে ১ম আর্গুমেন্ট পায়।
$ ls -l !!:^
৫. একটি কমান্ডের লাস্ট আর্গুমেন্ট পান :$ ব্যবহার করে
নিচের উদাহরণে, !cp:$ দেওয়া হয়েছে ls -l কমান্ডের আর্গুমেন্ট হিসেবে। !cp:$ হিস্ট্রিতে পূর্বের কমান্ডটি খুঁজে বের করে যা cp দিয়ে শুরু হয়েছে এবং সেই কমান্ডের লাস্ট আর্গুমেন্টটি পায়।
$ cp /etc/passwd /backup $ ls -l !cp:$ ls -l /backup
নিচের উদাহরণটি পূর্বের কমান্ড থেকে লাস্ট আর্গুমেন্ট পায়।
$ls -l !!:$
৬. একটি কমান্ডের nth আর্গুমেন্ট পান :n ব্যবহার করে
নিচের উদাহরণে, !tar:2 দেওয়া হয়েছে ls -l কমান্ডের আর্গুমেন্ট হিসেবে। !tar:2 হিস্ট্রিতে পূর্বের কমান্ডটি খুঁজে বের করে যা tar দিয়ে শুরু হয়েছে এবং সেই কমান্ডের ২য় আর্গুমেন্টটি পায়।
$ tar cvfz /backup/home-dir-backup.tar.gz /home $ ls -l !tar:2 ls -l /backup/home-dir-backup.tar.gz
৭. একটি কমান্ড থেকে সব আর্গুমেন্ট পান :* ব্যবহার করে
নিচের উদাহরণে, !cp:* দেওয়া হয়েছে ls -l কমান্ডের আর্গুমেন্ট হিসেবে। !cp:* হিস্ট্রিতে পূর্বের কমান্ডটি খুঁজে বের করে যা cp দিয়ে শুরু হয়েছে এবং তার সব আর্গুমেন্ট পায়।
$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup
৮. gầnে সার্চ করা ওয়ার্ডকে রেফার করুন !% ব্যবহার করে
যেমন আমরা উপরে ব্যাখ্যা করেছি, !?apache হিস্ট্রি থেকে পূর্বের কমান্ডটি সার্চ করবে যেটি "apache" কীওয়ার্ড ধারণ করে এবং সেটি এক্সিকিউট করবে।
$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart
!% পূর্ের ? সার্চ দ্বারা মিলিত পুরো ওয়ার্ডকে রেফার করবে।
উদাহরণস্বরূপ, আপনি যদি আগে ?apache সার্চ করে থাকেন, তবে !% পুরো ওয়ার্ড /usr/local/apache2/bin/apachectl ম্যাচ করবে। নোট করুন যে এই কনটেক্সটে / একই ওয়ার্ডের অংশ হিসেবে বিবেচিত হয়।
সুতরাং, এই কেসে, নিচের কমান্ড এক্সিকিউট করলে আপনি আপাচি স্টপ করতে পারবেন।
$ !% stop /usr/local/apache2/bin/apachectl stop
৯. একটি কমান্ড থেকে আর্গুমেন্টের রেঞ্জ পান x-y ব্যবহার করে
নিচের উদাহরণে, !tar:3-5 দেওয়া হয়েছে ls -l কমান্ডের আর্গুমেন্ট হিসেবে। !tar:3-5 হিস্ট্রিতে পূর্বের কমান্ডটি খুঁজে বের করে যা tar দিয়ে শুরু হয়েছে এবং ৩ থেকে ৫ নম্বর আর্গুমেন্টগুলো পায়।
$ tar cvf home-dir.tar john jason ramesh rita $ ls -l !tar:3-5 ls -l john jason ramesh
নিচের কমান্ডটি ২ নম্বর থেকে সব আর্গুমেন্ট পায়।
$ ls -l !tar:2-$
নিচের বিষয়গুলো মনে রাখবেন:
!!:*পূর্বের কমান্ড থেকে সব আর্গুমেন্ট পায়!!:2*২য় আর্গুমেন্ট থেকে শুরু করে সব আর্গুমেন্ট পায়!!:2-$উপরের মতই। ২য় আর্গুমেন্ট থেকে শুরু করে সব আর্গুমেন্ট পায়।!!:2-২য় আর্গুমেন্ট থেকে শুরু করে সব আর্গুমেন্ট পায় (লাস্ট আর্গুমেন্ট বাদে)।
বাশ হিস্টরি মডিফায়ার
মডিফায়ারগুলো ওয়ার্ড ডেজিগনেটরের পরে দেওয়া হয়, নিচের উদাহরণগুলোর মত।
১০. একটি ওয়ার্ড থেকে ট্রেইলিং পাথ নেম সরান :h ব্যবহার করে
নিচের উদাহরণে, !!:$:h পূর্বের কমান্ডের লাস্ট আর্গুমেন্ট নেয়, এবং ট্রেইলিং পাথ নেম সরিয়ে দেয়। এই কেসে, এটি ফাইলনেমটি সরিয়ে শুধু ফুল পাথটি পায়।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:h ls -l /very/long/path/name
১১. একটি ওয়ার্ড থেকে সব লিডিং পাথ নেম সরান :t ব্যবহার করে
এটি পূর্বের উদাহরণের একদম বিপরীত।
নিচের উদাহরণে, !!:$:t পূর্বের কমান্ডের লাস্ট আর্গুমেন্ট নেয়, এবং সব লিডিং পাথ নেম সরিয়ে দেয়। এই কেসে, এটি শুধু ফাইলনেমটি পায়।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:t ls -l file-name.txt
১২. একটি ওয়ার্ড থেকে ফাইল এক্সটেনশন সরান :r ব্যবহার করে
নিচের উদাহরণে, !!:$:r পূর্বের কমান্ডের লাস্ট আর্গুমেন্ট নেয়, এবং শুধু .suffix (যেটি এখানে ফাইল এক্সটেনশন) সরিয়ে দেয়। এই কেসে, এটা .txt সরিয়ে দিয়েছে।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:r ls -l /very/long/path/name/file-name
১৩. বাশ হিস্টরিতে সেড-লাইক সাবস্টিটিউশন :s/str1/str2/ ব্যবহার করে
আমরা আগে ^original^replacement^ ব্যবহার করতাম, আমরা বাশ হিস্টরিতে সেড-লাইক সাবস্টিটিউশনও ব্যবহার করতে পারি নিচের উদাহরণের মত। এটি মনে রাখতে সহজ হতে পারে। !! হলো পূর্বের কমান্ড কল করার জন্য, :s/original-string/replacement-string/ হলো সেড-লাইক সিনট্যাক্স একটি স্ট্রিং রিপ্লেস করার জন্য।
$ !!:s/ls -l/cat/
আপনি g ফ্ল্যাগও ব্যবহার করতে পারেন (সाथে s ফ্ল্যাগ) গ্লোবাল সাবস্টিটিউশন করার জন্য নিচের মত করে। এটি সাহায্যকারী যখন আপনি ভুলে একাধিক ওয়ার্ড টাইপ করে ফেলেছেন এবং সবগুলো একসাথে চেঞ্জ করে আবার এক্সিকিউট করতে চান।
নিচের উদাহরণে, ভুলে আমি password দুবার দিয়েছি (বদলে passwd)।
$ cp /etc/password /backup/password.bak
এটি ফিক্স করতে, শুধু নিচের গ্লোবাল হিস্টরি সেড-লাইক সাবস্টিটিউশন করুন।
$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak
১৪. সাবস্টিটিউশন দ্রুত রিপিট করুন :& ব্যবহার করে
আপনি যদি ইতিমধ্যে একটি বাশ হিস্টরি সাবস্টিটিউশন সফলভাবে এক্সিকিউট করে থাকেন যেমন উপরে দেখানো, তবে আপনি সেম সাবস্টিটিউশনটি আবার দ্রুত রিপিট করতে পারেন :& ব্যবহার করে।
আমি আবার ভুলে password টাইপ করেছি passwd-র বদলে অন্য একটি কমান্ডে।
$ tar cvf password.tar /etc/password
এখন, কমান্ড রি-টাইপ করার বদলে, বা gs/password/passwd করার বদলে, আমি শুধু :& ব্যবহার করতে পারি, যা লাস্ট সাবস্টিটিউশনটি রি-ইউজ করবে। লাস্ট সাবস্টিটিউশনটি গ্লোবালি রি-ইউজ করতে :g& ব্যবহার করুন।
$ !!:g& tar cvf passwd.tar /etc/passwd
১৫. এক্সিকিউট না করে কমান্ড প্রিন্ট করুন :p ব্যবহার করে
এটি খুব সাহায্যকারী যখন আপনি কমপ্লেক্স হিস্টরি সাবস্টিটিউশন করছেন, এবং এক্সিকিউট করার আগে ফাইনাল কমান্ডটি দেখতে চান।
নিচের উদাহরণে, !tar:3-:p, বাস্তবে কমান্ডটি এক্সিকিউট করে না।
যেহেতু আমরা :p দিয়েছি, এটা শুধু সাবস্টিটিউশন করে নতুন কমান্ডটি ডিসপ্লে করে। একবার আপনি বাশ হিস্টরি এক্সপ্যানশন যাচাই করলেন, এবং মনে করেন এটি আপনার ইচ্ছামত কমান্ড, তবে :p সরিয়ে আবার এক্সিকিউট করুন।
$ tar cvf home-dir.tar john jason ramesh rita $ tar cvfz new-file.tar !tar:3-:p tar cvfz new-file.tar john jason ramesh