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

Gui*_*ern 18 command-line bash manpage

fgbg以及jobs用于作业管理。出于某种原因(也许只有我一个人),我无法找到他们的二进制文件和联机帮助页(不whereis打印任何信息)。which没有输出。不过,这些命令本身工作得很好。

我运行了类似的命令find /bin bg,但没有成功。我也跑去find / bg广撒网。

hee*_*ayl 36

您不会针对这些命令获取任何文件,因为它们是 shell ( bash) 内置程序,而不是单独的可执行文件(例如二进制文件、脚本)。实际上,shell 内置函数被编译成 shell 可执行文件;如果你愿意,你可以检查源代码以确保它。由于whichwhereis仅查找外部可执行文件,您不会获得内置程序的任何输出。

要查找命令是内置文件还是别名或函数还是外部文件,最好的方法是使用type内置文件:

$ type fg
fg is a shell builtin

$ type bg
bg is a shell builtin

$ type jobs
jobs is a shell builtin
Run Code Online (Sandbox Code Playgroud)

另请注意,您的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
Run Code Online (Sandbox Code Playgroud)

要获取 shell 内置程序的文档,您可以检查man页面bash或使用help命令(这是一个内置命令):

help jobs
Run Code Online (Sandbox Code Playgroud)

同样正如@terdon 指出的那样,您应该使用type而不是which.

  • @user136104 在 `echo` 的情况下,它既可以作为 shell 内置 * 也可以作为单独的独立可执行文件使用(具有不同的功能和选项 - 请参阅 [为什么 printf 比 echo 更好?](http://unix. stackexchange.com/questions/65803/why-is-printf-better-than-echo) (5认同)
  • @ user136104 之所以像 `echo` 或 `kill` 可以作为命令和内置函数同时存在,而大多数其他内置函数不是,是因为它们不能在不成为 shell 的一部分的情况下运行。外部`bg`究竟会做什么?它不知道要继续什么进程,也无法控制它与终端的交互。 (4认同)

ste*_*ver 6

它们是 shell 内置程序 - 您可以通过键入help fghelp jobs在 bash shell 提示符下获取基本使用信息,或者从 bash 联机帮助页获取更多详细信息。


zwo*_*wol 5

除了 heemayl 的回答之外,值得指出的是fgbg, 和jobs 必须内置到外壳中,因为它们操作外壳内存中的数据结构和/或与外壳进程相关的内核状态。不可能编写一个外部命令来完成fg它的工作。

其他必须内置的命令包括cd, eval, exec, exit, export, history, read, set, source(aka .), shift, trap, ulimit, umask, 和wait。您的 shell 可能有更长的列表,这取决于它实现了多少扩展功能。 POSIX 有一个不同但重叠的“特殊内置实用程序”列表——我不确定为什么像breakcontinue算作命令而不是控制结构关键字,或者为什么 POSIX考虑像umaskmust-build这样的东西-in 当它们不能以任何其他方式实现时。(您可以编写一个/bin/umask名为umask(2),但它只会更改自己的设置,而不是由 shell 创建的后续进程,因此它不会满足其规范。)