QProcess + bash = /dev/stdin "otwarty", a nie powinien

0

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)?

0

Wiem że bash z "terminalem" komunikuje się stosując \033[ oraz \033]
Wykombinowałem coś takiego:

process.write("\033[6m [ -p /dev/stdin ] && echo True Boo || echo False YeY\n");
process.write("\033[6m echo Some Data | [ -p /dev/stdin ] && echo True Boo || echo False YeY\n");

Działać działa, tylko nie wiem czy trafiłem w sedno czy to efekt uboczny.

0

\033 to po prostu znak ESC. Niby czemu to coś miałoby zmieniać?

0

Bash przekazuje terminalowi kolory/pozycje/nazwę okna i wiele innych.
http://ascii-table.com/ansi-escape-sequences.php

Myślałem że podobnie jest w drugą stronę.
Po odpaleniu basha przez openpty jest prawie wszystko ok...

0

Ale nie rozumiem... -p sprawdza czy stdin to potok. No i zawsze (przy odpaleniu przez QProcess) to jest to potok. Musisz "zaalokować" terminal przez forkpty, openpty czy coś podobnego.
Odpal z -c w terminalu i programie qt, to zobaczysz co wtedy się dzieje.

0

[ cos ] w bash jest równoważne wywołaniu test cos, więc -p oznacza: "True if file is a named pipe (FIFO)" .
-c sprawdza czy plik istnieje

1 użytkowników online, w tym zalogowanych: 0, gości: 1