在C中模拟shell命令行

时间:2017-03-31 14:17:19

标签: c linux shell

我想在C中模拟以下shell命令行,使用execl():

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

知道这意味着什么吗? 感谢

2 个答案:

答案 0 :(得分:1)

所有重定向,无论是管道(|)还是重定向到文件(<<<>>>等)都只是由shell处理。当您在execx调用中传递它们时,它们只是作为新程序的附加参数传递。

无论如何,execl用新的替换原始程序,因此execl之后的任何内容都从未执行过,除非execl返回错误。正确的方法是为进程间通信设置管道,fork以获取进程数,将标准io重定向到管道,然后才执行新程序。

答案 1 :(得分:0)

此:

 "" ""

不会创建包含双引号字符串的字符串。它通过将一个空字符串(第一个""对)与另一个空字符串(第二个""对)连接起来,创建一个空字符串。请记住,C会自动连接相邻的双引号字符串文字("foo" "bar""foobar"相同)。

无论如何,引号不应传递给cut。你的意思是:

" "

更新:另一方面,你很可能不应该引用这个空间。 exec()函数系列默认情况下不会通过shell,引用是针对shell的。您确实想要将空格传递给cut,因此您应该直接使用" "