শেল স্ক্রিপ্ট

থাম্ব|আইপিফায়ারওয়াল(ipfirewall) কনফিগার করার জন্য একটি ফ্রীবিএসডি(FreeBSD) শেল স্ক্রিপ্ট সম্পাদনা করা হচ্ছে
**শেল স্ক্রিপ্ট **(ইংরেজি : Shell script) হচ্ছে একটি কমান্ড-লাইন ইন্টারপ্রিটার যা ইউনিক্স শেল দ্বারা চালিত একটি কম্পিউটার প্রোগ্রাম। বিভিন্ন প্রকার শেল স্ক্রিপ্টকে একসাথে স্ক্রিপ্টিং ভাষা হিসাবে বিবেচনা করা হয়।

ফাইল ম্যানিপুলেশন, প্রোগ্রাম এক্সিকিউশন এবং টেক্সট প্রিন্ট করা ইত্যাদি অপারেশন অনায়াসে শেল স্ক্রিপ্টের দ্বারা সঞ্চালন করা যেতে পারে। যে স্ক্রিপ্ট দিয়ে আমরা পরিবেশ (এনভায়রনমেন্ট) সেট আপ করি, প্রোগ্রাম রান করাই এবং প্রয়োজনীয় পরিষ্কারকরণ, লগিং ইত্যাদি করে থাকি তাকে **র‍্যাপার** (wrapper) বলা হয়।

সাধারণত শেল স্ক্রিপ্ট বলতে একটি অপারেটিং সিস্টেম শেলকে স্বয়ংক্রিয় মোডে চালানো (রান করা) বোঝায়; কিছু নির্দিষ্ট অপারেটিং সিস্টেমে এদের বলা হয়, ব্যাচ ফাইল (যেমন এমএসডস-উইন৯৫ স্ট্রীম, ওএস/২), কমান্ড প্রোসিডিউর্স (যেমন ভিএমএস), এবং শেল স্ক্রিপ্ট (যেমন উইন্ডোজ এনটি স্ট্রীম এবং তৃতীয় পক্ষের ডেরিভেটিভস যেমন ৪এনটি—নিবন্ধে cmd.exe) ইত্যাদি। মেইনফ্রেম অপারেটিং সিস্টেমে আবার এর ভিন্ন নাম আছে।

সাধারণত ইউনিক্স/গ্নু/লিনাক্স/পোসিক্স সম্মত ইনস্টলেশনের সাথে কর্নশেল (KornShell) অন্তর্ভুক্ত থাকে। বিভিন্ন প্রকার শেলের সংস্করণ আছে যেমন ksh88, কর্ণ শেল '93 ইত্যাদি। বোর্ন শেল(sh) হচ্ছে সবচেয়ে পুরনো শেল যা এখনও ব্যবহার হয়; এছাড়াও ইউনিক্স সিস্টেমে সবসময় অন্তর্ভুক্ত থাকে সি শেল (csh), বোর্ন এগেইন শেল (bash), রিমোট শেল (rsh), SSL টেলনেট সংযোগের জন্য একটি নিরাপদ শেল (ssh) এবং tclsh নামক একটি শেল যা Tcl/Tk ইনস্টলেশনের জন্য একটি প্রধান উপাদান; wish ও একটি গুই ভিত্তিক Tcl/Tk শেল। সি প্রোগ্রামিং ভাষা এবং Tcl শেলের সিনট্যাক্স উপর্যুক্ত প্রোগ্রামিং ভাষাসমূহের অনুরূপ। কর্ণ শেল ও ব্যাশ (Bash) শেল অ্যালগোল (ALGOL) ভাষা এবং অন্যান্য কিছু উপাদানের উপর ভিত্তি করে তৈরি। এদুটি অনেকাংশে বোর্ন (Bourne) শেলের ন্যায়। অন্যদিকে, পার্ল প্রোগ্রামিং ভাষা ডিজাইনে বিভিন্ন শেল প্লাস সরঞ্জাম যেমন awk, sed, grep, এবং বিভিন্ন প্রোগ্রামিং ভাষা বেসিক, লিস্প, সি র অবদান আছে।

