簡體   English   中英

如何在 Go 中更改 shell 的當前工作目錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM