স্ক্রিপ্ট ফাইল এবং বাইনারি ফাইলের মধ্যে পার্থক্য কীভাবে খুঁজে পাবেন?


11
$ ls -l /usr/bin
total 200732

-rwxr-xr-x 1 root   root     156344 Oct  4  2013 adb
-rwxr-xr-x 1 root   root       6123 Oct  8  2013 add-apt-repository
 list goes long ---------

উপরে adbএকটি বাইনারি ফাইল এবং add-apt-repositoryএকটি স্ক্রিপ্ট file.I কমান্ড লাইন মাধ্যমে nautilus.But মাধ্যমে ফাইল দেখার দ্বারা, আমি খুঁজে পাইনি কোন differences.I বা ভবিষ্যদ্বাণী করা করার জন্য একটি ফাইল বাইনারি ফাইল কিনা সক্ষম নই এই তথ্য পাবেন একটি স্ক্রিপ্ট ফাইল।

সুতরাং আমি কীভাবে কমান্ড-লাইনের মাধ্যমে স্ক্রিপ্ট এবং বাইনারি ফাইলগুলির মধ্যে পার্থক্য করব?

উত্তর:


16

শুধু ব্যবহার করুন file:

$ file /usr/bin/add-apt-repository
/usr/bin/add-apt-repository: Python script, ASCII text executable
$ file /usr/bin/ab
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

হিসাবে ব্যাখ্যা করা হয়েছে man file:

NAME
   file — determine file type

DESCRIPTION
 This manual page documents version 5.14 of the file command.

 file tests each argument in an attempt to classify it.  There are three
 sets of tests, performed in this order: filesystem tests, magic tests,
 and language tests.  The first test that succeeds causes the file type to
 be printed.

 The type printed will usually contain one of the words text (the file
 contains only printing characters and a few common control characters and
 is probably safe to read on an ASCII terminal), executable (the file con‐
 tains the result of compiling a program in a form understandable to some
 UNIX kernel or another), or data meaning anything else (data is usually
 “binary” or non-printable).  Exceptions are well-known file formats (core
 files, tar archives) that are known to contain binary data.  When adding
 local definitions to /etc/magic, make sure to preserve these keywords.
 Users depend on knowing that all the readable files in a directory have
 the word “text” printed.  Don't do as Berkeley did and change “shell
 commands text” to “shell script”.

এটিকে চালানোর জন্য আপনি একটি কৌশল ব্যবহার করতে পারেন সরাসরি এক্সিকিউটেবলের নামে $PATH:

$ file $(type -p add-apt-repository | awk '{print $NF}')
/usr/local/bin/add-apt-repository: Python script, ASCII text executable
$ file $(type -p ab | awk '{print $NF}')
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

আপনার ডিরেক্টরিতে পাওয়া যেতে পারে এমন সমস্ত এক্সিকিউটেবলের ফাইল ধরণের সন্ধান করতে $PATH, আপনি এটি করতে পারেন:

find $(printf "$PATH" | sed 's/:/ /g') -type f | xargs file

এবং fileএকটি নির্দিষ্ট ডিরেক্টরিতে ( /usr/binযেমন, উদাহরণস্বরূপ) সমস্ত ফাইল চালানোর জন্য ঠিক করুন

file /usr/bin/*

তবে আমাদের fileপ্রতিটি ফাইলের জন্য দৌড়াতে হবে এটি কোন ধরণের ফাইল তা দেখতে? সমস্ত ফাইলের জন্য কোনও সহজ পদ্ধতি আছে?
অবিনাশ রাজ

3
কোনও প্রদত্ত ডিরেক্টরিতে সমস্ত ফাইলের জন্য অবিশ্বশরাজ? শুধু কর file /usr/bin/*। ঠিক অন্য কোনও কমান্ডের মতোই।
টেরডন

5

আসলে, এইগুলির মধ্যে পার্থক্যগুলি এত বড় নয়।

একটি সাধারণ ইউনিক্স বা লিনাক্স সিস্টেমে পাঁচটির চেয়ে কম বাস্তব নির্বাহযোগ্য থাকে। উবুন্টুতে, এগুলি /lib/ld-linux.so.2এবং /sbin/ldconfig

এক্সিকিউটেবল হিসাবে চিহ্নিত অন্য যে কোনও কিছুই দোভাষী দ্বারা চালিত হয় , যার জন্য দুটি ফর্ম্যাট সমর্থিত:

  1. শুরু হওয়া ফাইলগুলির #!মধ্যে এই এবং প্রথম নতুনরেখানের চরিত্রের মধ্যে ইন্টারপ্রিটারের নাম থাকবে (এটি ঠিক আছে, "স্ক্রিপ্টগুলি" টেক্সট ফাইল হওয়ার দরকার নেই)।
  2. ইএলএফ ফাইলগুলির একটি PT_INTERPবিভাগ রয়েছে যা দোভাষীকে (সাধারণত /lib/ld-linux.so.2) পথ দেয় ।

যখন এই জাতীয় ফাইলটি কার্যকর করা হয় তখন কার্নেল দোভাষীটির নাম খুঁজে পায় এবং পরিবর্তে এটি কল করে। এটি পুনরাবৃত্তভাবে ঘটতে পারে, উদাহরণস্বরূপ আপনি যখন শেল স্ক্রিপ্টটি চালাবেন:

  1. কার্নেল স্ক্রিপ্টটি খুলবে, #! /bin/shশুরুতে এটি সন্ধান করবে ।
  2. কার্নেলটি খোলে /bin/sh, PT_INTERPসেগমেন্টটি নির্দেশ করছে /lib/ld-linux.so.2
  3. কার্নেলটি খোলে /lib/ld-linux.so.2, আবিষ্কার হয় যে এটির কোনও PT_INTERPবিভাগ নেই, এটি পাঠ্য অংশটি লোড করে এবং এটি শুরু করে, /bin/shআপনার স্ক্রিপ্ট আহ্বানের জন্য খোলা হ্যান্ডেলটি এবং কমান্ড লাইনটি প্রেরণ করে।
  4. ld-linux.so.2কোড বিভাগগুলি লোড করে /bin/sh, ভাগ করা লাইব্রেরি রেফারেন্সগুলি সমাধান করে এবং এর মূল কাজটি শুরু করে
  5. /bin/sh তারপরে স্ক্রিপ্ট ফাইলটি পুনরায় খোলে এবং এটি লাইন লাইন ব্যাখ্যা করতে শুরু করে।

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


ভাল তথ্য, কিন্তু আসলে এই প্রশ্নের উত্তর নয়।
অরেঞ্জডগ


1

ফাইল কমান্ড দুর্দান্ত, তবে আরও পেশাদার বিশ্লেষণকারী সরঞ্জামের জন্য, আমি চাই আপনি ট্রাইড প্যাকেজটি চেষ্টা করুন যা একটি ফাইল সনাক্তকারী সরঞ্জাম।

ট্রাইড হ'ল একটি ইউটিলিটি যা তাদের বাইনারি স্বাক্ষরগুলি থেকে ফাইলের প্রকারগুলি সনাক্ত করতে এবং এটি ব্যবহার করা সহজ।

আরও তথ্য এবং প্যাকেজটির জন্য কেবল এখানে যান: সাইট

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