كيف يمكنك الحصول على مخرجات أمر النظام في Go؟

StackOverflow https://stackoverflow.com/questions/1877045

  •  18-09-2019
  •  | 
  •  

سؤال

لنفترض أنني أريد تشغيل 'ls' في برنامج go، وتخزين النتائج في سلسلة.يبدو أن هناك بعض الأوامر لتفرع العمليات في الحزمتين exec وos، ولكنها تتطلب وسيطات ملف لـ stdout، وما إلى ذلك.هل هناك طريقة للحصول على الإخراج كسلسلة؟

هل كانت مفيدة؟

المحلول

يحرر: هذه الجواب قديمة. لطفا أنظر إجابة فاتح أرسلان أقل.


يستخدم 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 هو الإخراج الاستعداد. انها في الشكل []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