【问题标题】:Problems passing source command to bash from c++ application从 C++ 应用程序将源命令传递给 bash 的问题
【发布时间】:2012-11-15 06:12:08
【问题描述】:

我正在开发一个工作应用程序,它允许用户在终端上快速设置环境变量。通过在每个终端中设置路径,我们确保不同目录中具有相同名称的文件不会导致应用程序测试出现问题。我正在使用 Qt 构建基于 c++ 的程序,并且所有数据类型基本相同。

我正在使用以下代码在终端中调用命令,从该终端中使用 system() 启动应用程序。 我可以通过代码在 bash 中运行命令;但是,当我尝试使用带参数的命令时遇到了问题。 这可能就是为什么 source 似乎无法正常工作,因为 source 命令后面跟着文件名。看来我删除了 bash 命令后附加的参数。

我的代码:

void assignTerminalToPath(QString path)
{
    QString data = "";
    QString currentUsersHomeDirectory = QDir::homePath();
    QString tmpScriptLocation = currentUsersHomeDirectory;
    QByteArray ba;
    tmpScriptLocation += "/.tmpSourceFile";
    QFile tmpSourceFile(tmpScriptLocation);
    if(tmpSourceFile.open(QFile::WriteOnly | QFile::Truncate))
    {
        QTextStream output(&tmpSourceFile);
        data.append("export PATH=.:");
        data.append(path);
        data.append(":$PATH");
        output << QString("#!/bin/bash\n");
        output << data;
        tmpSourceFile.close();
    }
    data.clear();
    data.append("/bin/bash -c source ");
    data.append(tmpScriptLocation);
    ba = data.toLatin1();
    const char *cStr = ba.data();
    system(cStr);
}

也许我没有正确引用 bash,我需要 -c 之外的东西?

参考Execute shell/bash command using C/C++

提前感谢您的帮助!

【问题讨论】:

  • 即使source 是一个外部命令,您运行的内容也绝对是零影响。将导致的环境变化仅适用于子shell,从您的进程或系统上的任何其他内容中都看不到。你想做什么?
  • 在使用 Qt 时,您应该使用 QProcess,它具有用于更改环境变量等的 API。

标签: c++ bash qt command-line environment-variables


【解决方案1】:

source 不是你可以调用的程序,它是嵌入的 bash 命令。它被设计为由 bash 处理而不调用另一个 bash 副本,因此可以在当前 bash 副本中更改环境变量。

但是,您不能将 source 作为system() 的一部分调用。即使您确实成功了,一旦system() 返回,它对调用者应用程序更改环境变量的效果将完全丢失。

【讨论】:

  • 好吧好吧!哈哈!看起来你会得到一个两个一个!我想在这种情况下正确的答案是为用户提供导出代码以在他们的终端中运行或从应用程序启动一个新终端。感谢您的洞察力!你帮了大忙!
【解决方案2】:

尝试用双引号将参数括起来的命令(“command - arg1 - to arg2”)传递到函数system()中。

使用:

char *com = "\"command -arg1 -arg2\"";

系统(com);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2015-06-08
    • 2018-02-14
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多