最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解golang執(zhí)行Linux shell命令完整場(chǎng)景下的使用方法

 更新時(shí)間:2022年06月30日 10:30:52   作者:學(xué)亮編程手記  
本文主要介紹了golang執(zhí)行Linux shell命令完整場(chǎng)景下的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 執(zhí)行命令并獲得輸出結(jié)果

CombinedOutput()

執(zhí)行程序返回 standard output and standard error

func main() {
    cmd := exec.Command("ls", "-lah")
    out, err := cmd.CombinedOutput()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
    fmt.Printf("combined out:\n%s\n", string(out))
}

Output()

執(zhí)行程序返回standard output

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

2. 將stdout和stderr分別處理

用buffer接受輸出

func main() {
    cmd := exec.Command("ls", "-lah")
    var stdin, stdout, stderr bytes.Buffer
    cmd.Stdin = &stdin
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
    outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
    fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)
}

直接打印到屏幕

func main() {
    cmd := exec.Command("ls", "-lah")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stdout
    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
}

3. 異步執(zhí)行命令

cmd.Run() 阻塞等待命令執(zhí)行結(jié)束
cmd.Start() 不會(huì)等待命令完成

package main

import (
? ? "bytes"
? ? "fmt"
? ? "io"
? ? "log"
? ? "os"
? ? "os/exec"
)

func main() {
? ? var stdoutBuf, stderrBuf bytes.Buffer
? ? cmd := exec.Command("bash", "-c", "for i in 1 2 3 4;do echo $i;sleep 2;done")
? ? stdoutIn, _ := cmd.StdoutPipe()
? ? stderrIn, _ := cmd.StderrPipe()
? ? var errStdout, errStderr error
? ? stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
? ? stderr := io.MultiWriter(os.Stderr, &stderrBuf)
? ? err := cmd.Start()
? ? if err != nil {
? ? ? ? log.Fatalf("cmd.Start() failed with '%s'\n", err)
? ? }
? ? go func() {
? ? ? ? _, errStdout = io.Copy(stdout, stdoutIn)
? ? }()
? ? go func() {
? ? ? ? _, errStderr = io.Copy(stderr, stderrIn)
? ? }()
? ? err = cmd.Wait()
? ? if err != nil {
? ? ? ? log.Fatalf("cmd.Run() failed with %s\n", err)
? ? }
? ? if errStdout != nil || errStderr != nil {
? ? ? ? log.Fatal("failed to capture stdout or stderr\n")
? ? }
? ? outStr, errStr := string(stdoutBuf.Bytes()), string(stderrBuf.Bytes())
? ? fmt.Printf("\nout:\n%s\nerr:\n%s\n", outStr, errStr)
}

4. 執(zhí)行時(shí)帶上環(huán)境變量

func main() {
    cmd := exec.Command("bash", "-c", "programToExecute")
    additionalEnv := "programToExecute=ls"
    newEnv := append(os.Environ(), additionalEnv)
    cmd.Env = newEnv
    out, err := cmd.CombinedOutput()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
    fmt.Printf("%s", out)
}

5. 預(yù)先檢查命令是否存在

func checkLsExists() {
    path, err := exec.LookPath("ls")
    if err != nil {
        fmt.Printf("didn't find 'ls' executable\n")
    } else {
        fmt.Printf("'ls' executable is in '%s'\n", path)
    }
}

6. 兩個(gè)命令依次執(zhí)行,管道通信

func main() {
    c1 := exec.Command("ls")
    c2 := exec.Command("wc", "-l")
    r, w := io.Pipe() 
    c1.Stdout = w
    c2.Stdin = r
    var b2 bytes.Buffer
    c2.Stdout = &b2
    c1.Start()
    c2.Start()
    c1.Wait()
    w.Close()
    c2.Wait()
    io.Copy(os.Stdout, &b2)
}

或者

func main() {
    c1 := exec.Command("ls")
    c2 := exec.Command("wc", "-l")
    c2.Stdin, _ = c1.StdoutPipe()
    c2.Stdout = os.Stdout
    _ = c2.Start()
    _ = c1.Run()
    _ = c2.Wait()
}

反正下面這樣是不行的

func main() {
    c := exec.Command("ls", "|", "wc", "-l")
    c.Stdout = os.Stdout
    _ = c.Run()
}

不嫌丑可以用bash -c

func main() {
    cmd := "cat /proc/cpuinfo | egrep '^model name' | uniq | awk '{print substr($0, index($0,$4))}'"
    out, err := exec.Command("bash", "-c", cmd).Output()
    if err != nil {
        fmt.Printf("Failed to execute command: %s", cmd)
    }
    fmt.Println(string(out))
}

7. 按行讀取輸出內(nèi)容

func main() {
    cmd := exec.Command("ls", "-la")
    stdout, _ := cmd.StdoutPipe()
    cmd.Start()
    reader := bufio.NewReader(stdout)
    for {
        line, err := reader.ReadString('\n')
        line = strings.TrimSpace(line)
        if err != nil || io.EOF == err {
            break
        }
        log.Println(line)
    }
    cmd.Wait()
}

8. 獲得exit code

func RunCommand(name string, args ...string) (stdout string, stderr string, exitCode int) {
? ? log.Println("run command:", name, args)
? ? var outbuf, errbuf bytes.Buffer
? ? cmd := exec.Command(name, args...)
? ? cmd.Stdout = &outbuf
? ? cmd.Stderr = &errbuf

? ? err := cmd.Run()
? ? stdout = outbuf.String()
? ? stderr = errbuf.String()

? ? if err != nil {
? ? ? ? // try to get the exit code
? ? ? ? if exitError, ok := err.(*exec.ExitError); ok {
? ? ? ? ? ? ws := exitError.Sys().(syscall.WaitStatus)
? ? ? ? ? ? exitCode = ws.ExitStatus()
? ? ? ? } else {
? ? ? ? ? ? // This will happen (in OSX) if `name` is not available in $PATH,
? ? ? ? ? ? // in this situation, exit code could not be get, and stderr will be
? ? ? ? ? ? // empty string very likely, so we use the default fail code, and format err
? ? ? ? ? ? // to string and set to stderr
? ? ? ? ? ? log.Printf("Could not get exit code for failed program: %v, %v", name, args)
? ? ? ? ? ? exitCode = defaultFailedCode
? ? ? ? ? ? if stderr == "" {
? ? ? ? ? ? ? ? stderr = err.Error()
? ? ? ? ? ? }
? ? ? ? }
? ? } else {
? ? ? ? // success, exitCode should be 0 if go is ok
? ? ? ? ws := cmd.ProcessState.Sys().(syscall.WaitStatus)
? ? ? ? exitCode = ws.ExitStatus()
? ? }
? ? log.Printf("command result, stdout: %v, stderr: %v, exitCode: %v", stdout, stderr, exitCode)
? ? return
}

參考鏈接:

https://saucer-man.com/backend_development/571.html

到此這篇關(guān)于詳解golang執(zhí)行Linux shell命令完整場(chǎng)景下的使用方法的文章就介紹到這了,更多相關(guān)golang執(zhí)行Linux shell內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用dep 配置golang 開(kāi)發(fā)環(huán)境的操作方法

    使用dep 配置golang 開(kāi)發(fā)環(huán)境的操作方法

    下面小編就為大家?guī)?lái)一篇使用dep 配置golang 開(kāi)發(fā)環(huán)境的操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • golang?日志庫(kù)ZAP[uber-go?zap]示例詳解

    golang?日志庫(kù)ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開(kāi)源的高性能Go語(yǔ)言日志庫(kù),支持多種日志級(jí)別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進(jìn)行日志切割,實(shí)現(xiàn)日志按文件大小、時(shí)間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • grpc-go如何通過(guò)context傳遞額外數(shù)據(jù)

    grpc-go如何通過(guò)context傳遞額外數(shù)據(jù)

    metadata是grpc內(nèi)置的,用RPC服務(wù)傳遞http頭數(shù)據(jù),分in和out兩種,對(duì)應(yīng)的key都為一個(gè)空struct,這篇文章主要介紹了grpc-go通過(guò)context傳遞額外數(shù)據(jù),需要的朋友可以參考下
    2024-02-02
  • Go1.18都出泛型了速來(lái)圍觀

    Go1.18都出泛型了速來(lái)圍觀

    泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語(yǔ)言中編寫(xiě)代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型,本文通過(guò)例子給大家介紹下如何使用泛型,對(duì)Go1.18泛型相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-03-03
  • go語(yǔ)言工程結(jié)構(gòu)

    go語(yǔ)言工程結(jié)構(gòu)

    這篇文章主要簡(jiǎn)單介紹了go語(yǔ)言工程結(jié)構(gòu),對(duì)于我們學(xué)習(xí)go語(yǔ)言很有幫助,需要的朋友可以參考下
    2015-01-01
  • Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法

    Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法

    這篇文章主要介紹了Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法,實(shí)例分析了Go調(diào)用cmd程序的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言常見(jiàn)錯(cuò)誤之誤用init函數(shù)實(shí)例解析

    Go語(yǔ)言常見(jiàn)錯(cuò)誤之誤用init函數(shù)實(shí)例解析

    Go語(yǔ)言中的init函數(shù)為開(kāi)發(fā)者提供了一種在程序正式運(yùn)行前初始化包級(jí)變量的機(jī)制,然而,由于init函數(shù)的特殊性,不當(dāng)?shù)厥褂盟赡芤鹨幌盗袉?wèn)題,本文將深入探討如何有效地使用init函數(shù),列舉常見(jiàn)誤用并提供相應(yīng)的避免策略
    2024-01-01
  • GoFrame框架使用避坑指南和實(shí)踐干貨

    GoFrame框架使用避坑指南和實(shí)踐干貨

    這篇文章主要為大家介紹了GoFrame框架使用避坑指南和實(shí)踐干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享

    Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享

    jwt是?json?web?token的簡(jiǎn)稱。go使用jwt目前,主流使用的jwt庫(kù)是golang-jwt/jwt。本文就來(lái)和大家講講golang-jwt/jwt的具體使用,需要的可以參考一下
    2023-01-01
  • Go語(yǔ)言并發(fā)模型的2種編程方案

    Go語(yǔ)言并發(fā)模型的2種編程方案

    這篇文章主要介紹了Go語(yǔ)言并發(fā)模型的2種編程方案,本文給出共享內(nèi)存和通過(guò)通信的2種解決方案,并給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

巴东县| 岳西县| 贡觉县| 喀喇| 晋城| 东乌珠穆沁旗| 乌鲁木齐市| 德令哈市| 新丰县| 奎屯市| 称多县| 剑川县| 沅江市| 东至县| 江源县| 元谋县| 五原县| 桑植县| 安新县| 濮阳县| 博客| 平陆县| 合水县| 运城市| 思南县| 新巴尔虎右旗| 扎鲁特旗| 咸宁市| 梓潼县| 明星| 嘉义市| 澄城县| 聂拉木县| 固镇县| 阆中市| 班戈县| 辽宁省| 安乡县| 西城区| 云龙县| 白山市|