gpt4 book ai didi

go - 从 Go 更改父 shell 目录

转载 作者:IT王子 更新时间:2023-10-29 02:26:57 26 4
gpt4 key购买 nike

我怎样才能编写一个行为与“cd”一样的 Go 程序?

我尝试运行命令,但没有成功。

func main() {
cmd := exec.Command("cd", "/media/")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)
}

最佳答案

How can I write a Go program that will behave as 'cd ' does?

这在 POSIX 系统上不可能(即使使用任何其他编程语言)。

因为每个 process ,包括父 shell 进程,有其自己的当前 working directory .因此 cd 必须是 shell builtin (调用由 shell 进程本身完成的 chdir(2) 系统调用),它不能由某些 executable 完成,因为 shell 会 fork 一个新进程来运行每个命令(使用一些可执行文件,即不是内置的)。

阅读一些好的 Unix 或 Linux 编程书籍,例如 ALP ,求解释。还有一本关于 Operating systems 的好书,例如 Operating systems: three easy pieces会向您解释为什么会这样(并且在类似 POSIX 或类 Unix 的系统中不可能是其他情况)。

您的密码是 forking (使用 cmd.Run)一个新进程,那个子进程正在更改其工作目录。另见 fork(2) & execve(2) & path_resolution(7) .

调用 chdir(2)在你的 Go 代码中使用系统调用,使用 os.Chdir .这只会影响您的进程(以及由 fork(2) 创建的所有 future 子进程,它们继承其父进程的工作目录),当然不会更改您的父进程(通常是您的 shell)的工作目录。

要获取当前进程的当前工作目录(使用getcwd(2) 系统调用),请使用os.Getwd。在你的 Go 代码中(参见 this )。

在 Linux 上,您可以使用 /proc/(详见 proc(5))查询其他进程的工作目录。例如,在您的 shell 中运行 ls -l/proc/$$/cwd。在 Go 代码中,您将使用 os.Readlink在像 /proc/1234/cwd 等路径上。当然你不能改变一些其他进程的工作目录(你唯一可以改变的工作目录是你自己的进程之一,使用 chdir(2) )

正如 David Budsworth 评论的那样,您可以采用一个奇怪的约定:1. 您的prog 程序在标准输出上写入一个有效的(并且适本地为shell 引用)目录路径,仅此而已。 2. 你总是使用带有 command substitutionprog 程序,类似于 cd $(prog args...) (它可能成为 shell functionalias 等的主体),然后是你的 shell(不是你的 prog) 将更改目录作为程序的输出。

关于go - 从 Go 更改父 shell 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com