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