2012-08-17 49 views

回答

2

不,shell不會爲你解析它。每個程序都必須自行解析。下面的代碼應該清楚發生了什麼。

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    printf("argc: %d\n", argc); 
    for (i = 0; i < argc; i++) { 
     printf("argv[%d] = %s\n", i, argv[i]); 
    } 
    return 0; 
} 

讓我們來編譯這個程序。

[email protected]:~$ gcc args.c -o args 

現在讓我們來運行這個,看看輸出:

[email protected]:~$ ./args 
argc: 1 
argv[0] = ./args 
[email protected]:~$ ./args foo bar 
argc: 3 
argv[0] = ./args 
argv[1] = foo 
argv[2] = bar 
[email protected]:~$ ./args -a foo --b bar 
argc: 5 
argv[0] = ./args 
argv[1] = -a 
argv[2] = foo 
argv[3] = --b 
argv[4] = bar 

殼做的唯一的事情就是通過在命令行程序指定每個參數。雖然它會通過foo bar作爲您程序的兩個獨立參數,但它會通過"foo bar"'foo bar'作爲您程序的單個參數。是的,所以在將參數傳遞給程序之前,shell會對參數進行某種解析。它將引用的字符串視爲單個參數。下面是一個演示:

[email protected]:~$ ./args -a foo bar 
argc: 4 
argv[0] = ./args 
argv[1] = -a 
argv[2] = foo 
argv[3] = bar 
[email protected]:~$ ./args -a "foo bar" 
argc: 3 
argv[0] = ./args 
argv[1] = -a 
argv[2] = foo bar 
[email protected]:~$ ./args -a 'foo bar' 
argc: 3 
argv[0] = ./args 
argv[1] = -a 
argv[2] = foo bar 
[email protected]:~$ ./args -a "foo bar" 'car tar war' 
argc: 4 
argv[0] = ./args 
argv[1] = -a 
argv[2] = foo bar 
argv[3] = car tar war 
1

每個程序都必須解析所有參數本身。用破折號前綴它們只是Unix慣例。

7

每個程序都解析它的參數。你可能會想看看getopt這樣的答案變成:每個程序通常依靠getopt解析參數

1

不,shell不解析這些選項。每個程序都必須自行解析。

1

shell將命令行分割爲空格,以便程序接收參數列表;但是由程序決定他們的意思。通常使用像getopt這樣的參數解析庫來提供幫助。

0

程序參數不是shell的問題。

(簡化)命令行語法是:命令選項操作數
選項以連字符(短劃線)開頭,操作數沒有,選項沒有排序,操作數是有序的。

這雖然只是一個慣例,而不是法律。最爲人熟知的標準通常被稱爲POSIX標準,它定義了命令行here

您可能會注意到,選項是以單個連字符作爲前綴的單個字符,您的示例顯示了帶有多個字符的兩個連字符--bar。這些被稱爲長選項並不嚴格地作爲標準的一部分,儘管它們通常用於GNU實用程序(Linux上的正常情況)。

如果操作數以連字符開頭會發生什麼?答案是大多數程序會將其視爲操作數。雖然有一個特殊的標記, --(兩個連字符)標記選項列表的末尾,因此以下任何內容都只是操作數。