2013-02-07 216 views
0

我一直在試圖將結果從ls輸入到我正在編寫的C程序(在Unix中)的命令行中。我希望能夠有一個文件的索引,所以我打算使用argv。這是我認爲它應該工作:ls輸入到命令行

./foo &(ls ~/path) 

它不工作 - 什麼是對的ls輸出作爲參數傳遞給命令的正確方法是什麼?

回答

4

你的語法是關閉...

./foo $(ls ~/path) 

請注意,這將窒息在他們的某些字符的文件。使用數組來解決這個問題。

pushd ~/path 
files=(*) 
popd 
./foo "${files[@]}" 
2

您指定的符號做了兩兩件事:

./foo & 

在後臺運行程序foo(比它的命令名其他無參數)。然後:

(ls ~/path) 

運行在一個子殼(在這種情況下,是與在主殼體運行的話)的ls命令。問題是您打算(或需要)使用$代替&

./foo $(ls ~/path) 

此運行命令ls ~/path並捕獲輸出,它被分裂成單詞(使用$IFS變量中列出的分離器)。根據需要,每個單詞隨後將作爲參數提供給命令./foo

然後,我們可以辯論使用ls這樣的輸出的智慧,但除非你有包含空格(製表符,換行符等)的文件名,否則你會沒事的。

0

你知道Unix工具如何接受glob模式,所以你可以做cat *.txtrm ~/Pictures/Vacation*.jpg,而不必管/擴展ls

這是您的shell爲您的程序免費提供的功能!

只需使用./foo ~/path/*argv[1]將包含/home/you/path/fileoneargv[2]將包含/home/you/path/filetwo,等等。

這些文件名可能是相對或絕對的,但可以始終直接傳遞給open/fopen/execve或您想使用的任何功能。

使用ls你描述只會給你沒有目錄的文件名的最後一部分,這樣你就不會知道那裏的文件將它們做任何事情(不過,如果這就是你想要什麼,只是用basename(argv[1]))