Как мне посмотреть исходный код команды? [закрыто]

13

Я вдруг решил, что хотел бы взглянуть на исходный код «эхо»

$ which echo
/usr/bin/echo

так

$ ls -al /usr/bin/echo
-rwxr-xr-x. 1 root root 32536 Oct 31  2016 /usr/bin/echo

так

$strings /usr/bin/echo

заставляет меня поверить, что это скомпилированная C-программа

Теперь я застрял.

Как я:

  1. Узнайте, в какой упаковке он находится

  2. Получить источник

  3. Восстановите это

  4. Проверь это

  5. Установите новую версию для всей системы

(Я знаю, что 5 не очень хорошая идея, мне просто любопытно ...)

В настоящее время я нахожусь на Fedora, но меня также интересовали бы ответы для Debian

Ссылка на соответствующий учебник будет хорошим ответом.


Редактировать:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

Так что я думаю, что это тот, который /usr/bin/echoя хотел бы увидеть, а не пытаться читать целиком bash.

Джон Лоуренс Аспден
источник
2
Попробуй type -a echoпервым.
Satō
1
тип-эхо; echo - встроенная оболочка; echo это / usr / bin / echo; Так что я думаю, что хочу увидеть / usr / bin / echo, а не читать все bash!
Джон Лоуренс
2
Попробуй /usr/bin/echo --versionдальше.
Satō
4
наслаждайтесь: github.com/coreutils/coreutils/blob/master/src/echo.c
Джули Пеллетье
2
... И это совсем другой вопрос, чем тот, который вы задали.
Satō

Ответы:

13

RHEL / Fedora

Бегать rpm -qf /path

$ rpm -qf /usr/bin/echo
coreutils-8.25-17.fc25.x86_64

Загрузите исходный пакет (используйте yumдля RHEL):

$ dnf download coreutils --enablerepo="*source"

Извлеките источники, исправления из пакета SRPM, загруженного в текущий каталог, перейдите в каталог, в который извлекаются файлы, и найдите свой файл:

$ rpmbuild -rp coreutils-8.25-17.fc25.src.rpm
$ cd ~/rpmbuild/BUILD/coreutils-8.25/
$ find src -iname '*echo*'
src/echo.c

Вы можете пересобрать пакет с помощью rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, который произведет RPM, которые вы можете установить непосредственно в вашей системе.

Если вам нужно внести некоторые изменения в пакеты fedora, гораздо проще пойти по пути сопровождающего: установить fedpkg, клонировать репозиторий, внести изменения (с помощью исправлений) и пересобрать пакет с изменениями:

$ sudo dnf install fedpkg
$ fedpkg clone coreutils
$ cd coreutils
$ # do the modifications
$ fedpkg local
Jakuje
источник
15

Debian (и производные)

Запустите, dpkg -S /pathчтобы увидеть, какой пакет /pathпринадлежит:

$ dpkg -S /bin/echo
coreutils: /bin/echo

Получить источник (я на Ubuntu):

$ apt-get source coreutils
Reading package lists... Done
Need to get 5,755 kB of source archives.
Get:1 http://jp.archive.ubuntu.com/ubuntu xenial/main coreutils 8.25-2ubuntu2 (dsc) [2,071 B]
Get:2 http://jp.archive.ubuntu.com/ubuntu xenial/main coreutils 8.25-2ubuntu2 (tar) [5,725 kB]
Get:3 http://jp.archive.ubuntu.com/ubuntu xenial/main coreutils 8.25-2ubuntu2 (diff) [28.0 kB]
Fetched 5,755 kB in 3s (1,758 kB/s)
gpgv: Signature made 2016年02月18日 22時28分36秒 JST using RSA key ID 73F3F233
gpgv: Can't check signature: public key not found
dpkg-source: warning: failed to verify signature on ./coreutils_8.25-2ubuntu2.dsc
dpkg-source: info: extracting coreutils in coreutils-8.25
dpkg-source: info: unpacking coreutils_8.25.orig.tar.xz
dpkg-source: info: unpacking coreutils_8.25-2ubuntu2.debian.tar.xz
dpkg-source: info: applying no_ls_quoting.patch
dpkg-source: info: applying 61_whoips.patch
dpkg-source: info: applying 63_dd-appenderrors.patch
dpkg-source: info: applying 72_id_checkngroups.patch
dpkg-source: info: applying 80_fedora_sysinfo.patch
dpkg-source: info: applying 85_timer_settime.patch
dpkg-source: info: applying 99_kfbsd_fstat_patch.patch
dpkg-source: info: applying 99_hppa_longlong.patch
dpkg-source: info: applying 99_float_endian_detection.patch

Найдите файл:

$ cd coreutils-8.5 
$ find src -iname '*echo*'
src/echo.c

Остальное зависит от тебя.

Мур
источник
Огромное спасибо. Я думаю, что я должен заставить RHEL / Fedora ответить на принятый, так как я спрашивал об этом. Но в основном я использую Debian, так что ваш, вероятно, предпочтительнее с моей точки зрения! Позор, я не могу принять оба.
Джон Лоуренс
Ответ правильный, но, кроме того, часто хочется взглянуть на вышестоящий источник (например, есть ли у них новые изменения, которых еще нет в дистрибутиве). Для этого позвоните dpkg -s coreutils(или любой интересующий вас пакет) и поищите Homepage:. На главной странице вы можете найти доступ для чтения к их исходному коду и полной истории версий.
Уве Гойдер