অন্যান্য শেলের মধ্যে আছে ash, msh, ysh, zsh (একটি বহুল ব্যবহৃত উন্নত মানের কর্নশেল), টেনেক্স(Tenex) সি শেল (tcsh), পার্ল-এর মত শেল (psh) ইত্যাদি যা ডাউনলোড বা ক্রয় করা যেতে পারে। এছাড়া পাইথন, রুবি, সি, জাভা, পার্ল, পাস্কেল, রেক্স এর উপর ভিত্তি করে নির্মিত বিভিন্ন শেলও ব্যাপকভাবে পাওয়া যায়। আরেকটি পরিচিত শেল হল গিয়ে osh যার ম্যানুয়াল অনুযায়ী এটি "ইউনিক্স ষষ্ঠ সংস্করণ থেকে গৃহীত একটি উন্নত, পূর্ব সংস্করণের সাথেও চলে এমন স্ট্যান্ডার্ড কমান্ড ইন্টারপ্রিটার"।

MKS টুলকিট, সিগউইন, ইউউইন, ইনটারিক্স এবং অন্য কিছু উইন্ডোজ-ইউনিক্স আন্তঃপ্রক্রিয়া(Windows-Unix interoperability) সফটওয়্যার আছে যা ব্যবহার করে আমরা  উইন্ডোজ সিস্টেমেও উপরে উল্লেখিত শেলসমূহ ও ইউনিক্স প্রোগ্রামিং এর সুবিধা পেতে পারি। সংকেত ও অন্যান্য আন্তঃ প্রসেস যোগাযোগ(inter-process communication), সিস্টেম কল এবং এপিআই(এপিআই) গুলো এভাবে লাভ করা সম্ভব। আরেকটি  উইন্ডোজ শেল হল হ্যামিলটন সি শেল যা অনেকটা ইউনিক্স সি শেলের মত। মাইক্রোসফট তার এনটি ভিত্তিক অপারেটিং সিস্টেমের সাথে ব্যবহারের জন্য 'ইউনিক্সের জন্য উইন্ডোজ সেবা' নামক একটি শেল বিতরণ করে থাকে যা একটি পোজিক্স ভিত্তিক পরিবেশ সাব-সিস্টেম।

## কর্মক্ষমতা
### শর্টকাটসমূহ
একটি শেল স্ক্রিপ্ট কোন সিস্টেম কমান্ডকে একটি সুবিধাজনক ভিন্ন রূপ প্রদান করতে পারে, যেখানে বিশেষ পরিবেশ সেটিংস, কমান্ড বিকল্প বা পোস্ট-প্রসেসিং স্বয়ংক্রিয়ভাবে সম্ভব হয়ে থাকে। মজার ব্যাপার হল এই নতুনসৃষ্ট ভিন্নরূপী স্ক্রিপ্টটি একটি সম্পূর্ণরূপে স্বাভাবিক ইউনিক্স কমান্ড হিসাবেই কাজ করতে সক্ষম হয়।

উদাহরণস্বরূপ ধরা যাক ls কমান্ডটির একটি নতুন সংস্করণ 'l' সংক্ষিপ্ত নামে সৃষ্টি করতে হবে। ls সাধারণত ফাইলের একটি তালিকা প্রদান করে থাকে। সাধারণত এই নতুন কমান্ডটির সংজ্ঞা সংরক্ষিত করা হয় ইউজারের হোম নামক ফোল্ডারের বিন ডিরেক্টরিতে যেমন, /home/*username*/bin/l, এবং নিম্নলিখিত উপায়ে একটি ডিফল্ট কমান্ড সেট অপশন প্রাক সরবরাহ করা হয়ে থাকে।
```bash
#!/bin/sh
LC_COLLATE=C ls -FCas "$@"
```
প্রথম লাইনে কোন্ ইন্টারপ্রিটার দিয়ে বাকি স্ক্রিপ্টগুলি চলবে তা লেখা হয় এবং দ্বিতীয় লাইনে ফাইল ফরম্যাট, কলাম ও সাইজ(কতটি ব্লক) নির্দেশ করতে অপশন দেওয়া হয়। LC_COLLATE=C এর মাধ্যমে ডিফল্ট কোলেশন ক্রম সেট করা হয় যাতে বড়হাতের ও ছোটহাতের ইংরেজি অক্ষরকে আলাদা ভাবে প্রসেস করা হয় ও যাতে ডটফাইল(dotfiles) ও স্বাভাবিক ফাইলের নাম গুলিয়ে ফেলা না হয়(সাধারণত -a অপশন থাকলেই শুধু ডটফাইল দেখানো হয়ে থাকে)। ls কমান্ড যে সব স্বাভাবিক কাজ করতে সক্ষম এবং ls এর যা সিনট্যাক্স সেগুলি যাতে 'l' এর ক্ষেত্রেও ব্যবহার করা যেতে পারে সেজন্যে দ্বিতীয় লাইনের শেষে "$@" লেখা হয়েছে।

এখন ls এর পরিবর্তে সংক্ষিপ্তরূপ l ব্যবহার করে ফাইল তালিকাভুক্তি ইত্যাদি অপারেশন করা যেতে পারে।

আরেকটি উদাহরণ দেওয়া যাক। নিম্নলিখিত উপায়ে ls কমান্ড দিয়ে যে ডিরেক্টরির ভেতর স্ক্রিপ্টটি রান করা হচ্ছে তার মধ্যে অবস্থিত ফাইলগুলির তালিকা দেখা যায়।

```bash
#!/bin/sh

clear
ls -al
```
এই ক্ষেত্রে স্বাভাবিকভাবে #!/bin/sh দিয়ে শেল স্ক্রিপ্টটি শুরু করা হয়েছে। এরপর clear কমান্ডের মাধ্যমে টার্মিনালে/স্ক্রীনে থাকা সব টেক্সট বা লেখা মুছে ফেলা হবে। এরপর ls -al কমান্ডের মাধ্যমে যে ডিরেক্টরির ভেতর স্ক্রিপ্টটি রান করা হচ্ছে তার একটি ফাইলের তালিকা দেখানো হবে। বিভিন্ন কাজ করানোর জন্যে ls কমান্ডকে ভিন্ন ভিন্ন অ্যাট্রিবিউট দেওয়া যেতে পারে।

উল্লেখ্য: যদি clear কমান্ডটির ইমপ্লিমেনটেশন বা বাস্তবায়ন উপলব্ধ না থাকে তাহলে পরিবর্ত হিসাবে clr কমান্ড ব্যবহার করুন।

### ব্যাচ কাজসমূহ
একাধিক কাজ বা অপারেশন একত্রে করা হলে তাকে ব্যাচ কাজ বলা যেতে পারে। শেল স্ক্রিপ্টের মাধ্যমে বিভিন্ন কমান্ডকে একসাথে লিখে একটি শেলস্ক্রিপ্ট(ব্যাচ) ফাইলে রেখেও রান করা যেতে পারে। উদাহরণস্বরূপ ধরা যাক একটি ডিরেক্টরিতে তিনটি সি উৎস(সোর্স কোড) ফাইল আছে। এবার এই তিনটি উৎস ফাইলকে পৃথক পৃথকভাবে রান করার পরিবর্তে আমরা একটি সি শেল স্ক্রিপ্ট তৈরি করে একবারে কম্পাইল করতে পারি। এর ফলে তিনটি ফাইলই পর পর স্বয়ংক্রিয়ভাবে রান হয়ে যাবে। এরকম ফাইলকে ব্যাচ ফাইল বলে। নিম্নলিখিত উদাহরণটি দেখুন।

```bash
#!/bin/csh
echo compiling...
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
echo done.
```
স্ক্রিপ্টের মাধ্যমে ফাইল সংরক্ষণ করা, বিরতি নেওয়া এবং তারপর শুধু ./build রান করার ব্যবস্থা আছে। 1980 সাল থেকে স্ক্রিপ্টের পরিবর্তে বিভিন্ন ইউটিলিটি যেমন make ইত্যাদি দ্বারা এরকম বিল্ডজাতীয় কাজ করা হয়ে থাকে।

