Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt qprocess获取类shell行为_Qt_Shell_Qprocess - Fatal编程技术网

Qt qprocess获取类shell行为

Qt qprocess获取类shell行为,qt,shell,qprocess,Qt,Shell,Qprocess,我正在windows(不知道这是否重要)应用程序中使用QT,希望使用QProcess从我的应用程序启动一些进程。 (实际上是通过使用QProcess的qtscript包装器) 这似乎可行,但在使用更高级的命令行(如使用管道连接程序)时,我遇到了问题 如果我使用以下程序行启动流程: QProcess proc; QString command = "grep \"false negatives\" test.txt | cut -f2"; proc.start(command); grep命令抱

我正在windows(不知道这是否重要)应用程序中使用QT,希望使用
QProcess
从我的应用程序启动一些进程。 (实际上是通过使用
QProcess
的qtscript包装器)

这似乎可行,但在使用更高级的命令行(如使用管道连接程序)时,我遇到了问题

如果我使用以下程序行启动流程:

QProcess proc;
QString command = "grep \"false negatives\" test.txt | cut -f2";
proc.start(command);
grep命令抱怨找不到文件“2”。因此,很明显,命令行并不像我期望的那样被解释

如果我在命令前面加上一个
cmd/C
,它会工作得很好,但这显然不再是独立于操作系统的,并且可能会有一些关于命令行参数的额外警告

有没有类似Qt的方法来处理这个问题,并强制Qt使用一些默认的命令行解释器

有没有类似Qt的方法来处理这个问题,并强制Qt使用一些默认的命令行解释器

简单的答案是否定的,没有Qt默认的命令行解释器

QString command = "grep \"false negatives\" test.txt | cut -f2";
此命令不起作用,因为QProcess获取第一个令牌(grep)并将其用作命令,然后将每个项传递给该命令,并用空格分隔。在这种情况下,pipe命令不是grep的有效参数,既不是cut,也不是-f2

我评论说,的答案可能与之类似,因为它演示了如何将pipe命令成功地用于QProcess;请注意,参数用引号括起来

由于您不想调用cmd或*nix等价物(如bash),您可以通过两次调用QProcess来处理这个问题;第一个用于grep命令,第二个用于cut,传入第一个QProcess调用的输出

该函数使这变得更容易,允许您直接在两个QProcess对象之间创建管道

因此,您可以这样做:-

QProcess proc1;
QProcess proc2;

proc1.setStandardOutputProcess(&process2);

QString cmd1("grep \"false negatives\" test.txt");
QString cmd2("cut -f2");

proc1.start(cmd1);
proc2.start(cmd2);

@Merlin069的可能重复项它不是重复项。问题是不同的。我的问题中已经提到了链接问题(通过shell调用命令)的答案。请显示对QProcess start的完整调用,不仅仅是命令行参数。@Merlin069完成,但这没有什么特别之处。只需调用“bash-c command1 | command2”或“cmd/c command1 | command2”实际的命令字符串由从JavaScript调用QProcess包装器的脚本用户定义;如果找到它们,您就知道必须创建新的QProcess、拆分字符串并设置标准输出,并根据需要链接它们。这并不容易,因为参数分隔符在不同的系统上是不同的(windows不支持单引号)。管道符号可能在参数中作为普通文本符号(regex)出现。。。很多警告,除非有人无意中发现,否则你永远不会在意。管道之后的下一件事是输入和输出文件重定向或错误通道重定向。。。一个普通的shell allready已经实现了很多东西。为什么要重新实施它?(看一看)如果我是你,我只需使用#ifdef_平台并调用相关的命令行解释器,直接传递字符串。如果你使用Windows、OSX和linux,你只有两个解释器;cmd和bash,或者任何你喜欢的*nix。是的,这是显而易见的方法。我的希望是一些基本的东西被一些Qt的东西所覆盖。当然,这些都是特定于操作系统的功能,不一定兼容(但幸运的是,最基本的东西,如stdout/stderr重定向(文件和管道)是)