2011-05-24 118 views
2

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

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

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

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

回答

1

操作shell的工作目录是必须由shell自己完成的 - 你不能编写程序来完成它。至于你的第二个问题,请发表你的问题的例子。

3

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

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

在某些Unix shell上,可以使用.命令使shell脚本在当前shell的上下文中运行。如果您的shell支持该功能,则可以使用shell别名来运行它,因此您不必在命令前键入.

+0

那么在Unix上'cd'也必须一直是内置的shell? – Joey 2011-05-24 23:16:40

+1

这是正确的。将'cd'实现为外部进程将使得不可能更改shell进程的当前目录。 – 2011-05-24 23:18:02

0

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

mycd() 
{ 
    cd `mycdprogram "[email protected]"` 
} 

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

对于其他命令,你可以这样做:

myrun() 
{ 
    eval `myprogram "[email protected]"` 
} 

和外壳将尽一切shell命令myprogram产生。

当然这些都是POSIX shell的。

0
$(echo "cd /foo/bar") 

这演示了如何使用POSIX shell来做这样的事情。当然,它不能与Windows外壳一起使用。