দোভাষী দ্বারা কি #! / বিন / শ পড়া হয়?


66

ইন bashবা sh, আমি যা কিছু দিয়ে শুরু হয় অনুমান #একটি হল মন্তব্য

তবে bashস্ক্রিপ্টগুলিতে আমরা লিখি:

#!/bin/bash

পাইথন স্ক্রিপ্টগুলিতে রয়েছে:

#!/bin/python

এর অর্থ কি এই যে #নিজেই একটি মন্তব্য, যেখানে #!নেই?


1
এবং একবার আপনি অ্যাপারমার প্রোফাইলগুলি দেখা শুরু করলে আপনি দেখতে পাবেন #include। সেখানেও, এটি #কোনও মন্তব্য হিসাবে বোঝানো হয়নি।

4
@ vasa1 কিন্তু কী পয়েন্ট যে প্রায়ই শেল স্ক্রিপ্ট শুরুতে hashbang লাইন সম্পর্কে প্রশংসা না করে তারা হয় মন্তব্য নেই
এলিয়াহ কাগন

উত্তর:


100

#!লাইন ব্যবহার করা হয় আগে স্ক্রিপ্টটি রান করা হয়, তাহলে উপেক্ষিত যখন স্ক্রিপ্ট চালানো হয়।

আপনি জিজ্ঞাসা করছেন শেবাং লাইন এবং একটি সাধারণ মন্তব্যের মধ্যে পার্থক্য কী ।

শুরু হওয়া একটি লাইন #!অন্য যে কোনও লাইনের সাথে শুরু হওয়া ঠিক তেমনই একটি মন্তব্য #। এটি সত্য যদি #!ফাইলের প্রথম লাইন হয় বা অন্য কোথাও। #!/bin/sh এর একটি প্রভাব আছে , তবে এটি দোভাষী দ্বারা নিজেই পড়া হয় না

#সমস্ত প্রোগ্রামিং ল্যাঙ্গুয়েজে কোনও মন্তব্য নয় তবে, আপনি জানেন, এটি বোর্ন-স্টাইলের শেল shএবং bash(পাশাপাশি বেশিরভাগ নন-বোর্ন-স্টাইলের শেলগুলি, যেমন csh) এর মধ্যে একটি মন্তব্য । এটি পাইথনের একটি মন্তব্যও । এবং এটি বিভিন্ন ধরণের কনফিগারেশন ফাইলের একটি মন্তব্য যা সত্যই স্ক্রিপ্ট (মোটেও /etc/fstab) নয়।

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

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

  • আপনি যদি স্ক্রিপ্টটিকে একটি এক্সিকিউটেবল ফাইল হিসাবে আহ্বান করেন, উদাহরণস্বরূপ, রান করে ./script.sh, সিস্টেমটি প্রথম লাইনটি শুরু হয় কিনা তা শুরুর #!পরে শূণ্য বা আরও বেশি স্পেস দিয়ে শুরু করে তা একটি কমান্ড অনুসরণ করে see যদি এটি হয়, এটি স্ক্রিপ্টটির নাম হিসাবে এটিটিকে আর্গুমেন্ট হিসাবে চালায়। এই উদাহরণে এটি চলে /bin/sh script.sh(বা, প্রযুক্তিগতভাবে /bin/sh ./script.sh)।

  • আপনি যদি স্পষ্টভাবে দোভাষীকে কল করে স্ক্রিপ্টটি প্রার্থনা করেন তবে এই #!লাইনটি কখনও পরামর্শ করা হয় না। সুতরাং, আপনি যদি চালনা করেন sh script.shতবে প্রথম লাইনের কোনও প্রভাব নেই। যদি script2.shপ্রথম লাইনটি হয় তবে #!/usr/games/nibblesরানিং sh script2.shস্ক্রিপ্টটি খোলার চেষ্টা করবে না nibbles(তবে ./script2.shহবে)।

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

#!এই উদ্দেশ্যটি সঠিকভাবে পরিবেশন করতে বেছে নেওয়া হয়েছিল কারণ # একটি মন্তব্য শুরু হয় begins #!লাইন সিস্টেম, না দোভাষীর জন্য, এবং এটা অনুবাদক দ্বারা উপেক্ষিত হবে।

বাশ স্ক্রিপ্টগুলির জন্য শেবাং লাইন

আপনি (মূলত) বলেছেন আপনি স্ক্রিপ্টগুলির #!/bin/shজন্য ব্যবহার করেন bash। আপনার কেবল তখনই করা উচিত যদি স্ক্রিপ্টটির bashকোনওরকম এক্সটেনশনের shপ্রয়োজন না হয় - স্ক্রিপ্টটি চালাতে সক্ষম হওয়া দরকার। shসর্বদা একটি syMLink হয় না bash। প্রায়শই সমস্ত রিমোট দূরবর্তী সাম্প্রতিক ডেবিয়ান এবং উবুন্টু সিস্টেমে অন্তর্ভুক্ত , shএটির একটি সিমিলিংক dash

পাইথন স্ক্রিপ্টগুলির জন্য শেবাং লাইন

আপনি এটি দিয়েছিলেন (আপনার প্রশ্নের প্রথম সংস্করণে, সম্পাদনার আগে) যেটি দিয়ে আপনি আপনার পাইথন স্ক্রিপ্টগুলি শুরু করেন #!/bin/sh read by the interpretor। যদি আপনি এটি আক্ষরিক অর্থে বোঝাতে চান তবে আপনার অবশ্যই এটি করা বন্ধ করা উচিত। যদি hello.pyসেই লাইন দিয়ে শুরু হয়, চালানো কার্যকর হয় ./hello.py:

/bin/sh read by the interpretor hello.py

/bin/shread( by the interpretor hello.pyএর আর্গুমেন্ট হিসাবে) নামে একটি স্ক্রিপ্ট কার্যকর করার চেষ্টা readকরবে, (আশাবাদী) খুঁজে পাওয়া যাবে না এবং পাইথন দোভাষী দ্বারা আপনার পাইথন স্ক্রিপ্টটি আর দেখা যাবে না।

আপনি যদি এই ভুলটি করছেন তবে আমার বর্ণনা করা সমস্যা না থাকলে আপনি সম্ভবত আপনার পাইথন স্ক্রিপ্টগুলিকে স্পষ্টভাবে দোভাষী (উদাহরণস্বরূপ python hello.py) নির্দিষ্ট করে অনুরোধ করছেন , যার ফলে প্রথম লাইন উপেক্ষা করা হবে। আপনি যখন অন্যদের কাছে আপনার স্ক্রিপ্টগুলি বিতরণ করেন বা সেগুলি দীর্ঘ সময় ব্যবহার করেন, তখন এটি স্পষ্ট হতে পারে না যে তাদের কাজ করার জন্য এটি প্রয়োজনীয়। এগুলি এখনই ঠিক করা ভাল। বা কমপক্ষে প্রথম লাইনটি পুরোপুরি সরিয়ে ফেলুন, যাতে ./ত্রুটি বার্তাটি চালাতে ব্যর্থ হলে তা বোঝা যায়।

পাইথন স্ক্রিপ্টগুলির জন্য, আপনি যদি জানেন যে পাইথন ইন্টারপ্রেটার কোথায় (বা হতে চলেছে) তবে আপনি #!একইভাবে লাইনটি লিখতে পারেন :

#!/usr/bin/python

অথবা এটি যদি পাইথন 3 স্ক্রিপ্ট হয় তবে আপনার উল্লেখ করা উচিত python3, যেহেতু pythonপ্রায় সর্বদা পাইথন 2 :

#!/usr/bin/python3

তবে, সমস্যাটি হ'ল /bin/shসর্বদা উপস্থিত থাকার কথা, এবং ওএসের সাথে /bin/bashউপস্থিত সিস্টেমগুলিতে প্রায় সর্বদা উপস্থিত থাকে bash, পাইথন বিভিন্ন স্থানে থাকতে পারে।

অতএব, অনেক পাইথন প্রোগ্রামার পরিবর্তে এটি ব্যবহার করে:

#!/usr/bin/env python

(বা #!/usr/bin/env python3পাইথন 3 এর জন্য)

এটি স্ক্রিপ্টটি envসঠিক জায়গায় থাকার পরিবর্তে "সঠিক জায়গায়" pythonথাকার উপর নির্ভর করে । এটি একটি ভাল জিনিস, কারণ:

  • envপ্রায় সর্বদা অবস্থিত /usr/bin
  • সবচেয়ে সিস্টেমে, যেটা python করা উচিত নিজের স্ক্রিপ্টটি চালান এক প্রথম প্রদর্শিত হয় PATH। মেক রান hello.pyদিয়ে শুরু করা , যা (কার্যত) দৌড়ানোর সমতুল্য ।#!/usr/bin/env python./hello.py/usr/bin/env python hello.pypython hello.py

আপনি যে কারণে ব্যবহার করতে পারবেন না তা #!pythonহ'ল:

  • আপনি চান যে দোভাষীকে একটি নিখুঁত পাথ দিয়ে দেওয়া হবে (অর্থাত শুরু করা /)।
  • কলিং প্রক্রিয়া python বর্তমান ডিরেক্টরিতে কার্যকর করা হবে । কমান্ডটিতে স্ল্যাশ না থাকা অবস্থায় পাথ সন্ধান করা নির্দিষ্ট শেল আচরণ।

কখনও কখনও পাইথন বা অন্যান্য স্ক্রিপ্ট যা শেল স্ক্রিপ্ট নয় সেগুলির সাথে শেবাং লাইন থাকবে #!/bin/sh ...যেখানে ...অন্য কোনও কোড রয়েছে। এটি কখনও কখনও সঠিক হয়, কারণ বোর্ন-সামঞ্জস্যপূর্ণ শেলটি ( sh) যুক্ত করার জন্য কয়েকটি উপায় রয়েছে যাতে এটি একটি পাইথন দোভাষীকে ডাকতে পারে। (একটি যুক্তি সম্ভবত ধারণ করবে contain python) তবে, বেশিরভাগ উদ্দেশ্যে, #!/usr/bin/env pythonসহজ, আরও মার্জিত এবং আপনার পছন্দ মতো কাজ করার সম্ভাবনা বেশি।

অন্যান্য ভাষায় শেবাং লাইন

অনেক প্রোগ্রামিং এবং স্ক্রিপ্টিং ভাষা এবং কিছু অন্যান্য ফাইল ফর্ম্যাট #একটি মন্তব্য হিসাবে ব্যবহার করে । তাদের যে কোনওটির জন্য, ভাষার একটি ফাইল একটি প্রোগ্রাম দ্বারা চালিত হতে পারে যা পরে প্রথম লাইনে প্রোগ্রামটি নির্দিষ্ট করে যুক্তি হিসাবে গ্রহণ করে #!

কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজে #সাধারণত কোনও মন্তব্য হয় না, তবে বিশেষ ক্ষেত্রে প্রথম পংক্তিটি যদি এটি শুরু হয় তবে তা অগ্রাহ্য করা হয় #!। এটি #!সিনট্যাক্সের ব্যবহারকে আরও সহজ করে #দেয় যদিও অন্যথায় কোনও লাইন মন্তব্য করে না।

স্ক্রিপ্ট হিসাবে চালিত হয় না এমন ফাইলগুলির জন্য শেবাং লাইন

এটি স্বল্পতর স্বজ্ঞাত হলেও, কোনও ফাইল যার ফাইল ফর্ম্যাটটি প্রথম লাইনের সাথে সামঞ্জস্য করতে পারে #!তারপরে একটি এক্সিকিউটেবলের পুরো পথ অনুসরণ করে একটি শেবাং লাইন থাকতে পারে। আপনি যদি এটি করেন এবং ফাইলটি নির্বাহযোগ্য হিসাবে চিহ্নিত করা হয়, তবে আপনি এটি কোনও প্রোগ্রামের মতো চালাতে পারেন ... যার ফলে এটি নথির মতো খোলা থাকবে।

কিছু অ্যাপ্লিকেশন এই আচরণটি ইচ্ছাকৃতভাবে ব্যবহার করে। উদাহরণস্বরূপ, ভিএমওয়্যারের মধ্যে .vmxফাইলগুলি ভার্চুয়াল মেশিনগুলি সংজ্ঞায়িত করে। আপনি ভার্চুয়াল মেশিনটিকে "চালানো" যেমন স্ক্রিপ্ট হিসাবে করতে পারেন কারণ এই ফাইলগুলি এক্সিকিউটেবল হিসাবে চিহ্নিত রয়েছে এবং একটি শেবাং লাইন রয়েছে যার ফলে এটি একটি ভিএমওয়্যার ইউটিলিটিতে খোলা রয়েছে।

স্ক্রিপস হিসাবে চালিত হয় না তবে যেভাবে স্ক্রিপ্টের মতো কাজ করে এমন ফাইলগুলির জন্য শেবাং লাইনগুলি

rmফাইলগুলি সরায়। এটি কোনও স্ক্রিপ্টিং ভাষা নয়। যাইহোক, যে ফাইলটি শুরু হয় #!/bin/rmএবং এক্সিকিউটেবল হিসাবে চিহ্নিত হয় তা চালানো যেতে পারে এবং আপনি যখন এটি চালাবেন, তখন rmএটি মুছে ফেলা হবে।

এটি প্রায়শই "ফাইলটি নিজেকে মুছে ফেলা হয়" হিসাবে ধারণা করা হয়। তবে ফাইলটি আসলেই চলমান নয়। এটি .vmxফাইলগুলির জন্য উপরে বর্ণিত পরিস্থিতির মতো more

তবুও, #!লাইনটি একটি সাধারণ কমান্ড চালানোর সুবিধার্থে (কমান্ড-লাইন যুক্তি সহ), আপনি কিছু স্ক্রিপ্টিং এইভাবে সম্পাদন করতে পারেন। "স্ক্রিপ্ট" এর সাধারণ উদাহরণ হিসাবে আরও পরিশীলিত হিসাবে #!/bin/rmবিবেচনা করুন:

#!/usr/bin/env tee -a

এটি ইন্টারেক্টিভভাবে ব্যবহারকারীর ইনপুট নেয়, এটি ব্যবহারকারীর লাইনে বাই লাইনে প্রতিধ্বনি দেয় এবং "স্ক্রিপ্ট" ফাইলের শেষে যুক্ত করে।

কাজে লাগল? বেশি না. ধারণামূলক আকর্ষণীয়? পুরোটাই! হ্যাঁ. (কিছুটা।)

ধারণামূলকভাবে অনুরূপ প্রোগ্রামিং / স্ক্রিপ্টিং ধারণা (কেবল মজাদার জন্য)


@ রিনজুইন্ড থেক্স! (বিটিডব্লিউ এই উত্তরটি অন্য কোথাও আসে না, যদি আপনি যা ভাবছেন তা যদি হয় তবে)
এলিয়াহ কাগন

@ রিনজউইন্ড চিন্তা করবেন না, 1 ঘন্টা পরে 8 টি upvotes দিয়ে এটি আরও অনেক কিছু বাড়ানোর সম্ভাবনা রয়েছে :-)
গুটবার্ট

1
যদি এটি সর্বদা উপেক্ষা করা হয় তবে পাইথনসের -xপতাকাটি কী করবে?
জারিত

4
@gerrit ভাল প্রশ্ন। ইন্টারপ্রেটার / সংকলক যে কোনও ভাষায় লাইন নম্বর সহ বার্তাগুলির প্রতিবেদন করে, মন্তব্যগুলির বিষয়বস্তু উপেক্ষা করা হয়, তবে মন্তব্য-রেখাগুলি এখনও গণনা করা হয় । কোডের একটি লাইনের আগে একটি মন্তব্য বা ফাঁকা লাইন যুক্ত করার পরেও সেই লাইন কোডটির লাইন নম্বর বাড়ানো ফলাফল। -x"[গুলি] প্রথম লাইন ... এড়িয়ে যান" 2nd লাইন সংখ্যাযুক্ত পরার 1পরিবর্তে 2, 3 য় লাইন 2পরিবর্তে 3, ইত্যাদি এই জন্যই আপনি যে ফ্ল্যাগ ব্যবহার করা উচিত নয়। ;) -xনন-ইউনিক্স-এর মতো ওএসগুলিতে স্ক্রিপ্ট করার জন্য যা শেবাং-এর মতো সিনট্যাক্স দিয়ে শুরু #হয় না (সুতরাং পাইথন মন্তব্য নয়)।
এলিয়াহ কাগন

4
পার্ল, যদি অনুবাদক সরাসরি (শুরু হয় perl script.plবনাম ./script.pl) তাহলে অনুবাদক হবে যেমন পতাকা বিশ্লেষণ করতে কুঁড়েঘর লাইন পড়া -w। যদিও এই বৈশিষ্ট্যটির উপর নির্ভর করার প্রস্তাব দেওয়া হয় না।
অরেঞ্জডোগ

7

একটি শেবাং হ'ল অক্ষরের সংখ্যা চিহ্ন এবং বিস্মৃত চিহ্ন চিহ্ন (যেমন "# #") সমন্বিত অক্ষর ক্রম যখন কোনও স্ক্রিপ্টের প্রাথমিক লাইনে প্রাথমিক দুটি অক্ষর হিসাবে দেখা দেয়।

* নিক্স অপারেটিং সিস্টেমের অধীনে, যখন শেবাং দিয়ে শুরু হওয়া কোনও স্ক্রিপ্ট চালানো হয়, প্রোগ্রাম লোডার স্ক্রিপ্টের বাকী প্রাথমিক রেখার বাকী অংশটিকে দোভাষী নির্দেশ হিসাবে পার্স করে; স্ক্রিপ্টটি চালানোর চেষ্টা করার সময় প্রথমে ব্যবহৃত পথটি আর্গুমেন্ট হিসাবে পাঠিয়ে পরিবর্তে নির্দিষ্ট দোভাষী সংকেত চালিত হয়। উদাহরণস্বরূপ, যদি কোনও স্ক্রিপ্টের নাম "পথ / থেকে / আপনার স্ক্রিপ্ট" দিয়ে দেওয়া হয়, এবং এটি নিম্নলিখিত লাইন দিয়ে শুরু হয়:

#!/bin/sh

তারপরে প্রোগ্রাম লোডারকে প্রোগ্রামটি "/ bin / sh" পরিবর্তে চালানোর নির্দেশ দেওয়া হয় যেমন বোর্ন শেল বা একটি সামঞ্জস্যপূর্ণ শেল, "আস্তে আস্তে / আপনার স্ক্রিপ্ট "টিকে প্রথম আর্গুমেন্ট হিসাবে পাস করে।

তদনুসারে, এটিকে একটি স্ক্রিপ্টের নাম দেওয়া হয়েছে "পাথ / টু / পাইথন-স্ক্রিপ্ট" পাথ দিয়ে এবং এটি নিম্নলিখিত লাইন দিয়ে শুরু হয়:

#!/bin/python

তারপরে লোড হওয়া প্রোগ্রামটিকে "/ বিন / পাইথন" পরিবর্তে প্রোগ্রামটি চালানোর নির্দেশ দেওয়া হয়, উদাহরণস্বরূপ পাইথন দোভাষী, প্রথম যুক্তি হিসাবে "পাথ / টু / পাইথন-স্ক্রিপ্ট" পাস করে।

সংক্ষেপে "#" বর্ণের ক্রম "#" করার সময় একটি লাইন মন্তব্য করবে! কোনও স্ক্রিপ্টের প্রাথমিক লাইনে প্রথম দুটি অক্ষর হিসাবে উপস্থিত হওয়ার অর্থ উপরে বর্ণিত অর্থ।

বিশদর জন্য দেখুন কিছু স্ক্রিপ্ট কেন # দিয়ে শুরু হয়! ...?

উত্স: এই উত্তরটি কিছু বিভাগ থেকে (সামান্য সংশোধন সহ) উদ্ভূত হয় কুঁড়েঘর (ইউনিক্স) উপর ইংরেজি উইকিপিডিয়া (দ্বারা উইকিপিডিয়া অবদানকারী )। এই নিবন্ধটি সিসি-বাই-এসএ 3.0 এর আওতায় লাইসেন্স করা হয়েছে, এটি এও-তে ব্যবহারকারীর সামগ্রীর মতো, সুতরাং এই বিকাশটি অ্যাট্রিবিউশন সহ অনুমোদিত।


4

#!এটি shebangযখন স্ক্রিপ্টের প্রাথমিক লাইনে প্রাথমিক দুটি অক্ষর হিসাবে দেখা দেয় তখনই ডাকা হয় । এটি সম্পাদনার জন্য দোভাষীকে নির্দেশ করতে স্ক্রিপ্টগুলিতে ব্যবহৃত হয়। shebangঅপারেটিং সিস্টেম (কার্নেল), শেল জন্য না থাকে; সুতরাং এটি কোনও মন্তব্য হিসাবে ব্যাখ্যা করা হবে না।

