Я использую 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();
Есть ли лучшее решение?