কম্পিউটার টিউটোরিয়াল

.bashrc মাস্টার করে প্রোডাক্টিভিটি বাড়ান: অর্ধেক কীস্ট্রোকস (keystrokes) দিয়ে ডাবল দক্ষতা

আমার недавির পোস্টে উবুন্টু (Ubuntu) বাশ স্ক্রিপ্টস (Bash scripts) দিয়ে সেটআপ করার কথায়, আমি সংক্ষিপ্তে .bashrc-এর জাদু (magic) কে আলীদা (alluded) করেছিলাম। এটা যথার্থতা করলো না, তাই এখানে একটি কুইক পোস্ট (quick post) যা .bashrc কনফিগারেশন ফাইল (Bash configuration file) কী কী করতে পারে সেটি বিস্তারিত বলে।

আমার বর্তমান কনফিগারেশন আমার ওয়ার্কফ্লো ব্যাপকভাবে উন্নত করেছে, এবং আমাকে ৫০% এরও বেশি কীস্ট্রোকস (keystrokes) বাঁচিয়ে দিয়েছে যা এর ছাড়া করতে হতো! আসুন এলিয়াস (aliases), ফাংশন (functions), এবং প্রম্পট কনফিগারেশন (prompt configurations)-এর কিছু উদাহরণ দেখি যা কম কী প্রেস (key presses) দিয়ে আমাদের আরও এফিশিয়েন্ট (efficient) হতে সাহায্য করে।

বাশ এলিয়াস (Bash aliases)

একটি স্মার্টলি রিটেন (smartly written) .bashrc খুব বেশি কীস্ট্রোকস বাঁচাতে পারে। আমরা এটি লিটারালি (literally) বাশ এলিয়াস (bash aliases) ব্যবহার করে লাভ করতে পারি, বা স্ট্রিংস (strings) যা বড় কমান্ডগুলোরূপে এক্সপ্যান্ড (expand) হয়। একটি ইন্ডিকেটিভ (indicative) উদাহরণ হিসেবে, এখানে টার্মিনালে ফাইল কপি করার একটি বাশ এলিয়াস:

# Always copy contents of directories (r)ecursively and explain (v) what was done alias cp='cp -rv'

alias কমান্ড স্ট্রিংটি ডিফাইন (define) করে যা আমরা টাইপ করব, এবং সেই স্ট্রিংটি কীতে এক্সপ্যান্ড হবে। আমরা cp এর মত বিদ্যমান কমান্ডও ওভাররাইড (override) করতে পারি। নিজে থেকেই, cp কমান্ড শুধু ফাইল কপি করে, ডিরেক্টরি নয়, এবং সাইলেন্টলি (silently) সাকসিড (succeeds)। এই এলিয়াসের সাথে, আমাদের সেই দুটি ফ্ল্যাগ মনে রাখতে হয় না, না cd বা ls করা লাগে কপি করা ফাইলটি কনফার্ম (confirm) করতে যে সেটি সেখানে আছে! এখন, শুধু সেই দুটি কী প্রেস (key presses) (c এবং d জন্য) সেটি সব করবে আমাদের জন্য।

এখানে কিছু আরো .bashrc এলিয়াস সাধারণ ফাংশনসহ ফ্ল্যাগ পাস করার জন্য।

# List contents with colors for file types, (A)lmost all hidden files (without . and ..), in (C)olumns, with class indicators (F) alias ls='ls --color=auto -ACF' # List contents with colors for file types, (a)ll hidden entries (including . and ..), use (l)ong listing format, with class indicators (F) alias ll='ls --color=auto -alF' # Explain (v) what was done when moving a file alias mv='mv -v' # Create any non-existent (p)arent directories and explain (v) what was done alias mkdir='mkdir -pv' # Always try to (c)ontinue getting a partially-downloaded file alias wget='wget -c'

এলিয়াসগুলো তখন খুব কাজে লাগে যখন আমরা দীর্ঘ কমান্ড টাইপ করা এড়াতে চাই। এখানে কিছু যা আমি পাইথন এনভায়রনমেন্টস (Python environments) দিয়ে কাজ করার সময় ব্যবহার করি:

alias pym='python3 manage.py' alias mkenv='python3 -m venv env' alias startenv='source env/bin/activate && which python3' alias stopenv='deactivate'

বাশ এলিয়াস কীভাবে সময় বাঁচাতে পারে সেটি সম্পর্কে আরও ইনস্পিরেশন (inspiration) পেতে, এই আর্টিকেলের উদাহরণগুলো হাইলি রিকমেন্ডেড (highly recommended)।

বাশ ফাংশন (Bash functions)

উপরের এলিয়াসগুলোর একটা ডাউনসাইড (downside) হচ্ছে সেগুলো বয় medida স্ট্যাটিক (static) - সেগুলো সর্বদা এক্সাক্টলি ডিক্লেয়ার্ড (declared) টেক্সটে এক্সপ্যান্ড হয়। একটি বাশ এলিয়াস যা আর্গুমেন্ট (arguments) নেয়, সেটির জন্য আমাদের একটি ফাংশন (function) তৈরি করতে হবে। আমরা এটা এভাবে করতে পারি:

