#! - সাধারণত shebang, shabang, hashbang, poundbang নামে ডাকা হয় - এই আর্টিকেলে shebang ব্যবহার করব।
অনেক লিনাক্স শেল স্ক্রিপ্টের শুরুতে এটি থাকে - কিন্তু আসলে এটি কী? ভাঙিয়ে ব্যাখ্যা করা যাক।
এটি সাধারণত এমন দেখায়
#!/bin/bash
#! ফাইলের শুরুতে থাকে, সাধারণত প্রথম লাইনে, তারপর একটি এক্সিকিউটেবলের পথ (এই কেসে, bash শেল)।
এটি একটি কমেন্ট
এটি # দিয়ে শুরু হয়, তাই স্ক্রিপ্টের অংশ হিসেবে এক্সিকিউট হয় না - কিন্তু এটি স্ক্রিপ্ট কীভাবে অপারেট করবে সেটা প্রভাবিত করে, কারণ...
এটি একটি ইন্টারপ্রেটার ডিরেক্টিভের আগে থাকে
shebang সিস্টেমকে বলে কোন ইন্টারপ্রেটার দিয়ে স্ক্রিপ্ট রান করবে, ইন্টারপ্রেটার এক্সিকিউটেবলের পথ দিয়ে।
- এটি সাধারণত ফাইলের শুরুতে, প্রথম লাইনে থাকে, যাতে সঠিক ইন্টারপ্রেটার ফাইলের বাকি অংশ হ্যান্ডেল করতে পারে।
- দেওয়া পথ অবশ্যই ইন্টারপ্রেটার এক্সিকিউটেবলের অবসোলিউট পথ হতে হবে
- shebang লাইনে ইন্টারপ্রেটারকে পাস করার জন্য অপশন থাকতে পারে, তবে এনভায়রনমেন্টের ওপর নির্ভর করে সাপোর্ট ভিন্ন হয় - শুধু একটা অপশন দিয়ে রাখা সेफ।
উদাহরণ
নিচে কিছু #! উদাহরণ এবং তাদের মানে:
bash
#!/bin/bash
এই লাইন স্ক্রিপ্টের শুরুতে রাখলে সিস্টেম বুঝবে এটি bash শেল এক্সিকিউটেবল দিয়ে এক্সিকিউট করতে হবে।
zsh
#!/bin/zsh
এই লাইন রাখলে সিস্টেম বুঝবে এটি zsh শেল এক্সিকিউটেবল দিয়ে এক্সিকিউট করতে হবে।
bash এবং zsh-এর পার্থক্য নিয়ে আমাদের আর্টিকেল পড়ুন!
Python
#!/usr/bin/env python3
Python 3 দিয়ে স্ক্রিপ্ট এক্সিকিউট করুন। নোট করুন, এখানে python3 এক্সিকিউটেবলের পথ স্পেসিফাই না করে, এই লাইন ইউজারের এনভায়রনমেন্টে ডিফাইন করা python3 এক্সিকিউটেবল খুঁজে বের করে।
কিছুই না!
#!/bin/false
ফেইলার স্ট্যাটাস কোড রিটার্ন করে এবং স্ক্রিপ্ট এক্সিকিউট করে না। এমন স্ক্রিপ্টগুলোর জন্য যেগুলো সরাসরি এক্সিকিউট করার জন্য নয়।
#! বাইপাস করা
আপনি যদি #! বিশিষ্ট স্ক্রিপ্ট چنین রান করেন:
./myscript.sh
এখানে myscript.sh আপনার স্ক্রিপ্টের নাম - shebang ব্যবহার হয় ইন্টারপ্রেটার নির্ধারণের জন্য।
এটি শুধু সেই স্ক্রিপ্টগুলোর জন্য সম্ভব যেগুলোর execute পারমিশন আছে কারেন্ট ইউজারের।
তবে আপনি যদি এমন করেন:
bash myscript.sh
...তবে shebang লাইন নয় ইন্টারপ্রেটার নির্ধারণের জন্য ব্যবহার হয়, কারণ কমান্ডে আমরা bash স্পেসিফাই করেছি। শুধু স্ক্রিপ্টের read পারমিশন থাকলেই এটা করা যায়, কারণ স্ক্রিপ্ট এক্সিকিউট হচ্ছে না, bash এক্সিকিউট হচ্ছে।