Qprocess混淆了我的linux命令(我认为).怎么修?

Ste*_*ano 3 c++ linux qt qprocess

我需要强制我的c ++ QT4应用程序从linux命令读取结果.我正在尝试使用Qprocess但是一旦我的命令变得复杂,它就会以某种方式混乱(只是猜测)并且不起作用.

在这里,我尝试为yu做一个小例子:

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;
Run Code Online (Sandbox Code Playgroud)

这将打印:

Execute command -> ls -l | grep a | sort
"Std out -> " 
"Std err -> ls: |: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果从consol中删除,将正确打印文件名.

如果我用更简单的方式替换command = "ls -l";comman , 那么它可以顺利工作.操作系统在标准错误中返回错误.

因此,我猜测用于命令的Qstring会以某种方式被操纵.关于wht发生的任何想法?

lun*_*orn 7

QProcess不支持shell命令.因此管道符号不是由shell解释,而是直接传递给ls. ls将其解释为文件名,并抱怨,因为显然没有命名的文件|.

您需要通过重定向QProcess对象的输入和输出流来手动设置管道.阅读文档以了解如何执行此操作.

一般应该如何避免shell命令,而是依赖于Qt类和函数.肯定没有必要打电话,grep或者ls因为同样的事情可以更轻松地完成QRegExp,并且QDir.如果需要执行子进程,则使用::start(const QString&, const QStringList&, OpenMode)重载并将所有参数作为列表传递以避免引用问题.

  • 同样的问题.*通配符也由shell解释.在shell上发生的是,替换通配符并使用所有匹配的文件调用该命令.如果使用QProcess,则不进行此类替换,并将grep称为egrep"/ user/*/mydir/*"(注意",即将模式作为参数提供给egrep).尝试使用"on the shell你会遇到同样的问题. (3认同)