我想在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命令运行。
答案 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。