Apabila melaksanakan perintah shell yang berjalan lama dengan os/exec dalam Go, selalunya berfaedah untuk mendapatkan dan memproses output dalam masa nyata . Ambil, sebagai contoh, arahan ffmpeg, yang mengeluarkan maklumat kemajuan dalam bentuk baris seperti ini:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/
Matlamat kami adalah untuk menangkap dan memproses baris ini, mengekstrak maklumat kemajuan untuk memaparkan bar kemajuan langsung .
Tidak seperti stdout, ffmpeg menghantar diagnostik mesej (output konsol) kepada stderr. Dengan mengubah suai kod kami untuk membaca daripada stderr sebaliknya, kami boleh menangkap maklumat kemajuan:
package main import ( "bufio" "fmt" "os/exec" "strings" ) func main() { args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb" cmd := exec.Command("ffmpeg", strings.Split(args, " ")...) stderr, _ := cmd.StderrPipe() cmd.Start() scanner := bufio.NewScanner(stderr) scanner.Split(bufio.ScanWords) for scanner.Scan() { m := scanner.Text() fmt.Println(m) } cmd.Wait() }
Dengan pengubahsuaian ini, kami boleh terus mencetak maklumat kemajuan semasa perintah itu dilaksanakan.
Untuk mengekstrak maklumat kemajuan, kita perlu menghuraikan baris daripada stderr dan mengasingkan nilai yang berkaitan. Dalam kes ffmpeg, kami berminat dengan medan "masa":
time=00:00:04.13
Dengan menghuraikan nilai ini dan menukarnya kepada nisbah (cth., "4.13 saat / jumlah tempoh"), kita boleh memaparkan kemajuan sebagai peratusan. Ini membolehkan kami menjejak kemajuan arahan dalam masa nyata dan memberikan pengalaman yang mesra pengguna.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan dan Memproses Output Masa Nyata daripada Perintah Shell Berjangka Lama dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!