shell - 使用 golang 从命令行读取输入到 shell 脚本 exec

标签 shell go pipe

我正在使用 go 来使用 exec.command 运行 shell 脚本,如下所示,我想使用命令行获取输入参数,比如 i ,我的输出应该基于 i ,我该怎么做?

i := os.Args[1:2]
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | awk '{print $i/1024}' >> mem_usage.csv").Output()
if err != nil {
    fmt.Println(err.Error())
    return
 }

我如何在 shell 脚本中使用它?

没有i它工作正常,即如果我把 $1$2它工作正常,但我希望用户给我 i 的位置然后进行相应的计算。

最佳答案

您需要相应地格式化 exec-command 字符串。

即:

fmt.Sprintf("awk '{print $%d/1024}'", i)

这给出:awk '{print $1/1024}' for i = 1awk '{print $2/1024}'对于 i = 2

fmt.Sprintf 接受一个格式字符串和传递给该字符串的参数并返回格式化的字符串。 ( https://golang.org/pkg/fmt/#Sprintf )

这需要插入到您的 exec-command 中:

i := 2
awkPart := fmt.Sprintf("awk '{print $%d/1024}'", i)
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | "+awkPart+" | tee -a mem_usage.csv").Output()

您也许应该尝试更多地反汇编您的命令以进行维护,但这不是问题的一部分。

关于shell - 使用 golang 从命令行读取输入到 shell 脚本 exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56338860/

相关文章:

go - 如何使用 Golang 在控制台中更新多行

创建我自己的 shell 。处理 Ctrl-Z 然后发送 SIGCONT 关闭进程而不是继续它

c++ - 如何在 opencv 检测到圆后执行一些 shell 脚本

concurrency - 一次选择和多个案例

在 WCF 中使用命名管道的 C# 异步调用

c - C 中的多管道

python-3.x - 如何在 Python3 的 Popen 中读取/写入文件描述符?

Git shell 在 OpenSSH pop 窗口中提示输入密码

linux - AWS CLI 同步错误 - 找不到文件

go - 使用 golang channel 。获取 "all goroutines are asleep - deadlock!"