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.

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

报告相同问题?

悬赏问题

  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)