【问题标题】:How can I deal with null environmental variables in my minishell?如何在我的 minishell 中处理 null 环境变量?
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 他不是那个意思,因为如果你在 UNIX shell 中这样做,它不会有额外的空间。我说的是预辩论清单。这只是将原始字符串处理为扩展字符串。将变量替换为空将简单地忽略它的存在。
    • @Scriptonaut 是的,从存在中忽略它是真正的 shell 所做的。
    • @Scriptonaut 之所以有两个空格是因为双引号。
    • @Scriptonaut 注意他写的是空字符串而不是空字符。他的描述非常简洁,但它是正确的。幸运或不幸的是,这就是您在 UNIX 系统上获得的那种文档。技术上正确,绝对准确,没有一个词浪费在解释这到底是什么意思上。
    • @Scriptonaut 我在回答中添加了解释。
    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多