লিনাক্সে, কমান্ড টাইপ করার সময় যদি আপনি দুবার TAB চাপান, তবে টাইপ করা ক্যারেক্টারগুলো দিয়ে শুরু হওয়া সকল উপলব্ধ কমান্ডের তালিকা দেখাবে।
এটি কিছু নতুন নয়, সম্ভবত আপনি ইতিমধ্যে এই বিষয়ে জানেন। এই ফাংশনালিটিকে বাশ কমপ্লিশন বলা হয়। বেসিক ফাইল ও ডিরেক্টরি নেম কমপ্লিশন ডিফল্টভাবে বাশ কমান্ড লাইনে উপলব্ধ থাকে।
কিন্তু, আমরা এই বাশ কমপ্লিশনকে টার্বো-চার্জ করে পরবর্তী স্তরে নিয়ে যেতে পারি complete কমান্ড ব্যবহার করে।
এই টিউটোরিয়ালে ব্যাখ্যা করা হয়েছে কিভাবে প্রোগ্রামেবল কমপ্লিশন ব্যবহার করে অপশন ও কমান্ডের আর্গুমেন্টে অটো-কমপ্লিশন প্রয়োগ করা যায়।
উদাহরণস্বরূপ, write কমান্ড টাইপ করার পর যদি দুবার ট্যাব চাপেন, অটো-কমপ্লিশন লিখ অপারেশন انجام দিতে উপলব্ধ ইউজারদের তালিকা দেখাবে।
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
নিচের উদাহরণে, telnet কমান্ডের জন্য উপলব্ধ হোস্টনেমগুলো দেখাবে:
$ telnet [TAB][TAB] localhost dev-db fileserver
আপনার টার্মিনালে প্রোগ্রামেবল কমপ্লিশন পেতে, আপনাকে শুধু /etc/bash_completion রান করতে হবে নিচের মত করে:
# . /etc/bash_completion
আপনি /etc/bash.bashrc-এ (উবুন্টু লিনাক্স ১৩.০৪ থেকে) নিচের লাইনগুলো আনকমেন্ট ও করতে পারেন, যাতে উপরের কমান্ড এক্সপ্লিসিটলি রান করতে না হয়:
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
যদি এই লাইনগুলো ও /etc/bash_completion ফাইল না পান, তবে আপনাকে শুধু bash_completion প্যাকেজটি apt-get দিয়ে ইনস্টল করতে হবে।
১. বিদ্যমান বাশ-কমপ্লিশন দেখুন
প্রোগ্রামেবল বাশ কমপ্লিশন ইনেবল করার পর, একটি সেট বাশ কমপ্লিশন ডিফাইন করা থাকে। complete কমান্ড বাশ কমপ্লিশন ডিফাইন করার জন্য ব্যবহৃত হয়।
বিদ্যমান বাশ কমপ্লিশন দেখতে, নিচের মত করে complete কমান্ড ব্যবহার করুন:
complete -p | less
উপরের উদাহরণে -p অপশন অপশনাল।
২. বাশে স্ট্যান্ডার্ড কমপ্লিশনের তালিকা
বাশ ডিফল্টভাবে লিনাক্স ইউজারদের জন্য নিচের স্ট্যান্ডার্ড কমপ্লিশন প্রদান করে:
- ভেরিয়েবলনেম কমপ্লিশন
- ইউজারনেম কমপ্লিশন
- হোস্টনেম কমপ্লিশন
- পাথনেম কমপ্লিশন
- ফাইলনেম কমপ্লিশন
আমরা আমাদের আগের বাশ স্ট্যান্ডার্ড কমপ্লিশন আর্টিকেলে এইগুলো নিয়ে আলোচনা করেছি।
৩. কমান্ড প্রাপত করার জন্য কমপ্লিশন ডিফাইন করুন
-c কমান্ড দিয়ে একটি কমপ্লিশন ডিফাইন করুন যাতে উপলব্ধ কমান্ডগুলো আর্গুমেন্ট হিসেবে পাওয়া যায়। নিচের উদাহরণে, which কমান্ডের জন্য কমপ্লিশন ডিফাইন করা হয়েছে:
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
উপরে দেখা যাচ্ছে, 'y' চাপলে সকল কমান্ড লিস্ট হয়ে যাবে।
৪. ডিরেক্টরি প্রাপত করার জন্য কমপ্লিশন ডিফাইন করুন
-d অপশন দিয়ে কমপ্লিশন ডিফাইন করা যায় যাতে শুধু ডিরেক্টরি নেম আর্গুমেন্ট হিসেবে পাওয়া যায়। নিচের উদাহরণে, ls-এর জন্য কমপ্লিশন ডিফাইন করা হয়েছে:
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
উপরে দেখা যাচ্ছে, ট্যাব চাপলে শুধু ডিরেক্টরি দেখাচ্ছে।
৫. ব্যাকগ্রাউন্ড জব নেম প্রাপত করার জন্য কমপ্লিশন
complete দিয়ে জব নেমও আর্গুমেন্ট হিসেবে পাস করা যায়। -j অপশন ব্যবহার করে job কমান্ডে জব নেম পাস করা হয়েছে নিচে:
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
ব্যাকগ্রাউন্ড জব নিয়ে কথা বলছি, তাই আপনাকে লিনাক্স ব্যাকগ্রাউন্ড জব ম্যানেজ করার উদাহরণও জানা উচিত।
৬. প্রিফিক্স ও সাফিক্স সহ কমপ্লিশন
কমপ্লিশনগুলো жела করা প্রিফিক্স এবং সাফিক্স সহ ডিফাইন করা যায়। নিচের উদাহরণে, list_job_attrib.sh-এর জন্য প্রিফিক্স ও সাফিক্স ডিফাইন করা হয়েছে:
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
৭. এক্সক্লুশন সহ ফাইলনেম ও ডিরেক্টরি কমপ্লিশন
ধরুন স্ক্রিপ্ট রান হয়ে আউটপুট একটি আউটপুট ডিরেক্টরিতে লিখে যাচ্ছে নিচের মত করে:
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
উপরে, ls কমান্ডের জন্য অটো-কমপ্লিশনে .tmp ও .o ফাইলগুলো ইগনোর করতে চাইলে:
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE শেল ভেরিয়েবল যা ফাইলনেমের সাফিক্স ধারণ করে এবং অটো-কমপ্লিশনে সেগুলো এক্সক্লুড করে।
৮. IFS দিয়ে স্ট্রিং Сп্লিট করে কমপ্লিশন ভ্যালু পান
-W অপশনে ওয়ার্ডলিস্ট উল্লেখ করা যায় যা IFS ভেরিয়েবলের ভ্যালু দিয়ে স্প্লিট হয়। তারপর প্রতিটি রেজাল্ট ওয়ার্ড এক্সপ্যান্ড হয়ে কমপ্লিশনে দেখায়:
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
উপরোক্ত মত করে IFS ডিলিমিটার দিয়ে স্ট্রিং স্প্লিট করার পর ওয়ার্ড এক্সপ্যান্ড হয়, তাই এগুলো ভেরিয়েবলও হতে পারে নিচের মত করে:
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
৯. নিজস্ব ফাংশন লিখে কমপ্লিশন জেনারেট করুন
এটি আপনাকে একটি ফাংশন ইনক্লুড করতে দেয় কমপ্লিশন ডিফাইন করার জন্য। -F অপশনে ফাংশন নেম পাস করা হয় complete কমান্ডে এবং সেটি এক্সিকিউট হয়ে কমপ্লিশন জেনারেট করে। উদাহরণস্বরূপ, ফাংশনটি নিচের মত করে লিখা হয়:
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
উপরের ফাংশনে,
COMPREPLY: অ্যারে যা কমপ্লিশন রেজাল্ট ধারণ করে যা [TAB][TAB] চাপলে দেখায়COMP_WORDS: কমান্ড লাইনে টাইপ করা ওয়ার্ডগুলোর অ্যারেCOMP_CWORD:COMP_WORDSঅ্যারের ইনডেক্স, এর দিয়ে কমান্ড লাইনের বিভিন্ন পজিশনের ওয়ার্ড এক্সেস করা যায়compgen:-Wসম্ভাব্য কমপ্লিশন ধারণ করে এবং রেসপেক্টিভ আর্গুমেন্ট$current_argবেসισে বেছে নেওয়া হয়
এই ফাংশনটি parser_option ফাইলে থাকলে সোর্স করা হয় নিচের মত করে:
$ source parser_option
এই ফাংশনকে আপনার পার্সার স্ক্রিপ্টের সাথে লিংক করুন নিচের মত করে:
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
উপরে দেখা যাচ্ছে, পার্সারের অপশনগুলো _parser_options() ফাংশন দ্বারা জেনারেট হচ্ছে।
নোট: /etc/bash_completion দেখুন প্রোগ্রামেবল কমপ্লিশনের জন্য আরো ফাংশন পেতে।
১০. প্রাইমারি কোনো মিল জেনারেট না করলে সেকেন্ডারি স্পেসিফিকেশন
যদি ডিফাইন করা কমপ্লিশন স্পেসিফিকেশন থেকে কোনো মিল জেনারেট না হয়, তবে -o অপশনে উল্লিখিত comp-option কমপ্লিশনের জন্য ব্যবহৃত হয়।
$ complete -F _count_files -o dirnames ./countfiles.sh
উপরে, ./countfiles.sh ফাইলের জন্য _count_files ফাংশন দিয়ে কমপ্লিশন ডিফাইন করা হয়েছে। যদি _count_files() ফাংশন কোনো মিল জেনারেট না করে, তবে ডিরেক্টরি কমপ্লিশন অটেম্প্ট করা হবে।
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3