Como eu olho o código fonte para um comando? [fechadas]

13

De repente, decidi que gostaria de olhar o código-fonte para 'eco'

$ which echo
/usr/bin/echo

assim

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

assim

$strings /usr/bin/echo

me leva a acreditar que é um programa C compilado

Agora estou preso.

Como é que eu:

  1. Descubra em qual pacote está

  2. Obter a fonte

  3. Reconstrua

  4. Teste-o

  5. Instale a nova versão em todo o sistema

(Eu sei que 5 não é uma boa ideia, só estou curioso ...)

Atualmente, estou no Fedora, mas também estaria interessado nas respostas para o Debian

Um link para um tutorial relevante seria uma boa resposta.


Editar:

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

Então eu acho que é o que /usr/bin/echoeu gostaria de ver em vez de tentar ler o todo bash.

John Lawrence Aspden
fonte
2
Tente type -a echoprimeiro.
Satō Katsura
1
digite -a eco; eco é um shell embutido; eco é / usr / bin / eco; Então eu acho que quero ver o / usr / bin / echo em vez de ler todos os bash!
John Lawrence Aspden
2
Tente a /usr/bin/echo --versionseguir.
Satō Katsura
2
... E essa é uma pergunta muito diferente da que você fez.
Satō Katsura

Respostas:

13

RHEL / Fedora

Corre rpm -qf /path

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

Faça o download do pacote de origem (use yumpara RHEL):

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

Extraia as fontes, os patches do pacote SRPM baixados no diretório atual, mude para o diretório em que os arquivos são extraídos e localize seu arquivo:

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

Você pode reconstruir o pacote usando rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, o que produzirá os RPMs que você pode instalar diretamente no seu sistema.

Se você precisar fazer alguma modificação nos pacotes do fedora, é muito mais fácil seguir o caminho do mantenedor: Instale fedpkg, clone o repositório, faça as modificações (usando patches) e reconstrua o pacote com modificações:

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

Debian (e derivativos)

Execute dpkg -S /pathpara ver a qual pacote /pathpertence:

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

Obtenha a fonte (eu estou no 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

Encontre o arquivo:

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

O resto é com você.

muru
fonte
Muito obrigado. Acho que devo fazer com que o RHEL / Fedora responda ao aceito, já que perguntei sobre isso. Mas principalmente eu uso o debian, então o seu é provavelmente o preferido do meu ponto de vista! Uma pena não poder aceitar os dois.
John Lawrence Aspden
A resposta está correta, mas, além disso, pode-se querer consultar a fonte upstream (por exemplo, se há novas alterações ainda não divulgadas na distribuição). Para fazer essa ligação dpkg -s coreutils(ou qualquer pacote que você esteja interessado) e procurar o Homepage:. Na página inicial, você normalmente encontra acesso de leitura ao código fonte e ao histórico completo da versão.
Uwe Geuder