Saya sedang menulis program di Go yang menjalankan program seperti server (juga Go). Sekarang saya ingin memiliki stdout program anak di jendela terminal tempat saya memulai program induk. Salah satu cara untuk melakukannya adalah dengan cmd.Output()
fungsi, tetapi ini mencetak stdout hanya setelah proses keluar. (Itu masalah karena program mirip server ini berjalan untuk waktu yang lama dan saya ingin membaca keluaran log)
Variabelnya out
adalah dari type io.ReadCloser
dan saya tidak tahu apa yang harus saya lakukan dengannya untuk menyelesaikan tugas saya, dan saya tidak dapat menemukan apa pun yang berguna di web tentang topik ini.
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()
}
Penjelasan kode: hapus komentar Println
fungsi untuk mendapatkan kode untuk dikompilasi, saya tahu itu Println(out io.ReadCloser)
bukan fungsi yang berarti.
(itu menghasilkan output &{3 |0 <nil> 0}
) Kedua baris ini hanya diperlukan untuk mendapatkan kode yang akan dikompilasi.
sumber
io.Copy
dalam rutinitas gocmd.Wait()
ataufor{}
memutar ... mengapa ini ada di sini?Jawaban:
Tidak perlu repot dengan pipa atau goroutine, ini mudah.
sumber
cmd.Stdin = os.Stdin
sehingga seolah-olah Anda benar-benar telah menjalankan perintah itu dari shell Anda.log
alih-alih stdout, ada jawabannya di siniSaya yakin jika Anda mengimpor
io
danos
dan mengganti ini:dengan ini:
(lihat dokumentasi untuk
io.Copy
dan untukos.Stdout
), itu akan melakukan apa yang Anda inginkan. (Penafian: tidak diuji.)Ngomong-ngomong, Anda mungkin ingin merekam kesalahan standar juga, dengan menggunakan pendekatan yang sama seperti untuk keluaran standar, tetapi dengan
cmd.StderrPipe
danos.Stderr
.sumber
os.Stdout
) dan (2) mengkonfirmasikan premis bahwa, jika Anda tidak memanggilcmd.StdoutPipe()
sama sekali, keluaran standar pergi ke/dev/null
daripada ke keluaran standar proses induk .Bagi mereka yang tidak membutuhkan ini dalam satu loop, tetapi ingin output perintah bergema ke terminal tanpa
cmd.Wait()
memblokir pernyataan lain:sumber