bash - 如何编写一个可以切换到 bash 的 shell?

标签 bash shell unix go

我想在 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)

来源https://github.com/grzegorz-zur/bare-minimum/blob/95fb116631b6146707c47455d8ffce6bb5b8717c/editor.go#L152

早些时候,您需要在 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
    }
}

来源https://github.com/grzegorz-zur/bare-minimum/blob/95fb116631b6146707c47455d8ffce6bb5b8717c/editor.go#L87

关于bash - 如何编写一个可以切换到 bash 的 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472845/

相关文章:

bash - 使用 --exclude、grep -v 或 sed 从 du 命令输出中排除隐藏文件

linux - 如何在 Perl 的 system() 中使用 shell 的进程替换?

java - 在 Linux 上使用 Java 从 Windows 计算机中删除数百万个文件

bash - 为什么 bash (但不是破折号)丢失命令替换内的 heredoc 中的换行符?

linux - 创建一个不解释任何内容的 heredoc

linux - 创建 Unix 脚本来检查目录和子目录

c - 如何将多个小C程序组合在一起?

python - base64 和 MIME base 64 有什么区别?

python 3。导入错误 : no module named 'myfile'

linux - 检查脚本是否正在运行并启动它的脚本,如果它已停止