শেল স্ক্রিপ্টগুলি রচনা যা কোনও শেলের উপর চলবে (একাধিক শেবাং লাইন ব্যবহার করে?)


19

আমি সবেমাত্র শেল স্ক্রিপ্টিংয়ের আরও গভীর হতে শুরু করেছি, এবং আমি সবসময় আমার স্ক্রিপ্টটি একটি ফাইলের মধ্যে ফেলে দিয়েছি, চিহ্নিত করেছি chmod +xএবং এরপরে সম্পন্ন করেছি /path/to/script.shএবং যে কোনও অনুবাদকই ডিফল্ট হ'ল এটির সাথে তার পথ চলুক, যা আমি ধরেছিলাম zsh কারণ সেটাই ছিল আমি আমার শেল ব্যবহার করেছি স্পষ্টতই মনে হচ্ছে এটি /bin/shডিফল্টরূপে, এমনকি আমি zsh প্রম্পট থেকে স্ক্রিপ্টটি সম্পাদন করি, কারণ আমি আমার স্ক্রিপ্টগুলিতে zsh- নির্দিষ্ট স্টাফ লাগাতে শুরু করেছি এবং আমি চালিত না হওয়া পর্যন্ত এটি ব্যর্থ zsh /path/to/script.sh

বক্তব্যটি পেতে, আমার এখানে প্রশ্নগুলি:

  1. #!/path/to/shellশুরুতে কোন শেবাং লাইন ( ) না থাকলে কোন শেল স্ক্রিপ্টগুলি কার্যকর করে? আমি ধরে নিলাম /bin/shতবে আমি নিশ্চিত করতে পারছি না
  2. কোন প্ল্যাটফর্মে চলবে শেল স্ক্রিপ্টগুলি লেখার ক্ষেত্রে "সেরা অনুশীলন" হিসাবে বিবেচনা করা হয়? (ঠিক আছে, এটি খোলামেলা ধরণের)
  3. Zsh ব্যবহার না করার চেষ্টা করে zsh ব্যবহার না করে আবার ব্যশে ফিরে যেতে এমন কোনও স্ক্রিপ্ট লিখন কি সম্ভব? আমি নীচে দুটি শেবাং লাইন রাখার চেষ্টা করেছি, তবে bad interpreter: /bin/zsh: no such file or directoryআমি যদি zsh ছাড়াই কোনও মেশিনে চেষ্টা করে দেখি তবে এটির ত্রুটি রয়েছে ।

    #!/bin/zsh

    #!/bin/bash

উত্তর:


26

শুরুতে কোনও শেবাং লাইন (#! / পাথ / থেকে / শেল) না থাকলে কোন শেল স্ক্রিপ্টগুলি কার্যকর করে? আমি ধরে নিয়েছি / বিন / শ তবে আমি নিশ্চিত করতে পারি না।

কার্নেল যেমন স্ক্রিপ্ট এবং আয় চালানো রাজি 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 দ্বারা ব্যবহৃত সিনট্যাক্সটি বিভিন্ন জায়গায় এতটাই আলাদা যে আমি আপনার নিজের বিবেকহীনতার জন্য এটি করার পরামর্শ দেব না


1
ENOEXEC পেলে প্রতিটি শেল আসলে কী ডাকছিল তা আপনি কীভাবে আবিষ্কার করলেন?
গ্রাস করুন

2
@ এসব্রোবেল: ব্যবহার করছে strace -f -e fork,clone,execve। কিছু শেল /bin/shব্যর্থতার পরে কার্যকর করতে গিয়েছিল ; অন্যরা স্ক্রিপ্টটি নিজেরাই ব্যাখ্যা করেছিলেন।
মাধ্যাকর্ষণ

1
@ এসব্রোবেল: আরেকটি পদ্ধতি হ'ল একটি স্ক্রিপ্ট চালানো readlink /proc/$$/exe
মাধ্যাকর্ষণ


1
জন্য cshএবং tcsh, ব্যবহার কিনা স্ক্রিপ্ট দিয়ে শুরু হয় উপর নির্ভর করে #(যে ক্ষেত্রে তারা নিজেদের পরিবর্তে SH ডাকা মধ্যে স্ক্রিপ্ট ব্যাখ্যা করা)। এটি সেই সময়ে ফিরে যায় যখন সিএস সমর্থিত মন্তব্যগুলিতে কিন্তু বোর্ন শেল নয়, সুতরাং #এটি একটি সিশ স্ক্রিপ্ট ছিল এমন একটি ইঙ্গিত ছিল।
sch

2

1) আপনি যে বর্তমান শেলটি চালাচ্ছেন (

২) একই শেল টাইপের (বাশ / ড্যাশ / অ্যাশ / সিএসআই / আপনার স্বাদ যাই থাকুক না কেন) ধরে থাকুন এবং আপনার "সমর্থিত প্ল্যাটফর্মগুলি" ডিফল্টরূপে আপনি যে শেলটি ব্যবহার করতে চান তা ইনস্টল করে নিন। এছাড়াও, সিস্টেমে সাধারণত উপলব্ধ কমান্ড ব্যবহার করার চেষ্টা করুন। মেশিন-নির্দিষ্ট বিকল্পগুলি এড়িয়ে চলুন।

3) এর জন্য আসলে "যদি-তবে-অন্য" যুক্তি নেই interpreter directive। আপনি সমর্থন করতে চান এমন সমস্ত সিস্টেমে থাকা একটি শেল নির্দিষ্ট করা উচিত ... অর্থাত্ আপনার স্ক্রিপ্টটি সমস্ত শেল জুড়ে মোটামুটি জেনেরিক হওয়া পর্যন্ত #!/bin/bashজেনেরিক নির্দিষ্ট করা উচিত #!/bin/sh

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.