QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误
Posted
技术标签:
【中文标题】QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误【英文标题】:QT program containing a bash script with an if-test-then block and the escaped necessary quotes inside issues error 【发布时间】:2016-06-08 08:33:29 【问题描述】:我正在尝试在 QT 应用程序中运行一个小型 bash 脚本,其中包含一个 if-test-then 块和测试中的必要引号。由于脚本应该由 QT 编译并由 bash 运行,因此引号必须转义两次,因此在我看来,引号的转义反斜杠也必须转义。不幸的是,它没有按预期工作。
代码如下:
#include <stdio.h>
QObject *parent;
int main(int argc, const char* argv[])
QProcess *myProcess = new QProcess(parent);
myProcess->execute("/bin/bash -c \"x=1 ; echo $x ; if [ \\\"$x\\\" = \\\"1\\\" ] ; then echo itsOne ; fi\"");
当我运行编译后的程序时,我得到了输出:
root@debian:~# ./proggy
1
/bin/bash: line 0: [: missing `]'
在 bash 终端中尝试相同的脚本时,而不是此处看到的输出:
root@debian:~# x=1 ; echo $x ; if [ "$x" = "1" ] ; then echo itsOne ; fi
1
itsOne
我在 QT 程序中尝试了各种转义和引号的组合,到目前为止没有任何帮助。
有谁知道这里出了什么问题或如何解决这个谜语?不知何故,测试命令中的转义引号似乎破坏了 bash 看到的脚本。如果 test 命令中有两个必要的引号,为什么 bash 看不到右括号?
【问题讨论】:
使用raw string literal 可能会更容易。 gcc 版本是 4.4.5,因此很遗憾原始字符串文字不可用。 【参考方案1】:几点。
首先,execute 是 QProcess 的静态成员,因此无需创建 QProcess 的实例。
其次,使用execute overload 将程序名称与参数列表分开通常更容易。
考虑到这一点,您想要的可能是......
QProcess::execute("/bin/bash", QStringList() << "-c" << "x=1 ; echo $x ; if [ \\\"$x\\\" = \\\"1\\\" ] ; then echo itsOne ; fi");
【讨论】:
【参考方案2】:您的实际 bash 字符串是错误的(开头带有 /bin/bash 的字符串,而不是原始字符串)。首先在 bash 中调试它,因为这在 bash 中不起作用:
/bin/bash -c "x=1 ; echo $x ; if [ \"$x\" = \"1\" ] ; then echo itsOne ; fi"
您可以使用单引号替换外部双引号,以便在 bash 中运行:
/bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi'
然后你可以做你的最后陈述:
myProcess->execute("/bin/bash -c 'x=1 ; echo $x ; if [ \"$x\" == \"1\" ] ; then echo itsOne ; fi'");
在哪里(因为我没有我的 qt 电脑,所以我无法为你测试最后一部分):
qDebug() << "bin/bash -c 'x=1 ; echo $x ; if [ \"$x\" == \"1\" ] ; then echo itsOne ; fi'" << endl;
应该产生:
/bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi'
【讨论】:
不,执行产生: ;: -c: line 0: 寻找匹配的 `'' 时出现意外 EOF ;: -c: line 1: 语法错误:文件意外结束 @forenbuddy 啊,好的...稍后当我在我的 qt 电脑上时,我将不得不调试那个位。但是你应该可以在 bash 终端中输入这个/bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi'
并且它可以工作。然后你的 qDebug() 应该显示相同的输出......以上是关于QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有数据的标题添加到 Qt 中的 QTableWidget?
如何将 qrc 数据包含到使用 CMake 编译的基于 Qt 的二进制文件中