我想在 go 中从我的自定义 shell 切换到 bash shell。
我不确定如何休眠我的父进程(自定义 shell)并切换到子进程(bash)
这是我的部分代码。
cmd := exec.Command("bash", "-c", "/bin/bash")
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf(err.Error())
}
fmt.Printf("%s\n", stdoutStderr)
我想按如下方式做:
myshell >> /bin/bash
$ /bin/myshell
myshell >>
代码是exec但不是fork
binary, lookErr := exec.LookPath("/bin/bash")
if lookErr != nil {
panic(lookErr)
}
args := []string{"/bin/bash"}
env := os.Environ()
execErr := syscall.Exec(binary, args, env)
if execErr != nil {
panic(execErr)
}
因此,如果我退出 bash shell,当然,我的自定义 shell 将被终止。
myshell> bash
bash-3.2$ exit
exit
最佳答案
这是一个关于如何停止进程并让父 shell 进程接管控制的方法。我不确定您是否可以用它来做相反的事情。
这个想法是给自己发送一个停止信号。
pid := os.Getpid()
process, err := os.FindProcess(pid)
if err != nil {
err = errors.Wrapf(err, "error pausing process %+v", process)
return
}
process.Signal(syscall.SIGSTOP)
早些时候,您需要在 goroutine 中监听以继续发出信号,以便在需要时重新初始化您的进程
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGCONT, syscall.SIGTERM)
for signal := range signals {
switch signal {
case syscall.SIGCONT:
// reinitialize
case syscall.SIGTERM:
// stop
}
}
关于bash - 如何编写一个可以切换到 bash 的 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472845/