从Go更改父shell目录

从Go更改父shell目录,go,Go,如何编写一个与“cd”类似的Go程序 我试着运行一个命令,但没有成功 func main() { cmd := exec.Command("cd", "/media/") err := cmd.Run() log.Printf("Command finished with error: %v", err) } 如何编写一个与“cd”类似的Go程序 这在POSIX系统上是不可能的(即使使用任何其他编程语言) 因为包括父shell进程在内的每个进程都有自己的当前进程。因此,

如何编写一个与“cd”类似的Go程序

我试着运行一个命令,但没有成功

func main() {
    cmd := exec.Command("cd", "/media/")
    err := cmd.Run()
    log.Printf("Command finished with error: %v", err)
}
如何编写一个与“cd”类似的Go程序

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

因为包括父shell进程在内的每个进程都有自己的当前进程。因此,
cd
必须是一个(调用shell进程本身完成的系统调用),它不能由某些人完成,因为shell会派生一个新进程来运行每个命令(使用一些可执行文件,即,它不是内置的)

阅读一些优秀的Unix或Linux编程书籍,如,以获取解释。还有一本关于的好书,比如,可以解释为什么会这样(在类似POSIX或Unix的系统中,不可能是这样)

您的代码(带有
cmd.Run
)是一个新进程,并且该子进程只更改其工作目录。另见&&

要在Go代码中调用系统调用,请使用。这只会影响您的进程(以及将来由创建的所有子进程,它们继承父进程的工作目录),当然不会更改父进程(通常是您的shell)的工作目录

要获取当前进程的当前工作目录(带有系统调用),请在Go代码中使用(请参阅)

在Linux上,您可以使用
/proc/
(有关详细信息,请参阅)查询其他进程的工作目录。例如,在shell中运行
ls-l/proc/$$/cwd
。在Go代码中,您将在路径(如
/proc/1234/cwd
等)上使用。当然,您不能更改其他进程的工作目录(唯一允许您更改的工作目录是您自己的进程,使用)

正如所评论的,你可以采用一个奇怪的约定:1。您的
prog
程序在标准输出上写入一个有效的(并对shell适当引用)目录路径,而不写入其他内容。2.您总是将
prog
程序与a一起使用,类似于
cd$(prog args…
(它可以成为a或an的主体,等等),然后您的shell(而不是
prog
)将更改目录作为程序的输出

如何编写一个与“cd”类似的Go程序

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

因为包括父shell进程在内的每个进程都有自己的当前进程。因此,
cd
必须是一个(调用shell进程本身完成的系统调用),它不能由某些人完成,因为shell会派生一个新进程来运行每个命令(使用一些可执行文件,即,它不是内置的)

阅读一些优秀的Unix或Linux编程书籍,如,以获取解释。还有一本关于的好书,比如,可以解释为什么会这样(在类似POSIX或Unix的系统中,不可能是这样)

您的代码(带有
cmd.Run
)是一个新进程,并且该子进程只更改其工作目录。另见&&

要在Go代码中调用系统调用,请使用。这只会影响您的进程(以及将来由创建的所有子进程,它们继承父进程的工作目录),当然不会更改父进程(通常是您的shell)的工作目录

要获取当前进程的当前工作目录(带有系统调用),请在Go代码中使用(请参阅)

在Linux上,您可以使用
/proc/
(有关详细信息,请参阅)查询其他进程的工作目录。例如,在shell中运行
ls-l/proc/$$/cwd
。在Go代码中,您将在路径(如
/proc/1234/cwd
等)上使用。当然,您不能更改其他进程的工作目录(唯一允许您更改的工作目录是您自己的进程,使用)


正如所评论的,你可以采用一个奇怪的约定:1。您的
prog
程序在标准输出上写入一个有效的(并对shell适当引用)目录路径,而不写入其他内容。2.您总是将
prog
程序与a一起使用,类似于
cd$(prog args…
(它可以成为a或an的主体,等等),然后您的shell(而不是
prog
)将更改目录作为程序的输出。

谢谢,实际上,我正在尝试将cd的书签程序实现为“bookmark”名称,并将其转换为一个目录,您知道如何解决这个问题吗?这是不可能的,除非您直接从程序中调用
os.Chdir
(这不会改变父shell的工作目录,只会改变运行您的程序的进程及其所有未来的子进程的工作目录)。同样,您需要读取。没有任何“解决方法”。好的,解决方法是创建一个运行go程序的别名,该程序列出了路径。
alias gcd=goprogram cd a
这不是一个解决方法。您不能改变这样一个事实,即每个进程都有自己的工作目录,并且不可能更改其他进程(如父shell)的工作目录可以通过一个别名执行此操作,该别名可以执行
alias gcd=cd[backtick]goprog foo[backtick]
(不知道如何在注释中键入文字反勾号,因为这会生成代码段。但这将以
foo
作为参数运行
goprog
,然后
cd
到输出的任何内容,我实际上正在尝试实现一个书签程序,该程序将cd标记为“bookmark”名称,并将其转换为目录,你知道怎么做吗o解决方法?这是不可能的,除非您直接从程序中调用
os.Chdir
(这不会更改父shell的工作目录,仅更改运行程序的进程及其所有未来子进程的工作目录)。同样,您需要