### সাধারণীকরণ
শেল স্ক্রিপ্টের মাধ্যমে সহজেই বিভিন্ন ব্যাচ কাজ সম্পাদন করা যায়। উদাহরণস্বরূপ কোন JPEG ইমেজ PNG ইমেজে রূপান্তর করতে ব্যাশ স্ক্রিপ্ট ব্যবহার করা যেতে পারে। যেখানে কমান্ড-লাইনে সম্ভবত ওয়াইল্ডকার্ড—এর মাধ্যমে ছবির নাম প্রদান করা হয়। সাধারণত/home/username/bin/jpg2png এর মধ্যে একটি ফাইল হিসাবে স্ক্রিপ্টটি সংরক্ষিত করা হয়। নিচে একটি স্যাম্পল স্ক্রিপ্ট দেওয়া হল।

```bash
#!/bin/bash
for jpg; do                                  # use $jpg in place of each filename given, in turn
    png="${jpg%.jpg}.png"                    # construct the PNG version of the filename by replacing .jpg with .png
    echo converting "$jpg" ...               # output status info to the user running the script
    if convert "$jpg" jpg.to.png ; then      # use the convert program (common in Linux) to create the PNG in a temp file
        mv jpg.to.png "$png"                 # if it worked, rename the temporary PNG image to the correct name
    else                                     # ...otherwise complain and exit from the script
        echo 'jpg2png: error: failed output saved in "jpg.to.png".' >&2
        exit 1
    fi                                       # the end of the "if" test construct
done                                         # the end of the "for" loop
echo all conversions successful              # tell the user the good news
exit 0
```
jpg2png কমান্ডটি একটি JPEG ছবিতে ভরা ডিরেক্টরিতে  শুধু /home/*username*/bin/jpg2png *.jpg লিখে রান করা হলে সেই ডিরেক্টরিতে অবস্থিত JPEG ছবিগুলি NPG ছবিতে রূপান্তরিত হবে।

### অন্য প্রোগ্রামের সাথে মিল
শেল স্ক্রিপ্টের অন্যতম মূল বৈশিষ্ট্য  হল ইন্টারপ্রিটার ইনভোক করাকে অর্থাৎ চালানোকে একটি কোর অপারেটিং সিস্টেম বৈশিষ্ট্য হিসাবে বিবেচনা করা হয়। এর ফলে একজন ব্যবহারকারীর শেল কেবল সেই শেলের ভাষায় স্ক্রিপ্ট এক্সিকিউট করা বা যেসব স্ক্রিপ্টের ইন্টারপ্রিটার নির্দেশক আছে তাদের শুধুমাত্র শেল থেকে রান করা (বা চালানো) হলেই চলবে এমন হওয়ার (উভয়ই প্রাথমিক ব্যাশের সীমাবদ্ধতা ছিল) পরিবর্তে সংশ্লিষ্ট অপারেটিং সিস্টেম নিজে শেল স্ক্রিপ্টকে সেটআপ করে এবং এক্সিকিউট করে। একটি আধুনিক শেল স্ক্রিপ্টকে সিস্টেম কমান্ড এর চেয়ে বৃহত্তর অর্থে ব্যবহার করা হয়ে থাকে কারণ সিস্টেম কমান্ডগুলিকে আসলে শেল স্ক্রিপ্ট (বা, আরো সাধারণভাবে, স্ক্রিপ্ট বলা যায় কারণ এদের বেশ কিছু শেলের পরিবর্তে পার্ল, পাইথন ইত্যাদি ভাষায় ইন্টারপ্রিট করা হয়) বলা যায়। অন্যান্য সিস্টেম ইউটিলিটির মত শেল স্ক্রিপ্টও এক্সিকিউশনের সাফল্য বা ব্যর্থতা নির্দেশ করতে এক্সিট কোড রিটার্ন করে থাকে। অন্যদিকে শেল স্ক্রিপ্টকে বড় প্রোগ্রামের উপাদান হিসাবেও বিবেচনা করা হয়ে থাকে। এইক্ষেত্রে বড় প্রোগ্রামের ইমপ্লিমেন্টেশন বা বাস্তবায়ন প্রণালী বিবেচ্য নয়।

