package main
import (
"fmt"
"os/exec"
"bytes"
)
func main() {
var out, err bytes.Buffer
cmd := exec.Command("ls", "-al")
cmd.Stdout = &out
cmd.Stderr = &err
cmd.Start()
cmd.Wait()
stdout := out.String()
fmt.Println(stdout)
}
이렇게 하면 ls -al의 표준출력이 문자열로 정상적으로 출력되던데
여기서 원하는 길이만큼 자르면 되는 것 아님?
간단하게 되네
근데 이방법은 못쓸듯 항상 스트림으로 받아야함
stdout이 몇십만자 넘어가면 저렇게 복사하면 터져버리더라구요
out, _ := cmd.StdoutPipe()에서 out이 io.ReadCloser고, 그러므로 Read(p []byte) 쓸 수 있으니까, 저 버퍼 []byte의 크기를 지정해놓으면 될 것 같은데. 이때 out.Read(buffer)는 고루틴 시켜놓은 함수에서 실행되게 해놓은 다음 cmd.Start() 시켜주고.
ReadByte써서 한글자 한글자 읽었음
그냥 c에 저수준 read처럼 되면 좋겠는데 음
func stdoutStream(stream io.ReadCloser) []byte { buf := make([]byte, 100); n, _ := stream.Read(buf); buf = buf[0:n]; return buf; }
아 go를 쓸꺼니 return이 아니라 채널로 받아야겠다. 암튼.
계속 받아 읽을거면 안에서 for 돌면 될거고..
그거 비슷하게 만들었음 일단은 별문제 없이 작동하니까 그래도 써도 될듯