问题描述
fg
、 bg
和 jobs
用于作业管理。由于某种原因(也许只是我),我无法找到他们的二进制文件所在的位置,也找不到他们的联机帮助页( whereis
不打印任何信息)。 which
没有输出。不过,这些命令本身工作得很好。
我运行了类似 find /bin bg
的命令,但没有命中。我还跑了find / bg
来广撒网。
最佳办法
您不会针对这些命令获得任何文件,因为它们是 shell ( bash
) 内置s,而不是单独的可执行文件(例如二进制文件、脚本)。实际上,shell 内置s 被编译成 shell 可执行文件;如果您愿意,可以检查源代码以确保这一点。由于 which
或 whereis
仅查找外部可执行文件,因此您不会获得 内置s 的任何输出。
要查找命令是否是 内置、别名、函数或外部文件,最好的方法是使用 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
。
要显示命令的所有可用版本,请使用 -a
选项运行 type
:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
要获取 shell 内置s 的文档,您可以检查 bash
的 man
页面或使用 help
命令(这是 内置 命令):
help jobs
另外,正如 @terdon 指出的那样,您应该使用 type
而不是 which
。
次佳办法
它们是 shell 内置s – 您可以通过在 bash shell 提示符下键入 help fg
或 help jobs
来获取基本使用信息,或者从 bash 联机帮助页获取更多详细信息。
第三种办法
添加到 heemayl 的答案中,值得指出的是 fg
、 bg
和 jobs
必须内置到 shell 中,因为它们操作 shell 内存中的数据结构和/或与 shell 进程关联的内核状态。不可能编写执行 fg
操作的外部命令。
必须内置的其他命令包括 cd
、\n eval
、\n exec
、\n exit
、\n export
、\n history
、\n read
、\n set
、\n source
(又名 .
),\n shift
、\n trap
、\n ulimit
、\n umask
、\n 和 wait
。您的 shell 可能有更长的列表,具体取决于它实现的扩展功能的数量。 POSIX has a different, but overlapping, list of “special 内置 utilities” – 我不确定为什么像 break
和 continue
这样的东西算作命令而不是 control-structure 关键字,或者为什么 POSIX 不考虑像 umask
must-build-in 这样的东西,因为它们不能以任何其他方式实现。 (您可以编写一个名为 /bin/umask
的程序来调用 umask(2)
,但它只会更改其自身的设置,而不会更改 shell 创建的后续进程,因此它无法满足其规范。)