2 回答
TA贡献1848条经验 获得超10个赞
将命令的标准输入、标准输出和标准错误连接到父进程的标准输入。此外,提供-cto exec.Command, bashelsebash将尝试运行您的程序,就好像它是一个 shell 脚本一样。
例如启动交互式 Python 控制台:
func main() {
fmt.Println("Before Python shell:")
cmd := exec.Command("bash", "-c", "/usr/bin/python3")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
_ = cmd.Run() // add error checking
fmt.Println("After Python shell")
}
TA贡献1794条经验 获得超8个赞
听起来您想用您尝试启动的命令替换当前进程。在你启动另一个命令之后,你的 Go 程序就消失了,调用者与启动的程序交互,就好像它是最初启动的东西一样。
为此,您需要低级syscall.Exec函数。您通常不应该期望它返回。请注意,您需要提供许多详细信息,例如要运行的实际二进制文件以及高级包装器不需要的环境。(一个非常快速的谷歌搜索找到了这个详细的文章。)
import "os"
import "syscall"
err := syscall.Exec("/bin/ls", []string{"ls", "-l", "/"}, os.Environ())
// We don't expect this to ever return; if it does something is really wrong
os.panic(err)
就底层的 Unix 系统调用而言,更高级别的接口os.StartProcess和exec.Cmdall fork (2) 首先是一个子进程,然后是该子进程中的execve (2)。当您的 Go 进程退出时,该子进程将变为孤立的,系统 init 进程将成为其新的父进程。shell 只是看到 Go 进程已经退出,并会产生一个新的 shell 提示符。
- 2 回答
- 0 关注
- 673 浏览
添加回答
举报
