Piszę program w Go, który wykonuje program podobny do serwera (także Go). Teraz chcę mieć standardowe wyjście programu potomnego w moim oknie terminala, w którym uruchomiłem program nadrzędny. Jednym ze sposobów jest użycie cmd.Output()
funkcji, ale wypisuje ona standardowe wyjście dopiero po zakończeniu procesu. (To problem, ponieważ ten program podobny do serwera działa przez długi czas i chcę odczytać dane wyjściowe dziennika)
Zmienna out
ma wartość type io.ReadCloser
i nie wiem, co mam z nią zrobić, aby wykonać swoje zadanie, i nie mogę znaleźć w sieci nic pomocnego na ten temat.
func main() {
cmd := exec.Command("/path/to/my/child/program")
out, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
err = cmd.Start()
if err != nil {
fmt.Println(err)
}
//fmt.Println(out)
cmd.Wait()
}
Wyjaśnienie do kodu: odkomentuj Println
funkcję, aby uzyskać kod do skompilowania, wiem, że Println(out io.ReadCloser)
nie jest to znacząca funkcja.
(generuje wynik &{3 |0 <nil> 0}
) Te dwa wiersze są potrzebne tylko do pobrania kodu do kompilacji.
źródło
io.Copy
w ramach procedur gocmd.Wait()
anifor{}
pętli ... dlaczego te tutaj są?Odpowiedzi:
Nie musisz majstrować przy rurach ani gorutynach, ten jest łatwy.
źródło
cmd.Stdin = os.Stdin
je tak, jakbyś dosłownie wykonał to polecenie z powłoki.log
zamiast standardowego wyjścia, jest tutajWierzę, że jeśli import
io
ios
i to wymienić:z tym:
(zobacz dokumentację dla
io.Copy
i dlaos.Stdout
), zrobi to, co chcesz. (Zastrzeżenie: nie testowane.)Nawiasem mówiąc, prawdopodobnie będziesz chciał również przechwytywać standardowe błędy, używając tego samego podejścia, co w przypadku standardowego wyjścia, ale z
cmd.StderrPipe
ios.Stderr
.źródło
os.Stdout
) i (2) potwierdzenie założenia, że jeśli w ogóle nie wywołaszcmd.StdoutPipe()
, standardowe wyjście trafia/dev/null
raczej do standardowego wyjścia procesu nadrzędnego niż do standardowego wyjścia. .Dla tych, którzy nie potrzebują tego w pętli, ale chcieliby, aby wyjście polecenia było echem do terminala bez
cmd.Wait()
blokowania innych instrukcji:źródło