0

我的项目是 Haskell 中的一个命令行应用程序,并使用opt-parse应用程序包来处理命令行选项的解析。

我正在尝试实现一种功能,该功能可以更改运行命令的 shell 的工作目录。

例如,我想做类似的事情

$ program foo

并将 shell 更改为我的程序与传递的选项关联的指定目录foo

$ program foo
input 'foo'; now changing to directory '~/mydirectories/foodirectory'
[~/mydirectories/foodirectory]$

我尝试使用包中的setCurrentDirectory函数来实现此功能directory,但这似乎不会影响运行该目录的 shell 中的工作目录;工作目录没有变化。我想象它正在设置某种程序内部工作目录,因为我看到运行可执行文件的 shell 没有任何变化。

是否可以让我的程序以这种方式更改目录?这种目录切换功能将提高使用我的应用程序的便利性。

如何从命令行可执行文件实现目录切换功能?

4

1 回答 1

4

一般来说,你不能这样做。任何程序都不能使用标准的 UNIX 接口更改其父进程的目录,无论它是用什么语言编写的。一个程序只能改变它自己的目录(并且,通过扩展,它随后启动的任何程序的初始工作目录)。

但是,通过 shell 的积极参与,您可以做出非常相似的东西。考虑指导您的用户运行 shell 函数,如下所示:

# this wrapper works on any POSIX shell, but will avoid setting a global variable "dir" if
# the active shell (like bash, ksh, or even dash) supports local variables.
chdirWithMyHaskellProgram() {
    local dir 2>/dev/null || \
      declare dir 2>/dev/null || \
      : "current shell does not support local variables; proceeding anyhow"
    dir="$(myHaskellProgram "$@")" && cd -- "$dir"
}

...当且仅当退出状态指示成功时,将导致chdirWithMyHaskellProgram --foo-bar调用myHaskelProgram --foo-bar,并更改到相同的输出中命名的目录。


考虑myHaskelProgram --eval将源代码发送到上述函数。如果您实现了这一点,那么您的用户将需要放入eval "$(myHaskelProgram --eval)"他们的点文件,但此后将具有所需的功能。

于 2018-01-25T00:05:50.057 回答