首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分析Linux libreadline中的引号和双引号行

问分析Linux libreadline中的引号和双引号行
EN

Stack Overflow用户
提问于 2020-09-02 10:56:28
回答 1查看 41关注 0票数 0

我用C语言编写了我自己的libreadline Linux库。在readline()中,它从shell中获取代码行,并用空格字符进行解析,然后将其存储到一个指针变量中。现在,我希望解析这些行来获取命令行参数,这些参数包含命令和执行命令的文件名。

在这里,我遇到了一个问题,如果文件名有空格的名称,它会像下面这样解析

代码语言:javascript
复制
myshell$ ls 'file name 1' 'file name 2' file\ name\ 3

上面的cli是这样解析的

代码语言:javascript
复制
ls
'file
name
1'
'file
name
2'
file\
name\
3

所以,请帮助我解决这个问题,从读取行中获取空格文件名。

下面是我称之为readline的代码片段。

代码语言:javascript
复制
    while (!done)
    {
        temp = readline (prompt);

        /* Test for EOF. */
        if (!temp)
            exit (1);

        /* If there is anything on the line, print it and remember it. */
        if (*temp)
        {
            add_history (temp);
        }

        <Other stuffs to execute the command>
    }

使用tokeniser更新了文章。

代码语言:javascript
复制
    ptr = strtok(temp, " ");
    while(ptr != NULL) {
        printf("%s\n", ptr);
        ptr = strtok(NULL, " ");
    }
EN

回答 1

Stack Overflow用户

发布于 2020-09-02 19:03:43

即使是这种复杂程度的标记化,也很难使用strtok()的简单应用来实现。即使你能让它工作,代码也是不可读和不可维护的。有一些工具(如flex)可以根据规范生成记号赋予器,您也可以使用有限状态机(FSM)自己编写逻辑代码。使用FSM,您将检查每个字符,并根据标记器的当前状态采取操作。某些状态/字符组合将导致状态更改。

例如,如果您处于“双引号”状态,则不会将空格视为标记的末尾。但是,双引号状态中的双引号字符将发出从该状态转换到其他状态的信号。它们之间的状态和字符类别形成了一种矩阵,其中的条目控制在遇到状态和字符类别的每个组合时采取什么操作。

FWIW我有一个简单的实现,可以按照您想要的行来解析ASCII文本;请参阅以下代码中的tokenize()函数:

https://github.com/kevinboone/xine-server/blob/master/client/src/string.c

如果您正在创建一个shell,请注意“真正的”shell中的标记化逻辑非常复杂,并且通常使用工具实现。此外,大多数现代的真实应用程序都需要宽字符支持,这又增加了一层复杂性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63698034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档