如何在我的minishell中处理null环境变量?

时间:2012-10-17 01:16:03

标签: c shell unix environment-variables expansion

我在C中制作一个minishell,我正在考虑我的环境变量。我从用户那里获取原始输入行,并将其传递给函数:

int expand(char *orig, char *new, int newsize)

其中new是固定长度的char数组。我遍历orig直到找到$ {然后使用getenv来查找变量的值。如果实际上有一个值,我只需将其复制到新的。但是,当没有值时我遇到了问题,getenv返回null。

我的老师告诉我只需插入一个空字符,但这对我没有任何意义,我认为他的意思不同。如果我要在orig中插入一个空字符,那么当我将它解析为参数时,它会认为空字符标记了字符串的结尾,并且不会费心寻找任何进一步的参数。

例如,如果我进入这样的会话:

echo ${USER} ${NOTHING} ${TERM}

然后:

orig = "echo ${USER} ${NOTHING} ${TERM}\0"

new = "echo my_user_name \0 xterm\0"

输出结果为:

my_user_name 

因为它会认为my_user_name是最后一个参数,因为在它可以将xterm读入参数列表之前看到有一个空终止符。

我知道这是一个模糊的问题,但我认为你们中的一些人在制作迷你壳方面非常有经验,并且知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

也许他的意思是插入一个空字符串,即用什么都不替换变量。这就是/ bin / sh的作用。

$ echo "hi $joe how are you"
hi  how are you

null字符是值为0的字符。它通常写为'\0'。如您所知,它是C字符串结束标记。

空字符串也称为空字符串。它是""。在C中,它由0长度,1字节的字符数组表示,如:

char str[1] = {'\0'};

但从概念上讲,它是唯一不包含字符的字符串。

就个人而言,我更喜欢将其称为空字符串而不是空字符串。 Null是一个过度使用的词。空字符。空指针。