2012-02-03 163 views
2

我创建了一个小型shell,让用户输入一个像'ls'这样的命令,它会列出目录中的内容,就像它在我的代码中使用execv()一样,但是似乎并不适用于用户输入'set name =“bob”'之类的内容。我一直在寻找在我的代码中用于执行set命令时应该使用什么的地方,并且我能找到的最好的是system(),但这仍然不适合我。有任何想法吗?在c程序中执行SET命令

+0

这看起来像我的学校一年级项目之一。一个全部... – Eregrith 2012-02-03 09:21:29

+0

你有什么意思? – user1186710 2012-02-03 19:19:51

回答

0

由于您正在执行fork-and-exec或system(),因此该命令确实在单独的进程中运行。该过程中发生的事情(如设置环境变量)不会影响父级的环境。 (另外一个问题是,set实际上并没有创建一个环境变量。您将需要在[BA] SH exportsetenv在[T] CSH做到这一点。)

所以你需要编写你的迷你shell明确地处理set命令,而不是将它传递给另一个程序。

1

set是一个shell-built命令,而不是外部命令(实际上它需要具有预期的效果,即在shell进程本身内修改shell变量)。

这意味着您需要在shell自身内查找并处理set,方法是将某个变量添加到跟踪shell变量的内部数据结构中(如果它已经存在,则更新它)。

+0

那么这是否意味着我将不得不在我的小型shell中编写自己的set命令,它将执行类似于内置set命令的操作? – user1186710 2012-02-03 04:54:17

+0

@ user1186710:对 - 如果你想支持'set',那就是。 – caf 2012-02-03 05:08:39

+0

非常感谢! – user1186710 2012-02-05 09:26:03

0

你可能想看看setenv(3)和getenv(3)。这些是用于在C程序中更改和读取环境变量的函数。

+0

但那不会让我创造变数吗? – user1186710 2012-02-03 18:26:32

+0

从手册页:“setenv()函数将变量_name添加到值为_value的环境中,”所以,是的。 – user732933 2012-02-04 02:43:35