以编程方式访问shell扩展,替换和分词

时间:2014-08-31 07:04:52

标签: c linux bash shell posix

我希望使用一些shell功能进行exec()调用。给定一个命名shell的字符串,一个命名可执行文件的字符串和一个表示命令行的字符串,如何生成一个字符串数组,这些字符串是shell传递给可执行文件的参数?

所以在我的机器上,对于shell字符串"bash",可执行字符串"tr"和命令行字符串"tr 'hi there' goodbye",我想生成数组{{1} }。

许多基本的shell功能,例如上面的单词拆分示例,都不是非常难以模拟。不过,最好直接确定当前机器上的shell的行为方式。

我不只是想运行shell命令。我想保留对其余执行上下文的控制,例如文件描述符。

具体来说,我很感兴趣是否有一种简单的方法来应用大括号扩展,波浪扩展,变量扩展,分词,文件名扩展和引用删除。

我不是在问如何实现shell。我的问题是,如果在Linux平台上有一个系统调用来执行这些操作或以任何其他方式以编程方式访问命令行解析shell。

目标是创建一个程序,该程序将被赋予一个字符串,该字符串指定要运行的可执行文件和该可执行文件的参数。程序将通过fork和exec运行特定的可执行文件,然后通过stdin和stdout与它通信。这个问题只是询问有关指定可执行文件和参数的字符串的处理方式。是否有一种简单的方法来解析命令行字符串作为shell?

要获得shell命令行解析功能,可以将shell脚本或“sh -c”样式命令提供给程序。但是,如果存在系统功能来解析命令行并使结果以编程方式可见,那将是更可取的。那存在吗?如果是这样,它是什么?

目标操作系统是linux。最重要的外壳是bash。便携性是可取的,但不是必需的。

1 个答案:

答案 0 :(得分:2)

先阅读glob(7)

回想一下shell正在扩展-i.e. globbing - {/ 1}} 之前的参数执行exec(3)函数。

在您的C代码中,您可以使用glob(3)和/或fnmatch(3),甚至更好wordexp(3)。对于文件描述符,您需要open(2)dup(2)pipe(2)以及许多其他syscalls(2)

要扫描find(1)之类的文件树,请使用nftw(3)。要只读取目录,请使用opendir(3)readdir(3)等...

在某些时候,您需要多路输入(和/或输出),因此请了解poll(2)

另请阅读Advanced Linux Programming

对于组成部分中的字符串,您可以考虑strtok(3)

实际上,您希望在程序中嵌入一些scripting interpreter。因此,请考虑GNU guilelua(并且可能更喜欢与shell提供的语法和脚本语言不同的语法和脚本语言)。

或者将您的软件设计为库并编写必要的粘合代码,将其嵌入现有脚本解释器(如Python等等)中 - 甚至(但我)可能不建议)作为现有shell的plugin

BTW,system(3)popen(3)都是一个shell。你可以仔细构建他们的参数字符串。谨防code injection,请适当引用一些论点。

附加物

编辑后

,您需要*.txt。但是,你应该小心,例如因为某些文件名或目录名可能包含空格,并且您需要将这些空格解析为名称的一部分...