繁体   English   中英

ls通过管道传递到命令行

[英]ls piped into the command line

我一直试图将ls的结果通过管道传递到我正在编写的C程序的命令行(在Unix中)。 我希望能够拥有文件的索引,因此我打算使用argv。 这就是我认为应该起作用的方式:

./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 *.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]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM