2

bash我想知道外壳中内置的工具。例如,type pwd告诉我它pwd是内置在 shell 中的。

whereis pwd
/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

aptitude search pwd

没有(似乎)在我使用的密码上提供任何东西。(我在 Debian 系统上。)

-- 有什么办法可以查出里面有什么东西吗?除了蛮力type,就是。

--文件夹(上面)中的 和内置的一样pwd吗?它是否在启动时加载到外壳中?或者它是由shell从那个文件夹执行的?如果是这样,它以什么方式内置?binpwd

——为什么首先要内置东西?它们是特别调整以适应外壳,还是只是为了可以在内部调用它们而不需要新进程?我设法抓住了一个pwdwithpwd &ps。这是一种规避还是它们是独立的过程?

- 随时告诉我有关该主题的任何其他内容:)

4

7 回答 7

3

有什么方法可以找出内置的东西吗?

help会给你一个完整的清单。您可以help使用内置命令作为参数运行以获取更详细的信息。info "(bash) Shell Builtin Commands"将显示所有内置的 Bash 手册。

文件夹pwd中的(上图)与内置的相同吗?binpwd

不,它们完全不同:

$ builtin pwd --help
bash: pwd: --: invalid option
pwd: usage: pwd [-LP]

$ /bin/pwd --help
Usage: /bin/pwd [OPTION]...
Print the full filename of the current working directory.

  -L, --logical   use PWD from environment, even if it contains symlinks
  -P, --physical  avoid all symlinks
      --help     display this help and exit
      --version  output version information and exit

NOTE: your shell may have its own version of pwd, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report bugs to <bug-coreutils@gnu.org>.

为什么首先要内置东西?它们是特别调整以适应外壳,还是只是为了可以在内部调用它们而不需要新进程?

来自手册:“内置命令对于实现使用单独的实用程序不可能或不方便获得的功能是必要的。” 很难让命令像cd在外部工作,因为它会影响 shell 的状态。当然,很容易复制pwdor的行为true,但 POSIX 标准要求它们是内置的

我设法抓住了一个pwdwithpwd &ps。这是一种规避还是它们是独立的过程?

运行builtin &将导致 Bash 在后台运行子 shell。您可以通过执行 轻松看到这一点read &,因为read等到它输入。

于 2011-12-12T21:23:47.637 回答
1

为了回答你的第一个问题,我发现如果我(在我的 bash shell 中)输入“builtin”然后tab-tab,它会显示一个内置列表,因为它有tab-completion。我知道这只是您所要求的一小部分,但这是一个开始,因为我不知道所有“为什么”的东西。:P

于 2011-12-12T21:22:17.390 回答
1

Shell builtins 显然比单独的二进制文件更有效。单独的二进制文件是完全独立的,基本上可以与其他没有内置这些​​东西的 shell 一起使用。您可以通过将命令放在引号 IIRC 中来强制 bash 使用二进制文件。如果你man bash会发现一些关于内置命令以及它们如何工作的信息(它并不总是像外部二进制文件一样)。

于 2011-12-12T21:24:58.977 回答
1

bash手册页 ( )man bash列举了内置函数。

which命令将列出找到非内置插件的位置,考虑到${PATH}等等。

中的文件/bin/是替换文件,以防您使用没有将它们作为内置命令的 shell。

它们是为了提高效率而内置的,以避免fork/ exec,但bash特别是通常足够聪明,可以fork在必要时仍然(例如用于|&操作)

如果确实需要运行 中的版本bin,可以通过完整路径名(/bin/pwd例如)调用它们。(这也可以规避alias等等。) — 这对于 很少有用bash,但如果您使用的是非常简单的嵌入式 shell,例如busybox,这可能会有所帮助,因为它们的内置函数通常是功能的子集。

于 2011-12-12T21:25:28.513 回答
1

有关 shell 内置函数的完整列表,请使用man bash. 内置命令是 shell 在实际 shell 可执行文件中编译的命令。这样,如果由于某种原因您没有该echo命令,您仍然可以从 shell 运行它。这对于精简系统(例如嵌入式设备)或您意外擦除硬盘驱动器部分的情况非常方便。

通常,内置比外部可执行文件更受限制,但它也不需要启动另一个进程,您可能没有足够的资源去做。同样,大多数人不会遇到这种情况,但嵌入式系统和错误恢复发现它很有用。

于 2011-12-12T21:27:40.560 回答
1

man builtin将向您展示哪些命令是内置的,以及它们是如何执行的。从手册页:

Shell 内置命令是可以在运行的 shell 进程中执行的命令。

同样在该手册页上,您可以找到内置的其他进程。man pwd用于查找您的特定版本的pwd.

手册页是你的朋友 :)

于 2011-12-12T21:28:39.597 回答
1

如 bash 主页所述,您可以使用内置帮助来获取有关所有 bash 内置的信息。所以输入:

help

应该给你一个完整的清单。内置的原因是它们更有效,因为调用它们不涉及跨越新进程。如果您不想使用给定命令的内置命令,而是命令本身,则必须指定命令到 shell 的完整路径。例如

/bin/echo

而不仅仅是echo

于 2011-12-12T21:35:40.400 回答