0

所以我正在用 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!

中间有 2 个空格,不是:

HELLO WORLD!

只有一个(因为空字符串是一个参数)。

我希望这不会太令人困惑。如果你们需要任何澄清,请询问;我很乐意发布代码。

4

3 回答 3

2

它是在解析命令行时去掉引号的 shell。如果您将它们传递exec*给直接调用,则 echo 会回显它们。那么它相当于echo HELLO '""' WORLD!.

于 2012-10-14T20:27:52.453 回答
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);
}

这表明了差异。当您使用时,没有解释 I/O 重定向等的 shell execvp()— 尽管在这种情况下,execv()由于我已经指定了echo命令的路径,所以也可以。

于 2012-10-14T20:52:49.790 回答
1

/bin/echo不知道报价。它只是打印由空格分隔的所有参数。您所说的适用于外壳的原因是外壳知道引号并将空字符串作为第二个参数传递。

于 2012-10-14T20:30:56.160 回答