শেল স্ক্রিপ্টগুলি এখনও # ছাড়াই কাজ করছে (শ-ব্যাং লাইন)


10

আমি স্ক্রিপ্টগুলির শেলগুলিতে নতুন এবং অনেকগুলি বই লিখেছেন যে স্ক্রিপ্ট শুরু করতে #! (শ্যাং-ব্যাং) লাইনটি দোভাষীকে অনুরোধ করার জন্য ব্যবহার করুন thisআর এটি স্ক্রিপ্টের জন্য একটি নতুন শেল আহ্বান করবে এবং লাইন দ্বারা ব্যাখ্যার লাইনটি করবে one তবে একটি আমার বেসিক স্ক্রিপ্টটি এখনও যাদু লাইন ছাড়াই চলছে।

সুতরাং আমার প্রশ্নগুলি হ'ল:

  • আমার বেসিক স্ক্রিপ্টটি দোভাষী পেয়েছে কোথা থেকে।
  • স্ক্রিপ্ট কীভাবে দোভাষীকে সনাক্ত করতে পরিচালিত করে।

এখন আমি আমার বেসিক স্ক্রিপ্ট সম্পর্কে আপনাকে বলি এটিতে নীচের লাইনটি রয়েছে:

প্রতিধ্বনি "যাদু লাইনগুলি ছাড়াই বেসিক লিপি"


উত্তর:


3

যদি ম্যাজিক লাইন সরবরাহ না করা হয় তবে স্ক্রিপ্টটি চালানোর জন্য একটি ডিফল্ট শেল ব্যবহার করা হয়। এই ডিফল্ট শেলটি হয় বোর্ন শেল (sh) হতে পারে যা কিছু স্বাদে যেমন হয় তবে অন্য কিছু স্বাদে ব্যবহৃত ডিফল্ট শেল এটি কার্যকর করতে লগইন শেলের মতোই। জিনিসটি হ'ল: শেলটি সিদ্ধান্ত নেওয়ার জন্য এটি সিস্টেমে রাখবেন না, সর্বদা প্রথম লাইনে শেলটি যা চান তা সরবরাহ করুন।


1
হ্যাঁ ... আমার বর্তমান শেলটি শেল স্ক্রিপ্টের ম্যাজিক সংখ্যা না থাকার জন্য একটি ডিফল্ট শেলটি চাইছে।
ব্যবহারকারী1678213

1
@ ব্যবহারকারী1678213 হ্যাঁ, এটি আপনার শেল (এবং কার্নেল নয়) এটি করছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
আমি বিশ্বাস করি যে পসিক্সের আদেশ হ'ল / বিন / শ এই ক্ষেত্রে ব্যবহৃত হয়।
ভনব্র্যান্ড

2
@ ভনব্র্যান্ড এটি একটি সাধারণ ভুল ধারণা। পোজিক্স পসিক্স শেলটিকে হ্যান্ডেল দেয় না /bin/sh, কেবল shএকটি উপযুক্ত কাঠামোটি আবিষ্কার করার সময় এটিই প্রথম নির্বাহযোগ্য ut
jlliagre

3
এটি ভুল, এটি কখনও চালানোর জন্য ব্যবহৃত "লগইন শেল" নয়। যদিও ঘটতে পারে তা হ'ল কলিং শেলটি (যদি শেল থেকে স্ক্রিপ্টটি কল করা হয়) এর নিজের কোনও শিশু এটির ব্যাখ্যা করতে পারে।
স্টাফেন চেজেলাস

8

আপনি যখন কোনও প্রোগ্রাম সম্পাদন করেন, কার্নেলটি পরীক্ষা করে এটি কোনও ম্যাজিক বাইট ক্রম দ্বারা শুরু হয় কিনা তা পরীক্ষা করে । যদি এক্সিকিউটেবল ফাইলটি শুরু হয় #!, কার্নেল বাকী রেখাকে একটি দোভাষী হিসাবে ব্যাখ্যা করবে। যদি এক্সিকিউটেবল ফাইলটি শুরু হয় \177ELF(যেখানে \177127 বাইট রয়েছে), এটি ফাইলটিকে ELF এক্সিকিউটেবল হিসাবে লোড করে ; আজকাল বেশিরভাগ ইউনিক্স সিস্টেমে এটিই সাধারণ ধরণের।

যদি কার্নেল ফাইল ফর্ম্যাটটি স্বীকৃতি না দেয় তবে এটি ফাইলটি কার্যকর করতে অস্বীকার করে এবং ENOEXEC ত্রুটি (এক্সিকিউট ফর্ম্যাট ত্রুটি) প্রদান করে। যখন শেলটি লক্ষ্য করে, তখন শেল স্ক্রিপ্ট হিসাবে প্রোগ্রামটি চালানো নিজেই লাগে।

এটি কার্যকরভাবে দেখতে, আপনার স্ক্রিপ্টে কয়েকটি কমান্ড যুক্ত করুন:

ps l $$
ls -l /proc/$$/exe
echo hello

