Wie sehe ich mir den Quellcode für einen Befehl an? [geschlossen]

13

Ich entschied plötzlich, dass ich mir den Quellcode für 'Echo' ansehen möchte.

$ which echo
/usr/bin/echo

so

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

so

$strings /usr/bin/echo

lässt mich glauben, dass es sich um ein kompiliertes C-Programm handelt

Jetzt stecke ich fest.

Wie mache ich:

  1. Finden Sie heraus, in welchem ​​Paket es sich befindet

  2. Holen Sie sich die Quelle

  3. Baue es wieder auf

  4. Probier es aus

  5. Installieren Sie die neue Version systemweit

(Ich weiß, dass 5 keine gute Idee ist, ich bin nur neugierig ...)

Ich bin zurzeit auf Fedora, aber ich würde mich auch für die Antworten für Debian interessieren

Ein Link zu einem relevanten Tutorial wäre eine gute Antwort.


Bearbeiten:

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

Ich denke, es ist das, was /usr/bin/echoich sehen möchte, anstatt zu versuchen, das Ganze zu lesen bash.

John Lawrence Aspden
quelle
2
Versuchen Sie es type -a echozuerst.
Satō Katsura
1
Typ -a Echo; Echo ist eine eingebaute Shell; echo ist / usr / bin / echo; Ich schätze, ich möchte lieber die Datei / usr / bin / echo sehen, als die ganze Bash zu lesen!
John Lawrence Aspden
2
Versuchen Sie es als /usr/bin/echo --versionnächstes.
Satō Katsura
2
... und das ist eine ganz andere Frage als die, die Sie gestellt haben.
Satō Katsura

Antworten:

13

RHEL / Fedora

Lauf rpm -qf /path

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

Laden Sie das Quellpaket herunter ( yumfür RHEL verwenden):

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

Extrahieren Sie die Quellen, Patches aus dem im aktuellen Verzeichnis heruntergeladenen SRPM-Paket, wechseln Sie in das Verzeichnis, in das die Dateien extrahiert werden, und suchen Sie Ihre Datei:

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

Sie können das Paket mit neu erstellen rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm, wodurch die RPMs erstellt werden, die Sie direkt auf Ihrem System installieren können.

Wenn Sie Änderungen an Fedora-Paketen vornehmen müssen, ist es viel einfacher, den Wartungsmodus zu wählen: Installieren Sie fedpkgdas Repository, klonen Sie es, nehmen Sie die Änderungen vor (mithilfe von Patches) und erstellen Sie das Paket mit den folgenden Änderungen neu:

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

Debian (und Derivate)

Führen Sie aus, um dpkg -S /pathzu sehen, zu welchem ​​Paket Folgendes /pathgehört:

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

Holen Sie sich die Quelle (ich bin auf 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

Suchen Sie die Datei:

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

Der Rest liegt an dir.

muru
quelle
Vielen Dank. Ich denke, ich sollte die RHEL / Fedora dazu bringen, die akzeptierte zu beantworten, da ich danach gefragt habe. Aber hauptsächlich benutze ich debian, also ist wahrscheinlich deins aus meiner Sicht das bevorzugte! Schade, dass ich nicht beides akzeptieren kann.
John Lawrence Aspden
Die Antwort ist richtig, aber zusätzlich möchte man oft die Upstream-Quelle anschauen (z. B. ob sie neue Änderungen noch nicht in der Distribution haben). Rufen Sie dazu dpkg -s coreutils(oder an welchem ​​Paket auch immer Sie interessiert sind) auf und suchen Sie nach dem Homepage:. Auf der Homepage finden Sie normalerweise Lesezugriff auf den Quellcode und den Verlauf der Vollversion.
Uwe Geuder