"/ বিন / শ" যখন "/ বিন / বাশ" নির্দেশ করে তখন শেল স্ক্রিপ্ট চালানো হয়


11

আমি এই প্রশ্নে নিম্নলিখিতটি পড়েছি :

বাশ একটি --পোসিক্স স্যুইচকে সমর্থন করে যা এটি আরও পসিক্স-অনুগত করে। এটি sh হিসাবে অনুরোধ করা হলে POSIX নকল করার চেষ্টা করে ।

উপরের উদ্ধৃতিটি ধরে নিচ্ছে যে /bin/shএটি একটি লিঙ্ক যা নির্দেশ করে /bin/bash

তবে "sh হিসাবে আহ্বান" বলতে কী বোঝায় তা আমি পুরোপুরি বুঝতে পারি না ।


বলুন যে আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে যা "স্ক্রিপ্ট.শ" নামে পরিচিত:

#!/bin/bash
echo "Hello World"

স্ক্রিপ্টটি সাধারণ bashমোডে বা পসিক্স মোডে চলবে কিনা তা অনুগ্রহ করে আমাকে বলুন (ধরে নিই যে টার্মিনালটিতে আমি নিম্নলিখিত কমান্ডগুলি কার্যকর করেছি bash):

  1. sh script.sh
  2. bash script.sh
  3. ./script.sh

এখন বলুন যে আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে যার নাম "স্ক্রিপ্ট.শ" (যা উপরের স্ক্রিপ্টের মতো তবে শেবাং ছাড়াই):

echo "Hello World"

স্ক্রিপ্টটি সাধারণ bashমোডে বা পসিক্স মোডে চলবে কিনা তা অনুগ্রহ করে আমাকে বলুন (ধরে নিই যে টার্মিনালটিতে আমি নিম্নলিখিত কমান্ডগুলি কার্যকর করেছি bash):

  1. sh script2.sh
  2. bash script2.sh
  3. ./script2.sh

উত্তর:


19

কেবল পজিক্স মোডে কেবল 1 এবং 4 কেস চলবে (ধরে নেওয়া যায় যে shএটি ব্যাশ এবং শ এর কিছু অন্যান্য প্রয়োগ নয়)। যে কেসটি স্পষ্টভাবে কল bashছাড়াই কল --posixকরে সেগুলি শেবাং থেকে আসুক না তা হবে না। যে কোনও ক্ষেত্রে স্পষ্টভাবে কল shকরবে। ইতিমধ্যে স্ক্রিপ্টের জন্য কোনও শেল স্পষ্টভাবে শুরু না করা হলে শেবাং ব্যবহার করা হয়।

কেস।, যদি আপনার টার্মিনালটি চলমান থাকে bash, তবে পসিক্স মোডে চলবে না এবং বাশ নিজেই এটি ব্যবহার করবে। যদি আপনার টার্মিনালটির পরিবর্তে zsh চলমান থাকে তবে কেস 6 এছাড়াও পসিক্স মোডে চলতে পারে। পসিক্স সেই ক্ষেত্রে ঠিক কী হওয়া উচিত তা নিয়ে দ্বিধাগ্রস্ত , এবং সেখানে বাশ এবং জেডএস বিভিন্ন পছন্দ করেছেন। বাশ নিজেই স্ক্রিপ্টটি আহ্বান জানায়, যখন zsh ব্যবহার করে sh(যা কিছু ঘটে তাই)। অন্যান্য শেলগুলিও সেই বিন্দুতে পরিবর্তিত হয়।


আপনি কোন মোডে আছেন তা বলার একটি সহজ উপায় হ'ল আপনার স্ক্রিপ্টের বডি তৈরি করা:

kill -SIGHUP

যা POSIX মোডে ত্রুটিযুক্ত হয়ে ব্যর্থ হবে , তবে এর killবাইরের জন্য ব্যবহারের নির্দেশনা দেবে । এটি একটি সহজ পার্থক্য এবং এটি আপনার মুখোমুখি হওয়ার সম্ভাবনা যতটা পিছনে ফিরে আসবে তা ব্যাশ সংস্করণের দীর্ঘ পরিসরের মধ্য দিয়ে কাজ করে।


