命令 `fg`、`bg` 和 `jobs` 安装在哪里?

fgbgjobs用于作业管理。但出于某种原因(也许只是我自己),我找不到它们的二进制文件和man页(whereis没有输出任何信息)。which也没有输出。不过这些命令本身运行得很好。

我尝试了像find /bin bg这样的命令,但没有找到任何结果。我还运行了find / bg来扩大搜索范围。


manpage fg: http://www.unix.com/man-page/posix/1posix/fg/ 和 bg: http://www.unix.com/man-page/posix/1p/bg/ 在下面的答案中,如果用户使用的是"bash",更准确地称呼这些命令为强制性的POSIX shell命令可能更合适。如果这些命令不存在,就不能称呼所使用的系统为符合POSIX标准。 - Rinzwind
@Rinzwind 你知道/怀疑为什么我在我的shell中没有他们的manpages吗?:) - Guildenstern
1你已经知道:这些是内置于shell中的命令。所以它们的man页是 bash。执行 man bash | grep fg ;)(参见steeldrivers的答案)。 - Rinzwind
5个回答

你没有得到任何文件来执行这些命令,因为它们是shell(bash)内置命令,而不是独立的可执行文件(例如二进制文件、脚本)。实际上,shell内置命令被编译到shell可执行文件中;如果你想要确定的话,可以查看源代码。由于which或whereis只会寻找外部可执行文件,所以对于内置命令你将得不到任何输出。 要判断一个命令是内置命令、别名、函数还是外部文件,最好的方法是使用type内置命令:
$ type fg
fg is a shell builtin

$ type bg
bg is a shell builtin

$ type jobs
jobs is a shell builtin
请注意,您的find命令语法不正确。最简单的正确语法是find /where/to/search -name 'name_to_search'。 还要注意,有些命令既可以作为shell内置命令,也可以作为独立的可执行文件。对于这样的命令,要始终记住内置命令优先于外部命令。因此,当您运行echo something时,会运行内置的echo。如果您想运行二进制可执行文件echo,需要以不同的方式调用它。一种方法是使用可执行文件的完整路径:/bin/echo something。 要显示所有可用版本的命令,请使用type命令并带上-a选项:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
要获取shell内置命令的文档,你可以查看bash的man页或使用help命令(这是一个内置命令):
help jobs
另外,正如@terdon所指出的那样,你应该使用"type"而不是"which"。

我之前听说过这个“builtin”业务,但我想我没有太在意,因为whereis echowhich echo都会给出正常的输出,而type echo则表示echo是内建命令。你知道这背后的原因吗? - Guildenstern
5echo的情况下,它既可以作为shell内置命令使用,也可以作为独立的可执行文件使用(具有不同的功能和选项-参见为什么printf比echo更好?)。 - steeldriver
@user136104:请检查我的修改。 - heemayl
4@user136104 之所以像echokill这样的命令既可以存在于命令行中,也可以作为内建命令存在,而其他大部分内建命令不能,是因为它们在没有成为shell的一部分时无法正常工作。那么一个外部的bg命令会做什么呢?它不知道要继续哪个进程,并且无法控制其与终端的交互。 - Random832
或者 type fg bg jobs - Cyrus
1想要了解更多关于typewhich之间的区别,可以参考为什么不使用"which"? 那么应该使用什么?。简单总结就是:始终使用type - terdon

它们是shell内置命令 - 你可以在bash shell提示符下输入help fghelp jobs来获取基本使用信息,或者从bash manpage中获得更详细的信息。

补充heemayl的回答,值得指出的是fgbgjobs必须内置到shell中,因为它们操作shell内存中的数据结构和/或与shell进程相关联的内核状态。无法编写一个外部命令来完成fg的功能。 其他必须内置的命令包括cdevalexecexitexporthistoryreadsetsource(也称为.)、shifttrapulimitumaskwait。根据所实现的扩展功能的多少,您的shell可能有更长的列表。POSIX有一个不同但有重叠的“特殊内置工具”列表 - 我不确定为什么像breakcontinue这样的东西被视为命令而不是控制结构关键字,或者为什么POSIX在它们无法以其他方式实现时不将umask视为必须内置的。(您可以编写一个名为/bin/umask的程序来调用umask(2),但它只会更改自身的设置,而不会影响由shell创建的后续进程,因此它无法满足其规范。)

我认为你大部分是对的,@zwol,特别是如果命令需要操作shell的状态。然而,如果它是在操作系统级的内核状态,我认为任何具有适当权限的可执行文件都应该能够做到这一点。这可能就是为什么sysctl不是内置的原因之一。 - Randall Cook
@RandallCook 我并没有说“系统范围”的内核状态,我说的是与shell进程相关联的内核状态,比如umask和资源限制。(我相信当前的Unix系统允许您在具备足够权限的情况下修改另一个进程的资源限制,但过去是不可能的。) - zwol

fgbgjobs不是独立的实用工具,而是bash(shell内置命令)的一部分。

你可以使用命令在bash手册中找到更多关于它们的信息。

man bash

1你可能想要澄清一下,通过“bash 手册”你指的是运行命令 man bash - IQAndreas

这些是shell内置命令。它们没有对应的二进制文件,因为它们是Bash(或者你使用的其他shell)的一部分。 例如,在Bash manpage中有关于它们的文档(参见“SHELL BUILTIN COMMANDS”部分)。