문제

GO 프로그램에서 'LS'를 실행하고 결과를 문자열에 저장하고 싶다고 가정 해 봅시다. EXEC 및 OS 패키지에서 프로세스를 포크에 대한 몇 가지 명령이있는 것 같지만 STDOUT 등에 대한 파일 인수가 필요합니다. 출력을 문자열로 가져 오는 방법이 있습니까?

도움이 되었습니까?

해결책

편집하다: 이 대답은 더 이상 사용되지 않습니다. 참조하십시오 Fatih Arslan의 대답 아래에.


사용 exec.run 지정하여 파이프 stdout으로 (그리고 당신이 원한다면 stderr). CMD를 반환합니다 os.file Stdout (및 stderr) 필드에서. 그런 다음 예를 들어 사용하여 읽을 수 있습니다 ioutil.readall.

예시:

package main

import (
    "exec";
    "io/ioutil";
)

func main() {
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil {
        b, _ := ioutil.ReadAll(cmd.Stdout)
        println("output: " + string(b))
    }
}

다른 팁

지금은 더 쉬운 방법이 있습니다.

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("date").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The date is %s\n", out)
}

어디에 out SARDART 출력입니다. 형식입니다 []byte, 그러나 당신은 그것을 쉽게 문자열로 변경할 수 있습니다.

string(out)

당신은 또한 사용할 수 있습니다 CombinedOutput() 대신에 Output() 표준 출력 및 표준 오류를 반환합니다.

exec.command

stdout과 stderr를 별도의 문자열로 만들려면 다음과 같은 바이트 버퍼를 사용할 수 있습니다.

cmd := exec.Command("date")
var outb, errb bytes.Buffer
cmd.Stdout = &outb
cmd.Stderr = &errb
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}
fmt.Println("out:", outb.String(), "err:", errb.String())

선호하는 패러다임에 따라 두 가지 옵션이 있습니다.

  1. os.forkexec ()
  2. exec.run ()

나는 이것을 최근 버전의 GO (~ 1.11)와 함께 사용했습니다.

// CmdExec Execute a command
func CmdExec(args ...string) (string, error) {

    baseCmd := args[0]
    cmdArgs := args[1:]

    log.Debugf("Exec: %v", args)

    cmd := exec.Command(baseCmd, cmdArgs...)
    out, err := cmd.Output()
    if err != nil {
        return "", err
    }

    return string(out), nil
}

// Usage:
// out, err := CmdExec("ls", "/home")

사용 exec.run, stdout의 파이프 전달. 파이프에서 반환되는 파이프에서 읽으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top