0

ユーザーが端末ベースで環境変数をすばやく設定できるようにする作業用アプリケーションを開発しています。各ターミナルにパスを設定することで、異なるディレクトリにある同じ名前のファイルがアプリケーションのテストに問題を引き起こさないようにします。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 以外の何かが必要ですか?

参考C/C++でshell/bashコマンドを実行する

事前に助けてくれてありがとう!

4

2 に答える 2

3

source呼び出すプログラムではなく、組み込みの bash コマンドです。現在の bash コピーで環境変数を変更できるように、bash の別のコピーを呼び出さずに bash によって処理されるように設計されています。

ただし、 source を の一部として呼び出すことはできませんsystem()。それに成功したとしても、環境変数を変更する効果は、呼び出し元のアプリsystem()が戻ってくると完全に失われます。

于 2012-11-15T06:23:00.547 に答える
-1

パラメーターを二重引用符で囲んで ("command - arg1 - to arg2")、関数 system() で転送するコマンドを試してください。

使用済み:

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

システム (コム);

于 2012-11-15T07:43:07.490 に答える