我一直在試圖將結果從ls
輸入到我正在編寫的C程序(在Unix中)的命令行中。我希望能夠有一個文件的索引,所以我打算使用argv。這是我認爲它應該工作:ls輸入到命令行
./foo &(ls ~/path)
它不工作 - 什麼是對的ls
輸出作爲參數傳遞給命令的正確方法是什麼?
我一直在試圖將結果從ls
輸入到我正在編寫的C程序(在Unix中)的命令行中。我希望能夠有一個文件的索引,所以我打算使用argv。這是我認爲它應該工作:ls輸入到命令行
./foo &(ls ~/path)
它不工作 - 什麼是對的ls
輸出作爲參數傳遞給命令的正確方法是什麼?
你的語法是位關閉...
./foo $(ls ~/path)
請注意,這將窒息在他們的某些字符的文件。使用數組來解決這個問題。
pushd ~/path
files=(*)
popd
./foo "${files[@]}"
您指定的符號做了兩兩件事:
./foo &
在後臺運行程序foo
(比它的命令名其他無參數)。然後:
(ls ~/path)
運行在一個子殼(在這種情況下,是與在主殼體運行的話)的ls
命令。問題是您打算(或需要)使用$
代替&
。
./foo $(ls ~/path)
此運行命令ls ~/path
並捕獲輸出,它被分裂成單詞(使用$IFS
變量中列出的分離器)。根據需要,每個單詞隨後將作爲參數提供給命令./foo
。
然後,我們可以辯論使用ls
這樣的輸出的智慧,但除非你有包含空格(製表符,換行符等)的文件名,否則你會沒事的。
你知道Unix工具如何接受glob模式,所以你可以做cat *.txt
或rm ~/Pictures/Vacation*.jpg
,而不必管/擴展ls
?
這是您的shell爲您的程序免費提供的功能!
只需使用./foo ~/path/*
和argv[1]
將包含/home/you/path/fileone
,argv[2]
將包含/home/you/path/filetwo
,等等。
這些文件名可能是相對或絕對的,但可以始終直接傳遞給open
/fopen
/execve
或您想使用的任何功能。
使用ls
你描述只會給你沒有目錄的文件名的最後一部分,這樣你就不會知道那裏的文件將它們做任何事情(不過,如果這就是你想要什麼,只是用basename(argv[1]))
。