shell中内置的工具

时间:2011-12-12 21:20:28

标签: bash shell built-in pwd

我想知道bash shell中内置的工具。例如,type pwd告诉我pwd内置于shell中。

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

aptitude search pwd

在我使用的pwd上没有(似乎)给出任何东西。 (我正在使用Debian系统。)

- 有没有办法找出内置的东西?除了type的蛮力,就是。

- pwd文件夹(上方)中的bin是否与内置的pwd相同?是否在启动时加载到shell中?或者它是由shell从该文件夹执行的?如果是这样,它以什么方式内置?

- 为什么首先内置的东西?它们是否经过特别调整以适应shell,或者只是为了可以在内部调用它们以便它们不需要新的过程?我设法通过pwdpwd &抓住ps。这是一种规避还是分开的过程?

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

7 个答案:

答案 0 :(得分:3)

  

有没有办法找出内置的东西?

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

  

pwd文件夹(上方)中的bin是否与内置的pwd相同?

不,他们完全不同:

$ 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>.
  

为什么首先内置的东西?它们是否经过特别调整以适应shell,或者只是为了可以在内部调用它们以便它们不需要新的过程?

从手册中可以看出:“内置命令对于实现无法实现的功能或使用单独的实用程序获取不方便是必需的。”像cd这样的命令很难在外部工作,因为它会影响shell的状态。当然,很容易复制pwdtrue的行为,但POSIX标准requires that they are built-ins

  

我设法通过pwdpwd &抓住ps。这是一种规避还是分开的过程?

运行 builtin &将导致Bash在后台运行子shell。您可以通过read &轻松查看此内容,因为read会一直等到输入完毕。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

bash手册页(man bash)枚举内置插件。

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

/bin/中的文件是替换文件,以防您使用不具有内置函数的shell。

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

  

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

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

手册页是您的朋友:)

答案 6 :(得分:1)

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

help

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

/bin/echo

而不只是echo