Come guardo il codice sorgente di un comando? [chiuso]


13

Improvvisamente ho deciso che mi piacerebbe guardare il codice sorgente per 'echo'

$ which echo
/usr/bin/echo

così

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

così

$strings /usr/bin/echo

mi porta a credere che sia un programma C compilato

Ora sono bloccato.

Come posso:

  1. Scopri in quale pacchetto si trova

  2. Ottieni la fonte

  3. Ricostruiscilo

  4. Provalo

  5. Installa la nuova versione a livello di sistema

(So ​​che 5 non è una buona idea, sono solo curioso ...)

Sono attualmente su Fedora, ma sarei anche interessato alle risposte per Debian

Un collegamento a un tutorial pertinente sarebbe una buona risposta.


Modificare:

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

Quindi immagino sia quello in cui /usr/bin/echomi piacerebbe vedere piuttosto che cercare di leggere tutto bash.


2
Prova type -a echoprima.
Satō Katsura,

1
digitare -a echo; echo è una shell incorporata; echo è / usr / bin / echo; Quindi immagino di voler vedere quello / usr / bin / echo piuttosto che leggere tutto bash!
John Lawrence Aspden,

2
Prova /usr/bin/echo --versiondopo.
Satō Katsura,


2
... E questa è una domanda molto diversa da quella che hai posto.
Satō Katsura,

Risposte:


13

RHEL / Fedora

Correre rpm -qf /path

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

Scarica il pacchetto sorgente (usa yumper RHEL):

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

Estrai i sorgenti, le patch dal pacchetto SRPM scaricato nella directory corrente, passa alla directory in cui vengono estratti i file e trova il tuo file:

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

Puoi ricostruire il pacchetto usando rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, che produrrà gli RPM che puoi installare direttamente sul tuo sistema.

Se è necessario apportare alcune modifiche ai pacchetti fedora, è molto più semplice procedere come manutentore: installare fedpkg, clonare il repository, apportare le modifiche (usando le patch) e ricostruire il pacchetto con le modifiche:

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

15

Debian (e derivati)

Esegui dpkg -S /pathper vedere a quale pacchetto /pathappartiene:

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

Ottieni la fonte (sono su 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

Trova il file:

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

Il resto sta a voi.


Grazie mille. Penso che dovrei fare in modo che RHEL / Fedora risponda a quello accettato, dato che l'ho chiesto. Ma principalmente uso debian, quindi il tuo è probabilmente il preferito dal mio punto di vista! Un peccato che non posso accettare entrambi.
John Lawrence Aspden,

La risposta è corretta, ma si potrebbe anche voler guardare alla fonte a monte (ad esempio se hanno nuove modifiche non ancora nella distribuzione). Per fare quella chiamata dpkg -s coreutils(o qualunque pacchetto tu sia interessato) e cercare il Homepage:. Dalla homepage è in genere possibile accedere in lettura al codice sorgente e alla cronologia completa delle versioni.
Uwe Geuder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.