为了账号安全,请及时绑定邮箱和手机立即绑定

你如何从 Golang 执行终端命令?

你如何从 Golang 执行终端命令?

Go
蝴蝶刀刀 2022-11-28 10:19:50
我正在 Golang 中创建一个 CLI 工具,我对 Golang 和为终端制作工具都是新手。我需要直接从我的程序(特别是cd)执行终端命令。我该怎么做呢?我跟着这篇文章,但它抛出了一个错误,说在 %path% 中找不到回声在此先感谢您的帮助!
查看完整描述

4 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

cd通过调用os.Chdir来实现命令。

由于子进程无法更改父进程的工作目录,因此该cd命令没有单独的可执行文件。该cd命令内置于命令行解释器。


查看完整回答
反对 回复 2022-11-28
?
长风秋雁

TA贡献1757条经验 获得超7个赞

os/exec包帮助你在 Go 中执行终端命令。


执行系统命令非常简单。Cmd 保存您的外部命令。


所以在 linux 中假设你想运行“echo hello”命令,你会写下面的代码。


cmdStruct := exec.Command("echo","hello")    

out,err := cmdStruct.Output()

if err != nil {

    fmt.Println(err)

}

fmt.Println(string(out))

这是最基本的方法之一。但是,在 Windows 中,您需要将“echo hello”作为参数传递给命令提示符或 Powershell。


    cmdStruct:= exec.Command("cmd.exe","/c","echo","hello")

为了简化单个切片中的传递参数,


args:= strings.Split("/c echo hello there how are you"," ")

cmdStruct:= exec.Command("cmd.exe",args...)

查看此答案以获得更好的理解和此代码的增强版本。


对于 cd,您可以使用os.Chdir()和os.Getwd()分别更改和查看您的工作目录。但是如果你需要你的命令在特定目录中执行,你可以设置Dir你的命令,即


cmdStruct.Dir = "path/to/directory"

或者


cmdStruct.Dir = filepath.Join("path","to","directory")


查看完整回答
反对 回复 2022-11-28
?
慕仙森

TA贡献1827条经验 获得超8个赞

cd 不是外部程序。

命令行解释器有一个抽象“当前目录”,它影响所有其他命令。它是一个状态

例如,它用于处理相对路径。

如果您想从头开始创建 CLI,则必须定义此阶段如何影响一切。

如果您需要与现有 CLI 进行交互,则需要在操作系统进程中启动它并通过流进行交互。

有3个流:

STDIN - 输入 STDOUT - 输出 STDERR - 错误

您需要捕获用户命令并发送到 CLI 的 STDIN。并读取 STDIN / STDOUT 以写入响应。

例如,这与 goroutines 有关


查看完整回答
反对 回复 2022-11-28
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

尽管我问这个问题已经有一段时间了,但我认为回答这个问题会很好。简单来说,没有办法。程序基本上在它们自己的小盒子上运行,这意味着虽然 os.Chdir() 确实在技术上改变了工作目录,但它之后“恢复”。



查看完整回答
反对 回复 2022-11-28
  • 4 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号