Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写一个可以切换到bash的shell?_Bash_Shell_Unix_Go - Fatal编程技术网

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

如何编写一个可以切换到bash的shell?,bash,shell,unix,go,Bash,Shell,Unix,Go,我想从go中的自定义shell切换到bash shell 我不知道如何休眠父进程(自定义shell)并切换到子进程(bash) 这是我的部分代码 cmd:=exec.Command(“bash”、“-c”、“/bin/bash”) stdoutStderr,err:=cmd.CombinedOutput() 如果出错!=零{ fmt.Printf(err.Error()) } fmt.Printf(“%s\n”,stdoutStderr) 我想这样做: myshell>>/bin/bash $

我想从go中的自定义shell切换到bash shell

我不知道如何休眠父进程(自定义shell)并切换到子进程(bash)

这是我的部分代码

cmd:=exec.Command(“bash”、“-c”、“/bin/bash”)
stdoutStderr,err:=cmd.CombinedOutput()
如果出错!=零{
fmt.Printf(err.Error())
}
fmt.Printf(“%s\n”,stdoutStderr)
我想这样做:

myshell>>/bin/bash
$/bin/myshell
我的地狱>>
代码是exec,但不是fork

binary,lookErr:=exec.LookPath(“/bin/bash”)
如果你看得很好!=零{
恐慌(lookErr)
}
args:=[]字符串{“/bin/bash”}
env:=os.Environ()
execErr:=syscall.Exec(二进制、args、env)
如果执行错误!=零{
恐慌(执行错误)
}
因此,如果我退出bashshell,我的自定义shell当然会被杀死

myshell>bash
bash-3.2$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
    }
}

Source

这是一个如何停止进程并让父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
    }
}

来源

我用这种方法解决了这个问题

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("sh", "-c", "bash")
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    cmd.Stderr = os.Stderr

    cmd.Run()
}

我用这种方法解决了这个问题

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("sh", "-c", "bash")
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    cmd.Stderr = os.Stderr

    cmd.Run()
}

如果您从
myshell
开始,只需
exec/bin/bash
(或您的shell的等效程序),当您在bash中完成后,只需退出
返回
myshell
(您必须在命令
/bin/myshell
中将其作为条件,以便在启动时不会执行)@DavidC.Rankin Hi,因为我想替换/etc/passwd中的默认shell,但是如果需要,我可能需要bash shell。所以我必须实现从我的自定义shell切换到bash的功能。。。这更有道理,但同样有效。如果您启动到
/bin/myshell
并希望加载
/bin/bash
,只需执行
myshell
中的
exec/bin/bash
(它将当前shell替换为
/bin/bash
)。要返回到
/bin/myshell
,您仍然只需要退出
/bin/bash
。我从
/bin/bash
/bin/zsh
,然后在我的
.bashrc
中只使用
别名zshell='(exec zsh)
。(但请注意,
zsh
是在我当前shell的子shell中执行的,例如
(zsh)
保存,例如进入睡眠,
/bin/bash
,直到我退出
zsh
)@David C.Rankin你说的操作正是我想要实现的,但我仍在寻找用go语言进行bash过程的方法。我对这一部分一无所知:(
我甚至从未看过go是什么。希望其他人能在这方面提供帮助…如果你从
myshell
开始,只需
exec/bin/bash
(或与你的shell相当的版本),当您在bash中完成时,只需退出即可返回到myshell(您必须在命令
/bin/myshell
中将其设置为条件,以便在启动时不执行)@DavidC.Rankin您好,因为我想在/etc/passwd中替换我的默认shell,但是如果需要,我可能需要bash shell。因此我必须实现从自定义shell切换到bash的功能。哦……这更有意义,但仍然有效。如果您启动到
/bin/myshell
并想加载
/bin/bash
,那么请执行的任何操作de>exec/bin/bash位于
myshell
(它将当前shell替换为
/bin/bash
)。要返回
/bin/myshell
,您仍然只需要退出
/bin/bash
。我从
/bin/bash
/bin/zsh
,然后只使用
别名zshell=”(exec zsh)“
在my
.bashrc
中(但请注意,
zsh
是在当前shell的子shell中执行的,例如
(zsh)
在退出
zsh
之前,保留(例如,将
/bin/bash
置于睡眠状态)@David C.Rankin您所说的操作正是我想要实现的,但我仍在寻找一种用go语言实现bash过程的方法。我对这一部分一无所知:(我甚至从来没有看过go是什么。希望其他人能帮上忙…您能补充说明吗?您能补充说明吗?