我创建了一个小的迷你shell,它让用户输入像'ls'这样的命令,它会列出目录的内容,就像它应该在我的代码中使用execv(),但这似乎不起作用当用户输入类似'set name =“bob”'的内容时。我一直在寻找我应该在我的代码中使用的地方,当用户输入它时执行set命令,我能找到的最好的是system(),但这仍然不适合我。有什么想法吗?
答案 0 :(得分:1)
set
是一个shell-builtin命令,而不是外部命令(实际上它需要具有预期的效果,即在shell进程本身内修改shell变量)。
这意味着您需要在shell本身中查找并处理set
,方法是将命名变量添加到跟踪shell变量的内部数据结构中(如果已经存在则更新它)。
答案 1 :(得分:0)
由于您正在执行fork-and-exec或system(),因此该命令实际上是在单独的进程中运行的。在该过程中发生的事情(如设置环境变量)不会影响父项的环境。 (另一个问题是set
实际上并没有创建环境变量。您需要[ba] sh中的export
或[t] csh中的setenv
来执行此操作。)
因此,您需要编写迷你shell代码以明确处理set
命令,而不是将其传递给其他程序。
答案 2 :(得分:0)
您可能需要查看setenv(3)和getenv(3)。这些是用于在C程序中更改和读取环境变量的函数。