[英]How to change the shell's current working directory in Go?
我想用 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
}
}
但是當我在 shell 中運行go run main.go
時,它仍然沒有切換到我的主目錄。
那么如何通過運行 go 文件來更改我在 shell 中的工作目錄呢?
你不能這樣做; 每個子進程都有自己從父進程繼承的工作目錄。 在這種情況下,您的cd
從其父級(您的 shell)獲取其工作目錄。 子進程不能更改父進程的目錄或任何其他狀態。
這是基本的進程分離。 允許子進程影響其父進程會帶來各種安全和可用性問題。
Shell 將cd
實現為“特殊內置”。 它不是外部二進制文件:
$ where cd
cd: shell built-in command
換句話說,當 shell 運行cd
命令時,它與 shell 的其余部分在同一進程中運行。
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)
}
}
無論您使用哪種語言來實現它,您都無法在外部二進制文件中實現它。
我沒有完整的解決方案,但值得一提的是,您可以加載 golang 內置函數。 如果我找到/制作一個,我會用更完整的實現來更新這個答案。
Bash(和許多其他 shell)支持可加載的內置函數。 這個庫和其他庫支持內置函數,但不清楚如何修改 shell 變量(如PWD
)。
該名稱是對用於加載這些擴展的enable
內置函數的一種播放。 見https://linux.die.net/man/1/enable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.