linux - 如何实现一个新的shell命令?

标签 linux shell

我想实现我自己的 ps 命令版本,并且我想了解 Linux 中 shell 命令是如何实现的。它是 Shell 应用程序的一部分还是模块的一部分?

据我所知,当我在 shell 提示符下键入 ps 时:ps 的实际实现只能驻留在内核中,而 shell 只会调用内核 api/二进制文件。

现在,如果我想添加一个新命令(比如 myps):我应该在 shell 应用程序中修改什么? & 我应该在内核模块中修改什么?

shell 应用程序如何知道各个模块(内核、网络、fs 等)中支持的命令列表?

最后,如果(仅作为示例)网络模块仅针对 ipv4 配置和构建,那么在 shell 中支持 ipv6 命令就没有意义了吗?这是如何处理的?

最佳答案

ps 只是一个常规程序(通常位于/bin/ps)。您可以通过运行 which ps 找到它在系统中的位置。

当您运行命令时(假设它不是由 shell 本身实现的内置函数、别名等),shell 会搜索您的 PATH 环境变量中列出的目录。如果您使用 sh 或 bash 作为您的 shell,您可以通过运行 echo $PATH 来查看它。 Shell 按照目录在 PATH 中列出的顺序搜索目录,并运行它找到的第一个匹配程序。

如果您想创建一个新版本的 ps,只需编写一个程序并将其放在您的 PATH 中的一个目录中。通常在 /usr/local/bin/(所有用户都可以访问)或 ~/bin(在您的主目录中)之类的地方。或者您可以将新目录添加到您的 PATH。谢天谢地,无需扰乱内核或 shell 本身。

关于linux - 如何实现一个新的shell命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382739/

相关文章:

c - 没有我们可以通过命令行传递给应用程序的命令行参数?

linux - 如何在 Makefile 中使用 sbin 命令?

bash - Makefile 环境变量中的美元

python - 无法从文件访问完整的 python 模块,但可以从 shell 访问

bash - 使用 ffmpeg 转换文件时跟踪日志文件并处理每一行丢失的数据

linux - 查找命令权限被拒绝

使用 fork() 进行 C 系统编程

linux - 将 Emacs 复制/粘贴与系统复制/粘贴集成

linux - 在终端中输入 "bash -v"命令后出现问题

c - C 语言中的 Shell