如何查看命令的源代码?[关闭]


13

我突然决定我想看看'echo'的源代码

$ which echo
/usr/bin/echo

所以

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

所以

$strings /usr/bin/echo

使我相信这是一个已编译的C程序

现在我被卡住了。

我如何:

  1. 找出其中的包裹

  2. 获取来源

  3. 重建它

  4. 测试一下

  5. 在系统范围内安装新版本

(我知道5不是一个好主意,我很好奇...)

我目前正在使用Fedora,但我也会对Debian的答案感兴趣

链接到相关教程将是一个很好的答案。


编辑:

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

因此,我想这是/usr/bin/echo我想要看到的,而不是尝试阅读全部内容bash


2
请先尝试type -a echo
桂聪聪(SatōKatsura)

1
-a echo; echo是内置的shell; echo是/ usr / bin / echo; 所以我想我想看一看/ usr / bin / echo而不是读全部bash!
约翰·劳伦斯·阿斯普登

2
尝试/usr/bin/echo --version下一个。
桂聪聪(SatōKatsura)


2
...这是与您提出的问题完全不同的问题。

Answers:


13

RHEL / Fedora

rpm -qf /path

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

下载源包(yum用于RHEL):

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

从当前目录中下载的SRPM软件包中提取源,补丁程序,然后转到提取文件的目录并找到您的文件:

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

您可以使用来重建软件包rpmbuild --rebuild coreutils-8.25-17.fc25.src.rpm,这将产生可直接安装在系统上的RPM。

如果您需要对fedora软件包进行一些修改,则采用维护者的方法要容易得多:安装fedpkg,克隆存储库,进行修改(使用补丁程序)并通过修改来重建软件包:

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

15

Debian(及其衍生产品)

运行dpkg -S /path以查看哪个包/path属于:

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

获取源代码(我在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

查找文件:

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

其余的取决于您。


非常感谢。我认为我应该让RHEL / Fedora回答接受的问题,因为我确实对此提出了疑问。但主要是我使用debian,所以从我的角度来看,您可能是首选!可惜我不能接受。
约翰·劳伦斯·阿斯普登

答案是正确的,但另外,人们可能经常想看看上游源(例如,发行版中是否还有新的变化)。要执行该调用 dpkg -s coreutils(或您感兴趣的任何程序包)并查找Homepage:。通常,在主页上可以找到对其源代码和完整版本历史记录的读取权限。
Uwe Geuder '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.