我想知道是否可以从我正在执行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吗?
谢谢你的回答.但我担心没人接受.可能问题不是:).
据我所知,这是不可能的,因为它们是不同的过程。如果您需要影响 Ruby 脚本的父进程 (Bash),Bash 将需要获取某些内容。因此,您可以让 Ruby 脚本输出一些 bash 命令,然后使用一个 Bash 包装器来获取 Ruby 的输出。
试试这个例子,在 Bash 中:
`ruby -e 'puts "cd /tmp"'` | source /dev/stdin
Run Code Online (Sandbox Code Playgroud)
编辑:
实际上,您可以使用 eval 而不是 Bash 3 中的 source 来完成此操作:
eval $(ruby -e'puts "cd /tmp"')
Run Code Online (Sandbox Code Playgroud)