0

我一直在尝试将结果ls从命令行输入我正在编写的 C 程序(在 Unix 中)。我希望能够拥有文件的索引,所以我打算使用 argv。这就是我认为它应该工作的方式:

./foo &(ls ~/path)

它不起作用 - 将输出ls作为参数传递给命令的正确方法是什么?

4

3 回答 3

4

你的语法有点不对...

./foo $(ls ~/path)

请注意,这会阻塞包含某些字符的文件。请改用数组来解决此问题。

pushd ~/path
files=(*)
popd
./foo "${files[@]}"
于 2013-02-07T03:55:32.503 回答
2

您指定的符号有两件事:

./foo &

在后台运行程序foo(除了命令名之外没有其他参数)。然后:

(ls ~/path)

ls在子 shell 中运行命令(在此上下文中,与在主 shell 中运行命令相同)。问题是您打算(或需要)使用$.&

./foo $(ls ~/path)

这将运行命令并捕获输出,该输出被拆分为单词(使用变量ls ~/path中列出的分隔符​​)。$IFS然后根据需要将每个单词作为参数提供给 command ./foo

然后我们可以讨论使用这样的输出是否明智ls,但除非您的文件名包含空格(制表符、换行符等),否则您会没事的。

于 2013-02-07T04:02:18.503 回答
0

您知道 Unix 工具如何接受 glob 模式,因此您可以执行cat *.txtor rm ~/Pictures/Vacation*.jpg,而无需管道/扩展ls

这是你的 shell 为你的程序免费提供的一种能力!

只需使用./foo ~/path/*and argv[1]will contain /home/you/path/fileoneargv[2]will contain/home/you/path/filetwo等等。

这些文件名可能是相对的或绝对的,但始终可以直接传递给open//fopenexecve您要使用的任何函数。

按照你的描述使用ls只会给你文件名的最后一部分,没有目录,所以你不知道文件在哪里对它们做任何事情(尽管如果这是你想要的,只需使用basename(argv[1])).

于 2013-02-07T05:25:51.980 回答