প্রতিটি ট্রেডের একটি টুল থাকে যেটি প্রায়শই সেই বাণিজ্যে দক্ষতা অর্জন করে। অনেক সিসাডমিনের জন্য, সেই টুলটি তাদের শেল। বেশিরভাগ লিনাক্স এবং অন্যান্য ইউনিক্স-এর মতো সিস্টেমে, ডিফল্ট শেল হল ব্যাশ।
ব্যাশ একটি মোটামুটি পুরানো প্রোগ্রাম - এটি 1980 এর দশকের শেষের দিকে উদ্ভূত হয়েছিল - তবে এটি সি শেল (csh) এর মতো অনেক বেশি পুরানো শেল তৈরি করে, যা সহজেই 10 বছরের সিনিয়র। যেহেতু একটি শেলের ধারণাটি অনেক পুরানো, সেখানে প্রচুর পরিমাণে অলৌকিক জ্ঞান রয়েছে যা যেকোন সিসাডমিন লোকের বা মেয়ের জীবনকে অনেক সহজ করে তুলতে গ্রাস করার অপেক্ষায় রয়েছে৷
আসুন কিছু মৌলিক বিষয়গুলো দেখে নেওয়া যাক।
কে, কিছু সময়ে, অনিচ্ছাকৃতভাবে রুট হিসাবে একটি কমান্ড চালায় এবং কিছু ধরণের সমস্যা সৃষ্টি করেছে? হাত বাড়ায়
আমি মোটামুটি নিশ্চিত যে আমাদের মধ্যে অনেকেই এক সময়ে সেই লোক বা মেয়ে হয়েছি। খুব বেদনাদায়ক. দ্বিতীয়বার সেই পাথরটিকে আঘাত করা থেকে বিরত রাখার জন্য এখানে কিছু খুব সহজ কৌশল রয়েছে৷
উপনাম ব্যবহার করুন
৷
প্রথমে, mv
-এর মতো কমান্ডের জন্য উপনাম সেট আপ করুন এবং rm
যেটি mv -I
নির্দেশ করে এবং rm -I
. এটি নিশ্চিত করবে যে rm -f /boot
চলছে অন্তত নিশ্চিতকরণের জন্য আপনাকে জিজ্ঞাসা করে। Red Hat Enterprise Linux-এ, আপনি যদি রুট অ্যাকাউন্ট ব্যবহার করেন তবে এই উপনামগুলি ডিফল্টরূপে সেট আপ করা হয়৷
আপনি যদি আপনার সাধারণ ব্যবহারকারীর অ্যাকাউন্টের জন্যও সেই উপনামগুলি সেট করতে চান তবে আপনার হোম ডিরেক্টরিতে .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-এ আপ অ্যারো কী টিপবেন, আপনি আপনার পূর্ববর্তী কমান্ডগুলির সমস্ত (ভাল, অনেকগুলি) দেখতে এবং পুনরায় ব্যবহার করতে পারবেন। কারণ এই কমান্ডগুলি আপনার হোম ডিরেক্টরিতে .bash_history নামক একটি ফাইলে সংরক্ষণ করা হয়েছে। সেই ইতিহাস ফাইলটি অনেকগুলি সেটিংস এবং কমান্ডের সাথে আসে যা খুব দরকারী হতে পারে৷
৷
প্রথমে, আপনি history
টাইপ করে আপনার সম্পূর্ণ সাম্প্রতিক কমান্ড ইতিহাস দেখতে পারেন , অথবা আপনি history 30
টাইপ করে এটিকে আপনার শেষ 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 টানেল সেট আপ করার জন্য দু'দিন আগে যেটি ব্যবহার করেছিলাম তা খুঁজে পাওয়া অনেক সহজ করে তোলে (যা আমি বারবার ভুলে যাই, এবং আবার, এবং আবার...)।
সর্বোত্তম ব্যাশ অনুশীলন
ব্যাশ স্ক্রিপ্ট লেখার সময় আমি আমার সেরা 11টি সেরা (বা ভাল, অন্তত; আমি সর্বজ্ঞতা দাবি করি না) অভ্যাসগুলির তালিকা দিয়ে এটিকে গুটিয়ে রাখব৷
-
ব্যাশ স্ক্রিপ্টগুলি জটিল হতে পারে এবং মন্তব্যগুলি সস্তা। আপনি একটি মন্তব্য যোগ করতে কি ভাবছেন, একটি মন্তব্য যোগ করুন. আপনি যদি সাপ্তাহিক ছুটির পরে ফিরে আসেন এবং আপনি গত শুক্রবার কী করার চেষ্টা করছেন তা খুঁজে বের করতে সময় ব্যয় করতে হয়, আপনি একটি মন্তব্য যোগ করতে ভুলে গেছেন৷
- আপনার সমস্ত ভেরিয়েবলের নাম কোঁকড়া বন্ধনীতে মোড়ানো, যেমন
${myvariable}
. এটিকে অভ্যাস করা${variable}_suffix
এর মতো জিনিসগুলিকে তৈরি করে৷ সম্ভব এবং আপনার স্ক্রিপ্ট জুড়ে ধারাবাহিকতা উন্নত করে।
- একটি অভিব্যক্তি মূল্যায়ন করার সময় ব্যাকটিক্স ব্যবহার করবেন না;
$()
ব্যবহার করুন পরিবর্তে সিনট্যাক্স। তাই ব্যবহার করুন:for file in $(ls); do
না
for file in `ls`; do
আগের বিকল্পটি নেস্টেবল, আরও সহজে পঠনযোগ্য এবং সাধারণ সিসাডমিন জনসংখ্যাকে খুশি রাখে। ব্যাকটিক্স ব্যবহার করবেন না।
- সঙ্গতি ভালো। কাজ করার একটি শৈলী বেছে নিন এবং আপনার স্ক্রিপ্ট জুড়ে এটির সাথে লেগে থাকুন। স্পষ্টতই, আমি পছন্দ করব যদি লোকেরা
$()
বেছে নেয় ব্যাকটিক্সের উপর সিনট্যাক্স এবং তাদের ভেরিয়েবলগুলি কোঁকড়া বন্ধনীতে মোড়ানো। আমি এটি পছন্দ করব যদি লোকেরা ইন্ডেন্ট করার জন্য ট্যাব নয় - দুই বা চারটি স্পেস ব্যবহার করে, তবে আপনি যদি এটি ভুল করতে চান তবে এটি ধারাবাহিকভাবে ভুল করুন৷
- ব্যাশ স্ক্রিপ্টের জন্য সঠিক শেবাং ব্যবহার করুন। যেহেতু আমি ব্যাশ স্ক্রিপ্টগুলিকে শুধুমাত্র ব্যাশ দিয়ে চালানোর অভিপ্রায়ে লিখছি, আমি প্রায়শই
#!/usr/bin/bash
ব্যবহার করি আমার shebang হিসাবে.#!/bin/sh
ব্যবহার করবেন না অথবা#!/usr/bin/sh
. আপনার স্ক্রিপ্ট কার্যকর হবে, কিন্তু এটি সামঞ্জস্যপূর্ণ মোডে চলবে—সম্ভাব্যভাবে প্রচুর অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া সহ। (যদি না, অবশ্যই, সামঞ্জস্য মোড আপনি যা চান তা না।)
- স্ট্রিংগুলির তুলনা করার সময়, আপনার ভেরিয়েবলগুলি যদি-বিবৃতিতে উদ্ধৃত করা ভাল, কারণ আপনার ভেরিয়েবল খালি থাকলে, ব্যাশ এই ধরনের লাইনগুলির জন্য একটি ত্রুটি নিক্ষেপ করবে:
if [ ${myvar} == "foo" ]; then
echo "bar"
fiএবং এইরকম একটি লাইনের জন্য মিথ্যা মূল্যায়ন করবে:
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
কীওয়ার্ড একটি স্থানীয় পরিবর্তনশীল তৈরি করবে, যেটি শুধুমাত্র সেই ফাংশনের মধ্যেই দৃশ্যমান। এটি ভেরিয়েবলের সংঘর্ষের সম্ভাবনাকে সীমিত করে।
- প্রতিটি সিস্যাডমিনকে মাঝে মাঝে এটি করতে হবে:একটি কনসোলে কিছু ডিবাগ করুন, হয় একটি ডেটা সেন্টারে একটি বাস্তব অথবা একটি ভার্চুয়ালাইজেশন প্ল্যাটফর্মের মাধ্যমে একটি ভার্চুয়াল৷ যদি আপনাকে এইভাবে একটি স্ক্রিপ্ট ডিবাগ করতে হয়, তাহলে আপনি এটি মনে রাখার জন্য নিজেকে ধন্যবাদ জানাবেন:আপনার স্ক্রিপ্টগুলিতে লাইনগুলিকে খুব বেশি লম্বা করবেন না!
অনেক সিস্টেমে, একটি কনসোলের ডিফল্ট প্রস্থ এখনও 80 অক্ষর। আপনার যদি একটি কনসোলে একটি স্ক্রিপ্ট ডিবাগ করার প্রয়োজন হয় এবং সেই স্ক্রিপ্টটিতে খুব দীর্ঘ লাইন থাকে, তাহলে আপনি দুঃখিত পান্ডা হবেন। এছাড়াও, ছোট লাইন সহ একটি স্ক্রিপ্ট - ডিফল্ট এখনও 80 অক্ষর - একটি সাধারণ সম্পাদকেও পড়া এবং বোঝা অনেক সহজ!
আমি সত্যিই বাশ ভালোবাসি. আমি এটি সম্পর্কে লিখতে বা সহকর্মী উত্সাহীদের সাথে সুন্দর কৌশল বিনিময় করতে ঘন্টা ব্যয় করতে পারি। নিশ্চিত করুন যে আপনি মন্তব্যে আপনার পছন্দগুলি ড্রপ করেছেন!