ঐতিহাসিকভাবে স্ট্যান্ডার্ড সিস্টেম কমান্ডের মত সাধারণত শেল স্ক্রিপ্টের ক্ষেত্রেও ফাইলের নামের এক্সটেনশন থাকে না যদি না এটি একটি চলমান শেলের দ্বারা বিশেষ পদ্ধতিতে বা মেকানিজমে চালানোর জন্য তৈরি করা হয়ে থাকে (যেমন sh এর "." বা csh এর source)।

### প্রোগ্রামিং
অনেক আধুনিক শেলে শুধুমাত্র উন্নত সাধারণ উদ্দেশ্য প্রোগ্রামিং ভাষাতে পাওয়া যায় এমন সব বৈশিষ্ট্য থাকে। যেমন নিয়ন্ত্রণ-প্রবাহ নির্মাণ(control-flow constructs), ভেরিয়েবল, মন্তব্য, অ্যারে, সাবরুটিন ইত্যাদি। এইরকম বৈশিষ্ট্য উপলব্ধ থাকলে অত্যাধুনিক অ্যাপ্লিকেশনও শেল স্ক্রিপ্ট হিসাবে লেখা সম্ভব হয়। যাইহোক, এখনও শেল স্ক্রিপ্টের বেশ কিছু সীমাবদ্ধতা আছে। যেমন অধিকাংশ শেল স্ক্রিপ্টে তথ্য টাইপ সিস্টেম, ক্লাস, থ্রেডিং, জটিল গণিত, এবং অন্যান্য সাধারণ পূর্ণ ভাষায় প্রাপ্ত নানা বৈশিষ্ট্য বিদ্যমান নেই বা থাকলেও নিতান্তই কম। আবার শেল স্ক্রিপ্ট কম্পাইলিত কোড বা ইন্টারপ্রিট হওয়া কোডের তুলনায় ধীরগতিতে চলে থাকে। ফলে একরকম কর্মক্ষমতার সীমাবদ্ধতা লক্ষ্য করা যায়।

শেলে কাজ করার অভিজ্ঞতার মানোন্নয়নের জন্য স্ট্যান্ডার্ড ইউনিক্স সরঞ্জাম/টুল যেমন sed এবং awk শেল প্রোগ্রামিং-এর জন্য ব্যবহার করা যেতে পারে। এর ফলে শেল স্ক্রিপ্ট অতিরিক্ত ক্ষমতা প্রাপ্ত হয়। অনুরূপভাবে শেল স্ক্রিপ্টের মধ্যে পার্ল এমবেড করা বা ঢোকানো যেতে পারে। অন্যান্য স্ক্রিপ্টিং ভাষা যেমন Tcl, পার্ল ইত্যাদির গ্রাফিক্স অর্থাৎ চিত্রায়িত টুলকিটও পাওয়া যায়।

## অন্যান্য স্ক্রিপ্টিং ভাষা
খুব বড় বা জটিল কাজ সহজে পরিচালনা করার জন্য অনেক শক্তিশালী স্ক্রিপ্টিং ভাষা প্রকাশ করা হয়েছে, বিশেষত ঐসব ক্ষেত্রে যেখানে একটি কম্পাইল করা প্রোগ্রামিং ভাষার ব্যবহার  অসুবিধাজনক হয় এবং স্ক্রিপ্টিং ভাষার প্রয়োজনীয়তা অবহেলা করা যায় না। স্ক্রিপ্টিং ভাষার সাথে উচ্চ পর্যায়ের প্রোগ্রামিং ভাষার পার্থক্য কোথায় তা নিয়ে যথেষ্ট বিতর্কের অবকাশ আছে। কিন্তু সাধারণভাবে বলতে গেলে একটি স্ক্রিপ্টিং ভাষার জন্য ইন্টারপ্রিটারের প্রয়োজন হয়ে থাকে যা উচ্চ পর্যায়ের প্রোগ্রামিং ভাষার ক্ষেত্রে অনিবার্য নয়।

