你如何从 Golang 执行终端命令?
How do you execute terminal commands from Golang?
我正在 Golang 中创建一个 CLI 工具,我对 Golang 和为终端制作工具都是新手。我需要直接从我的程序中执行终端命令(特别是 cd
)。我该怎么做呢?我跟着 this post,但它抛出了一个错误,说在 %path%
中找不到 echo
在此先感谢您的帮助!
cd 不是外部程序。
命令行解释器有一个抽象“当前目录”,影响所有其他命令。这是一个状态
它用于处理相对路径,例如。
如果您想从头开始创建 CLI,则必须定义此阶段如何影响一切。
如果您需要与现有 CLI 进行交互,则需要在 OS 进程中启动它并通过流进行交互。
有 3 个流:
STDIN - 输入
STDOUT——输出
STDERR - 错误
您需要捕获用户命令并发送到 CLI 的 STDIN。并读取 STDIN / STDOUT 以写入响应。
这与 goroutines 有关,例如
调用os.Chdir执行cd
命令。
因为子进程无法更改父进程的工作目录,所以 cd
命令没有单独的可执行文件。 cd
命令内置于命令行解释器中。
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() and os.Getwd() 分别更改和查看您的工作目录。但是,如果您需要在特定目录中执行命令,则可以设置命令的 Dir
即
cmdStruct.Dir = "path/to/directory"
或
cmdStruct.Dir = filepath.Join("path","to","directory")
尽管我问这个问题已经有一段时间了,但我认为回答这个问题会很好。简单来说,没有办法。程序本质上 运行 在他们自己的小盒子上,这意味着虽然 os.Chdir() 确实在技术上改变了工作目录,但它之后“恢复”。
我正在 Golang 中创建一个 CLI 工具,我对 Golang 和为终端制作工具都是新手。我需要直接从我的程序中执行终端命令(特别是 cd
)。我该怎么做呢?我跟着 this post,但它抛出了一个错误,说在 %path%
在此先感谢您的帮助!
cd 不是外部程序。
命令行解释器有一个抽象“当前目录”,影响所有其他命令。这是一个状态
它用于处理相对路径,例如。
如果您想从头开始创建 CLI,则必须定义此阶段如何影响一切。
如果您需要与现有 CLI 进行交互,则需要在 OS 进程中启动它并通过流进行交互。
有 3 个流:
STDIN - 输入 STDOUT——输出 STDERR - 错误
您需要捕获用户命令并发送到 CLI 的 STDIN。并读取 STDIN / STDOUT 以写入响应。
这与 goroutines 有关,例如
调用os.Chdir执行cd
命令。
因为子进程无法更改父进程的工作目录,所以 cd
命令没有单独的可执行文件。 cd
命令内置于命令行解释器中。
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() and os.Getwd() 分别更改和查看您的工作目录。但是,如果您需要在特定目录中执行命令,则可以设置命令的 Dir
即
cmdStruct.Dir = "path/to/directory"
或
cmdStruct.Dir = filepath.Join("path","to","directory")
尽管我问这个问题已经有一段时间了,但我认为回答这个问题会很好。简单来说,没有办法。程序本质上 运行 在他们自己的小盒子上,这意味着虽然 os.Chdir() 确实在技术上改变了工作目录,但它之后“恢复”。