簡體   English   中英

C UNIX Shell execvp回聲

[英]C UNIX Shell execvp Echoing Quotes

因此,我正在用C語言編寫一個基本的UNIX minishell。一切都進行得很順利,但是最近我重新定義了它從控制台獲取的原始字符串中解析參數的方式。 這是解析方式的示例:

$> echo HELLO "" WORLD!
HELLO "" WORLD!

參數數組如下所示:[echo0,HELLO0,“” 0,WORLD!0]

我像這樣通過它:

execvp(args[0], args);

但是,回聲應該省略引號,並且如您所見,它會將引號打印出來。 由於在我的情況下echo不是內置命令,因此我無法自定義它的打印方式。 有人知道為什么會這樣嗎? 我想省略雙引號,但包括其他所有字符(當然除了null)。 但是,空字符串本身就算作一個參數,因此:

echo HELLO "" WORLD!

應該輸出:

HELLO  WORLD!

中間有2個空格,不是:

HELLO WORLD!

只有一個(因為一個空字符串是一個參數)。

我希望這不會太令人困惑。 如果您需要任何澄清,請詢問; 我很樂意發布代碼。

它是解析命令行時帶引號的shell。 如果將它們直接傳遞給exec*調用,則echo將回顯它們。 這相當於echo HELLO '""' WORLD!

/bin/echo不知道引號。 它只是打印所有用空格分隔的參數。 您說的對shell起作用的原因是,shell知道引號並將一個空字符串作為第二個參數傳遞。

#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()時,沒有外殼可以解釋I / O重定向等,盡管在這種情況下,因為我已經為echo命令指定了路徑,所以execv()也會做得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM