為什么要用xargs,問題的來源
在工作中經常會接觸到xargs命令,特別是在別人寫的腳本里面也經常會遇到,但是卻很容易與管道搞混淆,本篇會詳細講解到底什么是xargs命令,為什么要用xargs命令以及與管道的區別。為什么要用xargs呢,我們知道,linux命令可以從兩個地方讀取要處理的內容,一個是通過命令行參數,一個是標準輸入。例如cat、grep就是這樣的命令,舉個例子:
echo 'main' | cat test.cpp
這種情況下cat會輸出test.cpp的內容,而不是'main'字符串,如果test.cpp不存在則cat命令報告該文件不存在,并不會嘗試從標準輸入中讀取。echo 'main' | 會通過管道將 echo 的標準輸出(也就是字符串'main')導入到 cat 的標準輸入,也就是說此時cat的標準輸入中是有內容的,其內容就是字符串'main'但是上面的內容中cat不會從
它的標準輸入中讀入要處理的內容。(注:標準輸入是有一個緩沖區的,就像我們在程序中使用scanf函數從標準輸入中讀取一樣,實際上是從標準輸入的緩沖區中讀取的)。其實基本上linux的命令中很多的命令的設計是先從命令行參數中獲取參數,然后從標準輸入中讀取,反映才程序上,命令行參數是通過main函數的 int main(int argc,char*argv[]) 函數參數獲得的,而標準輸入則是通過標準輸入函數例如C語言中的scanf讀取到的。他們獲取的地方是不一樣的。例如:
echo 'main' | cat
這條命令會中cat會從其標準輸入中讀取內容并處理,也就是會輸出 'main' 字符串。echo命令將其標準輸出的內容 'main' 通過管道定向到 cat 的標準輸出中。
cat
如果僅僅輸入cat并回車,則該程序會等待輸入,我們需要從鍵盤輸入要處理的內容給cat,此時cat也是從標準輸入中得到要處理的內容的,因為我們的cat命令行中也沒有指定要處理的文件名。大多數命令有一個參數 - 如果直接在命令的最后指定 - 則表示從標準輸入中讀取,
例如:
echo 'main' | cat -
這樣也是可行的,會顯示 'main' 字符串,同樣輸入 cat - 直接回車與輸入 cat 直接回車的效果也一樣,但是如果這樣呢:
echo 'main' | cat test.cpp -
同時指定test.cpp 和 - 參數,此時cat程序還是會顯示test.cpp的內容。但是有一個程序的策略則不同,它是grep,例如:
echo 'main' | grep 'main' test.cpp -
該命令的輸出結果是:
test.cpp:int main()(standard input):main
此時grep會同時處理標準輸入和文件test.cpp中的內容,也就是說會在標準輸入中搜索 'main' 也會在文件 test.cpp (該文件名從grep命令行參數中獲得)中搜索 'main'。也就是說當命令行中 test.cpp 和 - 兩個參數同時存在的時候,不同的程序處理不同。我們看到了cat與grep處理就不同。但是有一點是一樣的 首先在命令行中查找要處理的內容的來源(是從文件還是從標準輸入,還是都有),如果在命令行中找不到與要處理的內容的來源相關的參數則默認從標準
新聞熱點
疑難解答