Как создаются системные команды, такие как ls?

19

У меня есть некоторые сомнения относительно * nix.

  • Я не знаю, какой тип исполняемого файла ls, будь то .sh или .ksh или любой другой тип исполняемого файла системы, если это так, что это?

  • Когда я попытался увидеть, как выглядит исходный код lsкоманды, он показывает что-то нечитаемое, какой метод * nix использует для создания этих типов нечитаемых файлов, и могу ли я сделать свои файлы похожими на эти файлы (например, ls- нечитаемые).

Jeyanthinath
источник
4
Я думаю, что это больше связано с URL выше, чем это дублирование.
SLM

Ответы:

31

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

тип

Вы используете, typeчтобы определить местоположение исполняемого файла на диске следующим образом:

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

Итак, теперь я знаю, что lsнаходится здесь, в моей системе в 2 местах: /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 - это формат файла , это вывод такого компилятора, как gcc, который используется для компиляции таких программ на C / C ++, как ls.

В вычислениях Исполняемый и связываемый формат (ELF, ранее называвшийся Расширяемым форматом связывания) является общим стандартным форматом файлов для исполняемых файлов, объектного кода, общих библиотек и дампов ядра.

Как правило, оно имеет одно из следующих расширений в имени файла: none, .o, .so, .elf, .prx, .puff, .bin

SLM
источник
@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, ... которые традиционно не создают автономный исполняемый файл бинарный файл). Затем научитесь использовать этот язык и как его скомпилировать.
Орион