当前位置: 首页 > 面试题库 >

如何在Go中更改Shell的当前工作目录?

秦博延
2023-03-14
问题内容

我想cd用Go 实现命令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文件在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)
    }
}

无论使用哪种语言来实现,都无法在外部二进制文件中实现。



 类似资料:
  • 本文向大家介绍如何在Python Shell中知道/更改当前目录?,包括了如何在Python Shell中知道/更改当前目录?的使用技巧和注意事项,需要的朋友参考一下 您可以使用os模块在Python中更改目录或cd。它以您要切换到的目录的相对/绝对路径作为输入。 例如 要了解当前的工作目录或密码,请使用os模块。 例如

  • 问题内容: 如何在Java程序中更改当前工作目录?我已经找到的关于该问题的所有信息都声称你根本做不到,但我不敢相信确实如此。 我有一段代码可以使用通常从其开始的目录中的硬编码相对文件路径打开文件,而我只想能够从其他Java程序中使用该代码而不必从内部启动特定目录。看来你应该可以拨打,但据我所知,仅默默地拨打那条电话就行不通了。 我会理解,如果Java不允许你这样做,或者不是因为Java允许你获取当

  • 问题内容: 是用于更改工作目录的shell命令。 如何在Python中更改当前的工作目录? 问题答案: 你可以使用以下命令更改工作目录: 使用此方法时,有两个最佳实践: 在无效路径上捕获异常(WindowsError,OSError)。如果抛出异常,请不要执行任何递归操作,尤其是破坏性操作。它们将沿旧路径而不是新路径运行。 完成后,返回到旧目录。可以通过将chdir调用包装在上下文管理器中以异常安

  • 问题内容: 我的目标是编写一个类似于Linux的基本Shell的C程序。除了更改工作目录外,我一切正常。我已经尝试了for输入字符串,但没有任何反应。我也尝试过,也没有运气。谁有想法?这是我的代码的一部分: 是否有可能做到这一点?还是这是与子外壳无法执行某些操作有关的简单情况? 编辑:上面的代码已完成。 问题答案: 将结尾字符留在中。 如果您键入,您会打电话而不是。

  • 问题内容: 我想实现一个userland命令,该命令将使用其参数之一(路径)并将目录更改为该目录。程序完成后,我希望外壳位于该目录中。所以我想用外部程序来实现命令。 可以在python脚本中完成还是必须编写bash包装器? 例: 问题答案: 其他人指出,您不能从孩子那里更改父母的工作目录。 但是有一种方法可以实现您的目标-如果从shell函数中进行cd,则 可以 更改工作目录。将此添加到您的〜/

  • 问题内容: 我想使用Java访问我当前的工作目录。 我的代码: 输出: 我的输出不正确,因为C驱动器不是我的当前目录。 如何获得当前目录? 问题答案: 代码: 这将打印从中初始化您的应用程序的当前目录的绝对路径。 说明: 从文档中: 软件包使用当前用户目录解析相对路径名。当前目录表示为系统属性,也就是从其中调用JVM的目录。