মনে হচ্ছে বাশ একটি টুরিং-সম্পূর্ণ ভাষা
ট্যুরিং সম্পূর্ণতার ধারণাটি বৃহত্তর প্রোগ্রামিংয়ের জন্য কোনও ভাষাতে কার্যকর অন্যান্য অনেক ধারণার থেকে সম্পূর্ণ পৃথক : ব্যবহারযোগ্যতা, অভিব্যক্তি, বোঝাপড়া, গতি ইত্যাদি
যদি টুরিং-সম্পূর্ণতা কেবল আমাদের প্রয়োজন হত, তবে আমাদের কোনও প্রোগ্রামিং ভাষা ছিল না , এমনকি সমাবেশের ভাষাও ছিল না । কম্পিউটার প্রোগ্রামাররা সকলেই কেবল মেশিন কোডে লিখতেন , যেহেতু আমাদের সিপিইউগুলিও টুরিং-সম্পূর্ণ।
তুলনামূলক সহজ স্ক্রিপ্টগুলি লেখার জন্য বাশ প্রায় একচেটিয়াভাবে কেন ব্যবহৃত হয়?
বৃহত্তর, জটিল শেল স্ক্রিপ্টগুলি - যেমন configure
জিএনইউ অটোকনফ দ্বারা লিখিত স্ক্রিপ্টস আউটপুট - অনেকগুলি কারণে অ্যাটিক্যাল:
তুলনামূলকভাবে সম্প্রতি পর্যন্ত, আপনি কোথাও একটি পসিক্স-সামঞ্জস্যপূর্ণ শেল থাকার বিষয়ে বিশ্বাস করতে পারেন না ।
অনেক সিস্টেমে, বিশেষত বয়স্কদের, প্রযুক্তিগতভাবে সিস্টেমে কোথাও একটি পসিক্স-সামঞ্জস্যপূর্ণ শেল থাকে তবে এটি অনুমানযোগ্য স্থানে নাও থাকতে পারে /bin/sh
। আপনি যদি একটি শেল স্ক্রিপ্ট লিখছেন এবং এটি বিভিন্ন সিস্টেমে চালাতে হয় তবে আপনি কীভাবে শেবাং লাইনটি লিখবেন ? একটি বিকল্প হ'ল এগিয়ে যাওয়া এবং ব্যবহার করা /bin/sh
, তবে যদি এমন সিস্টেমে চালিত হয় তবে নিজেকে প্রাক-পসিক্স বোর্ন শেল ডায়ালেক্টের মধ্যে সীমাবদ্ধ রাখতে বেছে নিন।
প্রাক-পসিক্স বোর্ন শেলগুলিতে বিল্ট-ইন গাণিতিকও নেই; আপনার কাছে ফোন করতে হবে expr
বা এটি bc
করতে হবে।
এমনকি পসিক্স শেল থাকা সত্ত্বেও, আপনি 1990 এর দশকের গোড়ার দিকে পার্ল প্রথম জনপ্রিয় হওয়ার পরে ইউনিক্স স্ক্রিপ্টিং ভাষাগুলিতে আমরা প্রত্যাশিত সাহসী অ্যারে এবং অন্যান্য বৈশিষ্ট্যগুলি হারিয়ে ফেলছি ।
ইতিহাসের এই সত্যটির অর্থ হ'ল আধুনিক বোর্নে পারিবারিক শেল স্ক্রিপ্ট অনুবাদকারী বিশুদ্ধরূপে অনেক শক্তিশালী বৈশিষ্ট্যগুলিকে উপেক্ষা করার এক দশক-দীর্ঘ traditionতিহ্য রয়েছে কারণ আপনি এগুলি সর্বত্র রাখার বিষয়ে বিশ্বাস করতে পারবেন না।
এটি এখনও অব্যাহত রয়েছে, বাস্তবে: বাশ সংস্করণ 4 পর্যন্ত সম্মিলিত অ্যারে পায় নি , তবে আপনি অবাক হতে পারেন যে এখনও কতগুলি সিস্টেম ব্যবহার করছে বাশ 3 এর উপর ভিত্তি করে অ্যাপল এখনও 2017 সালে ম্যাকোস সহ বাশ 3 জাহাজে বহন করে - আপাতদৃষ্টিতে লাইসেন্সিংয়ের কারণগুলি - এবং ইউনিক্স / লিনাক্স সার্ভারগুলি প্রায়শই উত্পাদন ব্যতীত সমস্ত দীর্ঘসময় ধরে চালিত হয়, তাই আপনার কাছে একটি স্থিতিশীল পুরাতন সিস্টেম এখনও বাশ 3 চলতে পারে যেমন একটি সেন্টোস 5 বাক্স। আপনার পরিবেশে যদি এই জাতীয় সিস্টেম থাকে তবে আপনি শেল স্ক্রিপ্টগুলিতে চালানোর জন্য মিশ্র অ্যারেগুলি ব্যবহার করতে পারবেন না।
যদি সেই সমস্যার আপনার উত্তরটি হ'ল আপনি কেবল "আধুনিক" সিস্টেমের জন্য শেল স্ক্রিপ্ট লেখেন তবে আপনাকে তখন এই পরিস্থিতিটি মোকাবেলা করতে হবে যে বেশিরভাগ ইউনিক্স শেলের জন্য সর্বশেষ সাধারণ রেফারেন্স পয়েন্টটি পসিক্স শেল স্ট্যান্ডার্ড , যা মূলত অপরিবর্তিত থেকে 1989 সালে প্রবর্তিত হয়েছিল that সেই স্ট্যান্ডার্ডের উপর ভিত্তি করে অনেকগুলি শেল রয়েছে তবে সেগুলি সমস্তই সেই স্ট্যান্ডার্ড থেকে আলাদা ডিগ্রিতে চলে গেছে। মিশুক অ্যারে আবার নিতে, bash
, zsh
, এবং ksh93
যে সব বৈশিষ্ট্য আছে, কিন্তু সেখানে একাধিক বাস্তবায়ন সঙ্গতিহীনতা আছে। আপনার পছন্দটি কেবলমাত্র ব্যাশ ব্যবহার করা বা কেবল জেডএস ব্যবহার করা বা কেবল ব্যবহার করা ksh93
।
যদি আপনার সমস্যার উত্তরটি হয়, "সুতরাং কেবল বাশ 4," বা ksh93
, বা যা কিছু ইনস্টল করুন তবে তার পরিবর্তে পার্ল বা পাইথন বা রুবি ইনস্টল করবেন না কেন? এটি অনেক ক্ষেত্রে অগ্রহণযোগ্য; ডিফল্ট ব্যাপার।
বোর্ন পরিবারের শেল স্ক্রিপ্টিং ভাষাগুলির কোনও মডিউল সমর্থন করে না ।
শেল স্ক্রিপ্টে আপনি মডিউল সিস্টেমে সবচেয়ে কাছাকাছি আসতে পারেন .
- হ'ল কমান্ডটি - source
আরও আধুনিক বোর্ন শেল রূপের মধ্যে - যা সঠিক মডিউল সিস্টেমের সাথে একাধিক স্তরে ব্যর্থ হয়, যার মধ্যে বেশিরভাগটি প্রাথমিক নাম নামকরণ ।
প্রোগ্রামিং ভাষা নির্বিশেষে, বৃহত্তর সামগ্রিক প্রোগ্রামের কোনও একক ফাইল কয়েক হাজার লাইন ছাড়িয়ে গেলে মানুষের বোঝাপড়াটি পতাকাঙ্কিত হতে শুরু করে। আমরা অনেকগুলি ফাইলের মধ্যে বৃহত প্রোগ্রামগুলি গঠনের খুব কারণটি হ'ল যাতে আমরা তাদের বিষয়বস্তু সর্বাধিক বা দুটি বাক্যে বিমূর্ত করতে পারি। ফাইল এ হ'ল কমান্ড লাইন পার্সার, ফাইল বি হল নেটওয়ার্ক আই / ও পাম্প, ফাইল সি লাইব্রেরি জেড এবং বাকি প্রোগ্রামের মধ্যে শিম, ইত্যাদি যখন একক প্রোগ্রামে অনেকগুলি ফাইল একত্র করার জন্য আপনার একমাত্র পদ্ধতিটি পাঠ্য অন্তর্ভুক্তি হয় , আপনার প্রোগ্রামগুলি কীভাবে যুক্তিসঙ্গতভাবে বৃদ্ধি করতে পারে তার একটি সীমাবদ্ধতা রেখেছেন।
তুলনার জন্য, এটির মতো হবে যদি সি প্রোগ্রামিং ভাষার কোনও লিঙ্কার না থাকে, কেবল #include
বিবৃতি থাকে। এই জাতীয় সি-লাইট উপভাষার জন্য extern
বা যেমন কীওয়ার্ডের প্রয়োজন হবে না static
। এই বৈশিষ্ট্যগুলি মডুলারিটির অনুমতি দেওয়ার জন্য বিদ্যমান।
পসিক্স কোনও একক শেল স্ক্রিপ্ট ফাংশনে স্কোপ ভেরিয়েবলের কোনও উপায় সংজ্ঞায়িত করে না , কোনও ফাইলের চেয়ে অনেক কম।
এটি কার্যকরভাবে সমস্ত পরিবর্তনশীলকে বিশ্বব্যাপী করে তোলে , যা আবার মডুলারিটি এবং সামঞ্জস্যকে ব্যথা দেয়।
সমাধান পোস্ট POSIX শাঁস মধ্যে এই আছে - মধ্যে অবশ্যই bash
, ksh93
এবং zsh
অন্তত - কিন্তু যে শুধু আপনাকে ফেরত উপরে বিন্দু 1 এনেছে।
আপনি জিএনইউ অটোকনক ম্যাক্রো রচনায় স্টাইল গাইডগুলিতে এর প্রভাব দেখতে পারেন, যেখানে তারা ম্যাক্রোর নামের সাথে আপনার পরিবর্তনশীল নামগুলি উপসর্গের প্রস্তাব দেয়, খুব দীর্ঘ পরিবর্তনশীল নামগুলি নিখুঁতভাবে গ্রহণযোগ্যতার সাথে সংঘর্ষের সম্ভাবনা হ্রাস করার জন্য নেতৃত্ব দেয় শূন্য।
এমনকি সি এক মাইল করে এই স্কোরের চেয়ে ভাল। কেবল বেশিরভাগ সি প্রোগ্রামগুলি মূলত ফাংশন-লোকাল ভেরিয়েবলগুলি দিয়ে লেখা হয় না, সি ব্লক স্কোপিংকে সমর্থন করে, যা একটি একক ফাংশনের মধ্যে একাধিক ব্লককে ক্রস-দূষণ ছাড়াই পরিবর্তনশীল নামগুলি পুনরায় ব্যবহার করতে দেয়।
শেল প্রোগ্রামিং ভাষার কোনও মানক পাঠাগার নেই।
এটি তর্ক করা সম্ভব যে শেল স্ক্রিপ্টিং ভাষার স্ট্যান্ডার্ড লাইব্রেরিটির বিষয়বস্তু PATH
, তবে কেবল এটিই বলেছে যে ফলাফলের কিছু পাওয়ার জন্য একটি শেল স্ক্রিপ্টকে অন্য একটি পুরো প্রোগ্রামে ডাকতে হবে, সম্ভবত এটি একটি আরও শক্তিশালী ভাষায় লেখা হয়েছে দিয়ে শুরু.
পারেলের সিপিএএন- এর মতো শেল ইউটিলিটি লাইব্রেরিরও বহুল ব্যবহৃত আর্কাইভ নেই । তৃতীয় পক্ষের ইউটিলিটি কোডের একটি বৃহত উপলব্ধ লাইব্রেরি ব্যতীত একজন প্রোগ্রামারকে অবশ্যই হাতে হাতে আরও কোড লিখতে হবে, তাই তিনি কম উত্পাদনশীল।
এমনকি যে সবচেয়ে শেল স্ক্রিপ্ট বহিরাগত প্রোগ্রাম সাধারণত সি লিখিত উপর নির্ভর কিছু দরকারী শেষ করার জন্য উপেক্ষা, সেখানে ঐ সমস্ত ওভারহেড এর pipe()
→ fork()
→ exec()
কল চেইন। আইপিসি এবং অন্যান্য ওএসগুলিতে প্রবর্তন প্রক্রিয়াটির তুলনায় সেই প্যাটার্নটি ইউনিক্সে মোটামুটি দক্ষ , তবে এখানে কার্যকরভাবে আপনি অন্য স্ক্রিপ্টিং ভাষায় সাবরুটিন কল দিয়ে যা করছেন তা প্রতিস্থাপন করছে , যা এখনও আরও কার্যকর। এটি শেল স্ক্রিপ্ট প্রয়োগের গতির উপরের সীমাতে একটি গুরুতর ক্যাপ রাখে।
শেল স্ক্রিপ্টগুলিতে সমান্তরাল সম্পাদনের মাধ্যমে তাদের কার্যকারিতা বাড়ানোর সামান্য বিল্ট-ইন ক্ষমতা রয়েছে have
বোর্ন শাঁস আছে &
, wait
এবং এই জন্য পাইপলাইনগুলি, কিন্তু যে মূলত শুধুমাত্র একাধিক প্রোগ্রাম রচনা, CPU- র বা I / O উপমা অর্জনের জন্য না করার জন্য দরকারী। আপনি সম্ভবত পাবে না হন গোঁজের কোর বা শেল স্ক্রিপ্টিং সঙ্গে একমাত্র সুসিক্ত RAID অ্যারের, এবং যদি আপনি না, আপনি সম্ভবত অন্য ভাষায় অনেক বেশী কর্মক্ষমতা অর্জন করতে পারে।
বিশেষত পাইপলাইনগুলি সমান্তরাল সম্পাদনের মাধ্যমে কর্মক্ষমতা বাড়ানোর দুর্বল উপায়। এটি কেবল দুটি প্রোগ্রামকে সমান্তরালভাবে চলতে দেয় এবং দুটির মধ্যে একটি সম্ভবত সময়ত কোনও নির্দিষ্ট সময়ে I / O তে বা অন্যটিকে অবরুদ্ধ করা হবে ।
এর চারপাশে উত্তরোত্তর উপায়গুলি রয়েছে, যেমন xargs -P
এবং জিএনইউparallel
, তবে এটি কেবল উপরের 4 পয়েন্টে রূপান্তরিত হয়।
কার্যকরভাবে মাল্টি-প্রসেসর সিস্টেমগুলির পুরো সুবিধা নেওয়ার কোনও অন্তর্নিহিত ক্ষমতা না থাকায়, শেল স্ক্রিপ্টগুলি সর্বদা কোনও ভাষার লিখিত প্রোগ্রামের চেয়ে ধীর হয়ে যায় যা সিস্টেমের সমস্ত প্রসেসর ব্যবহার করতে পারে। জিএনইউ অটোকনফের configure
স্ক্রিপ্টের উদাহরণটি আবার নিতে, সিস্টেমে করের সংখ্যা দ্বিগুণ করা এটি যে গতিবেগে চলছে তার উন্নতি করতে খুব সামান্য কাজ করবে।
শেল স্ক্রিপ্টিং ভাষার পয়েন্টার বা রেফারেন্স নেই ।
এটি আপনাকে অন্যান্য প্রোগ্রামিং ভাষায় খুব সহজেই সম্পন্ন কাজগুলি থেকে বিরত রাখে।
একটি জিনিসের জন্য, প্রোগ্রামটির স্মৃতিতে অপ্রত্যাশিতভাবে অন্য ডেটা স্ট্রাকচারের সাথে উল্লেখ করতে অক্ষমতার অর্থ আপনি বিল্ট-ইন ডেটা স্ট্রাকচারের মধ্যে সীমাবদ্ধ । আপনার শেলটিতে সহযোগী অ্যারে থাকতে পারে তবে সেগুলি কীভাবে বাস্তবায়ন করা হয়? বিভিন্ন ট্রেড অফসের সাথে রয়েছে বেশ কয়েকটি সম্ভাবনা: লাল-কালো গাছ , এভিএল গাছ এবং হ্যাশ টেবিলগুলি সর্বাধিক সাধারণ, তবে অন্যান্য রয়েছে। আপনার যদি অন্য কোনও ট্রেড অফসের প্রয়োজন হয়, তবে আপনি আটকে রয়েছেন, কারণ উল্লেখ ছাড়াই আপনার কাছে অনেক ধরণের উন্নত ডেটা স্ট্রাকচার হ্যান্ড-রোল করার উপায় নেই। তোমাকে যা দেওয়া হয়েছিল তাতে আটকে আছ
অথবা, এটি এমন ক্ষেত্রে হতে পারে যে আপনার একটি ডেটা স্ট্রাকচারের প্রয়োজন হতে পারে যা আপনার শেল স্ক্রিপ্ট ইন্টারপ্রেটারে যেমন পর্যাপ্ত বিকল্প নেই যেমন নির্দেশিত অ্যাসাইক্লিক গ্রাফের প্রয়োজন হয় যা নির্ভরতা গ্রাফকে মডেল করার জন্য আপনার প্রয়োজন হতে পারে । আমি কয়েক দশক ধরে প্রোগ্রামিং করে চলেছি, এবং শেল স্ক্রিপ্টে এটি করার জন্য আমি যেভাবে ভাবতে পারি তা হ'ল ফাইল সিস্টেমে অপব্যবহার করা , সিমলিংকগুলিকে ভুল তথ্যসূত্র হিসাবে ব্যবহার করা। আপনি কেবলমাত্র টুরিং-সম্পূর্ণতার উপর নির্ভর করার পরে আপনি যে সমাধানটি পান তা সমাধান, যা সমাধানটি মার্জিত, দ্রুত বা সহজে বোঝা যায় কি না সে সম্পর্কে আপনাকে কিছুই বলে না।
উন্নত ডেটা স্ট্রাকচারগুলি পয়েন্টার এবং রেফারেন্সের জন্য কেবল একটি ব্যবহার। আছে তাদের জন্য অন্যান্য অ্যাপ্লিকেশানের পাইলস , যা কেবল সহজেই একটি বোর্ন পরিবার শেল স্ক্রিপ্টিং ভাষায় সম্পন্ন করা যাবে না।
আমি আরও যেতে পারতাম, তবে আমি মনে করি আপনি এখানে পয়েন্টটি পেয়ে যাচ্ছেন। সহজ কথায় বলতে গেলে ইউনিক্স টাইপ সিস্টেমের জন্য আরও অনেক শক্তিশালী প্রোগ্রামিং ভাষা রয়েছে।
এটি একটি বিশাল সুবিধা, যা কিছু ক্ষেত্রেই ভাষার মধ্যস্বত্বের জন্য ক্ষতিপূরণ দিতে পারে।
অবশ্যই, এবং ঠিক এই কারণেই জিএনইউ অটোকনফ তার configure
স্ক্রিপ্ট আউটপুটগুলির জন্য শেল স্ক্রিপ্ট ভাষার বোর্ন পরিবারের একটি উদ্দেশ্যমূলক-সীমাবদ্ধ উপসেট ব্যবহার করেছে : যাতে এর configure
স্ক্রিপ্টগুলি সর্বত্র বেশ কার্যকর হবে।
আপনি সম্ভবত জিএনইউ অটোকনফের বিকাশকারীদের তুলনায় উচ্চ-বহনযোগ্য বোর্ন শেল ডায়ালেক্টে লেখার উপযোগী বিশ্বাসীদের একটি বৃহত্তর দল খুঁজে পাবেন না, তবুও তাদের নিজস্ব তৈরি প্রাথমিকভাবে পার্ল, আরও কিছু m4
, এবং কিছুটা শেল লেখা হয়েছে লিপি; কেবল অটোকনফের আউটপুট একটি খাঁটি বোর্ন শেল স্ক্রিপ্ট। যদি এটি "সর্বত্র বোর্ন" ধারণাটি কীভাবে কার্যকর তা প্রশ্ন না করে তবে কী হবে তা আমি জানি না।
সুতরাং, এই জাতীয় প্রোগ্রামগুলি কীভাবে পেতে পারে তার সীমাবদ্ধতা রয়েছে?
প্রযুক্তিগতভাবে বলতে গেলে, না, যেমন আপনার টুরিং-সম্পূর্ণতা পর্যবেক্ষণের পরামর্শ দেয়।
তবে এটি একথা বলার মতো নয় যে নির্বিচারে-বড় শেল স্ক্রিপ্টগুলি লেখার পক্ষে সুন্দর, ডিবাগ করা সহজ, বা দ্রুত কার্যকর করা যায়।
খাঁটি বাশে কোনও ফাইল সংক্ষেপক / ডেকম্প্রেসার লিখতে, বলতে কি সম্ভব?
"খাঁটি" বাশ, কোনও বিষয় ছাড়াই ডাকে PATH
? সংক্ষিপ্তকারক সম্ভবত ব্যবহারযোগ্য echo
এবং হেক্স অব্যাহতি ক্রম, তবে এটি করা মোটামুটি বেদনাদায়ক হবে। শেলের মধ্যে বাইনারি ডেটা হ্যান্ডেল করতে না পারার কারণে ডিকম্প্রেসারটি সেভাবে লেখা অসম্ভব । আপনি od
বাইনারি ডেটা টেক্সট ফর্ম্যাটে অনুবাদ করার জন্য শেষ করতে চাইবেন , ডেটা পরিচালনা করার শেলের আদি উপায় calling
একবার আপনি শেল স্ক্রিপ্টিংটি যেমনভাবে ইচ্ছা করেছিলেন সেভাবে ব্যবহার করতে শুরু করলেন, যেমন অন্যান্য প্রোগ্রামগুলিকে চালানোর জন্য আঠালো হিসাবে PATH
, দরজাগুলি উন্মুক্ত হয়ে যায়, কারণ এখন আপনি কেবলমাত্র অন্যান্য প্রোগ্রামিং ভাষায় যা করতে পারেন তার মধ্যে সীমাবদ্ধ থাকেন, যা আপনাকে বলে কোন সীমা নেই। শেল স্ক্রিপ্ট যা এর সমস্ত শক্তি পাওয়ার সাথে সাথে অন্যান্য প্রোগ্রামগুলিতে কল করে PATH
আরও শক্তিশালী ভাষায় লিখিত একঘেয়ে প্রোগ্রামগুলির মতো দ্রুত চালিত হয় না, তবে এটি চালায় does
এবং যে বিষয়টি। আপনার যদি দ্রুত চালনার জন্য কোনও প্রোগ্রামের প্রয়োজন হয় বা অন্যের কাছ থেকে ক্ষমতা ধার করার পরিবর্তে যদি এটি নিজেই শক্তিশালী হওয়া প্রয়োজন তবে আপনি এটি শেলটিতে লিখবেন না।
একটি সাধারণ ভিডিও গেম?
এখানে শেল টেট্রিস । আপনি যদি যান তবে এই জাতীয় অন্যান্য গেমগুলি উপলভ্য।
কেবলমাত্র খুব সীমাবদ্ধ ডিবাগিং সরঞ্জাম রয়েছে
বৃহত্তর প্রোগ্রামিং সমর্থন করার জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলির তালিকায় আমি ডিবিগিং সরঞ্জাম সমর্থনটি প্রায় 20 তম স্থানে রেখে দেব। পুরো প্রোগ্রামাররা ভাষা নির্বিশেষে সঠিক ডিবাগারগুলির চেয়ে printf()
ডিবাগিংয়ের উপর অনেক বেশি নির্ভর করে।
শেল ইন, আপনার আছে echo
এবং set -x
, যা একসাথে একটি দুর্দান্ত অনেক সমস্যা ডিবাগ যথেষ্ট।
sh
স্ক্রিপ্টconfigure
যা বহুসংখ্যক ইউনিক্স প্যাকেজের জন্য বিল্ড প্রক্রিয়ার অংশ হিসাবে ব্যবহার করা হয় 'অপেক্ষাকৃত সহজ' নয়।