শুরুতে কোনও শেবাং লাইন (#! / পাথ / থেকে / শেল) না থাকলে কোন শেল স্ক্রিপ্টগুলি কার্যকর করে? আমি ধরে নিয়েছি / বিন / শ তবে আমি নিশ্চিত করতে পারি না।
কার্নেল যেমন স্ক্রিপ্ট এবং আয় চালানো রাজি ENOEXEC, তাই সঠিক আচরণ প্রোগ্রামের উপর নির্ভর করে আপনি এই ধরনের একটি স্ক্রিপ্ট চালাতে সমস্যা থেকে ।
- bash 4.2.39 - নিজেই ব্যবহার করে
- ব্যস্তবক্স-অ্যাশ 1.20.2 - নিজেই ব্যবহার করে
- ড্যাশ 0.5.7 - রান / বিন / শ
- માછલી 1.23.1 - ENOEXEC সম্পর্কে অভিযোগ করে, তারপরে ভুল ফাইলটিকে দোষ দেয়
- এটি ও টি কেএস 933 + 2012.08.01 - নিজেই ব্যবহার করে
- mksh R40f - রান / বিন / শ
- pdksh 5.2.14 - রান / বিন / শ
- sh-heirloom 050706 - নিজেই ব্যবহার করে
- tcsh 6.18.01 - রান / বিন / শ
- zsh 5.0.0 - রান / বিন / শ
- cmd.exe 5.1.2600 - আপনাকে মজার দেখাচ্ছে।
ইন জন্য glibc ফাংশন execv()
বা execve()
শুধু ENOEXEC ফিরে যান। তবে execvp()
এই ত্রুটি কোডটি লুকিয়ে রাখে এবং স্বয়ংক্রিয়ভাবে / বিন / এসকে অনুরোধ করে। (এটি এক্সিকিউটেড (3 পি) এ নথিভুক্ত করা হয়েছে ।)
কোন প্ল্যাটফর্মে চলবে শেল স্ক্রিপ্টগুলি লেখার ক্ষেত্রে "সেরা অনুশীলন" হিসাবে বিবেচনা করা হয়? (ঠিক আছে, এটি খোলামেলা ধরণের)
হয় sh
কেবলমাত্র পসিক্স-সংজ্ঞায়িত বৈশিষ্ট্যগুলিতে লেগে থাকুন বা পুরো ব্যাশ (যা বহুলভাবে উপলভ্য) এ যান এবং বিতরণ করা হলে আপনার প্রয়োজনীয়তার মধ্যে এটি উল্লেখ করুন।
(এখন যেহেতু আমি এটির কথা ভাবি, পার্ল - বা সম্ভবত পাইথন - আরও বেশি বহনযোগ্য হবে, এর চেয়ে ভাল বাক্য গঠনের কথা উল্লেখ না করে))
সর্বদা শেবাং লাইন যুক্ত করুন। যদি ব্যাশ বা zsh ব্যবহার #!/usr/bin/env bash
করে থাকেন তবে শেলের পথ হার্ডকডিংয়ের পরিবর্তে ব্যবহার করুন। (তবে, পসিক্স শেলটি গ্যারান্টিযুক্ত /bin/sh
, সুতরাং env
সেই ক্ষেত্রে এড়িয়ে যান))
(দুর্ভাগ্যবশত, এমনকি /bin/sh
সবসময় একই। গনুহ autoconf প্রোগ্রাম সয়ে গেছে বিভিন্ন quirks ।)
Zsh ব্যবহার না করার চেষ্টা করে zsh ব্যবহার না করে আবার ব্যশে ফিরে যেতে এমন কোনও স্ক্রিপ্ট লিখন কি সম্ভব? আমি নীচের মতো দুটি শেবাং লাইন রাখার চেষ্টা করেছি, তবে এটি কেবল খারাপ দোভাষী: / বিন / zsh এর সাথে ত্রুটি করেছে : আমি zsh ছাড়াই কোনও মেশিনে চেষ্টা করে দেখি তবে এ জাতীয় কোনও ফাইল বা ডিরেক্টরি আউট নেই।
কেবলমাত্র একটি শেবাং লাইন থাকতে পারে; নিউলাইন চরিত্রের পরে সমস্ত কিছুই এমনকি কার্নেল দ্বারা পড়েনি, এবং শাঁস দ্বারা একটি মন্তব্য হিসাবে বিবেচিত হবে।
এটা সম্ভব একটি স্ক্রিপ্ট যে রান যেমন লিখতে #!/bin/sh
, চেক যা শেল পাওয়া যায়, এবং রান exec zsh "$0" "$@"
বা exec bash "$0" "$@"
ফলাফলের উপর নির্ভর করে। তবে, ব্যাশ এবং zsh দ্বারা ব্যবহৃত সিনট্যাক্সটি বিভিন্ন জায়গায় এতটাই আলাদা যে আমি আপনার নিজের বিবেকহীনতার জন্য এটি করার পরামর্শ দেব না ।