# Show contents of the directory after changing to it function cd () { builtin cd "$1" ls -ACF }

আমি কয়বার cd টাইপ করি এবং তারপর অবিলম্বে ls টাইপ করি যাতে যে ডিরেক্টরিতে আছি তার কন্টেন্ট দেখি, সেটি গুনতে পারি না। এই ফাংশন সেটআপ থাকলে, শুধু সেই দুটি অক্ষর দিয়ে সব হয়ে যায়! ফাংশনটি প্রথম আর্গুমেন্ট, $1, লোকেশন হিসেবে নেয় ডিরেক্টরি চেঞ্জ করার জন্য, তারপর সেই ডিরেক্টরির কন্টেন্ট প্রিন্ট করে সুন্দর ফরম্যাটেড কলামসে (formatted columns) ফাইল টাইপ ইন্ডিকেটরসহ (file type indicators)। builtin পার্টটি প্রয়োজন বাশকে অ্যালো (allow) করার জন্য যে আমরা এই ডিফল্ট কমান্ড ওভাররাইড করি।

বাশ ফাংশন সফ্টওয়্যার ডাউনলোড বা আপগ্রেড করার সময়ও খুব উপযোগী। আমি আগে কমপক্ষে কয়েক মিনিট খরচ করতাম প্রতি কয়েক সপ্তাহে হিউগো (Hugo) স্ট্যাটিক সাইট জেনারেটরের (static site generator) নতুন এক্সটেন্ডেড ভার্সন (extended version) ডাউনলোড করতে, তাদের চমৎকার শিপিং ফ্রিকোয়েন্সি (shipping frequency) কৃতজ্ঞতা। একটি ফাংশন দিয়ে, আমি শুধু ভার্সন পাস করি, এবং আপগ্রেডটি কয়েক সেকেন্ডে হয়ে যায়।

# Hugo install or upgrade function gethugo () { wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/ sudo mv -f tmp/hugo /usr/local/bin/ rm -rf tmp/ hugo version }

$@ নোটেশনটি শুধু দিয়ে দেওয়া সকল আর্গুমেন্ট নেয়, ফাংশনে তার জায়গায় রিপ্লেস করে। উপরের ফাংশন চালাতে এবং হিউগো ভার্সন ০.৫৭.২ ডাউনলোড করতে, আমরা কমান্ড ব্যবহার করি gethugo 0.57.2।

আমার গোল্যাঙ্গ (Golang)-এর জন্যও একটা আছে:

function getgolang () { sudo rm -rf /usr/local/go wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz rm -rf tmp/ go version }

অথবা কীভাবে একটি ফাংশন যা করেন্ট রিপোজিটরির জন্য গিটল্যাব (GitLab)-এ রিমোট অরিজিন URL (remote origin URL) যোগ করে?

function glab () { git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git git remote -v }

glab username দিয়ে, আমরা কারেন্ট গিট রিপোজিটরির জন্য একটি নতুন origin URL তৈরি করতে পারি আমাদের username দিয়ে GitLab.com-এ। একটি নতুন রিমোট URL-এ পুশ (push) করা অটোমেটিক্যালি একটি নতুন প্রাইভেট গিটল্যাব রিপোজিটরি তৈরি করে, তাই এটি ব্যাকআপ (backup) তৈরি করার জন্য একটি উপযোগী শর্টকাট!

বাশ ফাংশনস वस्तুতঃ শুধু স্ক্রিপ্টিংর সম্ভাবনাগুলো (possibilities of scripting) দিয়ে সীমাবদ্ধ, যেগুলো প্র্যাক্টিক্যালি (practically) কম। যদি ऐसा কিছু থাকে যা আমরা ঘন ঘন করি টার্মিনেলে কিছু লাইন টাইপ করে, তবে আমরা সেটার জন্য একটি বাশ ফাংশন বানাতে পারি!

বাশ প্রম্পট (Bash prompt)

ডিরেক্টরি কন্টেন্টসের পাশাপাশি, আমরা যে ডিরেক্টরিতে আছি তার ফুল পাথ (full path) দেখতেও উপযোগী। বাশ প্রম্পট আমাদের এই পাথ দেখাতে পারে, অন্যান্য উপযোগী ইনফরমেশনসহ যেন আমাদের বর্তমান গিট ব্রাঞ্চ (Git branch)। আরও পঠনীয় (readable) করতে, আমরা প্রম্পটের প্রতিটি পার্টের জন্য কালার (colours) ডিফাইন (define) করতে পারি। এখানে কীভাবে আমরা আমাদের প্রম্পট .bashrc-এ সেটআপ করতে পারি এটি অর্জন করতে:

# Colour codes are cumbersome, so let's name them txtcyn='\[\e[0;96m\]' # Cyan txtpur='\[\e[0;35m\]' # Purple txtwht='\[\e[0;37m\]' # White txtrst='\[\e[0m\]' # Text Reset # Which (C)olour for what part of the prompt? pathC="${txtcyn}" gitC="${txtpur}" pointerC="${txtwht}" normalC="${txtrst}" # Get the name of our branch and put parenthesis around it gitBranch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' } # Build the prompt export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "

