我有一个 GUI C++ 程序,它从用户那里获取一个 shell 命令,调用 forkpty() 和 execvp() 在子进程中执行该命令,而父 (GUI) 进程读取子进程的 stdout/stderr 输出和在 GUI 中显示它。
这一切都很好(在 Linux 和 MacOS/X 下)。例如,如果用户输入“ls -l /foo”,GUI 将显示 /foo 文件夹的内容。
但是,不处理诸如输出重定向之类的 bash 细节。例如,如果用户输入“echo bar > /foo/bar.txt”,子进程将输出文本“bar > /foo/bar.txt”,而不是将文本“bar”写入文件“/ foo/bar.txt”。
这大概是因为 execvp() 直接运行可执行命令“echo”,而不是运行 /bin/bash 并将用户的命令交给按摩/预处理。
我的问题是,为了使系统的行为与用户在 bash 提示符下键入他的字符串完全一样,要使用什么正确的子进程调用?我尝试使用 /bin/bash 调用来包装用户的命令,如下所示:/bin/bash -c the_string_the_user_entered,但这似乎不起作用。有什么提示吗?
ps 只调用 system() 不是一个好的选择,因为它会导致我的 GUI 阻塞,直到子进程退出,并且一些子进程可能不会退出很长时间(如果有的话!)