স্ক্রিপ্ট ফাইলের শুরুতে আপনার কেন #! / বিন / বাশ লাগাতে হবে?


483

আমি এর আগে বাশ স্ক্রিপ্ট তৈরি করেছি এবং সেগুলি #!/bin/bashশুরুতে না করে ঠিকঠাক হয়ে গেছে।

এটি inোকানোর কী লাভ? জিনিস কি অন্য কিছু হতে পারে?

এছাড়াও, আপনি কিভাবে উচ্চারণ করবেন #? আমি জানি যে !"ঠুং ঠুং শব্দ" হিসাবে উচ্চারিত হয়।

#!উচ্চারিত হয় কিভাবে ?


8
আপনার দরকার নেই এবং আপনার কোনও পছন্দ না করা উচিত নয়। আপনি যখন (# পসিক্স) শেল এবং ব্যাশের পার্থক্য সম্পর্কে জানতে পারেন তখন '#! / বিন / শ' ব্যবহার করুন। আপনার জীবনবৃত্তান্ত খুব বেশি বাড়ার একদিন আগে আসবে যখন আপনি নিজেকে একটি আলাদা শেলযুক্ত সিস্টেমে খুঁজে পাবেন এবং আপনি এখনও আপনার স্ক্রিপ্টগুলি কাজ করতে চান।
জেনস

50
এটি "হ্যাশ-ব্যাং" বা "শে-ব্যাং" উচ্চারিত হয়।
বিচহাউস

22
আমি মনে করি এটি লক্ষণীয় যে আপনি যদি আপনার স্ক্রিপ্টকে একটি এক্সিকিউটেবল হিসাবে চালনা করেন তবে এটি কেবল কার্যকর হয়। সুতরাং আপনি যদি নির্বাহযোগ্য পতাকা নির্ধারণ করেন এবং তারপরে টাইপ করুন ./yourscript.extension, উদাহরণস্বরূপ, ./helloworld.pyবা ./helloworld.sh, এটি সেই শীর্ষ লাইনে দোভাষীর সন্ধান করবে, যা হবে #!/bin/pythonবা !#/bin/bashযেখানে স্ক্রিপ্টটি কার্যকর করার python helloworld.pyসময় প্রথম লাইনটি লক্ষ্য করা যাবে না কারণ এটি মন্তব্য করা হয়েছে বাইরে। সুতরাং এটি শেল / কার্নেলের জন্য একটি বিশেষ ক্রম।
জেএফএ

পাইথন ও # ব্যবহার করার জন্য @ জেএফএ-তে বাশ ও পাইথনের মধ্যে ক্রম পরিবর্তন রয়েছে! বাশ জন্য?
এএআই

@ আজিয়াআনন্দ এবং এটি কোনও ভুল টাইপ, ভাল ক্যাচ ছিল না
জেএফএ

উত্তর:


425

এটি একটি সম্মেলন তাই * নিক্স শেলটি জানে যে কী ধরণের দোভাষী ব্যবহার করতে হবে।

উদাহরণস্বরূপ, এটিটি-র পুরানো স্বাদগুলি sh (বোর্ন শেল) -কে ডিফল্ট করেছে , যখন বিএসডি-র পুরানো সংস্করণগুলি সিএস (সি শেল) এ ডিফল্ট হয়েছিল ।

এমনকি আজ (যেখানে অধিকাংশ সিস্টেমে ব্যাশ চালানোর জন্য, "বোর্ন আবার শেল" ), স্ক্রিপ্ট ব্যাশ, পাইথন, পার্ল, রুবি, পিএইচপি ইত্যাদি, ইত্যাদি উদাহরণস্বরূপ হতে পারে, আপনি দেখতে হতে পারে #!/bin/perlবা #!/bin/perl5

পিএস: বিস্ময়কর চিহ্নটি ( !)টিকে স্নেহের সাথে "ব্যাং" বলা হয় । শেল মন্তব্য প্রতীক ( #) কখনও কখনও "হ্যাশ" বলা হয় ।

PPS: মনে রাখবেন - * স্নো অধীনে, একটি ফাইল ধরনের সঙ্গে একটি প্রত্যয় যুক্ত করা নিছক হয় কনভেনশন , না একটি "বিধি" অর্থ । একটি এক্সিকিউটেবল একটি বাইনারি প্রোগ্রাম, মিলিয়ন স্ক্রিপ্ট ধরণের যে কোনও একটি এবং অন্যান্য জিনিসও হতে পারে। অতএব প্রয়োজন #!/bin/bash


1
আমি অন্য দরকারী কিছু সম্পর্কে জানতে পেরেছি, $ #। এটাকে কী বলা হয়?
নোড নিনজা

91
শেবাং শেল কনভেনশন নয়, সিস্কাল পরিচালনা করার সময় এটি কার্নেল দ্বারা ব্যাখ্যা করা হয় execve(2); সুতরাং শেবাং শাঁস নয়, কার্নেল কনভেনশন।
বেসাইল স্টারিনকিভিচ

10
এছাড়াও, এটি ভিমের মতো কিছু সম্পাদককে ফাইলের কোনও এক্সটেনশন না থাকলে সিনট্যাক্স হাইলাইট করার জন্য ভাষা নির্ধারণ করতে সহায়তা করে। শেবাং ছাড়াই, ভিম সরল পাঠ্য ফাইলের মতো একটি বাশ স্ক্রিপ্ট প্রদর্শন করবে।
অ্যারোন ব্লেনকুশ 10'13

1
এটি আমাকে অবাক করে তোলে যে আপনার কি #!/bin/shএমন জিনিস .profileএবং আনডলোড
কলব ক্যানিয়ন

5
তো ... হ্যাশ-ব্যাং-স্ল্যাশ-বিন-স্ল্যাশ-বাশ ?
বার্নাত

134

শিবাং আরও স্পষ্ট করে বলতে #!গেলে, যখন এটি এক্সিকিউটেবল ( x মোড ) ফাইলের প্রথম দুটি বাইট হয়, তখন এক্সিকিউ (2) সিস্টেম কল (যা প্রোগ্রামগুলি কার্যকর করে) দ্বারা ব্যাখ্যা করা হয় । তবে শিবাংয়েরexecve উল্লেখ না করার জন্য পসিক্স স্পেসিফিকেশন

এটি অবশ্যই একজন অনুবাদককে এক্সিকিউটেবলের ফাইলের পথ অনুসরণ করতে হবে (যা বিটিডাব্লু এমনকি আপেক্ষিক হতে পারে, তবে বেশিরভাগ ক্ষেত্রে নিরঙ্কুশ হয়)।

একটি সুন্দর কৌতুক (অথবা হয়ত না এত সুন্দর একটি) একজন দোভাষী (যেমন এটি pythonব্যবহারকারীর মধ্যে) $PATHব্যবহার করা envপ্রোগ্রাম (সবসময় এ /usr/bin/envসব লিনাক্স দিকে) যেমন মত

 #!/usr/bin/env python

যে কোনও ইএলএফ এক্সিকিউটেবল, দোভাষী হতে পারে। আপনি এমনকি ব্যবহার করতে পারেন #!/bin/catবা #!/bin/trueযদি আপনি চান! (তবে এটি প্রায়শই অকেজো হয়ে যায়)


8
হ্যাকের আলোচনার জন্য এই প্রশ্নটি দেখুন #!/usr/bin/env
কিথ থম্পসন

আমি যদি অজগরকে একটি যুক্তি দিতে চাই তবে আমি কীভাবে এটি করতে পারি তা আসলে আমি কার্যকর করতে চাই #!/usr/bin/env bash -x। আমি কেমন করে ঐটি করি ?
indianwebdevil

এটির সহজ আমি নিজেই এটি খুঁজে পেয়েছি, কেবল তার পরে পরম যুক্ত করুন#!/usr/bin/env bash -x
ইন্ডিয়ানউবদেবিল 13

bashপ্রায় সবসময় /bin/bashতাই আপনার #!/bin/bash -x
শেবাংটি

49

একে শেবাং বলে । ইউনিক্স-স্পোকে, # কে তীক্ষ্ণ বলা হয় (সংগীতে যেমন) বা হ্যাশ (টুইটারে হ্যাশট্যাগগুলির মতো), এবং! বলা হয় ঠুং ঠুং শব্দ (আপনি প্রকৃতপক্ষে আপনার আগের শেল কমান্ডটির সাথে উল্লেখ করতে পারেন, যাকে ব্যাং-ব্যাং বলা হয়)। সুতরাং যখন একসাথে রাখা হয়, আপনি এসএএসএচ-ব্যাং, বা শেবাং পাবেন।

পার্টের পরে #! এটি পরিচালনা করার জন্য কোন প্রোগ্রামটি ব্যবহার করতে হবে তা ইউনিক্সকে বলে। যদি এটি নির্দিষ্ট না করা থাকে তবে এটি ব্যাশ (বা sh, বা zsh, বা আপনার EL শেল ভেরিয়েবল যাই হোক না কেন) দিয়ে চেষ্টা করবে তবে এটি সেখানে থাকলে সেই প্রোগ্রামটি ব্যবহার করবে। প্লাস, # বেশিরভাগ ভাষায় একটি মন্তব্য, সুতরাং পরবর্তী কার্যনির্বাহনে লাইনটি এড়ানো যায়।


2
যদি আমি ইতিমধ্যে ব্যাশে আছি, যদি এটি #! / বিন / বাশ দেখায় তবে এটি কি আর কোনও ব্যাশ উদাহরণ শুরু করবে? যদি আমি ইতিমধ্যে ব্যাশে আছি এবং আমি এটি ছেড়ে দিই তবে কী হবে? কোন পার্থক্য আছে?
নোড নিনজা

2
@ জাভাস্ক্রিপ্টিনিঞ্জ কোনওভাবেই এটি নতুন বাশ শেল শুরু করে। ব্যাশের ক্ষেত্রে, যতক্ষণ না আপনি ইতিমধ্যে ব্যাশ ব্যবহার করছেন ততক্ষণ কোনও পার্থক্য নেই। শেবাং কেবল সত্যিকার অর্থে গুরুত্বপূর্ণ যদি (ক) আপনাকে এমন কিছু চালানো দরকার যা কেবল শেল নয়, যেমন পাইথন বা পার্ল, বা (খ) আপনি ব্যাশ শেল ব্যবহার করেন না (যেমন আপনি জেডএস ব্যবহার করেন) তবে আপনার প্রয়োজন বাশ চালানোর দরকার হয় এমন কিছু চালান।
অস্টিন1হওয়ার্ড

যাইহোক, আমার মতে শেবাংকে অন্তর্ভুক্ত করা ভাল অনুশীলন, ঠিক এইভাবে কেউ কেউ পড়ছেন জানেন কী চলছে।
অস্টিন1হওয়ার্ড

2
ভুল: execve(2)সিস্কেল $SHELLভেরিয়েবলটি ব্যবহার করবেন না । এটি কার্নেল যা শিবাংয়ের ব্যাখ্যা দিচ্ছে।
বেসাইল স্টারিনকিভিচ

1
@ বাসাইলস্টারিঙ্কেভিচ যা সঠিক, কার্নেলের এল্ফ লোডার শেবাংকে ব্যাখ্যা করে। আমি বলছিলাম যে শেবাং সরবরাহ না করা হলে EL শেল ব্যবহার করা হবে।
অস্টিন 1 হাওয়ার্ড

19

কুঁড়েঘর লোডার করার জন্য একটি নির্দেশ প্রোগ্রাম যার পরে উল্লেখ করা হয় ব্যবহার করা #!প্রশ্নে ফাইলের জন্য দোভাষী হিসেবে যখন আপনি এটি চালানো চেষ্টা করুন। সুতরাং, আপনি নামক একটি ফাইল চালানোর চেষ্টা করে foo.shযা হয়েছে #!/bin/bashউপরের প্রকৃত কমান্ড রান যে /bin/bash foo.sh। এটি বিভিন্ন প্রোগ্রামের জন্য বিভিন্ন দোভাষী ব্যবহারের একটি নমনীয় উপায়। এটি সিস্টেম স্তরে বাস্তবায়িত কিছু এবং ব্যবহারকারী স্তরের এপিআই হ'ল শেবাং কনভেনশন।

শিবাং একটি যাদু নম্বর - এটি একটি মানব পাঠযোগ্য যা প্রদত্ত দোভাষীর স্ক্রিপ্ট হিসাবে ফাইলটিকে চিহ্নিত করে knowing

এমনকি শেবাং ব্যতীত এটি "কাজ করা" সম্পর্কে আপনার বক্তব্যটি কেবলমাত্র কারণ প্রশ্নযুক্ত প্রোগ্রামটি হ'ল আপনি ব্যবহার করছেন এমন একই শেলের জন্য লিখিত শেল স্ক্রিপ্ট। উদাহরণস্বরূপ, আপনি খুব ভালভাবে একটি জাভাস্ক্রিপ্ট ফাইল লিখতে পারেন এবং তারপরে #! /usr/bin/jsএকটি জাভাস্ক্রিপ্ট "শেল স্ক্রিপ্ট" রাখতে একটি (বা অনুরূপ কিছু) রেখেছিলেন ।


18

অপারেটিং সিস্টেমটি আপনার শেল স্ক্রিপ্টটি চালাতে ডিফল্ট শেল নেয়। স্ক্রিপ্টের শুরুতে শেল পথ উল্লেখ করে আপনি ওএসকে সেই নির্দিষ্ট শেলটি ব্যবহার করতে বলছেন। এটি বহনযোগ্যতার জন্যও কার্যকর ।


15

প্রতিটি বিতরণে একটি ডিফল্ট শেল থাকে। বেশিরভাগ সিস্টেমে বাশই ডিফল্ট। যদি আপনি কোনও সিস্টেমে আলাদা ডিফল্ট শেল ব্যবহার করে কাজ করে থাকেন তবে স্ক্রিপ্টগুলি বাশের জন্য নির্দিষ্ট লেখা থাকলে সেগুলি উদ্দেশ্য অনুযায়ী কাজ করতে পারে না।

ব্যাশ থেকে কোড গ্রহণ বছরের পর বছর ধরে বিকশিত করেনি kshএবং sh

#!/bin/bashআপনার স্ক্রিপ্টের প্রথম লাইন হিসাবে যুক্ত করা, ওএসকে স্ক্রিপ্টে shellঅনুসরণ করা কমান্ডগুলি কার্যকর করতে নির্দিষ্ট অনুরোধ করতে বলে ।

#! প্রায়শই "হ্যাশ-ব্যাং", "সে-ব্যাং" বা "শা-ব্যাং" হিসাবে পরিচিত।


9

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



0

এটি এমন কোনও ব্যক্তির পক্ষে দরকারী হতে পারে যে একটি পৃথক সিস্টেম ব্যবহার করে যা সেই লাইব্রেরিটি সহজেই উপলভ্য নয়। যদি এটি ঘোষিত না হয় এবং আপনার স্ক্রিপ্টে এমন কিছু ফাংশন রয়েছে যা সেই সিস্টেম দ্বারা সমর্থিত নয়, আপনার উচিত # / বিন / ব্যাশ ঘোষণা করুন। আমি কর্মক্ষেত্রে আগে এই সমস্যায় পড়েছি এবং এখন আমি এটিকে অনুশীলন হিসাবে অন্তর্ভুক্ত করছি।

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