ফলাফল:

~/github/myrepo (master) $

রঙগুলো নাম দিয়ে সহজে আইডেন্টিফাই (identify) করা যায় কোন রঙ কোথায় শুরু ও শেষ হয়, এবং পরবর্তীটি কোথায় শুরু হয়। আমরা টার্মিনেলে যে প্রম্পট দেখি সেটি ডিফাইন (defined) হয় export PS1 এর পরের স্ট্রিং দিয়ে, প্রতিটি কম্পোনেন্ট এক্সপেইস সিকোয়েন্স (escape sequence) দিয়ে সেট। আসুন ব্রেক ডাউন (break down) করি:

  • \w বর্তমান ওয়ার্কিং ডিরেক্টরি (current working directory) ডিসপ্লে করে,
  • \$(gitBranch) উপরে ডিফাইন করা gitBranch ফাংশন কল করে, যা বর্তমান গিট ব্রাঞ্চ ডিসপ্লে করে,
  • \$ "$" ডিসপ্লে করবে যদি আপনি একটি নরমাল ইউজার (normal user) হন বা নরমাল ইউজার মোডে হন, এবং "#" ডিসপ্লে করবে যদি আপনি রুট (root) হন।

বাশ এক্সপেইস সিকোয়েন্সের (Bash escape sequences) ফুল লিস্ট (full list) আমাদের আরও অনেক ইনফরমেশন ডিসপ্লে করতে সাহায্য করতে পারে, সময় ও তারিখ (time and date) পর্যন্ত! বাশ প্রম্পটস হাইলি কাস্টমাইজেবল (highly customizable) এবং إندিভিজুয়াল (individual), তাই যেকোনো ভাবে আপনি পছন্দ করুন সেটাপ করুন।

এখানে কিছু অপশন যা ইনফরমেশন ফ্রন্ট অ্যান্ড সেন্টার (front and centre) রাখে এবং আমাদের আরও এফিশিয়েন্টলি (efficiently) কাজ করতে সাহায্য করতে পারে।

প্রক্রাস্টিনেশন-এভার্স (procrastination-averse)দের জন্য

ইউজারনেম এবং বর্তমান টাইম সেকেন্ডসহ, ২৪-আওয়ার HH:MM:SS ফরম্যাটে:

export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 > 

যারা সবসময় জানতে চান তারা কোথায় আছেন

ফুল ফাইল পাথ আলাদা লাইনে, এবং ইউজারনেম:

export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo user: 

মিনিমালিস্ট (minimalist)-দের জন্য

export PS1=">"
> 

আমরা বাশ এক্সপেইস সিকোয়েন্সের বেসিকস (basics) দিয়ে অনেক প্র্যাকটিক্যাল প্রম্পট বানাতে পারি; একবার ফাংশনস প্রম্পটের সাথে ইন্টিগ্রেট (integrate) করা শুরু করলে, যেন গিট ব্রাঞ্চ উদাহরণে, জিনিসগুলো খুব কমপ্লেক্স (complicated) হতে পারে। এই পরিমাণ কমপ্লিকেশন আপনার প্রোডাক্টিভিটির জন্য একটি অ্যাডিশন (addition) নাকি ডেট্রিমেন্ট (detriment), শুধু আপনি জানতে পারেন নিশ্চিতভাবেই!

অনেক ফ্যান্সি বাশ প্রম্পট (fancy Bash prompts) সম্ভব যেসব প্রোগ্রামস দিয়ে যেগুলো কুইক সার্চ (quick search) দিয়ে পাওয়া যায়। আমি ইচ্ছাকৃতভাবে স্যাম্পলস (samples) দিনি এখানে কারণ, ঠিক আছে, যদি আপনি এই স্টাফে (stuff) আমার মত একসাইটেড (excited) হতে পারেন, তবে আপনি এই পোস্ট পড়া শুরু করার আগে যা করছিলেন সেটি করতে কয়েক ঘন্টা লাগতে পারে, এবং আমি সেটি আমার কনসciens (conscience)-এ রেখে থাকতে পারি না। ?

আশা করি আমরা এখন টাইম ইনভেস্টেড (time invested) এবং usefulness gained (usefulness gained) আমাদের বাশ কনফিগারেশন ফাইল থেকে একটি নাইস ব্যালেন্স (nice balance) পেয়েছি! আপনি আপনার নতুন-রিকভার্ড (newly-recovered) কীস্ট্রোক ক্যাপাসিটি (keystroke capacity) ভালো কাজে লাগান।

  1. বাশকে পাইথনে রিপ্লেস করুন: সিস্টেম অ্যাডমিনিস্ট্রেটরদের জন্য আধুনিক কমান্ড-লাইন পছন্দ

  2. JSONStudio ObjectRocket ডেটাবেসে স্মุดলি কানেক্ট করুন

  3. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  4. Linux Watch কমান্ড 습득: সিনট্যাক্স, অপশন এবং প্রয়োগিক উদাহরণ