gpt4 book ai didi

c++ - 带有一些符号的单独 shell 命令

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:21 25 4
gpt4 key购买 nike

我正在使用 C++ 作为编码语言来实现 shell。

基本上,我定义了一个 char *argv[128] 来通过 strtok 空间存储命令。

所以如果我输入ls -a -l > test.txt它将变成

ls
-a
-l
>
test.txt

我想要做的是分离'>'符号,这样我就可以继续实现重定向和管道功能。

我想定义一个 vector 来存储 ls-a-l 和 test.txt,并让程序执行重定向功能。

我怎样才能做到这一点?

最佳答案

您应该为您的 shell 定义词汇约定。例如,在 POSIX shell 中,您可以通过以下方式传递带有空格的参数:引用它或用反斜杠转义它,例如
ls > 'file name with spaces'得到 ls 的输出到一个名为 file name with spaces单个文件中

如果使用 C++ 进行编码,您应该使用真正的 C++ 功能。所以你会将该行读入 std::string 使用 std::getline 。然后您应该对该字符串进行标记,即将其转换为标记序列。有些标记是特殊的(因此 > 与引用的 '>' 等不同...)。所以定义一个class Token并实现一个解析器,它给出 std::vector<Token>来自您之前阅读过的一行(类型为 std::string )。

当然,您需要了解一些syscalls ,所以请阅读例如Advanced Linux Programming 。例如,cd必须是调用 chdir(2) 的 shell 内置命令。重定向需要使用dup2(2)open(2) 。管道需要使用pipe(2)等等....

顺便说一句,你应该查看 free software 的源代码shell(并使用 strace 来了解它们的作用)。大多数都是用 C 编码的(例如 GNU bashsash ),但是 fish用 C++ 编码。

关于c++ - 带有一些符号的单独 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29911082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com