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


158

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

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

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


1
Посетите, например: ftp.gnu.org/pub/gnu/coreutils Вы можете просмотреть код в Интернете. Откройте один из архивов и проверьте папку src.
Хейл

Привет, я тоже нахожу утилиты, это util-linux. Вы можете найти его здесь
Активист

1
lsэто не часть Linux, это часть Gnu. Gnu работает на Linux и других ядрах.
Ctrl-Alt-Delor

3
Я считаю, что интерфейс github проще для чтения кода, github.com/coreutils/coreutils/blob/master/src/ls.c
zyxue

Ответы:


168

Все эти основные команды являются частью 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 строки кода для команды «достаточно просто», так как ls... вы все еще заинтересованы в ее чтении ?? Удачи! : D


2
О, МОЙ БОГ! Я думал, что это было немного легче ... Ну, путь длиннее и сложнее, чем ожидалось :-)
Луиджи Тибурзи

21
Попробуйте источник дляcat . Всего 767 строк.
Дрю Ноакс

3
Only 4984 code lines ...- Кажется, за 4 года и 3 месяца lsстало еще на 57 строк сложнее.
sherrellbc

3
Я помню, как однажды я попытался понять, почему wcэто намного быстрее, чем эквивалентная Java-программа. Итак, я посмотрел на код ... OMG, он оптимизирован для чтения с диска, буферизации входных данных и т. Д. Или чего-то еще :)
yǝsʞǝla

@ yǝsʞǝlA Я не очень хорошо знаю C; как вы говорите, для чего он оптимизирует? Можете привести пример?
Абдул

127

Прямые ссылки на источники для некоторых популярных программ в 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 строка)

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


4
Спасибо за перечисление с количеством строк. :)
Гаутам Гопалакришнан

У тебя есть su?
Аарон Исав,

@Drew, ты хоть представляешь, есть ли команды оболочки, написанные на самом деле в сценарии оболочки?
Рафаэль

6

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

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

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


или просматривать репо онлайн ... например. git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c
бесполезно

5

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

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

Они более четкие, умные, простые и бесполезные, например, ls.cимеют всего 369 LOC

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


1

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

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


1

Вы можете получить его на GitHub с помощью команды

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

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

Вам нужно установить git .

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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.