shell - 管道命令并使用命令重定向输出
问题描述
这是我的代码:
package main
import (
"fmt"
"os"
"os/exec"
"strconv"
"time"
)
func main() {
year, month, day := time.Now().Date()
monthI := int(month)
fmt.Println("toto")
date := strconv.Itoa(year)+"_"+strconv.Itoa(monthI)+"_"+strconv.Itoa(day)
nameSnapshot := "storedb@backup_"+date
args := []string{"snapshot",nameSnapshot}
cmd := exec.Command("zfs", args...)
err := cmd.Run()
if err != nil {
os.Stderr.WriteString(err.Error())
}
args = []string{"send",nameSnapshot,"|","gzip",">","backup_"+date+".gz"}
cmd = exec.Command("zfs", args...)
err = cmd.Run()
if err != nil {
os.Stderr.WriteString(err.Error())
}
}
我想在一个命令中完成。
我的第二行 zfs send 命令似乎不起作用。
如何使用 cmd.exec 管道和重定向 golang 中的输出?
解决方案
这是您如何实现此目的的简化版本:
outfile, _ := os.OpenFile("backup.gz", os.O_RDWR|os.O_CREATE, 0755)
// your zfs command
zfs := exec.Command("zfs", "send", "storedb@backup")
gzip := exec.Command("gzip", "-cf") // gzip to stdout (-cf)
gzip.Stdin, _ = zfs.StdoutPipe() // zfs stdout to gzip stdin
gzip.Stdout = outfile // write output of gzip to outfile
gzip.Start() // gzip start waiting for input
zfs.Run() // zfs start command
gzip.Wait() // gzip wait for pipe to close
outfile.Close()
它相当于shell中的这个命令:
zfs send stored@backup | gzip -cf > backup.gz
推荐阅读
- php - TYPO3:用函数覆盖 $GLOBALS['TCA']
- javascript - 如何在 Javascript AutoDesk 中获取模型对象元数据属性
- python - 试图在 python 中编写关于石头和剪刀的代码
- tensorflow - 调整输入尺寸后,tensorflow lite(tflite)调用错误
- reactjs - 如何在 reactjs 中捕获组件内部的错误?
- powershell - 获取 cmd.exe 退出的返回
- xml - 从 XSLT 1.0 输出中省略空元素
- jquery - 清晰的故事情节ajax错误
- sql - SQL插入挂起 - 读取未提交或拆分查询?
- java - 无法从 java 中的 JSON 获取所需的值“方法 getString(String) 未定义为 String 类型””