[英]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.