Правильный способ отказаться от ввода в golang pty - PullRequest
0 голосов
/ 30 мая 2019

Я использую golang pty library для интерактивной консоли оболочки, где пользователь может выполнять любые команды.

Проблема в том, что я не могу найти хороший способдля разделения ввода пользователя и вывода оболочки, поскольку Stdin, Stdout и Stderr назначены одному и тому же файлу.

Вот пример:

func main() {

    cmd := exec.Command("sh", "-c", "mongo --quiet --host=localhost test")
    f, _ := pty.Start(cmd)
    cmd.Start()

    time.Sleep(1 * time.Second) // some time to start

    for ;; {

        io.WriteString(f, "sleep(1000);Date.now();\n")
        stdoutScanner := bufio.NewScanner(f)

        go func() {
            for stdoutScanner.Scan() {
                text := stdoutScanner.Text()
                println(text)
            }
        }()

        time.Sleep(1200 * time.Millisecond)
    }
}

Этот код выдает такой код:

> sleep(1000);Date.now();sleep(1000);Date.now();
1559185677551
sleep(1000);Date.now();
1559185679053
1559185691069
now();
1559185692573
);Date.now();sleep(1000);Date.now();
1559185694074
ep(1000);Date.now();sleep(1000);Date.now();

Мне нужно только

1559185677551
1559185679053
1559185691069
1559185692573
1559185694074

Я могу отфильтровать весь отсканированный текст, который contains пользовательский ввод, но он не работает стабильно - в примере вы можете найти такие фрагменты, какep(1000);Date.now();

Есть ли лучшее решение?

...