我需要强制我的 C++ QT4 应用程序从 Linux 命令读取结果。我正在尝试使用 Qprocess,但是一旦我的命令变得复杂,它就会以某种方式变得混乱(只是猜测)并且不起作用。
这里我试着给大家举一个小例子:
QProcess process;
command = "ls -l | grep a | sort";
qDebug() << "Execute command -> "+command;
process.start( command );
process.waitForFinished(-1);
QString processStdout = process.readAllStandardOutput();
QString processStderr = process.readAllStandardError();
qDebug() << "Std out -> "+processStdout;
qDebug() << "Std err -> "+processStderr;
这将打印:
Execute command -> ls -l | grep a | sort
"Std out -> "
"Std err -> ls: |: No such file or directory
while 会从控制台正确打印符文的文件名。
如果我用更简单的东西替换逗号,例如command = "ls -l";
它工作不顺利
该错误由操作系统返回标准错误。
因此我猜想用于该命令的 Qstring 会以某种方式被操纵。知道发生了什么吗?
QProcess
不支持 shell 命令。因此,管道符号不会由 shell 解释,而是直接传递给ls
. ls
将其解释为文件名,并抱怨,因为显然没有名为的文件|
.
您需要通过重定向 QProcess 对象的输入和输出流来手动设置管道。阅读文档以了解如何执行此操作。
一般来说,应该如何避免 shell 命令,而依赖 Qt 类和函数。当然不需要打电话grep
or ls
,因为同样可以更容易地完成QRegExp
, and QDir
。如果需要执行子进程,则使用::start(const QString&, const QStringList&, OpenMode)
重载并将所有参数作为列表传递以避免引用问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)