我正在努力创建自己的shell。
我为用户输入创建了词法分析器和解析器(创建二叉树)。 所以对于这样的命令: cat main.c | ls | WC
我得到了这棵树:
"|"
/ \
/ \
/ \
"cat main.c" "|"
/ \
/ \
"ls" "wc"
所以我的树遍历功能(按顺序)是这样的:
inorder(root)
{
inorder(root->left);
//exec cmd and do redirection
inorder(root->right);
}
我的问题是当我在节点“ls”或“wc”时,我不知道如何 检查命令之前和之后是否有管道。
有什么想法吗?
答案 0 :(得分:1)
在您的解析树中,管道是节点,命令是叶子。管道必须同时具有左右分支。当您从管道向左移动时,您现在所在的管道就是您要执行的命令的输出管道。当你向右走的时候,你所在的管道就是目的地命令的管道。
因此将入口和出口管道作为参数传递。如果该命令或其中一个NULL
节点没有重定向,则它们指向|
。
inorder(root, in, out)
{
if (root is cmd) {
execute(root, in, out);
} else {
// root is pipe
inorder(root->left, in, root);
redirect(in, out);
inorder(root->right, root, out);
}
}
使用inorder(root, NULL, NULL)
从树的根开始。