¿Cómo miro el código fuente de un comando? [cerrado]

13

De repente decidí que me gustaría mirar el código fuente de 'echo'

$ which echo
/usr/bin/echo

entonces

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

entonces

$strings /usr/bin/echo

me lleva a creer que es un programa C compilado

Ahora estoy atascado.

Cómo puedo:

  1. Descubre en qué paquete está

  2. Obtén la fuente

  3. Reconstruirlo

  4. Pruébalo

  5. Instale la nueva versión en todo el sistema

(Sé que 5 no es una buena idea, solo tengo curiosidad ...)

Actualmente estoy en Fedora, pero también me interesarían las respuestas para Debian

Un enlace a un tutorial relevante sería una buena respuesta.


Editar:

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

Así que supongo que es el /usr/bin/echoque me gustaría ver en lugar de tratar de leer todo bash.

John Lawrence Aspden
fuente
2
Intenta type -a echoprimero.
Satō Katsura
1
escriba -a echo; echo es una concha incorporada; echo es / usr / bin / echo; Así que supongo que quiero ver el / usr / bin / echo uno en lugar de leer todo bash!
John Lawrence Aspden
2
Intenta a /usr/bin/echo --versioncontinuación.
Satō Katsura
2
... Y esa es una pregunta muy diferente a la que hiciste.
Satō Katsura

Respuestas:

13

RHEL / Fedora

correr rpm -qf /path

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

Descargue el paquete fuente (uso yumpara RHEL):

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

Extraiga las fuentes, los parches del paquete SRPM descargado en el directorio actual, cambie al directorio donde se extraen los archivos y encuentre su archivo:

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

Puede reconstruir el paquete usando rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, lo que producirá los RPM que puede instalar directamente en su sistema.

Si necesita hacer alguna modificación en los paquetes de fedora, es mucho más fácil seguir el camino del mantenedor: instalar fedpkg, clonar el repositorio, hacer las modificaciones (usando parches) y reconstruir el paquete con modificaciones:

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

Debian (y derivados)

Ejecute dpkg -S /pathpara ver a qué paquete /pathpertenece:

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

Obtenga la fuente (estoy en 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

Encuentra el archivo:

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

El resto depende de usted.

muru
fuente
Muchas gracias. Creo que debería hacer que el RHEL / Fedora responda al aceptado, ya que pregunté sobre eso. Pero principalmente uso Debian, ¡así que el tuyo es probablemente el preferido desde mi punto de vista! Una pena que no pueda aceptar las dos.
John Lawrence Aspden
La respuesta es correcta, pero adicionalmente, a menudo, es posible que desee mirar la fuente ascendente (por ejemplo, si tienen nuevos cambios que aún no están en la distribución). Para hacer esa llamada dpkg -s coreutils(o cualquier paquete que le interese) y busque el Homepage:. Desde la página de inicio, generalmente puede encontrar acceso de lectura a su código fuente y al historial de versiones completo.
Uwe Geuder