QProcess 传递(shell)参数

Posted

技术标签:

【中文标题】QProcess 传递(shell)参数【英文标题】:QProcess passing (shell) arguments 【发布时间】:2017-06-10 09:45:02 【问题描述】:

我正在尝试在 Qt 中读取 shell 脚本的输出。但是,将参数传递给 shell 脚本不起作用,因为它被完全忽略了。我在以下摘录中做错了什么?

QProcess *process = new QProcess;
process->start("sh", QStringList() << "-c" << "\"xdotool getactivewindow\"");
process->waitForFinished();
QString output = process->readAllStandardOutput();
target = output.toUInt();

我查看了其他几个线程并尝试了解决方案,例如

process->start("sh", QStringList() << "-c" << "xdotool getactivewindow");

process->start("sh", QStringList() << "-c" << "xdotool" << "getactivewindow");

但没有任何效果。

【问题讨论】:

process-&gt;start("xdotool", QStringList() &lt;&lt; "getactivewindow"); 有效吗?如果你自己在shell中执行命令是什么? 在 shell 中我执行 xdotool getactivewindow。并且谢谢,process-&gt;start("xdotool", QStringList() &lt;&lt; "getactivewindow"); 工作!我怀疑原因是只有一个命令没有任何空间可以逃脱。所以最初的问题仍然没有解决。 【参考方案1】:

我希望您的第二种方法应该有效。

我使用以下脚本 (test.sh) 对其进行了测试:

#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"

我通过以下方式使用QProcess 调用脚本:

QProcess *process = new QProcess;
process->start("./test.sh", QStringList() << "abc" << "xyz");
process->waitForFinished();
qDebug () << process->readAllStandardOutput();
// returns: "First arg: abc\nSecond arg: xyz\n" => OK

process->start("sh", QStringList() << "-c" << "./test.sh abc xyz");
process->waitForFinished();
qDebug () << process->readAllStandardOutput();
// returns: "First arg: abc\nSecond arg: xyz\n" => OK

process->start("sh", QStringList() << "-c" << "./test.sh" <<  "abc xyz");
process->waitForFinished();
qDebug () << process->readAllStandardOutput();
// returns: "First arg: \nSecond arg: \n" => WRONG

说明

process-&gt;start("sh", QStringList() &lt;&lt; "-c" &lt;&lt; "\"xdotool getactivewindow\"");:不需要(也不允许)自己引用参数。 documentation 不是很清楚,但它指出:

注意:不会对参数进行进一步拆分。

process-&gt;start("sh", QStringList() &lt;&lt; "-c" &lt;&lt; "xdotool getactivewindow");:这应该可以工作

process-&gt;start("sh", QStringList() &lt;&lt; "-c" &lt;&lt; "xdotool" &lt;&lt; "getactivewindow");: getactivewindow 作为参数传递给sh 而不是xdotool

【讨论】:

以上是关于QProcess 传递(shell)参数的主要内容,如果未能解决你的问题,请参考以下文章

QProcess 无法传递参数

如何使用 QProcess 启动 Shell 脚本?

Qt通过QProcess启动进程并传递命令行参数

Qt通过QProcess启动进程并传递命令行参数

Qt QProcess

如何在 QProcess 执行它们时打印真正的 QProcess 参数列表