Comment puis-je consulter le code source d'une commande? [fermé]

13

J'ai soudainement décidé que j'aimerais regarder le code source de 'echo'

$ which echo
/usr/bin/echo

donc

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

donc

$strings /usr/bin/echo

me fait croire que c'est un programme C compilé

Maintenant je suis coincé.

Comment puis-je:

  1. Découvrez dans quel package il se trouve

  2. Obtenez la source

  3. Reconstruisez-le

  4. Essaye-le

  5. Installer la nouvelle version à l'échelle du système

(Je sais que 5 n'est pas une bonne idée, je suis juste curieux ...)

Je suis actuellement sur Fedora, mais je serais également intéressé par les réponses pour Debian

Un lien vers un tutoriel pertinent serait une bonne réponse.


Éditer:

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

Je suppose donc que c'est celui /usr/bin/echoque j'aimerais voir plutôt que d'essayer de lire l'ensemble bash.

John Lawrence Aspden
la source
2
Essayez d' type -a echoabord.
Satō Katsura
1
type -a echo; echo est un shell intégré; echo est / usr / bin / echo; Donc je suppose que je veux voir celui / usr / bin / echo plutôt que de lire tout bash!
John Lawrence Aspden
2
Essayez /usr/bin/echo --versionensuite.
Satō Katsura
2
... Et c'est une question très différente de celle que vous avez posée.
Satō Katsura

Réponses:

13

RHEL / Fedora

Courir rpm -qf /path

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

Téléchargez le package source (à utiliser yumpour RHEL):

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

Extrayez les sources, les correctifs du package SRPM téléchargé dans le répertoire actuel, accédez au répertoire dans lequel les fichiers sont extraits et recherchez votre fichier:

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

Vous pouvez reconstruire le package à l'aide de rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, ce qui produira les RPM que vous pouvez installer directement sur votre système.

Si vous devez apporter des modifications aux packages fedora, il est beaucoup plus facile de suivre la voie du responsable: installez fedpkg, clonez le référentiel, effectuez les modifications (à l'aide de correctifs) et reconstruisez le package avec des modifications:

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

Debian (et dérivés)

Exécutez dpkg -S /pathpour voir à quel package /pathappartient:

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

Obtenez la source (je suis sur 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

Trouvez le fichier:

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

Le reste dépend de toi.

muru
la source
Merci beaucoup. Je pense que je devrais faire en sorte que RHEL / Fedora réponde à la réponse acceptée, puisque j'ai posé des questions à ce sujet. Mais j'utilise principalement Debian, donc le vôtre est probablement le préféré de mon point de vue! Dommage que je ne puisse pas accepter les deux.
John Lawrence Aspden
La réponse est correcte, mais en plus, on peut souvent vouloir regarder la source en amont (par exemple, s'ils ont de nouveaux changements pas encore dans la distribution). Pour faire cet appel dpkg -s coreutils(ou tout autre package qui vous intéresse) et recherchez le Homepage:. À partir de la page d'accueil, vous pouvez généralement trouver un accès en lecture à leur code source et à l'historique complet des versions.
Uwe Geuder