dongxi1320 2018-12-31 07:40
浏览 13
已采纳

从Go更改父Shell目录

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

I tried running a Command, but it didn't work.

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

1条回答 默认 最新

  • drzfnr0275 2018-12-31 07:45
    关注

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

    This is impossible on POSIX systems (even by using any other programming languages).

    Because each process, including the parent shell process, has its own current working directory. Hence cd has to be a shell builtin (invoking the chdir(2) system call done by the shell process itself), it cannot be done by some executable, because the shell forks a new process to run every command (using some executable, i.e. which is not a builtin).

    Read some good Unix or Linux programming book, such as the ALP, for an explanation. And a good book on Operating systems, such as Operating systems: three easy pieces would explain you why is it so (and cannot reasonably be otherwise, in POSIX-like or Unix-like systems).

    Your code is forking (with cmd.Run) a new process, and that child process only is changing its working directory. See also fork(2) & execve(2) & path_resolution(7).

    To invoke the chdir(2) system call in your Go code, use os.Chdir. That would only affect your process (and all future child processes created by fork(2), which inherit the working directory of their parent process) and of course won't change the working directory of your parent process (which often is your shell).

    To get the current working directory (with the getcwd(2) system call) of your current process, use os.Getwd in your Go code (and see this).

    On Linux, you could use /proc/ (see proc(5) for details) to query the working directory of other processes. For example, run ls -l /proc/$$/cwd in your shell. In Go code you'll use os.Readlink on a path like /proc/1234/cwd etc. Of course you cannot change the working directory of some other process (the only working directory that you are allowed to change is the one of your own process, using chdir(2))

    As commented by David Budsworth, you could adopt a weird convention that: 1. Your prog program writes a valid (and suitably quoted for the shell) directory path on the standard output, and nothing else. 2. You always use that prog program with a command substitution, something like cd $(prog args...) (which could become the body of a shell function or an alias, etc...), then your shell (not your prog) would change directory as output by your program.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog