Як створюються системні команди на зразок ls?


19

У мене є деякі сумніви щодо * nix.

  • Я не знаю, який тип виконавчого файлу - lsце .sh чи .ksh чи будь-який інший тип системи, що виконується, якщо він є, що це?

  • коли я намагався побачити, як виглядає вихідний код lsкоманди, він показує щось нечитабельне, який метод * nix використовує для створення цих типів нечитабельних файлів і чи можу я зробити свої файли подібними до цих файлів (наприклад, ls- нечитабельних).



4
Я думаю, що це більше пов'язано з URL-адресою вище, ніж з копією.
slm

Відповіді:


31

Ви можете визначити природу виконуваного файлу в Unix, використовуючи fileкоманду та typeкоманду.

тип

Ви використовуєте typeдля визначення місця виконання файлу на диску так:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

Тож тепер я знаю, що lsзнаходиться тут у моїй системі у двох місцях: /usr/bin/ls& /bin/ls. Переглядаючи ці виконувані файли, я бачу, що вони однакові:

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

ПРИМІТКА. Ви можете підтвердити, що вони однакові за своїми розмірами, використовуючи cmpабо diff.

з розл
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
з cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Використання файлу

Якщо я запитую їх за допомогою fileкоманди:

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

Отже, це були б фактичні фізичні програми, складені з C / C ++. Якщо вони були скриптами оболонки, вони зазвичай подавались так file:

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

Що ELF?

ELF - це формат файлу , це вихід такого компілятора, як gcc, який використовується для компіляції програм C / C ++, таких як ls.

У обчислювальній системі виконуваний та пов'язаний формат (ELF, який раніше називався "Розширюваний формат зв'язування") - це загальний стандартний формат файлів для виконуваних файлів, об'єктного коду, спільних бібліотек та основних скидів.

Зазвичай він матиме одне з наступних розширень у назві файлу: none, .o, .so, .elf, .prx, .puff, .bin


@lgeorget - Дивіться цю запитання щодо порад щодо використання типу порівняно з яким: unix.stackexchange.com/questions/85249/… . Як правило, найкраще користуватися typeбудь-де, де ви спокусилися використати whichабо whereis.
slm

3
Крім того, для інструментів GNU вихідний код є у вільному доступі, розпочніть пошук за адресою gnu.org/software
glenn jackman

Для ідентичного тесту ви дійсно повинні використовувати щось на кшталт md5sumабо sha1sum, а не просто перевіряти розміри та час файлів.
Боб

@Bob - Ідентичні файли не мали нічого спільного з Q, тому я показав простий метод. Для порівняння файлів я використав би більш доречний інструмент, такий як cmp, який призначений для порівняння бінарних файлів. Також дивлячись на те, який пакунок вони надають, вказується, чи вони пов'язані чи ні. Вони обидві частини, coreutils-8.21-13.fc19.x86_64і я просто знаю, що вони однакові за 20 років роботи з випусками Red Hat.
slm

@Bob - перегляньте оновлення для прикладів порівняння файлів.
slm

9

Це двійковий виконуваний файл (компілюється в машинний код, як і більшість систем). Сценарії оболонки більше схожі на "клей", щоб з'єднати деталі разом, щоб швидко та гнучко створювати рішення з існуючих матеріалів. Це сила * nix.

Вам потрібен вихідний код (c, іноді c ++ - це найпоширеніші мови на * nix), а не лише компільований виконуваний файл. Оскільки він є відкритим кодом, ви можете отримати код для всього із онлайн-сховищ (основні утиліти, як правило, з проекту gnu). Однак це трохи складно, якщо ви не знаєте, як використовувати git або інші системи відстеження версій.

Ось файл ls.c, якщо він допомагає: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


О, і щоб уточнити питання, як створити бінарні програми: вибирайте серед незліченних мов програмування (за винятком пари, що інтерпретується або напівінтерпретується, наприклад, python, java, javascript, ... які традиційно не створюють автономний виконуваний файл двійковий файл). Потім навчіться використовувати цю мову та як її складати.
Оріон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.