প্রতিটি পেশার একটি সরঞ্জাম থাকে যা সে পেশার মাস্টাররা সবচেয়ে বেশি ব্যবহার করে। অনেক সিস্টেম অ্যাডমিনের জন্য সেটি হলো তাদের শেল। অধিকাংশ লিনাক্স এবং অন্যান্য ইউনিক্স-লাইক সিস্টেমে ডিফল্ট শেল হলো বাশ।
বাশ একটি পুরনো প্রোগ্রাম—এটি ১৯৮০-এর দশকের শেষে উদ্ভূত হয়েছিল—কিন্তু এটি অনেক পুরনো শেলগুলোর ওপর তৈরি, যেমন C শেল (csh), যা এটিকে ১০ বছর বয়স বড়। শেল কনসেপ্ট যেহেতু এত পুরনো, তাই এর ব্যাপারে অপরিচিত জ্ঞান প্রচুর পরিমাণে আছে যা যেকোনো সিস্টেম অ্যাডমিনের জীবন অনেক সহজ করে তুলতে পারে।
চলুন কিছু বেসিক দেখি।
কারো নাকি অনিচ্ছাকৃতভাবে রুট হিসেবে কমান্ড চালিয়ে সমস্যা সৃষ্টি کرده? হাত তুললাম
আমি খুব আত্মবিশ্বাসে বলতে পারি, আমাদের মধ্যে অনেকেই এক সময় সে "ব্যক্তি" ছিলাম। খুব যন্ত্রণাদায়ক। দুবারের সেই পাথর سے আঘাত না খাওয়ার জন্য কিছু খুব সহজ ট্রিক নিচে দেওয়া হলো।
অ্যালিয়াস ব্যবহার করুন
প্রথমে, mv এবং rm এর মতো কমান্ডগুলোর জন্য অ্যালিয়াস সেট করুন যেগুলো mv -i এবং rm -i-কে পয়েন্ট করে। এটি নিশ্চিত করবে যে rm -f /boot চালালেও কমপক্ষে আপনাকে কনফারমেশন চাওয়া হবে। রেড হ্যাট এন্টারপ্রাইজ লিনাক্সে, রুট অ্যাকাউন্ট ব্যবহার করলে এই অ্যালিয়াসগুলো ডিফল্টভাবে সেট থাকে।
আপনার নরমাল ইউজার অ্যাকাউন্টের জন্যও এগুলো সেট করতে চাইলে, আপনার হোম ডিরেক্টরির .bashrc ফাইলে এই দুটি লাইন যোগ করুন (এগুলো sudo-ওর সাথেও কাজ করবে):
alias mv='mv -i' alias rm='rm -i'
আপনার রুট প্রম্পটকে আলাদা করুন
ভুল বাঁচানোর আরেকটি উপায় হলো নিশ্চিত করা যে আপনি রুট অ্যাকাউন্ট ব্যবহার করছেন তা আপনি জানেন। আমি সাধারণত রুট প্রম্পটকে আমার সাধারণ কাজের প্রম্পট থেকে খুব আলাদা করে রাখি।
রুটের হোম ডিরেক্টরির .bashrc ফাইলে নিচের কোড যোগ করলে আপনার রুট প্রম্পট লাল-ऑন-ব্ল্যাক হবে, যা স্পষ্টভাবে বোঝাবে যে আপনি (অথবা অন্য কেউ) সতর্কতার সাথে পা রাখবেন।
export PS1="\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]"
বস্তুত:, আপনাকে যতটা সম্ভব রুট হিসেবে লগইন করতে থেকে বিরত থাকা উচিত এবং অধিকাংশ সিস্টেম অ্যাডমিন কমান্ড sudo দিয়ে চালানো উচিত, কিন্তু সেটা আলাদা কথা।
"অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া" বাঁচাতে কিছু ছোট ট্রিক বাস্তবায়ন করার পর, চলুন দেখি বাশ আপনার দৈনন্দিন কাজে কীভাবে সাহায্য করতে পারে।
আপনার ইতিহাস নিয়ন্ত্রণ করুন
আপনি জানেন বাশে আপ অ্যারো কী চাপলে পূর্বের কমান্ডগুলো দেখা যায় এবং পুনরায় ব্যবহার করা যায়। কারণ সেগুলো আপনার হোম ডিরেক্টরির .bash_history ফাইলে সংরক্ষিত থাকে। সেই ইতিহাস ফাইলের সাথে কিছু সেটিং ও কমান্ড আছে যা খুব উপকারী।
প্রথমে, history টাইপ করে আপনার সম্পূর্ণ gầniai কমান্ড ইতিহাস দেখতে পারেন, অথবা history 30 দিয়ে শেষ ৩০টি কমান্ড দেখতে পারেন। কিন্তু সেটা সাধারণ। আপনার বাশ কী সংরক্ষণ করবে এবং কীভাবে সংরক্ষণ করবে তার ওপর আরও নিয়ন্ত্রণ আছে।
উদাহরণস্বরূপ, আপনার .bashrc-এ নিচের লাইন যোগ করলে স্পেস দিয়ে শুরু হওয়া কমান্ডগুলো ইতিহাস লিস্টে সংরক্ষিত হবে না:
HISTCONTROL=ignorespace
এটি উপকারী যখন আপনাকে প্লেইন টেক্সটে পাসওয়ার্ড পাস করতে হয়। (হ্যাঁ, সেটি ভয়ানক, কিন্তু এখনও হয়।)
আপনি যদি চান যে একটি বারবার ব্যবহৃত কমান্ড ইতিহাসে না দেখায়, তবে ব্যবহার করুন:
HISTCONTROL=ignorespace:erasedups
এটি থাকলে, আপনি যখন একটি কমান্ড ব্যবহার করবেন, তার সকল পূর্বের ঘটনা ইতিহাস ফাইল থেকে মুছে যাবে এবং শুধু শেষ আহ্বানটি আপনার ইতিহাস লিস্টে সংরক্ষিত থাকবে।
একটি ইতিহাস সেটিং যা আমি পছন্দ করি তা হলো HISTTIMEFORMAT সেটিং। এটি আপনার ইতিহাস ফাইলের সব এন্ট্রির সাথে টাইমস্ট্যাম্প যোগ করবে। উদাহরণস্বরূপ, আমি ব্যবহার করি:
HISTTIMEFORMAT="%F %T "
যখন আমি history 5 টাইপ করি, তবে আমি পাই:
1009 2018-06-11 22:34:38 cat /etc/hosts 1010 2018-06-11 22:34:40 echo $foo 1011 2018-06-11 22:34:42 echo $bar 1012 2018-06-11 22:34:44 ssh myhost 1013 2018-06-11 22:34:55 vim .bashrc
এটি আমার কমান্ড ইতিহাস ব্রাউজ করে দুদিন আগে যে কমান্ড দিয়ে আমি আমার হোম ল্যাবে SSH টানেল সেটআপ করেছিলাম (যেটি আমি বারবার ভুলে যাই) সেটি খুঁজে বের করা অনেক সহজ করে দেয়।
সেরা বাশ অভ্যাস
আমি বাশ স্ক্রিপ্ট লিখার সময় আমার সেরা ১১টি অভ্যাস (অথবা কমপক্ষে ভালো অভ্যাস; আমি সর্বজ্ঞ হওয়ার দাবি করি না) শেয়ার করছি।
-
বাশ স্ক্রিপ্ট জটিল হতে পারে এবং কমেন্ট খুব সস্তা। যদি কমেন্ট যোগ করতে হিচকিচান, তবে যোগ করুন। আপনি যদি শুক্রবারের কাজ সোমবারে মনে করতে না পারেন, মানে আপনি কমেন্ট যোগ করতে ভুলে গেছেন।
- সকল ভেরিয়েবল নাম কার্লি ব্রেসে মোড়ান, যেমন
${myvariable}। এটিকে অভ্যাস করলে${variable}_suffixএর মতো কাজ করা সম্ভব হয় এবং আপনার স্ক্রিপ্টগুলোর সुसंगতি বেড়ে।
- এক্সপ্রেশন ইভ্যালুয়েট করার সময় ব্যাকটিক ব্যবহার করবেন না; বরং
$()সিনট্যাক্স ব্যবহার করুন। অর্থাৎ:
for file in $(ls); doনা
for file in `ls`; doপূর্বের অপশন নেস্টেড হতে পারে, সহজে পঠনযোগ্য, এবং সাধারণ সিস্টেম অ্যাডমিনদের খুশি রাখে। ব্যাকটিক ব্যবহার করবেন না।
- সদৃশতা ভালো। এক স্টাইল বেছে নিন এবং পুরো স্ক্রিপ্টে সেটি ধরে রাখিন। বশেষ্ট, আমি
$()সিনট্যাক্স এবং কার্লি ব্রেসে ভেরিয়েবল মোড়ানোর পক্ষে। আমি ট্যাবের বদলে দুই বা চার স্পেস দিয়ে ইনডেন্ট করার পক্ষে, কিন্তু যদি আপনি ভুলভাবে করুন, তবে সেটাও স_usangতাভাবে করুন।
- বাশ স্ক্রিপ্টের জন্য সঠিক শিব্যাং ব্যবহার করুন। যেহেতু আমি বাশ স্ক্রিপ্ট লিখি শুধু বাশে রান করার জন্য, আমি প্রায়শই
#!/usr/bin/bashশিব্যাং হিসেবে ব্যবহার করি।#!/bin/shবা#!/usr/bin/shব্যবহার করবেন না। আপনার স্ক্রিপ্ট রান হবে, কিন্তু কম্প্যাটিবিলিটি মোডে—হয়তো অনেক অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া সহ। (অलबत्ता, কম্প্যাটিবিলিটি মোডই আপনার লক্ষ্য হলে আলাদা কথা।)
- স্ট্রিং তুলনা করার সময়, if-স্টেটমেন্টে আপনার ভেরিয়েবলগুলো কোট করুন, কারণ আপনার ভেরিয়েবল খালি হলে বাশ এই লাইনগুলোর জন্য এরর থ্রো করবে:
if [ ${myvar} == "foo" ]; then echo "bar" fiএবং এই লাইনটি false ইভ্যালুয়েট করবে:
if [ "${myvar}" == "foo" ]; then echo "bar" fiএছাড়া, আপনি যদি ভেরিয়েবলের কন্টেন্ট সম্পর্কে অনিশ্চিত হন (যেমন: ইউজার ইনপুট পার্স করার সময়), তবে ভেরিয়েবলগুলো কোট করুন যাতে 스페সিয়াল ক্যারেক্টার ইন্টারপ্রেট না হয় এবং ভেরিয়েবলটি হোয়াইটস্পেস থাকলেও একটি শব্দ হিসেবে বিবেচিত হয়।
- এটি সেলফ পছন্দের বিষয়, কিন্তু আমি বাশে স্ট্রিং তুলনা করার জন্যও ডাবল ইকোয়াল সাইন (
==) পছন্দ করি। এটি কনসিস্টেন্সির বিষয়, এবং যদিও স্ট্রিং তুলনার জন্য সিঙ্গল ইকোয়াল সাইনও কাজ করে, আমার মনে তখনই আসে "সিঙ্গল ইকোয়াল মানে অ্যাসাইনমেন্ট অপারেটর!"
- সঠিক এক্সিট কোড ব্যবহার করুন। নিশ্চিত করুন যে আপনার স্ক্রিপ্ট যদি ব্যর্থ হয়, তবে ইউজারকে একটি লেখিত ব্যর্থতার মেসেজ (সমাধানের উপায়সহ) দেখান এবং নন-জিরো এক্সিট কোড পাঠান:
# we have failed echo "Process has failed to complete, you need to manually restart the whatchamacallit" exit 1
এটি আপনার স্ক্রিপ্টকে প্রোগ্রাম্যাটিক্যালি অন্য স্ক্রিপ্ট থেকে কল করে সফল সম্পন্ন হয়েছে কিনা যাচাই করা সহজ করে দেয়।
- বাশের বিল্ট-ইন মেকানিজম ব্যবহার করে আপনার ভেরিয়েবলগুলোর জন্য যৌক্তিক ডিফল্ট মান দিন অথবা আপনার আশা করা ভেরিয়েবল ডিফাইনড না থাকলে এরর থ্রো করুন:
# this sets the value of $myvar to redhat, and prints 'redhat' echo ${myvar:=redhat}# this throws an error reading 'The variable myvar is undefined, dear reader' if $myvar is undefined ${myvar:?The variable myvar is undefined, dear reader}
- বিশেষ করে বড় স্ক্রিপ্ট লিখার সময়, এবং বিশেষ করে অন্যদের সাথে মিলে কাজ করার সময়, ফাংশনের ভিতরে ভেরিয়েবল ডিফাইন করার সময়
localকিওয়ার্ড ব্যবহার করার কথা বিবেচনা করুন।localকিওয়ার্ড একটি লোকাল ভেরিয়েবল তৈরি করে, অর্থাৎ সেটি শুধু সেই ফাংশনের ভিতরে দৃশ্যমান। এটি ভেরিয়েবল ক্ল্যাশের সম্ভাবনা কমিয়ে দেয়।
- প্রতিটি সিস্টেম অ্যাডমিনকে কখনো কখনো কনসোলে ডিবাগ করতে হয়, হয় ডেটা সেন্টারের রিয়েল কনসোল অথবা ভার্চুয়ালাইজেশন প্ল্যাটফর্মের মাধ্যমে ভার্চুয়াল কনসোল। যদি আপনাকে কনসোলে স্ক্রিপ্ট ডিবাগ করতে হয়, তবে আপনি এই টিপস মনে রাখলে আপনাকে কৃতজ্ঞ থাকবেন: আপনার স্ক্রিপ্টের লাইনগুলো খুব লম্বা করবেন না!
অনেক সিস্টেমে কনসোলের ডিফল্ট চওড়া এখনো ৮০ ক্যারেক্টার। আপনি যদি খুব লম্বা লাইনવાલা স্ক্রিপ্ট কনসোলে ডিবাগ করেন, তবে আপনি খুব দুঃখী হবেন। বস/ui, ছোট লাইনওয়ালা স্ক্রিপ্ট (ডিফল্ট ৮০ ক্যারেক্টার) সাধারণ এডিটরেও পড়া ও বোঝা অনেক সহজ!
আমি সত্যিই বাশকে ভালোবাসি। আমি এর সম্পর্কে ঘন্টা কাটিয়ে লিখতে পারি বা সহপাঠীদের সাথে চমকদার ট্রিক্স বিনিময় করতে পারি। আপনার প্রিয় ট্রিকগুলো কমেন্টে শেয়ার করুন!