簡體   English   中英

在C ++中使用QProcess從gnome-terminal重定向輸出

[英]Redirecting output from gnome-terminal using QProcess in C++

我正在嘗試為gui生成一個子進程,該子進程將生成一個終端。 我希望此終端產生的數據(stdout和stderr)顯示在出現的窗口以及設置的日志文件中。 當我直接在外殼中鍵入命令時,它可以按預期工作,但是當作為啟動命令提供給QProcess時,它實際上不會向文件中寫入任何內容。

例如:如果用戶未安裝二進制文件,則應將其寫到bin.log,該命令未找到。 我將生成的QProcess的環境設置為與正在運行的父進程相同(以便它可以查找bash和其他內容),並在調用QProcess.start()方法之前設置了工作目錄。 我寫了一個測試用例,內容如下:

gnome-terminal --title 'Sub-Terminal' -e 'bash -c "foo [args to foo] |& tee foo.log"'

在Qt中,我執行以下操作:

QProcess *child = new QProcess(this);
QString   cmd   = "gnome-terminal --title 'Sub-Terminal' -e 'bash -c \"foo [args to foo] |& tee foo.log\"'";
child->setProcessEnvironment(<process environment I have created before>);
child->setWorkingDirectory(<current working dir>);
child->start(cmd);
...

它生成終端,但不將任何數據寫入foo.log。 我也嘗試了以下方法:

QProcess *child = new QProcess(this);
QString   prog  = "gnome-terminal"
QStringList args;
args << "-x" << "bash" << "foo" << "[foo's arguments]" << "|&" << "tee" << "foo.log";
// set the process env and working dir
child->start(prog, args);

有人對如何解決這個問題有任何建議嗎? 我已經嘗試過使用QProcess.setStandardErrorFile(foo.log)和QProcess.setStandardOutputFile(foo.log)重定向stdout和stderr,但是看來這將從gnome-terminal本身重定向stdout(這不是什么)。

您必須將要在終端中執行的整個命令作為QProcess單個參數提供給"-e" ,以及將要在bash中執行的命令作為bash的單個參數提供:

args << "-e" << "bash -c 'foo [args to foo] |& tee foo.log'";

這基本上執行

bash -c 'foo [args to foo] |& tee foo.log'

在終端中,它自己執行

foo [args to foo] |& tee foo.log

在bash內。

您的猜測是正確的,即無法從gnome-terminal進程讀取輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM