我使用C ++作为编码语言来实现shell。
基本上我通过strtok空间定义了一个char *argv[128]
来存储命令。
因此,如果我输入ls -a -l > test.txt
,则会转到
ls
-a
-l
>
test.txt
我想要做的是分开'>'符号所以我可以继续实现重定向和管道功能。
我想定义一个向量来存储ls-a-l和test.txt,让程序执行重定向功能。
我该怎么做?
答案 0 :(得分:0)
您应该为shell定义词法约定。例如,在POSIX shell中,您可以通过例如空格传递参数。引用它或使用反斜杠转义它,例如在UIFont
中将ls > 'file name with spaces'
的输出转换为名为ls
的单个文件
如果使用C ++编码,则应使用正版C ++功能。因此,您可以使用std::string
将该行读入std::getline
。然后你应该标记该字符串,即将其转换为一系列标记。有些令牌很特殊(因此file name with spaces
与引用的>
等不同......)。因此,定义一个'>'
并实现一个解析器,该解析器从您之前读过的一行(类型为class Token
)中提供std::vector<Token>
。
当然,您需要了解一些syscalls, Advanced Linux Programming。例如,std::string
必须是内置的shell,调用chdir(2)。重定向需要使用dup2(2)和open(2)。管道需要使用pipe(2)等....
cd
来了解它们的用途)。大多数用C编码(例如GNU bash或strace
),但fish用C ++编码。
答案 1 :(得分:-1)
如果要分隔词法符号,则应定义词汇约定。您可以使用flex ++为您生成解析器。
如果要在shell中进行重定向,请尝试方法dup2() 您可以找到similar Q&A here。