【发布时间】:2019-10-16 17:55:26
【问题描述】:
我希望 Go 程序在 bash 终端中运行命令(包括内置命令),并将其显示在终端本身中,就像
$ls
trial.go output.txt hello.txt
$pwd
/home/bb/cc
$go run trial.go pwd
/home/bb/cc
$go run trial.go cd ..
$pwd
/home/bb
如您所见,golang 脚本将命令作为输入,并在相同的终端和环境中执行并显示输出
我尝试了以下代码,但它不适用于内置命令
cmd := exec.Command("<the input command>")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
简单来说,输入的字符串会被粘贴到终端并被执行。
【问题讨论】:
-
Bash 内置命令(不出所料)仅在被 bash 解释时才有效。试试
exec.Command("bash -c 'the command'")。 -
不可能像你期望的那样实现
go run trial.go cd ..,因为一个进程不能改变一个祖先进程的当前工作目录。 -
exec.Command可用于执行命令,即可以通过路径在文件系统中访问的程序。 Bash 内置程序不是命令。它们不能通过文件系统中的路径访问。它们只存在于正在运行的 Bash 进程中。 -
除此之外,在 Go 中包装一个 shell 听起来是一个可怕的想法。我能想象的唯一原因是模仿 rsh 或 ssh 之类的东西——这将是重新发明轮子,说得客气一点。
标签: linux bash shell go terminal