Cześć!
Mam niemałą zagwozdkę z symulacją terminala, przedstawię to w jak najbardziej okrojonej wersji zawierającej problem.
/*
bash vs bash execute from my app
BASH:
$ cat test-1.sh
#!/bin/bash
[ -p /dev/stdin ] && echo True Boo || echo False YeY
$ ./test-1.sh
False Yey
MY APP:
$ ./myapp
True Boo
*/
#include <QCoreApplication>
#include <QProcess>
#include <qglobal.h>
#include <QTextStream>
int main(int argc, char * argv[])
{
QCoreApplication a(argc, argv);
QProcess process;
typedef void (QProcess:: *finished)(int);
QObject::connect(&process, static_cast<finished>(&QProcess::finished), [&](){
a.exit();
});
QObject::connect(&process, &QProcess::readyReadStandardOutput, [&](){
QTextStream(stdout) << process.readAllStandardOutput();
});
process.start("/bin/bash -i -l");
process.write("[ -p /dev/stdin ] && echo True Boo || echo False YeY \n");
process.write("exit\n");
return a.exec();
}
Jeżeli odpalę jakiś program z konsoli, to ten nie widzi "stdin", jeśli znów wrzucę jakieś dane poprzez strumień to widzi. Masło maślane:
$ [ -p /dev/stdin ] && echo True || echo False
False
$ echo Some Data | [ -p /dev/stdin ] && echo True || echo False
True
Jak zmusić żeby takie zachowanie było też w bashu odpalonym przez powyższy program (c++/qt)?