通过QProcess运行.sh脚本时出错

时间:2014-12-09 08:36:08

标签: qt shell qt4 qprocess

我编写了一个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数据库。当从linux终端($。/ script.sh)手动运行脚本文件(script.sh)时,它成功地将.csv文件导入到数据库表中。

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

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

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

错误:靠近第1行:接近&#34; - &#34;:语法错误 错误:无法打开&#34; ora_exported.csv&#34;

可能导致这个???

EDITED

我现在将.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的路径。因此,运行时错误[错误:无法打开&#34; ora_exported.csv&#34;]已经消失,但另一条消息[错误:接近第1行:接近&#34; - &#34;:语法错误]是还在。

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

2 个答案:

答案 0 :(得分:4)

echo是shell的内置命令,可能表现不同。

E.g。拿这个测试脚本: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"

答案 1 :(得分:3)

  1. 您使用外部脚本更新数据库看起来很奇怪!
  2. 为什么不传递“ora_exported.csv”文件名作为脚本参数?这有助于解决问题。
  3. 我正在谈论(打字)这个解决方案:
  4. void MainWindow::on_importButton_clicked()
    {    
        QProcess::startDetached("/bin/sh",
                                QStringList()<<"/home/aj/script.sh",
                                "<location of: 'ora_exported.csv' file>");
    }