编辑并重新编译单个程序

编辑并重新编译单个程序
whereis pwd
pwd: /bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

二进制文件夹中的 pwd 与

type pwd
pwd is a shell builtin

那么在外部 pwd 上做一些实验不是无害的吗?就像添加一个“Hello shell!” cout只是为了演示原理?

pwd的来源在哪里?您通常是通过发行版获得它(我使用的是 Debian)还是您以某种方式安装或下载它?是C语言吗?我是否像使用 gcc 的任何其他文件一样编译它,并将结果(使用合适的 chmod)放入路径包含的文件夹中?升级怎么样?如你所知,我错过了这里的大局。

(顺便说一句,头文件似乎是不相关的:pwd 作为密码,而不是 print/present 工作目录。)

答案1

在外部密码上做一些实验不是无害吗?

这是一个糟糕的赌注,没有任何用途/bin/pwd。出于安全原因,在 shell 脚本(尤其是通常由 root 运行的脚本)中提供外部程序的完整路径是一种很好的做法。

尽管如此,您仍然可以安全地构建自定义pwd并将其放在您的主目录中的某个位置。如果包使用自动会议,这通常足以配置要安装在主目录下的包:

$ ./configure --prefix=$HOME

你可以这样说--prefix=$HOME/pwd-test,以避免任何冲突的可能性。

只要正确设置了包的构建系统,当您像这样配置它时,您就可以放心地说,make install无需成为 root,因为它写入的所有文件都应该位于您给定的前缀下。

pwd的来源在哪里?

pwd是其一部分coreutils。你会发现这样的事情Debian 软件包搜索引擎

你通常会通过发行版获得它吗(我使用的是 Debian)

您可能还没有下载发行版源代码,但是,它被认为是 Debian 发行版的一部分。它们被分成六个磁盘(!)源 DVD 集,约占 25 GB,这就是为什么大多数人从不下载它们的原因。

不过,除非您尝试重建整个 Debian 发行版或创建衍生发行版,否则您现在可能不应该下载它们。点菜在这个阶段,下载可能是一个更好的主意。

你以某种方式安装或下载它吗?

是的,您还可以使用apt-get安装包的源代码。有一个整章APT 指南关于这一点。

(该文档被标记为“已过时”,但我没有看到替代文档。)

是C语言吗?

很可能是的。

我是否像使用 gcc 的任何其他文件一样编译它,并将结果(使用合适的 chmod)放入路径包含的文件夹中?

您可能不直接运行 gcc,您可能会执行标准configure ; make ; make install舞蹈。如果您从 Debian 软件包搜索页面下载源 tarball,您可能会在 tarball 中找到一个INSTALLREADME文件,其中包含构建说明。

升级怎么样?

他们呢?软件包搜索引擎将帮助您找到您可能需要的任何版本的软件,并将apt-get帮助您跟踪源代码的更改,就像跟踪二进制文件一样。

我在这里错过了大局。

你可能想看看Debian 文档, 然后。

头文件似乎不相关:密码中的 pwd,而不是打印/当前工作目录。)

是的。它是 C 程序员的实用程序标头,用于访问用户数据库。说man 3 getpwent要了解通过该界面可以使用什么。

答案2

在 Linux 上,pwd通常由coreutils包裹。您可以从该网站或您的发行版的源代码存储库下载源代码(这里是 Debian)。

您可以pwd按照通常的方式编译该包中的其他工具:解压源代码并:

./configure
make

pwd您可以根据需要修改源代码并重新编译(它是 C 代码,在 中src/pwd.c)。但我会不是coreutils建议您安装您在发行版副本上自行修改的任何内容。

如果您想“玩”它,请将其安装到主目录中的某个位置,并将其添加到您的路径(或测试用户的路径)中。仅当您确切知道自己在做什么(并且知道如何撤消该操作)时,才覆盖由发行版/包管理器管理的可执行文件。

这不是特定于 的coreutils,您可以使用您的发行版提供的所有开源软件包(甚至是它不提供的软件包)来执行此操作。但是,关于不要修改由您的发行版管理的文件的警告对于低级“系统”软件包更为重要,因为您更有可能完全搞砸系统。

答案3

为什么/bin/pwd和内置

/bin/pwd是一个独立的可执行文件,用于打印当前目录。大多数 shell 都有pwd内置函数,原因有两个:

  • 这是一个常见、简单的操作;内置的速度更快。
  • 有几个 shell 会跟踪当前目录中的符号链接。考虑:

    $ pwd
    /home/gilles
    $ ln -s /tmp sym       # Create a symlink /home/gilles/sym -> /tmp
    $ cd sym
    $ pwd
    /home/gilles/sym       # the directory tracked by the shell
    $ /bin/pwd
    /tmp                   # the "real" location of the current directory
    $ pwd -P               # pwd -P also shows the "real" location
    /tmp
    $ cd ..
    $ pwd
    /home/gilles           # The shell stripped one level off its current directory
    $ set -P               # Turn off symlink following (in bash)
    $ cd sym
    $ pwd
    /tmp
    $ cd ..
    $ pwd
    /
    

某些脚本显式调用/bin/pwd以避免 shell 可能执行的任何符号链接。覆盖/bin/pwd做其他事情可能会破坏东西。

哪里可以找到来源

在 Debian 及其衍生版本(包括 Ubuntu 及其衍生版本)以及任何其他使用 dpkg 和 APT 操作软件包的系统上,您可以通过运行来查找文件位于哪个软件包中

dpkg -S /bin/pwd

您将看到该文件是由coreutils包提供的。

一般来说,要找出构建该二进制包的源包,请运行dpkg -s coreutilsapt-cache show coreutilsaptitude show coreutils这里,它们不显示一行Source:,这意味着源包与二进制包具有相同的名称(情况并非总是如此,主要是当源包被拆分为多个二进制包时)。

如果你想获取源码,你甚至不需要找出源码包的名称。赶紧跑

apt-get source coreutils

这将下载并解压包的源代码coreutils

也可以看看

沃伦·杨的答案,其中提出了一些补充观点。

相关内容