Как мне прочитать исходный код команд оболочки?

Я хотел бы прочитать фактический исходный код, с которым написаны команды Linux. Я приобрел некоторый опыт их использования, и теперь я думаю, что пришло время взаимодействовать с моей машиной на более глубоком уровне.

Я нашел здесь несколько команд http://directory.fsf.org/wiki/GNU. К сожалению, мне не удалось найти базовые команды, такие как 'ls', которые, как мне кажется, достаточно просты для начала.

Как именно мне прочитать исходный код простых команд оболочки, таких как ls? Я работаю на Ubuntu 12.04


person Luigi Tiburzi    schedule 17.07.2012    source источник
comment
Посетите, например,: ftp.gnu.org/pub/gnu/coreutils. Вы можете просмотрите код в Интернете. Откройте один из архивов и проверьте папку src.   -  person Haile    schedule 17.07.2012
comment
Привет, я тоже нашел утилиты, это util-linux. Вы можете найти его здесь   -  person acgtyrant    schedule 16.12.2014
comment
ls не является частью Linux, это часть Gnu. Gnu работает на Linux и других ядрах.   -  person ctrl-alt-delor    schedule 31.08.2017
comment
Я считаю, что интерфейс github проще для чтения кода, github.com/coreutils/coreutils /blob/master/src/ls.c   -  person zyxue    schedule 15.06.2018


Ответы (8)


Все эти базовые команды являются частью пакета coreutils.

Вы можете найти всю необходимую информацию здесь:

http://www.gnu.org/software/coreutils/

Если вы хотите загрузить последний исходный код, вам следует использовать git:

git clone git://git.sv.gnu.org/coreutils

Чтобы установить git на свой компьютер с Ubuntu, вы должны использовать apt-get (git не входит в стандартную установку Ubuntu):

sudo apt-get install git

По правде говоря, здесь вы можете найти конкретный источник команды ls:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

Всего 4984 строки кода для команды «достаточно просто», как _5 _... вы все еще заинтересованы в ее прочтении ?? Удачи! : D

person Zagorax    schedule 17.07.2012
comment
МОЙ БОГ! Я думал, что это немного проще ... Путь длиннее и сложнее, чем ожидалось :-) - person Luigi Tiburzi; 18.07.2012
comment
Попробуйте исходный код для cat. Всего 767 строк. - person Drew Noakes; 24.09.2014
comment
Only 4984 code lines ... - Кажется, за 4 года и 3 месяца ls стал еще на 57 строк сложнее. - person sherrellbc; 14.10.2016
comment
Помню, однажды я попытался понять, почему wc намного быстрее, чем эквивалентная программа на Java. Итак, я посмотрел на код ... Боже, он оптимизирован для чтения с диска, буферизации входных данных и т. Д. Или чего-то еще :) - person yǝsʞǝla; 02.12.2016
comment
@ yǝsʞǝlA Я не владею C; как узнать, для чего он оптимизируется? Вы можете привести мне пример? - person Abdul; 30.03.2017
comment
Да, мне определенно интересно прочитать все ~ 5000 строк кода, было бы хорошо, если бы их было 10000. Мои результаты получения размеров файлов в моей программе иногда отличаются от того, что показывает ls, и ls верен. Я считаю, что происходит кеширование, которое не позволяет моей программе видеть последний размер файла. Если ls верен, мне нужно только выяснить, что он делает, и сделать то же самое самому. Вот почему это открытый исходный код. Если бы никто не хотел его читать, то открытый исходный код назывался бы закрытым ;-) Спасибо за ссылку прямо на ls. Это как раз то, что мне нужно +1 - person Michael Krebs; 22.05.2021

Прямые ссылки на исходный код некоторых популярных программ в coreutils:

  • cat (767 строк)
  • chmod (570 строк)
  • cp (2912 строк)
  • cut (831 строка)
  • date (570 строк)
  • df (1718 строк)
  • du (1112 строк)
  • echo (272 строки)
  • head (1070 строк)
  • hostname (116 строк)
  • kill (312 строк)
  • ln (651 строка)
  • ls (4954 строки)
  • md5sum (878 строк)
  • mkdir (306 строк)
  • mv (512 строк)
  • nice (220 строк)
  • pwd (394 строки)
  • rm (356 строк)
  • rmdir (252 строки)
  • shred (1325 строк)
  • tail (2301 строка)
  • tee (220 строк)
  • touch (437 строк)
  • wc (801 строка)
  • whoami (91 строка)

Полный список здесь.

person Drew Noakes    schedule 24.09.2014
comment
Спасибо за листинг с количеством строк. :) - person Gowtham Gopalakrishnan; 23.08.2016
comment
У вас есть su? - person Aaron Esau; 09.02.2018
comment
@Drew, ты хоть представляешь, есть ли на самом деле команды оболочки, написанные в сценарии оболочки? - person Rafael; 17.09.2019

ls является частью coreutils. Вы можете получить это с помощью git:

git clone git://git.sv.gnu.org/coreutils

Вы найдете coreutils в списке с другими пакетами (прокрутите вниз) на этой странице.

person Denys Séguret    schedule 17.07.2012
comment
или просмотрите репо в Интернете ... например. git.savannah.gnu.org/cgit/coreutils. git / tree / src / ls.c - person Useless; 17.07.2012

На самом деле более разумные источники предоставляет http://suckless.org, посмотрите их sbase репозиторий:

git clone git://git.suckless.org/sbase

Они яснее, умнее, проще и бессмысленнее, например, ls.c имеет всего 369 LOC.

После этого будет легче понять более сложный код GNU.

person hurufu    schedule 13.07.2015

CoreUtils, упомянутый в других сообщениях, НЕ показывает реальную реализацию большинства функций, которые, я думаю, вы ищете. В большинстве случаев он предоставляет интерфейс для фактических функций, извлекающих данные, которые можно найти здесь:

Он построен на Gnulib с фактическим исходным кодом в подкаталог lib

person slashmais    schedule 18.08.2016
comment
Это официальный ресурс или сторонний репозиторий? - person Martin; 09.09.2020
comment
@Merlin: это официально - person slashmais; 11.09.2020

Вы можете получить его на github, используя команду

git clone https://github.com/coreutils/coreutils.git

Вы можете найти все исходные коды в папке src.

У вас должен быть установлен git.

С 2012 года все изменилось, ls исходный код теперь насчитывает 5309 строк

person RMPR    schedule 04.02.2019

Дистрибутивы BSD на самом деле являются хорошим способом чтения исходного кода с использованием их репозиториев, поскольку все они упакованы в одном месте, и вы можете увидеть, как исторически исходный код развивался или изменялся. Так почему бы не использовать репозитории BSD, такие как NetBSD или OpenBSD для этой задачи.

person mohamad.wael    schedule 08.06.2021

    cd ~ && apt-get source coreutils && ls -d coreutils*     

Вы должны иметь возможность использовать такую ​​команду в ubuntu для сбора исходного кода для пакета, вы можете опустить sudo, предполагая, что вы загружаете в принадлежащее вам место.

person Aaron Peter Samuel    schedule 20.02.2013