## শেলের জীবন চক্র
শেল স্ক্রিপ্ট সাধারণত সফটওয়্যার নির্মাণের প্রাথমিক ধাপের মত এবং প্রায়ই তা পরে অন্য কোন অন্তর্নিহিত সফটওয়্যারে বাস্তবায়িত করা হয়। বেশিরভাগ ক্ষেত্রে শেল স্ক্রিপ্টকে পার্ল, পাইথন বা সি তে রূপান্তরিত করা হয়। এই রূপান্তর প্রক্রিয়া বাস্তবায়নের সময় খুঁটিনাটি বিষয়গুলো সম্পূর্ণভাবে শেল স্ক্রিপ্টের মধ্যে লুকানো থাকে। ফলে ইন্টারপ্রিটার নির্দেশিকা অনুসারে সহজেই পুনঃবাস্তবায়নের কাজ সম্পন্ন করা যায় এবং এন্ড ইউজার বা শেষ ব্যবহারকারীর উপর কোন প্রভাব পরে না।

".sh" ফাইল এক্সটেনশন থাকা ফাইলসমূহ সাধারণত একটি শেল স্ক্রিপ্ট, কিন্তু অধিকাংশ শেল স্ক্রিপ্টের কোন এক্সটেনশন থাকে না।

## সুবিধা এবং অসুবিধা
সম্ভবত শেল স্ক্রিপ্টের শ্রেষ্ঠ সুবিধাটি হচ্ছে এই যে, কমান্ড-লাইনে যেসব কমান্ড ও সিনট্যাক্স ব্যবহার হয় শেল স্ক্রিপ্টেও হুবহু তাই ব্যবহার করা হয়। ফলস্বরূপ প্রোগ্রামারকে সম্পূর্ণ ভিন্ন একটি সিনট্যাক্স শেখার ঝামেলা পোহাতে হয় না। কিন্তু কম্পাইলিত ভাষাগুলির ক্ষেত্রে এই সুবিধা নেই।

প্রায়ই শেল স্ক্রিপ্টে প্রোগ্রাম লেখা অন্য প্রোগ্রামিং ভাষায় প্রোগ্রাম লেখার থেকে অনেক সহজ। সহজ প্রোগ্রাম তথা ফাইল চয়ন, দ্রুত শুরু হওয়া, বন্ধুত্বপূর্ণ ত্রুটি সংশোধন ইত্যাদি হচ্ছে শেল স্ক্রিপ্টের বহু সুবিধাগুলির অন্যতম। বিশেষ করে ত্রুটি কোথায় হয়েছে তা নির্ধারণ করা ও সংশোধনের জন্য কোড লেখা সহজ। যারা প্রোগ্রাম লেখায় অপারদর্শী তারাও শেল স্ক্রিপ্ট ব্যবহার করে প্রোগ্রামের গতিবিধির মুল্যায়ন করতে পারেন। তদুপরি শেল স্ক্রিপ্ট বহু-প্রসেসিং এর সীমিত সুযোগ প্রদান করে থাকে।

অপরদিকে, শেল স্ক্রিপ্টে ত্রুটি হওয়া অস্বাভাবিক কিছু নয়। অনিচ্ছাকৃত টাইপিং এর ভুল হওয়া যেমন rm -rf */লেখা(rm -rf */লেখার পরিবর্তে) ইউনিক্স কমিউনিটিতে খুব স্বাভাবিক। শুধুমাত্র একটি বেশি স্পেস দেওয়ার ফলে একটি নির্দিষ্ট ডিরেক্টরির ভেতর সব ফাইল মুছে দেওয়ার পরিবর্তে সিস্টেমের সমস্ত ফাইল মুছে দেওয়ার ঘটনা ঘটতে পারে। অনুরূপভাবে cp এবং mv কমান্ডও ভয়ঙ্কর অস্ত্রে পরিণত হতে পারে। আবার > চিহ্নটির ভুল ব্যবহারে একটি ফাইলের সমস্ত লেখা মুছে যেতে পারে। গোদের উপর বিষফোঁড়ার মত ব্যাপার হল অনেক ইউনিক্স কমান্ডের মধ্যে কেবল একটি অক্ষরের ব্যবধান থাকে যেমন cp, cd, dd, df ইত্যাদি।