সৌজন্যে: http://en.wikedia.org/wiki/Shebang_%28Unix%29

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

বিস্তারিত তথ্য: http://wiki.bash-hackers.org/scriptting/basics#the_shebang


0

না, এটি কেবল execলিনাক্স কার্নেলের সিস্টেম কল দ্বারা ব্যবহৃত হয় এবং দোভাষী দ্বারা একটি মন্তব্য হিসাবে বিবেচিত হয়

আপনি যখন ব্যাশ করবেন:

./something

লিনাক্সে, execএটি পথের সাথে সিস্টেম কলকে কল করে ./something

কার্নেলের এই লাইনটি এই ফাইলটিতে পাঠানো হবে exec: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25

if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))

এটি ফাইলের প্রথম বাইটগুলি পড়ে এবং তাদের সাথে তুলনা করে #!

যদি তুলনাটি সত্য হয়, তবে বাকী রেখাটি লিনাক্স কার্নেল দ্বারা বিশ্লেষণ করা হয়েছে, যা প্রথম আর্গুমেন্ট হিসাবে execপাথ /usr/bin/env pythonএবং বর্তমান ফাইলের সাথে আরেকটি কল করে :

/usr/bin/env python /path/to/script.py

এবং এটি কোনও স্ক্রিপ্টিং ভাষার জন্য কাজ করে যা #মন্তব্য চরিত্র হিসাবে ব্যবহার করে ।

এবং হ্যাঁ, আপনি এটি দিয়ে একটি অসীম লুপ তৈরি করতে পারেন:

printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a

বাশ ত্রুটিটি সনাক্ত করে:

-bash: /a: /a: bad interpreter: Too many levels of symbolic links

#! মানুষের পাঠযোগ্য হতে পারে, তবে এটির প্রয়োজন নেই।

যদি ফাইলটি বিভিন্ন বাইট দিয়ে শুরু হয়, তবে execসিস্টেম কলটি একটি ভিন্ন হ্যান্ডলার ব্যবহার করবে। অন্যান্য গুরুত্বপূর্ণ বিল্ট-ইন হ্যান্ডলারটি ইএলএফ এক্সিকিউটেবল ফাইলগুলির জন্য: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305 যা বাইটগুলি পরীক্ষা করে 7f 45 4c 46(যা মানুষের মতো হয়ে ওঠে জন্য পঠনযোগ্য .ELF)। আসুন নিশ্চিত করুন যে 4 টি প্রথম বাইট পড়ে /bin/ls, যা একটি ELF এক্সিকিউটেবল:

head -c 4 "$(which ls)" | hd 

আউটপুট:

00000000  7f 45 4c 46                                       |.ELF|
00000004                                                                 

সুতরাং যখন কার্নেল সেগুলি বাইটগুলি দেখে, এটি ELF ফাইলটি নেয়, এটিকে সঠিকভাবে মেমরিতে রাখে এবং এটি দিয়ে একটি নতুন প্রক্রিয়া শুরু করে। আরও দেখুন: https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under-linux/31394861#31394861

অবশেষে, আপনি binfmt_miscযান্ত্রিকতার সাথে আপনার নিজের শেবাং হ্যান্ডলার যুক্ত করতে পারেন । উদাহরণস্বরূপ, আপনি ফাইলগুলির জন্য.jar একটি কাস্টম হ্যান্ডলার যুক্ত করতে পারেন । এই প্রক্রিয়াটি এমনকি ফাইল এক্সটেনশনের মাধ্যমে হ্যান্ডলারদের সমর্থন করে। আর একটি অ্যাপ্লিকেশন হ'ল কিউইএমইউ সহ স্বতন্ত্রভাবে একটি ভিন্ন স্থাপত্যের এক্সিকিউটেবলগুলি চালানো

আমি মনে করি না পসিআইএক্স তবে শিবাংগুলি নির্দিষ্ট করে: https://unix.stackexchange.com/a/346214/32558 , যদিও এটি যৌক্তিক বিভাগে উল্লেখ করা হয়েছে, এবং ফর্মটিতে "যদি এক্সিকিউটেবল স্ক্রিপ্টগুলি সিস্টেম দ্বারা সমর্থিত হয় তবে কিছু হতে পারে" ঘটতে "।

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