ব্যাশ শেল নিশ্চিতভাবে একমাত্র শেল নয়, কিন্তু এটি সবচেয়ে শক্তিশালীদের একটি। এটি সিস্টেম অ্যাডমিনিস্ট্রেটরদের জন্য একটি জনপ্রিয় পছন্দ যারা একটি সিম্পল "লন্ডری লিস্ট" কমান্ডের বাইরে যেতে চান একটি সিস্টেমে রান করার জন্য। অন্যান্য শেলেরও অনেক চমৎকার ব্যবহার আছে (উদাহরণস্বরূপ, আমি Git হুকের জন্য ডিফল্ট হিসেবে Tcsh ব্যবহার করি), কিন্তু গভীর স্ক্রিপ্টিং-এর জন্য ব্যাশ একটি সহজ পছন্দ, এবং এখানে কারণটি।
ফাংশন
একটি ব্যাশ স্ক্রিপ্টে ফাংশন তৈরি করতে, function কীওয়ার্ড ব্যবহার করুন:
function foo {
# code here
}
ফাংশনগুলো প্রোগ্রামারদের জন্য উপযোগী কারণ এটি কোডে রিডানডেন্সি কমানো সাহায্য করে। কোডে কম রিডানডেন্সি মেইনটেনেন্সের পরিমাণ কমায় কারণ আপনাকে যদি কোনো মান পরিবর্তন করতে হয়, তবে আপনাকে সেটি শুধু একবার খুঁজে বের করতে হবে (এর ফাংশনে) প্রতিবার এটি ব্যবহার করা হয় তার পরিবর্তে।
ব্যাশ কীভাবে প্রস্তুত
ফাংশনগুলো শেলগুলিতে বেশ ভালোভাবে সমর্থিত, Tcsh-এর 빼ه একটি উল্লেখযোগ্য ব্যতিক্রম।
- Korn shell: ব্যাশের মতো একই সিন্ট্যাক্স ব্যবহার করে
- Zsh: ব্যাশের মতো একই সিন্ট্যাক্স ব্যবহার করে
- Fish: ফাংশন তৈরি এবং ম্যানিপুলেট করার জন্য কাস্টম function কমান্ড ব্যবহার করে
- Tcsh: কখনো কখনো, Tcsh-এ ফাংশন নেই সেটি goto স্টেটমেন্ট দিয়ে ওয়ার্কঅরাউন্ড করা যায়, কিন্তু এটি কদাচিত অপ্টিমাল পছন্দ নয়।
রিডাইরেকশন
ইনপুট এবং আউটপুটের রিডাইরেকশন যেকোনো প্রোগ্রামিং এবং স্ক্রিপ্টিং ভাষায় একটি প্রিয় ফাংশন, এবং এটি অন্তর্নিহিতভাবে ঘটে যখন আপনি একটি শেল ব্যবহার করছেন। আপনি টেক্সট ইনপুট করেন; আপনি আউটপুট পান। কিছু শেল অন্যদের চেয়ে বেশি রবাস্ট, এবং আপনি অনুমান করতে পারেন, ব্যাশ আপনাকে প্রায় সবই অপশন দেয়।
বেসিকগুলো সহজ: আউটপুট রিডাইরেক্ট করতে কিছু সংখ্যক > ক্যারেক্টার ব্যবহার করুন এবং ইনপুট রিডাইরেক্ট করতে কিছু সংখ্যক < ক্যারেক্টার। কিছু স্পেশাল ডেজিগনেশন আছে নির্দিষ্ট টাইপের ইনপুট এবং আউটপুটের জন্য। উদাহরণস্বরূপ, এরর মেসেজগুলো stderr নামে একটি স্ট্রিমে যায়, যা রিডাইরেকশনের উদ্দেশ্যে 2> হিসেবে ডেজিগনেটেড। উদাহরণস্বরূপ, এই কমান্ডটি এরর মেসেজগুলো output.log নামে একটি ফাইলে ডাইরেক্ট করে:
$ ls /void 2> output.log
ব্যাশ কীভাবে প্রস্তুত
রিডাইরেকশন একটি শেলের সাথে ইন্টারঅ্যাক্ট করার সময় একটি চমৎকার সুবিধা ফাংশন, এবং যদিও সব বড় শেলগুলো রিডাইরেকশনের কোনো রকম সমর্থন করে, সব ফিচার সব শেলে উপলব্ধ নয়।
- Korn shell: ব্যাশের মতো একই সিন্ট্যাক্স ব্যবহার করে
- Zsh: ব্যাশের মতো একই সিন্ট্যাক্স ব্যবহার করে
- Fish: আংশিক সমর্থন
- Tcsh: আংশিক সমর্থন
সোর্স
যখন আপনি একটি ফাইল শেলে সোর্স করেন, আপনি ফাইলটি আপনার শেল এনভায়রনমেন্টে ইম্পোর্ট করেন। অধিকাংশ শেল এটি দক্ষতার সাথে হ্যান্ডেল করে, কিন্তু কিছু আপনার সুবিধার জন্য কিছু এক্সট্রা ফিচার প্রদান করে।
উদাহরণস্বরূপ, যখন আপনি ব্যাশে source ব্যবহার করেন, এটি আপনার বর্তমান ডিরেক্টরিতে আপনার রেফারেন্স করা ফাইলটি সার্চ করে। যদি এটি সোর্স করার জন্য ফাইলটি খুঁজে না পায়, তবে এটি আপনার PATH-এ সার্চ করে। এটি একটি ছোট বোনাস, কিন্তু এটি অত্যন্ত সুবিধাজনক কারণ এটি আপনাকে সাধারণ ফাংশনগুলো আপনার ড্রাইভে একটি কেন্দ্রীয় লোকেশনে সংরক্ষণ করতে দেয় এবং তারপর আপনার এনভায়রনমেন্টকে একটি ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্ট (IDE) হিসেবে বিবেচনা করতে দেয়। আপনাকে চিন্তা করতে হয় না আপনার ফাংশনগুলো কোথায় সংরক্ষিত, কারণ আপনি জানেন সেগুলো আপনার লোকাল সমতুল্য /usr/include-এ, তাই আপনি কোথায় আছেন সেটি নির্বিশেষে সোর্স করার সময় ব্যাশ সেগুলো খুঁজে পায়।
ব্যাশ কীভাবে প্রস্তুত
ব্যাশ একমাত্র শেল যা source কমান্ড বা সংক্ষিপ্ত (এবং POSIX-লাইrikt) . নোটেশন ব্যবহার করার সময় বর্তমান ডিরেক্টরি এবং আপনার PATH উভয়ই সার্চ করে।
কী বাইন্ডিং
অনেক শেল আপনাকে আপনি কীভাবে সেগুলোর সাথে ইন্টারঅ্যাক্ট করবেন সেটি কাস্টমাইজ করতে দেয়, এবং অবশ্যই, একটি টেক্সট-ভিত্তিক ইন্টারফেসের সাথে যেকোনো ইন্টারঅ্যাকশন টাইপিং দিয়ে শুরু হয়। ব্যাশে, আপনি আপনার বর্তমান কীম্যাপ দেখতে পারেন:
$ bind -V | grep keymap
আপনার কীম্যাপ পরিবর্তন করতে (Emacs থেকে Vi-তে, উদাহরণস্বরূপ):
$ bind 'set keymap vi'
ব্যাশ কীভাবে প্রস্তুত
শুধু ব্যাশ এবং Zsh কী বাইন্ডিং-এর জন্য বিল্ট-ইন প্রিসেট প্রদান করে।
ইতিহাস
যেকোনো শেলের চেয়ে ব্যাশের সবচেয়ে রবাস্ট কমান্ড-ইতিহাস ইন্টারফেস আছে। ব্যাশ ভার্সনের history রিভার্স সার্চ, কুইক রিকল, ইতিহাস এডিটিং (লাইন নম্বর দিয়ে এন্ট্রি ডিলিট করা সহ), এবং আরও অনেক কিছু অনুমতি দেয়। অন্যান্য সব শেল মিলেও ব্যাশের ইতিহাস ইন্টারফেসের মিল রেখে, কিন্তু কেউ একা (Zsh′, যা সাধারণত ব্যাশের অনুকরণ করে) নিজে থেকে এটিকে ম্যাচ করে না।
ইতিহাস ম্যানিপুলেশন
history কমান্ড আপনার অতীতের সাথে ইন্টারঅ্যাক্ট করার একমাত্র উপায় নয়। ব্যাশের শর্টহ্যান্ড নোটেশনের একটি সমৃদ্ধ সংগ্রহ আছে যা আপনাকে আপনার শেল ইতিহাসের কমান্ডগুলো রিকল এবং এমনকি মডিফাই করতে সক্ষম করে।
উদাহরণস্বরূপ, সবচেয়ে সাম্প্রতিক কমান্ডটি আবার চালাতে (আউটপুট history | tail -n1, একটি লিডিং space ব্যবহার করে, এখানে দ্বারা ডেজিগনেটেড, ইতিহাস কমান্ডকে আপনার ইতিহাসের বাইরে রাখতে), আপনি শুধু !! টাইপ করতে পারেন ব্যাশে।:
$ wc -w luarocks.xml
1284 luarocks.xml
$ !!
1284 luarocks.xml
সাম্প্রতিক কমান্ডটি চালাতে সেই কমান্ডের অংশটি অন্য কিছু দিয়ে রিপ্লেস করে, আপনি স্ট্রিং সাবস্টিটিউশন ব্যবহার করতে পারেন:
$ wc -w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$ wc -l luarocks.xml
214 luarocks.xml
এইরকম অনেক শর্টকাট আছে, সেগুলো সব ব্যাশ ম্যান এবং ইনফো পেজে ডকুমেন্টেড। স্বীকার করা যাক, এই ট্রিকগুলো অনেক অগ্রগামী ব্যবহারকারীদের জন্য যাদের জন্য ব্যাশ ইন্টারঅ্যাকশন এতটাই পুনরাবৃত্তিমূলক এবং মন্ডেন যে অস্পষ্ট, দেখা যাক র্যান্ডম কী কম্বিনেশনগুলো উপযোগী। Zsh কার্যকরভাবে ব্যাশের অনুকরণ করে, কিন্তু অন্য কোনো শেল এই ধরনের ম্যাক্সিমাইজড ইফিশিয়েন্সি অফার করে না।
ব্যাশ কীভাবে প্রস্তুত
ব্যাশের ইতিহাস কমান্ডগুলো অন্য যেকোনো শেলের চেয়ে বेजোড় (Zsh কাছাকাছি, কিন্তু কিছু অপশন নেই, যেমন লাইন নম্বর দিয়ে ডিলিট করার ক্ষমতা)।
অ্যাসোসিয়েটিভ অ্যারে
বেশির ভাগ শেল ইনডেক্সড অ্যারে তৈরি, ম্যানিপুলেট, এবং কোয়েরি করার ক্ষমতা অফার করে। সাদা ইংরেজিতে, একটি ইনডেক্সড অ্যারে হলো একটি জিনিসের তালিকা যেগুলো একটি নম্বর দিয়ে প্রিফিক্সড। জিনিসগুলোর এই তালিকা, তাদের বরাদ্দ করা নম্বরের সাথে, সুবিধাজনকভাবে একটি একক ভেরিয়েবলে র্যাপ করা থাকে, যা আপনার কোডে এটিকে "হাতে ধরে" ঘুরানো সহজ করে তোলে।
ব্যাশ, যাইহোক, অ্যাসোসিয়েটিভ অ্যারে তৈরি করার ক্ষমতা অন্তর্ভুক্ত করে এবং এই অ্যারে들을 অন্য যেকোনো অ্যারের মতোই বিবেচনা করে। একটি অ্যাসোসিয়েটিভ অ্যারে আপনাকে কী এবং ভ্যালু পেয়ারের তালিকা তৈরি করতে দেয়, শুধু নম্বরযুক্ত ভ্যালু না।
অ্যাসোসিয়েটিভ অ্যারের চমৎকার দিক হলো কীগুলো আrbitrary হতে পারে:
$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`
যেকোনো কী কোয়েরি করুন:
$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192
আপনি যে সাধারণ অ্যারে অপারেশনগুলো আশা করবেন সেগুলো অধিকাংশ উপলব্ধ।
ব্যাশ কীভাবে প্রস্তুত
ব্যাশ একমাত্র শেল যা অ্যাসোসিয়েটিভ অ্যারের জন্য পূর্ণ সমর্থন প্রদান করে (আরেকবার Zsh কাছাকাছি, কিন্তু কীগুলো তালিকা করার ফাংশন নেই)।
শেল স্ক্রিপ্টিং-এর জন্য ব্যাশ বেছে নিন
ব্যাশের কিছু সুবিধা POSIX-কম্প্লায়েন্ট নয়। তত্ত্বে, এর মানে আপনি একটি ব্যাশ স্ক্রিপ্ট লিখতে পারেন যা ব্যাশ ছাড়া একটি সিস্টেমে প্রত্যাশা অনুযায়ী রান করে না। যদি তা হয়, তবে বলা হয় আপনার স্ক্রিপ্ট "পোর্টেবল" নয়।
প্র্যাকটিসে, যাইহোক, ব্যাশ ফ্রি এবং ওপেন সোর্স সফটওয়্যার, তাই কারো উনি ইনস্টল করতে পারেন, তারা লিনাক্স, BSD, OpenIndiana, উইন্ডোজ, বা macOS চালান না কেন। ব্যাশ ইনস্টল করা ব্যবহারকারকে ব্যাশকে তাদের ডিফল্ট শেল হিসেবে ব্যবহার করতে বাধ্য করে না, বা এমনকি সচেতনভাবে এটি লঞ্চ করতে হয় না, কারণ একটি ভালো শেল স্ক্রিপ্ট তার শীর্ষ শিবাং লাইনে কোন শেলটি ব্যবহার করছে সেটি শনাক্ত করে (#!/bin/bash, উদাহরণস্বরূপ)।
সন্দেহ হলে, আপনার ডকুমেন্টেশনে আপনার শেল স্ক্রিপ্টের একটি ডিপেন্ডেন্সি হিসেবে ব্যাশ অন্তর্ভুক্ত করুন (যদি এটি একমাত্র ডিপেন্ডেন্সি হয়) যাতে ব্যবহারকারীদের সতর্ক করা যায় যে এটি একটি ব্যাশ স্ক্রিপ্ট, জেনেরিক শেল স্ক্রিপ্ট নয়।
ব্যাশের অনেক সুবিধা আছে, এবং আমি মনে করি সেগুলো পোর্টেবিলিটি সংক্রান্ত চিন্তার চেয়ে বেশি গুরুত্বপূর্ণ। পাইথন বা জাভা বা অন্য যেকোনো সফটওয়্যারের মতো, কখনো কখনো ডিপেন্ডেন্সি থাকে। আপনি যদি ব্যাশ পছন্দ করেন এবং এর শর্টহ্যান্ড এবং শর্টকাটগুলো উপযোগী পান, নিজেকে সংকোচিত করবেন না।