(এটি লিনাক্সের জন্য, অন্যান্য ইউনিসের জন্য সামঞ্জস্য করুন)) তারপরে বিভিন্ন শেল থেকে স্ক্রিপ্টটি চালানোর চেষ্টা করুন। আপনি দেখতে পাবেন যে কিছু শেলগুলি স্ক্রিপ্টটি কার্যকর করার জন্য নিজের একটি নতুন উদাহরণ তৈরি করেছে (বাশ, ksh93) অন্যরা স্প্যান করেছে /bin/sh(ড্যাশ, পিডিএক্স, জেডএস)।


আপনার ls -lআদেশ দিয়ে আমি কী সন্ধান করব ? এই: lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash-? যদি তাই হয়, এটা কি বলে? এছাড়াও, খেয়াল আমি SHELL=/bin/bashউপর env, কিন্তু পরিবর্তন এটা পরিবর্তন আচরণের মনে হয়নি। এটি কি সম্পর্কহীন?
ইমানুয়েল বার্গ

দেখে মনে হচ্ছে আপনি শেল ভেরিয়েবল "শেল" পরিবর্তন করছেন।
ব্যবহারকারী1678213

2
@ ইমানুয়েলবার্গ হ্যাঁ (আসলে আমার লেখা উচিত ছিল ls -l /proc/$$/exe)। exeশেল যে আপনার স্ক্রিপ্টটি নির্বাহ লিঙ্ক পয়েন্ট। আপনি যখন আপনার স্ক্রিপ্টটি চালান, আপনি দেখবেন যে এটি স্ক্রিপ্টটির ব্যাখ্যা দেয় এমন বাশ। আপনি যেমন pdksh থেকে এটি চালানোর, তাহলে এটি সঞ্চালিত হয় /bin/sh। আমি এমন কোনও শেল জানি না যা SHELLপরিবেশের পরিবর্তনশীল বা সেই পরিস্থিতিতে লগইন শেল ব্যবহার করে ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

2
@ ব্যবহারকারী1678213 /etc/passwdআপনি যখন এসএসএইচ বা টেক্সট কনসোলে লগ ইন করবেন তখন শেলটি কীভাবে কার্যকর হবে তা পরিবর্তন করে শেল পরিবর্তন করা। কোন শেল স্ক্রিপ্ট কার্যকর করতে পারে তা পরিবর্তন করে না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

2
@ ব্যবহারকারী1678213 আমি পরীক্ষাগুলি চালিয়ে এখানে যা লিখেছি তা যাচাই করেছি। আমি যে শেলগুলি পরীক্ষা করেছি /etc/passwdসেগুলির মধ্যে কোনওটি শেলটি কী ব্যবহার করবেন তা সিদ্ধান্ত নিতে তাকাতে পারেনি, তারা হয় নিজের একটি দৃষ্টান্ত তৈরি করেছেন বা সম্পাদন করেছেন /bin/sh
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

-2

এটি সম্ভবত নিম্নলিখিত 3 সম্ভাবনার মধ্যে একটি:

  1. আপনি স্ক্রিপ্টটি সরাসরি দোভাষী, IE: বাশ স্ক্রিপ্ট.শ দিয়ে কল করছেন

  2. স্ক্রিপ্ট ফাইলটির নামের একটি .sh এক্সটেনশন রয়েছে, যা সিস্টেমকে এই ধরণের ফাইলের জন্য ডিফল্ট প্রোগ্রামটি সন্ধান করে

  3. আপনি যে শেল এনভায়রনমেন্টটি ব্যবহার করছেন সেটি 'ইকো' নিজেই এক্সিকিউট করছে, যেহেতু আমি কেবল অনুমান করতে পারি যে স্ক্রিপ্ট ফাইলটি এক্সিকিউটেবল। যদি উদাহরণস্বরূপ, আপনি ব্যাশ শেল ব্যবহার করছেন এবং আপনার ফাইলে একটি কমান্ড রয়েছে যা কেবল ksh দ্বারা ব্যবহৃত হয়, তবে আপনি দেখতে পাবেন যে এটি কাজ করবে না।

শুভকামনা!


3
আমি এটিকে বাশ দিয়ে বা কোনও এক্সটেনশন দিয়ে ডাকিনি।
ব্যবহারকারী1678213

1
এবং শেল এনভায়রনমেন্ট এটি কার্যকর করছে না কারণ যখন আমি আমার স্ক্রিপ্টটি চাওয়ার পরে পিএস কমান্ডটি প্রার্থনা করি। পিএস কমান্ড দুটি বাশ প্রক্রিয়া দেখায় wh যার অর্থ দুটি বাশ চলমান। একটি আমার লগইন বাশ শেল এবং অন্যটি হ'ল আমার বেসিক_স্ক্রিপ্টের জন্য ব্যাশ
ব্যবহারকারী1678213

1
2: কার্নেল এর মতো কিছু করবে না। Zsh এটি করতে পারে, এবং ব্যাশ এটি করতে মোচড় দেওয়া যায়। 3: হ্যাঁ, তবে এটি শেলের মধ্যে কিছুটা আলাদা হয়, আমার উত্তর দেখুন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.