所以我在C中编写一个基本的UNIX minishell。一切都进展顺利,但是我最近重新调整了从控制台获取的原始字符串中解析参数的方式。以下是解析方式的示例:
$> echo HELLO "" WORLD!
HELLO "" WORLD!
参数数组如下所示:[echo0,HELLO0,“”0,WORLD!0]
我这样传递:
execvp(args[0], args);
然而,echo应该省略引号,正如你可以看到它打印出来的那样。由于echo在我的情况下不是内置命令,我无法自定义它的打印方式。有人知道为什么会这样吗?我想省略双引号,但包括所有其他类型的字符(当然除了null)。但是,空字符串本身就是一个参数,所以:
echo HELLO "" WORLD!
应输出:
HELLO WORLD!
中间有两个空格,而不是:
HELLO WORLD!
只有一个(因为空字符串是一个参数)。
我希望这不会太混乱。如果你们需要任何澄清,请问一下;我很乐意发布代码。
答案 0 :(得分:2)
解析命令行时,它会删除引号。如果您直接将它们传递给exec*
,则回声会回应它们。它等于echo HELLO '""' WORLD!
。
答案 1 :(得分:1)
/bin/echo
不知道引号。它只是打印由空格分隔的所有参数。您所说的与shell一起工作的原因是shell知道引号并将空字符串作为第二个参数传递。
答案 2 :(得分:1)
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
char *args1[] = { "/bin/echo", "HELLO", "\"\"", "WORLD!", 0 };
char *args2[] = { "/bin/echo", "HELLO", "", "WORLD!", 0 };
if (fork() == 0)
{
execvp(args1[0], args1);
exit(1);
}
while (wait(0) > 0)
;
execvp(args2[0], args2);
return(1);
}
这表明了不同之处。当你使用execvp()
时,没有shell来解释I / O重定向等 - 尽管在这种情况下,execv()
也会这样做,因为我已经为echo
命令指定了路径。 / p>