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 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?