আরেকটি গুরুত্বপূর্ণ সমস্যা হল মন্থর এক্সিকিউশনের গতি এবং প্রায় প্রত্যেকটি নতুন কমান্ডের জন্য একটি নতুন প্রসেস তৈরি করার বাধ্যবাধকতা। শুধু যদি পাইপলাইন সেট করে, যাতে করে, কার্যকর ফিলটার কমান্ডের মাধ্যমে অধিকাংশ কাজ করা সম্ভব হয় তাহলে এই মন্থরতা কিছুটা লাঘব করা যায়। কিন্তু জটিল স্ক্রিপ্টের ক্ষেত্রে সাধারণত এরকম করা সম্ভব না।

আবার বিভিন্ন প্ল্যাটফর্মের মধ্যে সঙ্গতির সমস্যাও আছে। পার্ল এর জনক ল্যারি ওয়ালের বিখ্যাত উক্তি "It is easier to port a shell than a shell script." অর্থাৎ একটি শেল পোর্ট করা একটি শেল স্ক্রিপ্ট পোর্ট করার চেয়ে সহজ।

আবার শেল স্ক্রিপ্টের সীমাবদ্ধতার জন্য খুব জটিল স্ক্রিপ্ট লেখাও মুশকিল। এই সমস্যার সমাধানের জন্য নানারকম শেল এক্সটেন্সন তৈরি করা হয়েছে যাতে হিতে বিপরিত ছাড়া কিছু হয় নি।

তেমনই কিছু স্ক্রিপ্টের অসুবিধাগুলির মূলে আছে ভাষার সিনট্যাক্সের বা বাস্তবায়নের ডিজাইনগত ত্রুটি। এমন অনেক শেল আছে যেগুলি অন্য শেল প্রোগ্রামিং ভাষা বা পূর্ণ ভাষা যেমন Scsh (যা স্কীম ব্যবহার করে) ব্যবহার করে থাকে।

## অন্যান্য অপারেটিং সিস্টেমে শেল স্ক্রিপ্টিং
আন্তঃপ্রক্রিয়া (interoperability) সফটওয়্যার যেমন সিগউইন, এমকেএস টুলকিট, ইন্টারিক্স(যা মাইক্রোসফট উইন্ডোজ সার্ভিসেস ফর ইউনিক্সের সাথে পাওয়া যায়), হ্যামিলটন সি শেল, ইউউইন ইত্যাদি ইউনিক্স শেল প্রোগ্রামকে উইন্ডোজ এনটি এবং তার উত্তরসূরিগুলিতে চালাতে ব্যবহৃত হয়। এমএস-ডস উইন্ডোজ ৯৫ শাখায় এবং প্রাথমিক এমকেএস টুলকিট ভার্সনগুলোতেও ফাংশানিলিটির হ্রাস ঘটে। ইউনিক্স শেল চালানোর জন্য অন্তত ৩ প্রকার ডিসিএল ইমপ্লিমেনটেশন বা বাস্তবায়ন আছে যথা এক্সএলএনটি (কমান্ড শেলের সাথে ব্যবহৃত বহু-ব্যবহারযোগ্য স্ক্রিপ্টিং ভাষা), উইন্ডোজ স্ক্রিপ্ট হস্ট এবং সিজিআই প্রোগ্রামিং। ম্যাক ওএস এক্স এবং পরবর্তী উত্তরসুরিগুলি ইউনিক্স-এর ন্যায়।

উপর্যুক্ত সরঞ্জাম বা টুলগুলি ছাড়াও কিছু পোজিক্স এবং ওএস/২ ভিত্তিক কার্যক্ষমতা আছে যা উইন্ডোজ এনটি থেকে শুরু করে উইন্ডোজ ২০০০ অব্দি ব্যবহার করা যায়। একটি তৃতীয় এমএস-ডস নামক ১৬ বিট উপসিস্টেম আছে যার মাধ্যমে এমএস-ডস ব্যাচ ফাইলসমূহ রান করা যায়।

