【发布时间】:2012-10-07 04:56:19
【问题描述】:
我正在用 C 语言制作一个 minishell,我正在考虑环境变量。我从用户那里获取原始输入行,并将其传递给函数:
int expand(char *orig, char *new, int newsize)
new 是一个固定长度的字符数组。我遍历 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 读入参数列表之前存在一个空终止符。
我知道这是一个模糊的问题,但我认为你们中的一些人在制作 minishell 方面非常有经验,并且知道通常如何解决这个问题。
【问题讨论】:
标签: c shell unix environment-variables expansion