我想cd用Go 实现命令main.go:
cd
main.go
func main() { flag.Parse() if flag.NArg() == 0 { curUser, err := user.Current() if err != nil { log.Fatal(err) } os.Chdir(curUser.HomeDir) // or like this // cmd := exec.Command("cd", curUser.HomeDir) fmt.Println(os.Getwd()) // ok in application } }
但是当我go run main.go在shell中运行时,它仍然不会切换到我的主目录。
go run main.go
那么如何通过运行go文件在shell中更改我的工作目录?
你做不到 每个子进程都有从父进程继承的自己的工作目录。在这种情况下,您cd将从其父级(您的shell)获取其工作目录。子进程无法更改父进程的目录或任何其他状态。
这是基本的过程分离。允许子进程影响其父进程将遇到各种安全性和可用性问题。
外壳实现cd为“特殊内置”。它不是外部二进制文件:
$ where cd cd: shell built-in command
换句话说,当外壳程序运行cd命令时,它与外壳程序其余部分的运行过程相同。
Shell的REPL的基本逻辑如下所示:
for { line := waitForInputLine() switch { case strings.HasPrefix(line, "cd"): os.chdir(strings.Split(line, " ")[1]) // ..check other builtins and special cases./ default: runBinary(line) } }
无论使用哪种语言来实现,都无法在外部二进制文件中实现。