2015-05-25 63 views
0

我想知道是否有某種模式或技巧要記住何時或何時不要在命令行參數中使用引號。何時在命令行中使用引號? cp與find

例如之間有什麼區別:

find -type f -name "*<extension-with-quotes>" 

cp <extension-without-quotes> ../<new-folder> 

需要一個報價和一個沒有,否則它給出了一個錯誤。爲什麼?

回答

1

,如果你不希望擴大的爭論做,而是希望通過參數逐字到任何程序你試圖運行通過你需要引號。例如,參見以下程序:

#include <stdio.h> 
int main (int argc, char *argv[]) { 
    printf ("Argument count = %d\n", argc); 
    for (int i = 0; i < argc; i++) 
     printf (" %2d: [%s]\n", i, argv[i]); 
    return 0; 
} 

其輸出其參數計數和參數。下面的記錄表明它如何與和不帶引號運行:

$ ./testprog "*.sh" 
Argument count = 2 
    0: [./testprog] 
    1: [*.sh] 

$ ./testprog *.sh 
Argument count = 7 
    0: [./testprog] 
    1: [xmit.sh] 
    2: [gen.sh] 
    3: [morph.sh] 
    4: [prog.sh] 
    5: [mon.sh] 
    6: [test.sh] 

因此,舉例來說,如果你有三個日誌文件目錄是,外殼會改變你的:

ls *.log 

到:

ls a.log b.log c.log 

之前移交清單上的ls程序(ls程序永遠不會*.log根本)。

然而,find期望一個文件模式,而不是文件的列表,所以它會*.log通過的傳遞,一個單一的參數,而不是由shell擴展三個獨立的參數。

事實上,如果你在當前目錄下只有a.log,一個沒有引號*.log會叫a.log只有查找文件不論如何在下面的目錄中存在許多其他的日誌文件。這是因爲find從來沒有看到*.log,只有殼牌擴大它的a.log


一個類似的例子是expr。如果你想知道什麼三次七是,你想要做的:

expr 3 * 7 

由於Shell將首先展開*到當前目錄下的所有文件:

3 dallas_buyers_club.avi nsa_agent_list.txt whitehouse_bomb.odt 7 

expr將不會有太大的意義。這樣做的正確的方法是沿着線:

expr 3 '*' 7 

有效維護*因此該方案得到它不變。


特別注意的國家安全局,中央情報局,美國電影協會和形成罷工恐成凡人的心其他黑暗陰影組織。該文件列表是虛構的幽默。我真的不要想讓任何穿着深色西裝的男人出現在我的前門:-)