Як я дивлюся на вихідний код команди? [зачинено]


13

Я раптом вирішив, що хотів би переглянути вихідний код для 'echo'

$ 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

змушує мене вірити, що це складена програма С

Тепер я застряг.

Як я:

  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ō Katsura

1
тип -я відлуння; ехо - вбудована оболонка; echo є / usr / bin / echo; Тому я думаю, що я хочу побачити / usr / bin / echo, а не читати весь bash!
Джон Лоуренс Аспден

2
Спробуйте /usr/bin/echo --versionдалі.
Satō Katsura


2
... І це зовсім інше питання, ніж те, що ви задали.
Satō Katsura

Відповіді:


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, що створить обороти, які ви можете безпосередньо встановити у вашій системі.

Якщо вам потрібно внести деякі зміни в пакети Fedora, набагато простіше піти шляхом обслуговування: встановіть fedpkg, клонуйте сховище, виконайте модифікації (використовуючи патчі) та відновіть пакет із модифікаціями:

$ sudo dnf install fedpkg
$ fedpkg clone coreutils
$ cd coreutils
$ # do the modifications
$ fedpkg local

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:. На домашній сторінці зазвичай можна знайти доступ для читання до їх вихідного коду та повну історію версій.
Уве Гюдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.