শেল-স্ক্রিপ্ট শিরোনাম (#! / বিন / শ বনাম #! / বিন / সিএসএস)


92

সমস্ত স্ক্রিপ্ট ফাইল কেন শুরু হয়

#!/bin/sh

বা সাথে

#!/bin/csh

এটা কি দরকার? এর উদ্দেশ্য কী? আর দুজনের মধ্যে পার্থক্য কী?


4
সিএসএস স্ক্রিপ্টের জন্য আপনার ব্যবহার করা উচিত #!/bin/csh -f; -fউৎস না শেল বলে ব্যবহারকারীর .loginএবং .cshrc, যা স্ক্রিপ্টটি রান দ্রুত বানায় এবং ব্যবহারকারীর সেটআপ উপর নির্ভরতা এড়াতে। (বা আরও ভাল, csh স্ক্রিপ্ট লিখবেন না।) -fSh বা বাশ স্ক্রিপ্টগুলির জন্য ব্যবহার করবেন না ; এর একই অর্থ নেই।
কিথ থম্পসন

উত্তর:


99

এটি একটি হিসাবে পরিচিত Shebang:

http://en.wikedia.org/wiki/Shebang_( ইউনিক্স)

#! দোভাষী [alচ্ছিক-আরগ]

একটি শিবাং কেবল তখনই প্রাসঙ্গিক হয় যখন কোনও স্ক্রিপ্টের সম্পাদনের অনুমতি থাকে (যেমন chmod u + x স্ক্রিপ্ট.শ)।

যখন একটি শেল স্ক্রিপ্টটি কার্যকর করে এটি নির্দিষ্ট দোভাষী ব্যবহার করবে।

উদাহরণ:

#!/bin/bash
# file: foo.sh
echo 1

$ chmod u+x foo.sh
$ ./foo.sh
  1

@ কলব ক্যানিয়ন আপনার প্রয়োজন নেই, তবে এটি সিনট্যাক্স হাইলাইটিং সহ কিছু সম্পাদককে সহায়তা করতে পারে (যদিও একই জিনিস অর্জনের জন্য সাধারণত অন্যান্য উপায় রয়েছে): unix.stackexchange.com/a/88730/193985
ব্রাহাম স্নাইডার

42

#!লাইন কার্নেল (বিশেষত বাস্তবায়ন বলে execveসিস্টেম কল) যে এই প্রোগ্রাম একটি ব্যাখ্যা ভাষায় লেখা হয়; নীচের পরম পঠনামটি দোভাষীকে শনাক্ত করে। মেশিন কোডে সংকলিত প্রোগ্রামগুলি একটি ভিন্ন বাইট অনুক্রমের সাথে শুরু হয় - বেশিরভাগ আধুনিক ইউনিক্সে 7f 45 4c 46( ^?ELF)) যা তাদের এগুলি সনাক্ত করে।

আপনি যে কোনও প্রোগ্রামের পরে চান তার পরম পাথ রাখতে পারেন#! , যতক্ষণ না সেই প্রোগ্রামটি কোনও #!স্ক্রিপ্ট না হয় । কার্নেল একটি অনুরোধ পুনর্লিখন করে

./script arg1 arg2 arg3 ...

যেখানে ./scriptশুরু হয়, বলুন, #! /usr/bin/perlযেমন কমান্ড লাইন আসলে ছিল

/usr/bin/perl ./script arg1 arg2 arg3

অথবা, যেমনটি আপনি দেখেছেন, আপনি #! /bin/shকোনও স্ক্রিপ্ট লিখতে ব্যবহার করতে পারেন যার অর্থ ব্যাখ্যা করা উচিত sh

#!লাইন শুধুমাত্র আপনি প্রক্রিয়াকৃত হয় সরাসরি (স্ক্রিপ্ট ডাকা ./scriptকমান্ড লাইন); ফাইলটিও কার্যকর হতে হবে ( chmod +x script)। যদি আপনি না লাইন প্রয়োজন নেই (এবং যদি থাকে উপেক্ষা করা হবে), এবং ফাইল এক্সিকিউটেবল হতে নেই। বিন্দু (দো বৈশিষ্ট্যের আপনাকে জানতে হবে কোন ভাষায় তারা লেখা হয় করেও ব্যাখ্যা ভাষার প্রোগ্রাম ডাকা সরাসরি করার অনুমতি দেয় হয়। - আপনি যে একটি মহান অনেক স্টক প্রোগ্রাম এই বৈশিষ্ট্য ব্যবহার আসলে। আবিষ্কার করা হবে)sh ./script#!grep '^#!' /usr/bin/*

এই বৈশিষ্ট্যটি ব্যবহারের জন্য এখানে কিছু নিয়ম রয়েছে:

  • #!প্রথম দুই হওয়া আবশ্যক বাইট ফাইলে। বিশেষত, ফাইলটি অবশ্যই একটি ASCII- সামঞ্জস্যপূর্ণ এনকোডিংয়ে থাকতে হবে (যেমন UTF-8 কাজ করবে, তবে UTF-16 কাজ করবে না) এবং অবশ্যই একটি "বাইট অর্ডার চিহ্ন" দিয়ে শুরু করা উচিত নয় , বা কার্নেল এটি হিসাবে স্বীকৃতি দেবে না #!লিপি.
  • পরবর্তী পথটি #!অবশ্যই একটি নিখুঁত পাথ হতে হবে (শুরু হবে /)। এটিতে স্থান, ট্যাব বা নিউলাইন অক্ষর থাকতে পারে না।
  • এটি ভাল শৈলী, তবে প্রয়োজন হয় না, #!এবং এর মধ্যে একটি জায়গা রাখে /। সেখানে একাধিক স্থান রাখবেন না।
  • আপনি #!লাইনে শেল ভেরিয়েবল রাখতে পারবেন না , সেগুলি প্রসারিত হবে না।
  • আপনি একক স্পেস দ্বারা পৃথক করে পরম পথের পরে একটি কমান্ড-লাইন যুক্তি রাখতে পারেন । পরম পাথের মতো, এই যুক্তিতে স্থান, ট্যাব বা নিউলাইন অক্ষর থাকতে পারে না। কখনও কখনও জিনিসগুলি ( #! /usr/bin/awk -f) কাজ করার জন্য এটি প্রয়োজন হয় , কখনও কখনও এটি কেবল দরকারী ( #! /usr/bin/perl -Tw)। দুর্ভাগ্যক্রমে, আপনি পরম পথের পরে দুটি বা ততোধিক যুক্তি রাখতে পারবেন না ।
  • কিছু লোক #! /usr/bin/env interpreterপরিবর্তে আপনাকে ব্যবহার করতে বলবে #! /absolute/path/to/interpreterএটি প্রায় সবসময়ই একটি ভুল। এটি আপনার প্রোগ্রামের আচরণটি $PATHস্ক্রিপ্টটি চালিতকারীর পরিবর্তকের উপর নির্ভর করে । এবং সমস্ত সিস্টেমের envপ্রথম স্থান নেই।
  • যে প্রোগ্রামগুলি প্রয়োজন setuidবা setgidঅধিকারগুলি ব্যবহার করতে পারে না #!; সেগুলি মেশিন কোডে সংকলন করতে হবে। (যদি আপনি কী না জানেন তবে setuidএটি সম্পর্কে চিন্তা করবেন না))

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


লিনাক্সের সাম্প্রতিক সংস্করণগুলি নির্দিষ্ট দোভাষীকে একটি স্ক্রিপ্ট হতে দেয়। এটির পরে স্থান বাদ দেওয়া সাধারণ অনুশীলন #!; এটি ভাল স্টাইল কিনা তা নিয়ে কোনও মন্তব্য নেই। হ্যাকের পক্ষে মতামত ও আলোচনার জন্য এই প্রশ্নটি এবং আমার উত্তর দেখুন #!/usr/bin/env
কিথ থম্পসন

@ কিথথম্পসন আমি ছাপের আওতায় আছি লিনাক্স হ'ল একমাত্র সাধারণ ইউনিক্স বৈকল্পিক যা দোভাষীকে স্ক্রিপ্ট হতে দেয়, সুতরাং এটি এখনও নির্ভর করার মতো কিছু নয়। যেহেতু আমি এটি লিখেছি আমি নিজেই এমন পরিস্থিতির মুখোমুখি হয়েছি যেখানে #!/usr/bin/envসঠিক জিনিস ছিল তবে এটি আমার মতামত থেকে যায় যে এটি প্রায়শই একটি খারাপ ধারণা।
zwol

4

এটি আপনার স্ক্রিপ্টটির ব্যাখ্যা / চালনার জন্য আপনি কোন শেল (কমান্ড ইন্টারপ্রেটার) ব্যবহার করছেন তা সংজ্ঞায়িত করে। প্রতিটি শেলটি ব্যবহারকারীর সাথে ইন্টারেক্ট করে এবং স্ক্রিপ্টগুলি (প্রোগ্রামগুলি) চালায় সেভাবে কিছুটা আলাদা।

আপনি যখন ইউনিক্স প্রম্পটে একটি কমান্ড টাইপ করেন, আপনি শেলটির সাথে ইন্টারঅ্যাক্ট করছেন।

যেমন, #!/bin/cshসি-শেল, /bin/tcshটি-শেল, /bin/bashব্যাশ শেল ইত্যাদি বোঝায়

আপনি কোন ইন্টারেক্টিভ শেলটি ব্যবহার করছেন তা বলতে পারেন

 echo $SHELL

কমান্ড, বা বিকল্পভাবে

 env | grep -i shell

আপনি কমান্ড দিয়ে আপনার কমান্ড শেল পরিবর্তন করতে পারেন chsh

প্রত্যেকের একটি আলাদা কমান্ড সেট এবং ভেরিয়েবলগুলি নির্ধারণের পদ্ধতি এবং নিজস্ব প্রোগ্রামিং কনস্ট্রাক্টসের সেট রয়েছে। উদাহরণস্বরূপ, ব্যাশের সাথে if-অন্য বিবৃতিটি সি-শেলের মধ্যে পৃথক দেখাচ্ছে।

এই পৃষ্ঠাটি আগ্রহী হতে পারে কারণ এটি ব্যাশ এবং টিসিএস কমান্ড / সিনট্যাক্সের মধ্যে "অনুবাদ" করে।

শেল স্ক্রিপ্টে নির্দেশিকা ব্যবহারের ফলে আপনি একটি আলাদা শেল ব্যবহার করে প্রোগ্রাম চালাতে পারবেন। উদাহরণস্বরূপ আমি tcshশেলটি ইন্টারেক্টিভভাবে ব্যবহার করি তবে প্রায়ই স্ক্রিপ্ট ফাইলে / বিন / ব্যাশ ব্যবহার করে ব্যাশ স্ক্রিপ্টগুলি চালিত করি run

পাশে:

এই ধারণাটি অন্যান্য স্ক্রিপ্টগুলিতেও প্রসারিত। উদাহরণস্বরূপ আপনি যদি পাইথনে প্রোগ্রাম করেন তবে আপনি রাখবেন

 #!/usr/bin/python

আপনার পাইথন প্রোগ্রামের শীর্ষে


সুতরাং এটি প্রয়োজন? আমি কীভাবে জানব যে আমি আসলে কোন শেল ব্যবহার করছি?
এক দুই তিন

সুতরাং যদি আমি কারও কাছে তাদের মেশিনে স্ক্রিপ্টগুলি লেখার জন্য লিখছি এবং তারা কী শেল ব্যবহার করছে তা আমি জানি না। (এই ব্যক্তি, দুর্ভাগ্যবশত, এই জিনিস সম্পর্কে নিখুঁত, এইভাবে তিনি যা করতে পারেন তা কোনও জিনিস পরিবর্তন না করেই স্ক্রিপ্ট চালানো হয়)। আমি কি কিছু করতে পারি #! $SHELL? এটি কি শেবাংয়ের মধ্যে সঠিক শেলটি রাখবে?
এক দুই তিন

4
@ ওনেটউথ্রি বেশিরভাগ সিস্টেমে স্ট্যান্ডার্ড শেল থাকে, আপনি যদি কোনও বাশ বা সিএসএস স্ক্রিপ্ট লিখে থাকেন তবে আপনি ঠিকঠাক হবেন। কি শেল তারা ইন্টারেক্টিভ ব্যবহার করছেন না ব্যাপার, যেমন, সৌন্দর্য যে !#/bin/bashনির্দেশ। এটি আপনার শেল স্ক্রিপ্টটি কার্যকর করতে কোন শেল ব্যবহার করবে তা সিস্টেমকে বলে।
লেভন

এই $SHELLমুহুর্তে আপনি কোন শেলটি চালাচ্ছেন তার মান অগত্যা আপনাকে জানায় না; এটি আপনাকে সাধারণত আপনার ডিফল্ট শেলটি বলে । tcsh সেট $versionএবং $tcsh; বাশ সেট $BASH_VERSION। সমস্ত শাঁসের অগত্যা একই পদ্ধতি হয় না।
কিথ থম্পসন

4
@ ওয়ানটিউ থ্রি: #!লাইনটি স্ক্রিপ্টটির বাক্য গঠনটির সাথে মেলে, না স্ক্রিপ্টটি চালাচ্ছেন এমন ব্যক্তি দ্বারা ব্যবহৃত ইন্টারেক্টিভ শেল।
কিথ থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.