我一直在尝试将结果ls
从命令行输入我正在编写的 C 程序(在 Unix 中)。我希望能够拥有文件的索引,所以我打算使用 argv。这就是我认为它应该工作的方式:
./foo &(ls ~/path)
它不起作用 - 将输出ls
作为参数传递给命令的正确方法是什么?
你的语法有点不对...
./foo $(ls ~/path)
请注意,这会阻塞包含某些字符的文件。请改用数组来解决此问题。
pushd ~/path
files=(*)
popd
./foo "${files[@]}"
您指定的符号有两件事:
./foo &
在后台运行程序foo
(除了命令名之外没有其他参数)。然后:
(ls ~/path)
ls
在子 shell 中运行命令(在此上下文中,与在主 shell 中运行命令相同)。问题是您打算(或需要)使用$
.&
./foo $(ls ~/path)
这将运行命令并捕获输出,该输出被拆分为单词(使用变量ls ~/path
中列出的分隔符)。$IFS
然后根据需要将每个单词作为参数提供给 command ./foo
。
然后我们可以讨论使用这样的输出是否明智ls
,但除非您的文件名包含空格(制表符、换行符等),否则您会没事的。
您知道 Unix 工具如何接受 glob 模式,因此您可以执行cat *.txt
or rm ~/Pictures/Vacation*.jpg
,而无需管道/扩展ls
?
这是你的 shell 为你的程序免费提供的一种能力!
只需使用./foo ~/path/*
and argv[1]
will contain /home/you/path/fileone
,argv[2]
will contain/home/you/path/filetwo
等等。
这些文件名可能是相对的或绝对的,但始终可以直接传递给open
//fopen
或execve
您要使用的任何函数。
按照你的描述使用ls
只会给你文件名的最后一部分,没有目录,所以你不知道文件在哪里对它们做任何事情(尽管如果这是你想要的,只需使用basename(argv[1]))
.