3
bashপ্যাসিক্স মোডে POSIXLY_CORRECTপরিবেশগত পরিবর্তনশীল বা এর মতো চলতে বাধ্য করবে এমন আরও কিছু জিনিস রয়েছে SHELLOPTS=posix
স্টাফেন চেজেলাস

1
[ -o posix ]যে আপনি (অন্য শাঁস (যশ ব্যতীত), তাই আপনাকে যা করতে হবে যে একটি নেই চাইবেন ব্যাশ মধ্যে posix মোডে চালাচ্ছেন চেক করতে আরো একটি সুস্পষ্ট উপায় shস্ক্রিপ্ট)। POSIXLY_CORRECT=1 bash -c '[ -o posix ] && echo yes'আউটপুট yes`
Stéphane Chazelas

2
Case-এর ক্ষেত্রে, পশিক যেমন পসিক্স মোডে আবশ্যক তখন প্যাসিক্স মোডে বাশ নিজেই স্ক্রিপ্টটি আহ্বান করে । পসিক্স শি-ব্যাং প্রক্রিয়াটি নির্দিষ্ট করে না এবং এক্সিকিউটেবল স্ক্রিপ্টগুলি পাওয়ার 6 টি একমাত্র পসিক্স উপায় এবং স্পষ্টভাবে নির্দিষ্ট করা হয় (পসিক্স এনভায়রনমেন্টে, স্ক্রিপ্টটি বোঝানো হয় শিথিল ইউটিলিটি অনুসারে)।
স্টাফেন চ্যাজেলাস

8

"হিসাবে আহ্বান" বাশ শুরু হওয়া প্রক্রিয়াটি তার "জিরোথ" কমান্ড লাইন আর্গুমেন্টে রাখে তা যা বোঝায় argv[0]

exec*()সিস্টেমে যখন কোনও প্রোগ্রাম শুরু করা হয় , তখন তারা প্রোগ্রামটি সম্বলিত বাইনারি ফাইলের নামটি সত্যই জানতে পারে না, তবে পরিবর্তে কলিং প্রক্রিয়া সেখানে যা খুশি তা রাখতে পারে। সাধারণত, নামটি ফাইল সিস্টেম থেকে নেওয়া হয়, সুতরাং আপনি যদি চালনা করেন তবে /bin/shএটি সেখানে রাখা হয়। এবং যদি /bin/shবাশ হয় তবে এটি কোনও সিমিলিংক হওয়ার দরকার নেই, এটি একটি হার্ড লিঙ্ক বা শেল প্রোগ্রামের অন্য কোনও অনুলিপি হতে পারে।

"প্রোগ্রামের নাম" সেট করার উদাহরণ হিসাবে, বাশের execকমান্ড -aবিকল্পটি দিয়ে জিরোথ আর্গুমেন্ট সেট করতে পারে । (আমরা পার্লের সাথে বা সরাসরি সি ইত্যাদি দিয়ে একই কাজ করতে পারি)

এখানে, mynameএকটি সাধারণ সি প্রোগ্রাম যা কেবল তার জেরোথ আর্গুমেন্টটি প্রিন্ট করে, নামটি নিজে দেখায়:

$ ./myname 
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename 
I am ./somename
$ ./othername
I am ./othername

উৎস:

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("I am %s\n", argv[0]);
    return 0;
}

তবে, সংখ্যাযুক্ত প্রশ্নের উত্তর দিতে ...

(1 এবং 4) দৌড়াতে আপনার sh somescriptযা কিছু আছে shতা চলবে PATH, সম্ভবত /bin/shতবে সম্ভবত এর মতো কিছু/usr/xpg4/bin/sh

  • যদি এটি বাশ হয় তবে এটি নামটি দেখায় বলে এটি পসিএক্স মোডে চলে sh
  • যদি এটি জেড শেল বা কর্ন শেল হয় তবে এটি একইভাবে নামটি দেখে shতবে এটি "এসএইচ সামঞ্জস্যপূর্ণ" মোডে চলে, যা বোর্ন শেল সামঞ্জস্যপূর্ণ হওয়ার লক্ষ্য এবং those উভয় শেলের পুরো পসিক্স কনফর্মেন্ট মোডের সাথে সূক্ষ্মভাবে আলাদা is ।
  • এটি অবশ্যই অ্যালকুইস্ট শেল, একটি আসল বোর্ন শেল বা অবশ্যই অন্য কিছু হতে পারে।

(2 & 5) রানিং bash somescriptনিয়মিত ব্যাশ মোডে চালানো হবে (আবার, অবশ্যই এটা কি উপর নির্ভর করে bashআপনার PATHহয়।)

(3) এখানে, স্ক্রিপ্টটির নাম প্রোগ্রামের ফাইলের জায়গায় সরাসরি সিস্টেম কলে দেওয়া হয়। কার্নেল হ্যাশবাং লাইনটি পড়ে এবং স্ক্রিপ্টটি চালাতে এটি ব্যবহার করে।

()) এটি জটিল। এটি (3) এর মতো, তবে ENOEXEC (Exec format error)কোনও হ্যাশবাং লাইন নেই বলে প্রোগ্রামটি শুরু করার জন্য সিস্টেম কল ব্যর্থ হয় ( )। পরবর্তীটি যা ঘটে তা নির্ভর করে আপনি যে শেলটি চালাচ্ছেন সে নিজেই পসিক্স মোডে রয়েছে কিনা depends পসিক্সের প্রয়োজন যে কোনও পসিক্স-কনফর্মেন্ট শেল প্রতিক্রিয়া হিসাবে একটি নির্দিষ্ট ফ্যাশনে আচরণ করবে ENOEXEC তবে "শেলটি চাওয়ার সমান কমান্ড" এর কিছুটা অবকাশ রয়েছে যার অর্থ বিভিন্ন শেল বিভিন্ন কাজ করে।

  • বোর্ন অ্যাগেইন শেলটি একই কমান্ড-লাইন আর্গুমেন্ট হিসাবে স্ক্রিপ্টটির নাম সহ একই মোডে নিজেকে পুনরায় চালায় । এর পসিএক্স-কনফরম্যান্ট মোডে এটি অবশ্যই নিজের পসিএক্স-কনফর্মেন্ট মোডে চলছে, এইভাবে পসিক্স-কনফর্মেন্ট শেলটি পোজ করার জন্য পসিক্স প্রয়োজনীয়তা মেনে চলে।
  • জেড শেল, অলকুইস্ট শেল, এবং কর্ন শেলটি /bin/shস্ক্রিপ্টটির নামের সাথে চালিত হয়ে অন্য আর্গুমেন্টের আগে এটির প্রথম কমান্ড-লাইন আর্গুমেন্ট হিসাবে .োকানো হয়েছে। জেড শেল, অ্যালকুইস্ট শেল এবং কর্ন শেল /bin/shপ্রোগ্রামটি একটি বলে ধরে নিয়ে ছদ্মবেশে একটি পসিক্স-কনফর্মেন্ট শেলটি আহ্বান করার চেষ্টা করছে (চেষ্টা করছে) ।

আপনি কি এই সি প্রোগ্রামের সোর্স কোডটি শেয়ার করতে পারেন ..
জিপসিকোসমোনট

int main(int argc, char *argv[]){printf("I am %s\n",argv[0]);}
স্টিগ হেমার

যে প্রায় কাছাকাছি এটা.
ইলকচাচু

4

চালিত শেলটি হয় কমান্ড লাইনে ডাকা এক বা শেবাংয়ের একটি (যদি কমান্ড লাইন এটি নির্দিষ্ট করে না)।

সুতরাং, সংস্করণ 1 এবং 4 চলবে sh, 2 এবং 5 এর সাথে বাশ এবং 6 টি চলতে পারে না যদি আপনি ইন্টার (ইন্টারেক্টিভ) sh (এবং কিছু অন্যান্য) ব্যবহার করে থাকেন। স্ক্রিপ্ট শুরু করে বাশ। Ksh এছাড়াও। Zsh এটি sh হিসাবে শুরু করে।

shবাশের সাথে লিঙ্ক করা থাকলে কেবল সেগুলি শুরু করা পোস্টিক্স বিকল্পটি ব্যবহার করবে /bin/sh

কোনও বাশ ksh বা zsh সংস্করণ এটি চালাচ্ছে কিনা তা সনাক্ত করতে আপনার স্ক্রিপ্টে এই লাইনটি যুক্ত করুন:

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