সমস্ত স্ক্রিপ্ট ফাইল কেন শুরু হয়
#!/bin/sh
বা সাথে
#!/bin/csh
এটা কি দরকার? এর উদ্দেশ্য কী? আর দুজনের মধ্যে পার্থক্য কী?
সমস্ত স্ক্রিপ্ট ফাইল কেন শুরু হয়
#!/bin/sh
বা সাথে
#!/bin/csh
এটা কি দরকার? এর উদ্দেশ্য কী? আর দুজনের মধ্যে পার্থক্য কী?
উত্তর:
এটি একটি হিসাবে পরিচিত 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
#!
লাইন কার্নেল (বিশেষত বাস্তবায়ন বলে 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
সঠিক জিনিস ছিল তবে এটি আমার মতামত থেকে যায় যে এটি প্রায়শই একটি খারাপ ধারণা।
এটি আপনার স্ক্রিপ্টটির ব্যাখ্যা / চালনার জন্য আপনি কোন শেল (কমান্ড ইন্টারপ্রেটার) ব্যবহার করছেন তা সংজ্ঞায়িত করে। প্রতিটি শেলটি ব্যবহারকারীর সাথে ইন্টারেক্ট করে এবং স্ক্রিপ্টগুলি (প্রোগ্রামগুলি) চালায় সেভাবে কিছুটা আলাদা।
আপনি যখন ইউনিক্স প্রম্পটে একটি কমান্ড টাইপ করেন, আপনি শেলটির সাথে ইন্টারঅ্যাক্ট করছেন।
যেমন, #!/bin/csh
সি-শেল, /bin/tcsh
টি-শেল, /bin/bash
ব্যাশ শেল ইত্যাদি বোঝায়
আপনি কোন ইন্টারেক্টিভ শেলটি ব্যবহার করছেন তা বলতে পারেন
echo $SHELL
কমান্ড, বা বিকল্পভাবে
env | grep -i shell
আপনি কমান্ড দিয়ে আপনার কমান্ড শেল পরিবর্তন করতে পারেন chsh
।
প্রত্যেকের একটি আলাদা কমান্ড সেট এবং ভেরিয়েবলগুলি নির্ধারণের পদ্ধতি এবং নিজস্ব প্রোগ্রামিং কনস্ট্রাক্টসের সেট রয়েছে। উদাহরণস্বরূপ, ব্যাশের সাথে if-অন্য বিবৃতিটি সি-শেলের মধ্যে পৃথক দেখাচ্ছে।
এই পৃষ্ঠাটি আগ্রহী হতে পারে কারণ এটি ব্যাশ এবং টিসিএস কমান্ড / সিনট্যাক্সের মধ্যে "অনুবাদ" করে।
শেল স্ক্রিপ্টে নির্দেশিকা ব্যবহারের ফলে আপনি একটি আলাদা শেল ব্যবহার করে প্রোগ্রাম চালাতে পারবেন। উদাহরণস্বরূপ আমি tcsh
শেলটি ইন্টারেক্টিভভাবে ব্যবহার করি তবে প্রায়ই স্ক্রিপ্ট ফাইলে / বিন / ব্যাশ ব্যবহার করে ব্যাশ স্ক্রিপ্টগুলি চালিত করি run
পাশে:
এই ধারণাটি অন্যান্য স্ক্রিপ্টগুলিতেও প্রসারিত। উদাহরণস্বরূপ আপনি যদি পাইথনে প্রোগ্রাম করেন তবে আপনি রাখবেন
#!/usr/bin/python
আপনার পাইথন প্রোগ্রামের শীর্ষে
#! $SHELL
? এটি কি শেবাংয়ের মধ্যে সঠিক শেলটি রাখবে?
!#/bin/bash
নির্দেশ। এটি আপনার শেল স্ক্রিপ্টটি কার্যকর করতে কোন শেল ব্যবহার করবে তা সিস্টেমকে বলে।
$SHELL
মুহুর্তে আপনি কোন শেলটি চালাচ্ছেন তার মান অগত্যা আপনাকে জানায় না; এটি আপনাকে সাধারণত আপনার ডিফল্ট শেলটি বলে । tcsh সেট $version
এবং $tcsh
; বাশ সেট $BASH_VERSION
। সমস্ত শাঁসের অগত্যা একই পদ্ধতি হয় না।
#!
লাইনটি স্ক্রিপ্টটির বাক্য গঠনটির সাথে মেলে, না স্ক্রিপ্টটি চালাচ্ছেন এমন ব্যক্তি দ্বারা ব্যবহৃত ইন্টারেক্টিভ শেল।
#!/bin/csh -f
;-f
উৎস না শেল বলে ব্যবহারকারীর.login
এবং.cshrc
, যা স্ক্রিপ্টটি রান দ্রুত বানায় এবং ব্যবহারকারীর সেটআপ উপর নির্ভরতা এড়াতে। (বা আরও ভাল, csh স্ক্রিপ্ট লিখবেন না।)-f
Sh বা বাশ স্ক্রিপ্টগুলির জন্য ব্যবহার করবেন না ; এর একই অর্থ নেই।