শেল ব্যবহারের ক্ষেত্রে বিভিন্ন প্রকার কনসোল বিকল্প আছে যেমন ৪-এনটি, ৪-ডস, ৪-ওএস২, ফ্রীডস, পিটার নরটনের এনডস, জিইউআই টেক কমান্ড যা উইন্ডোজ এনটি স্টাইলের Cmd.exe তে কার্যকারিতা যোগ করে, এমএস-ডস/উইন্ডোজ ৯৫ ব্যাচ ফাইল (যা Command.com দ্বারা রান করা হয়), ওএস/২ এর cmd.exe ইত্যাদি। উপর্যুক্ত বিকল্পগুলি তাদের দ্বারা পরিবর্ধিত শেলসমুহের মতই এবং উইন্ডোজ হস্ট সিস্টেমের সাথে বেশি সংযুক্ত যার তিনটি পূর্বইন্সটলীত ইঞ্জিন আছে যথা ভিবিস্ক্রিপ্ট, জেস্ক্রিপ্ট, ভিবিএ। এছাড়াও অনেক তৃতীয় পক্ষ ইঞ্জিন যোগ করা যায়। ৪এনটি এবং অন্যান্য প্রোগ্রামে রেক্স, পার্ল, পাইথন, রুবি ও টিসিএলের পূর্বলিখিত ফাঙ্কশন থাকে। পিসিডস এমএসডসের ন্যায় কিন্ত ডিআরডস অনেকটা আলাদা। উইন্ডোজ এনটির পুরনো সংস্করণগুলি ৪ওএস২ এর বর্তমান সংস্করণগুলিকে ওএস/২ উপসিস্টেমের মাধ্যমে চালাতে পারে।

সংজ্ঞানুযায়ী স্ক্রিপ্টিং ভাষাসমূহের প্রসারণ সম্ভব হয়ে থাকে। উদাহরণস্বরূপ, এমএস-ডস/উইন্ডোজ ৯৫/৯৮ এবং উইন্ডোজ এনটি সিস্টেমগুলিতে শেল বা ব্যাচ প্রোগ্রাম কিক্সটার্ট, কিউবেসিক, রেক্স, পার্ল, পাইথন তথা উইন্ডোজ স্ক্রিপ্ট হোস্টকে কল করতে পারে। আবার ইউনিক্স ও পোজিক্স সম্মত সিস্টেমে awk এবং sed দিয়ে শেল স্ক্রিপ্টগুলি স্ট্রিং ও গাণিতীয় প্রসেসিং ক্ষমতা বৃদ্ধি করতে পারে। টিসিএল(Tcl), পার্ল, পাইথনে আবার গ্রাফিক্স বা চিত্রায়নের সুবিধা থাকে এবং এই প্রোগ্রামিং ভাষাসমূহের মাধ্যমে ফাঙ্কশন ও প্রসিজার লেখা হলে তুলনামূলকভাবে দ্রুত কোড রান করানো যায়। তদুপরি শেল ভাষায় অনুপলব্ধ কার্যক্ষমতা যেমন সকেট ও অন্য যোগাযোগ পদ্ধতি, উচ্চ-ক্ষমতা টেক্সট প্রসেসিং, স্বলিখিত ও স্বপরিবর্তিত কোড, রিকার্সন পদ্ধতি, সরাসরি মেমোরি আক্সেস (DMA), সর্টিং ইত্যাদির সুবিধা লাভ করাও সম্ভব হয়।  ভিজুয়াল বেসিক ও ভিবিস্ক্রিপ্ট ব্যবহার করে স্প্রেডশিট, ডেটাবেস, টেলি-যোগাযোগ সফটওয়্যার, চিত্রায়ন সরঞ্জাম অন্যান্য সফটওয়্যারকে শেল স্ক্রিপ্টের মাধ্যমে কাজে লাগানো যায়।

## আরও দেখুন
* গ্লু কোড
* ইন্টারপ্রিটার নির্দেশক
* শেব্যাং চিহ্ন (#!)
* ইউনিক্স শেল
* উইন্ডোজ পাওয়ারশেল
* উইন্ডোজ স্ক্রিপ্ট হস্ট

## তথ্যসূত্র

## বহিঃসংযোগ
* ''An Introduction To Shell Programming'' by Greg Goebel
* ''UNIX / Linux shell scripting tutorial'' by Steve Parker
* ''Shell Scripting Primer'' (Apple) 
* ''What to watch out for when writing portable shell scripts'' by Peter Seebach
* Free Unix Shell scripting books
* Beginners/BashScripting, Ubuntu Linux.

বিষয়শ্রেণী:স্ক্রিপ্টিং ভাষা