如何从ruby脚本中的(终端)cd文件夹中

Emi*_*ggi 8 ruby

我想知道是否可以从我正在执行ruby脚本的位置更改当前终端目录.

例如,如果我正在$HOME终端中执行脚本,我想$HOME/mydir在脚本的末尾cd入.

我尝试了几件事,但我总是在脚本启动的同一个导演中找到.

我试过的事情:

Dir.chdir( mydir )
%[cd mydir]
Run Code Online (Sandbox Code Playgroud)

它们实际上是在更改目录,但仅在脚本执行的线程中.当脚本结束时,我在终端中的当前位置仍然与启动脚本之前的位置相同.

我在SO中发现了类似的东西,但它与Python相关并且响应似乎是否定的.


你可能会问为什么?

我目前正在参与一个命令行应用程序(使用gli),作为起点,它需要一个项目文件夹.所以我的第一个命令看起来像:

$ myfoo new project
Run Code Online (Sandbox Code Playgroud)

这会project在当前目录中创建一个名称为的新文件夹.现在能够使用我需要的其他命令:

$ cd project
project$ myfoo domore
Run Code Online (Sandbox Code Playgroud)

所以我只是觉得在project执行完毕后发现自己很好myfoo new project.


我害怕,这并不容易(根本不可能).那么使用一个执行我想要的ruby调用的bash脚本代替RubyGems生成的标准文件呢?这可行吗?我傻了吗?我应该用eval吗?


谢谢你的回答.但我担心没人接受.可能问题不是:).

Ian*_*Ian 2

据我所知,这是不可能的,因为它们是不同的过程。如果您需要影响 Ruby 脚本的父进程 (Bash),Bash 将需要获取某些内容。因此,您可以让 Ruby 脚本输出一些 bash 命令,然后使用一个 Bash 包装器来获取 Ruby 的输出。

试试这个例子,在 Bash 中:

`ruby -e 'puts "cd /tmp"'` | source /dev/stdin
Run Code Online (Sandbox Code Playgroud)

但这仅适用于 Bash 4.0。

编辑:

实际上,您可以使用 eval 而不是 Bash 3 中的 source 来完成此操作:

eval $(ruby -e'puts "cd /tmp"')
Run Code Online (Sandbox Code Playgroud)