以可移植的方式以编程方式更改shell的cwd

时间:2011-05-24 19:43:38

标签: shell batch-file cmd

我想在C中编写一个命令行工具,它可以作为高级“cd”或“pushd / popd”命令,可以移植到Windows / Mac / Linux。 (详细信息,如果您好奇,请在http://alsweigart.tumblr.com/post/4008393181/command-line-idea-up

问题是,当用户从shell运行程序时,更改当前工作目录将改变程序的cwd,而不是shell的cwd。

有没有办法编写程序来做我想做的事情,还是我不得不求助于编写bash脚本/批处理文件?

或者,有没有办法管道程序的输出作为shell命令运行?即程序输出“cd / foo / bar”,shell脚本调用该程序并将其输出作为shell命令运行。

4 个答案:

答案 0 :(得分:4)

通常,一个进程无法更改另一个进程的当前目录(在Windows和Unix系统上都是如此)。因此,在shell外部作为单独进程运行的程序无法更改shell的当前目录。

您可能必须使用批处理文件和/或shell脚本的某种组合来完成您想要的操作。请注意,虽然Windows批处理文件可以更改它们运行的​​shell的当前目录,但是Unix上的shell脚本的 true。在Unix的情况下,您可能希望使用shell 函数,它们在同一个进程中运行。请注意,编写shell函数是特定于shell的,因此您必须将程序移植到您想要支持的每个Unix shell。

在某些Unix shell上,您可以使用.命令在当前shell的上下文中运行shell脚本。如果你的shell支持它,你可以使用shell别名来运行它,这样你就不必在命令前键入.

答案 1 :(得分:1)

操作shell的工作目录是必须由shell本身完成的 - 你不能编写程序来执行它。至于你的第二个问题,请发一个你所询问的例子。

答案 2 :(得分:0)

解决方案是创建一个运行程序的shell函数,然后对结果执行cd。

mycd()
{
  cd `mycdprogram "$@"`
}

您可以像mycd Please change my directory to /tmp或您的程序所需的任何参数一样运行它。

对于其他命令,您可以执行以下操作:

myrun()
{
   eval `myprogram "$@"`
}

shell将执行myprogram生成的任何shell命令。

当然,所有这些都适用于POSIX shell。

答案 3 :(得分:0)

$(echo "cd /foo/bar")

这演示了如何使用POSIX shell进行此类操作。当然,它不适用于Windows shell。