请问 go 语言以./proName 的方式调用外部程序? os/exec 写蒙了…

2018-02-06 15:17:24 +08:00
 praynise
请问请问 go 语言以./proName 的方式调用外部程序呢?例如,我想要通过 go 调用 sqluldr2 抽取文件,或者一次执行多个命令,例如 command a;command b;command c 这种方式…
谢谢大家
1320 次点击
所在节点    Go 编程语言
7 条回复
ChristopherWu
2018-02-06 16:40:30 +08:00
可以。
ChristopherWu
2018-02-06 16:41:02 +08:00
```
package main

import (
"log"
"os/exec"
)

func main() {
cmd := exec.Command("sleep", "1")
log.Printf("Running command and waiting for it to finish...")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)
}
```
praynise
2018-02-07 08:52:44 +08:00
@ChristopherWu 没有看懂您的意思,可以麻烦详细解释如何使用./来执行吗?
先付上我自己的理解:Command 第一个参数为 path,实际上是通过$PATH 环境变量进行检索,看第一个参数中的内容是否在$PATH 变量内,如果存在,则视为可执行,如果不存在,会直接返回错误。此参数为必填参数
第二个参数开始,则为 path 所需要的参数,非必填,但是如果填写了,必须是 PATH 的参数
基于这个理解,首先./程序,程序并不一定在$PATH 中,使用 exec.Command('程序名')的方式会报错:未找到 PATH 中有可执行文件。如果将程序加入 path,再执行 exec.Command('程序名'),则会提示 exec format error。同时 name 参数中直接输入“./程序名” 也没法进行操作
麻烦您了,谢谢
ChristopherWu
2018-02-07 10:08:55 +08:00
@praynise 不用客气。我以前是用绝对路径来做的。
也可以先拿到当前 golang 程序的绝对路径,再拼出要运行的程序的绝对路径。
利用环境变量的没有试过额
goofool
2018-02-07 18:19:14 +08:00
直接程序名字就可以了吧,不需要加./
nekoyaki
2018-02-23 10:03:07 +08:00
我猜可能楼主和我之前是一个想法,看看这个: https://github.com/nagae-memooff/goutils/blob/master/utils.go
仅供参考,用里头的 Sysexec,就可以像直接在 shell 里敲命令一样的方式直接把字符串传进去了。
执行的时候的环境变量也是你这个 go 用户,在控制台里的时候的环境变量。不过最好用绝对路径,相对路径的比较复杂,三句两句说不清。
比如 Sysexec(`history|grep iperf`)这样直接传进去就行。
praynise
2018-02-24 10:41:26 +08:00
@nekoyaki 这个帮了我大忙了,而且还帮我发现了个不小的坑,谢谢啦,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/428925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX