【问题标题】:Error while running a .sh script via QProcess通过 QProcess 运行 .sh 脚本时出错
【发布时间】:2014-12-09 08:36:08
【问题描述】:

我编写了一个 QT GUI 程序,按下按钮将执行 .sh 脚本。脚本的内容是-

echo -e 'attach database 'testdatabase.db' as 'aj';\n.separator ","\n.import ora_exported.csv qt_ora_exported' | sqlite3 testdatabase.db

基本上,该脚本会将 .csv 文件导入 sqlite 数据库。当脚本文件 (script.sh) 从 linux 终端 ($./script.sh) 手动运行时,它成功地将 .csv 文件导入到数据库表中。

但是,当我从我的 QT 程序中调用脚本时

void MainWindow::on_importButton_clicked()
{    
    QProcess process;
    process.startDetached("/bin/sh",QStringList()<<"/home/aj/script.sh");
}

它编译成功,但在运行时按下按钮时会在控制台中显示错误消息。

错误:第 1 行附近:“-”附近:语法错误 错误:无法打开“ora_exported.csv”

这可能是什么原因???

已编辑

我现在已将 .sh 脚本更改为--

echo -e 'attach database 'testdatabase.db' as 'aj';\n.separator ","\n.import /home/aj/ora_exported.csv qt_ora_exported' | sqlite3 testdatabase.db

因此提供了我的 ora_exported.csv 的路径。结果运行时错误[错误:无法打开“ora_exported.csv”]已经消失,但另一个消息[错误:靠近第1行:靠近“-”:语法错误]仍然出现。

与之前的情况相同,使用 ./script.sh 成功将数据导入 sqlite3 db 表文件,但 QProcess 无法。

【问题讨论】:

  • 脚本从该文件ora_exported.csv 不存在的目录运行和/或path 变量不包含该文件所在的目录。只需添加third argument: workingDirectory,并具有适当的值。
  • 我已经注意到您的建议,并在脚本文件中包含了 .csv 的目录路径。情况还是一样。您能否指导我了解workingDirectory 在我的上下文中将是什么。我无法从 QT 文档链接中获得它。
  • @MarekR 正在讨论调用QProcess 的目录。只需将该目录添加到startDetached() 调用或在process 实例上调用setWorkingDirectory(),然后再调用startDetacjed()

标签: qt shell qt4 qprocess


【解决方案1】:

echo 是一个 shell 的内置命令,可能会有不同的行为。

例如拿这个测试脚本:echotest.sh

echo -e "123"

现在我们可以比较不同的结果:

$ bash echotest.sh
123
$ zsh echotest.sh
123
$ dash echotest.sh
-e 123

您可能在某些类似 Ubuntu 的操作系统上,/bin/sh 重定向到 dash。这将解释围绕“-”的错误。因此,如果您使用 echo,请专门设置您的 shell 或确保您的脚本适用于所有常见的 shell。


另外,你搞砸了你的报价

echo -e 'attach database 'testdatabase.db' as 'aj';\n.separator ","\n.import /home/aj/ora_exported.csv qt_ora_exported'

结果(第一行没有引号)

attach database testdatabase.db as aj;
.separator ","
.import /home/aj/ora_exported.csv qt_ora_exported

但你可能想要

echo -e "attach database 'testdatabase.db' as 'aj';\n.separator ','\n.import /home/aj/ora_exported.csv qt_ora_exported"

【讨论】:

  • 好的,所以我在 QProcess 期间使用了 /bin/bash 并且没有出现错误,但它仍然没有触发 .sh 文件,我使用“附加数据库 'testdatabase.db' 作为 'aj'; \n.separator ','\n.import /home/aj/ora_exported.csv qt_ora_exported" 但 .sh 脚本仍然从终端执行,而不是从我的 QT 应用程序执行
  • 目前没有运行时错误(使用/bin/bash后)
  • 添加日志以获得更多见解(更新了我答案的中间部分)。
  • 感谢提示,但没有观察到错误,因此未创建日志记录文件。
  • 尝试对不同的输出类型使用附加模式和不同的文件。 (见编辑代码)
【解决方案2】:
  1. 您使用外部脚本更新数据库看起来很奇怪!
  2. 为什么不将“ora_exported.csv”文件名作为脚本参数传递?这将有助于解决问题。
  3. 我在谈论(打字)这个解决方案:
void MainWindow::on_importButton_clicked()
{    
    QProcess::startDetached("/bin/sh",
                            QStringList()<<"/home/aj/script.sh",
                            "<location of: 'ora_exported.csv' file>");
}

【讨论】:

  • 出于测试/学习目的,我正在使用外部脚本。一旦我取得一点进展,我将直接进行 db 到 db 通信。目前看来,您将 .csv 的位置作为 QProcess 中的参数的建议实际上解决了我的问题。非常感谢。对此的一个小行解释也受到高度赞赏。