এই আর্টিকেলের মূল ফোকাস হলো স্পষ্টভাবে বুঝতে bash-এ script run করা vs source করা-র কী হয়। প্রথমে আমরা স্পষ্টভাবে বুঝব প্রোগ্রাম কীভাবে সাবমিট হয় যখন আপনি ভিন্ন ভাবে স্ক্রিপ্ট কল করেন।
নোট: এক্সটেনশন সহ স্ক্রিপ্ট তৈরি করা मैटर করে না। এক্সটেনশন ছাড়াও স্ক্রিপ্ট ঠিকঠাক चले।
বেসিক্যালি, প্রতিটি স্ক্রিপ্ট একটি লাইন দিয়ে শুরু হয় যাকে shebang (#!) বলে। Bash-এ Hash সিম্বল কমেন্ট হিসেবে ইন্টারপ্রেট হয় কিন্তু shebang-এর স্পেশাল মেনিং আছে। এটি bash-কে বলে আপনার শেব্যাং-এ উল্লেখ করা ইন্টারপ্রেটারে প্রোগ্রাম সাবমিট করতে।
নিচে একটি স্যাম্পল প্রোগ্রাম এবং আমি bash নির্দিষ্ট করেছি ইন্টারপ্রেটার হিসেবে।
$ cat >> Hello_World.sh #!/usr/bin/env bash echo "Hello world" $ chmod +x Hello_world.sh
এখন স্ক্রিপ্ট রান করার দুটি উপায় আছে।
- রিলেটিভ পাথ ব্যবহার করে স্ক্রিপ্ট কল করুন। স্ক্রিপ্ট আছে সে ডিরেক্টরিতে যান এবং ./Hello_world.sh রান করুন।
- অবসোলিউট পাথ ব্যবহার করে স্ক্রিপ্ট কল করুন। ফাইল সিস্টেমের যেকোনো জায়গা থেকে স্ক্রিপ্টের ফুল পাথ টাইপ করুন।
$ ./Hello_world.sh $ pwd $ /home/karthick/Hello_world
এখন দেখি কী হয় যখন আপনি shebang ছাড়া প্রোগ্রাম সাবমিট করার চেষ্টা করেন। shebang অনুপস্থিতিতে, প্রোগ্রাম আপনার করেন্ট শেলে সাবমিট হবে যা আপনি রান করছেন, আমার কেসে এটি Bash (/bin/bash)।
একটি উদাহরণ দিয়ে দেখি। আমি একটি পাইথন স্ক্রিপ্ট তৈরি করছি shebang ছাড়া এবং প্রোগ্রাম কল করলে, bash নয় জানতে পারে যে এটি পাইথন ইন্টারপ্রেটারে সাবমিট করা উচিত, বরং করেন্ট শেলে রান করবে।
$ cat > run-py.py
echo $SHELL
print("Hello world")
$ chmod +x run-py.py
$ ./run-py.py
এই কেসে, আপনি প্রোগ্রাম কল করতে পারেন ইন্টারপ্রেটার মেনশন করে বা শুধু shebang লাইন যোগ করুন যা সবসময় রিকমেন্ডেড।
# which python3 $(which python3) /home/karthick/run_py.py
এখন আপনি জানেন স্ক্রিপ্ট কীভাবে কল করতে হয়, পরবর্তী ধাপ হবে বুঝতে যখন আমরা স্ক্রিপ্ট কল করি তখন কী হয়। আপনি উপরের উদাহরণগুলোর মতো স্ক্রিপ্ট ইনভোক করলে এটি একটি চাইল্ড প্রসেস তৈরি করবে (forking) এবং স্ক্রিপ্ট চাইল্ড প্রসেসে সাবমিট হবে। আমি একটি স্যাম্পল স্ক্রিপ্ট রান করলাম যা শুধু নিচের কমান্ড রান করে এবং দেখায় স্ক্রিপ্ট চাইল্ড প্রসেসে সাবমিট হয়েছে।
$ ps -ef --forest | grep -i bash
স্ক্রিপ্টের অংশ হিসেবে একাধিক চাইল্ড প্রসেস থাকতে পারে এবং সেটি আমাদের কোডের ওপর ডিপেন্ড করে। নোট করা উচিত যে সাবস্ক্রিপ্ট তৈরি করা এনভায়রনমেন্টাল ভেরিয়েবল স্ক্রিপ্ট ফিনিশ হলে ড্রপ হয়ে যায়। একটি চাইল্ড প্রসেস প্যারেন্ট প্রসেস তৈরি করা ভেরিয়েবল এক্সেস করতে পারে এক্সপোর্ট করে। কিন্তু প্যারেন্ট প্রসেস চাইল্ড প্রসেস তৈরি করা ভেরিয়েবল এক্সেস করতে পারে না।
ভেরিয়েবল কীভাবে কাজ করে এবং কীভাবে এক্সপোর্ট করতে হয় সেটি বুঝতে নিচের আর্টিকেলগুলো দেখুন।
- Understanding and Writing ‘Linux Variables’ in Shell Scripting
- Learn Difference Between $$ and $BASHPID in Bash
স্ক্রিপ্ট সোর্সিং
“Source” একটি শেল built-in কমান্ড যা আর্গুমেন্ট হিসেবে পাস করা ফাইলটি পড়ে এবং কোডটি করেন্ট শেল এনভায়রনমেন্টে রান করে। একটি উপযুক্ত ইউজ কেস যা আপনি অধিকাংশ সময় ব্যবহার করেন হলো .bashrc বা .bash_profile-এ কনফিগারেশন মডিফাই করে source command দিয়ে চেঞ্জগুলো রিলোড করা।
$ type -a source
source command রান করার দুটি সিনট্যাকটিক উপায় আছে। আপনি দুটোর যেকোনো একটি বেছে নিতে পারেন, এটি পারসোনাল চয়েস।
$ source FILE_NAME [ARGUMENTS] $ . FILE_NAME [ARGUMENTS]
দেখি source আসলে কীভাবে কাজ করে। আমি দুটি শেল স্ক্রিপ্ট তৈরি করব। প্রথম স্ক্রিপ্ট (Module.sh) কিছু ভেরিয়েবল এবং ফাংশন রাখবে। দ্বিতীয় স্ক্রিপ্ট (Main.sh) ভেরিয়েবল প্রিন্ট করবে এবং ফাংশন কল করবে।
File Module.sh.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo “Function f1 is called”
}
File Main.sh.
#!/usr/bin/env bash echo $VAR1 f1
স্ক্রিপ্টের এক্সিকিউশন পারমিশন সেট করুন এবং মেইন স্ক্রিপ্ট “main.sh” কল করুন। এখন এই স্ক্রিপ্ট করেন্ট শেল এনভায়রনমেন্টে ফাংশন f1 এবং ভেরিয়েবল VAR1 খুঁজবে এবং command not found দিয়ে ফেল করবে।
$ bash main.sh
এখন স্ক্রিপ্টের ভিতরে source কমান্ড চালাতে পারি যা ভেরিয়েবল এবং ফাংশনগুলো করেন্ট শেল এনভায়রনমেন্টে লোড করবে এবং “main.sh”-এর কাছে অ্যাক্সেসযোগ্য হবে।
File Module.sh.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo "Function f1 is called"
}
File Main.sh.
#!/usr/bin/env bash source module.sh Tecmint echo $VAR1 f1
আবার স্ক্রিপ্ট রান করুন এবং দেখুন।
$ bash main.sh
source bash-এ খুব উপকারী মডুলার প্রোগ্রামিং অ্যাপ্রোচ ফলো করার জন্য শেল স্ক্রিপ্ট বানাতে। আমরা আমাদের কোড ছোট ছোট মডিউলে ভাঙতে পারি এবং অনেক প্রোগ্রামে ব্যবহার করতে পারি। এই পথে আমরা DRY (Don’t Repeat Yourself) প্রিন্সিপল ফলো করতে পারি।
এই আর্টিকেলের জন্য এতটুকু। আমরা সংক্ষেপে bash-এ sourcing এবং forking-এর পার্থক্য আলোচনা করেছি। আর্টিকেলটি পড়ুন এবং আপনার মূল্যবান ফিডব্যাক শেয়ার করুন।