[英]Emulate shell command line in C
我想用execl()在C中模拟以下shell命令行:
find . -type f -ls | cut -d " " -f 3- | sort -n -k 6 >file.txt ; less <file.txt
我把它们写成:
execl("/usr/bin/find", "find", ".", "-type", "f", "-ls", (char *)NULL);
execl("/usr/bin/cut", "cut", "-d", "" "", "-f", "3-", (char *)NULL);
execl("/usr/bin/sort", "sort", "-n", "-k", "6", ">file.txt", (char *)NULL);
execl("/usr/bin/less", "less", "<file.txt", (char *)NULL);
我也实现了管道,但出现错误:
cut: cut: -: Input/Output error -: Input/output error
知道这意味着什么吗? 谢谢
所有重定向,无论是管道( |
)还是重定向到文件( <
, <<
, >
, >>
等)都仅由外壳程序处理。 当您在execx
调用中传递它们时,它们只是作为附加参数传递给新程序。
而且无论如何, execl
用新程序替换原始程序,因此execl
之后的任何东西都不会执行,除非execl
返回错误。 正确的方法是为进程间通信设置管道,分叉以获取进程数,将标准io重定向到管道,然后才执行新程序。
这个:
"" ""
不创建包含双引号字符串的字符串。 它通过将一个空字符串(第一对""
)与另一个空字符串(第二对""
)连接来创建一个空字符串。 请记住,C自动连接相邻的双引号字符串文字( "foo" "bar"
与"foobar"
相同)。
无论如何,不应将引号传递给cut
。 你的意思是:
" "
更新:另一方面,您很可能根本不应该引用该空间。 exec()
系列函数默认情况下不会通过外壳,而引号是针对外壳的。 您确实想传递一个cut
的空间,因此应该直接用" "
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.