在ruby脚本中执行cd命令

我想从ruby脚本中更改当前shell的pwd。 所以:

> pwd /tmp > ruby cdscript.rb > pwd /usr/bin 

这是我现在的代码:

 exec('cd /usr/bin') 

不幸的是,cd是内置命令。 所以:

 `exec': No such file or directory - cd (Errno:ENOENT) 

对此有何解决方法?


没办法让它在ruby本身工作,所以我换了齿轮。 我修改了脚本以输出目标目录路径,然后在.bashrc中定义了一个函数,该函数将通过脚本传递参数然后cd到正确的目录。 不像我希望的那样自成一体,但它完成了这项工作。

伙计们,谢谢你的回复。

正如其他答案已经指出的那样,您可以更改ruby脚本中的pwd,但它只会影响子进程(您的ruby脚本)。 无法从子进程更改父进程’pwd。

一种解决方法是,让脚本输出shell命令来执行并在反引号中调用它(即shell执行脚本并将其输出作为执行的命令)

myscript.rb:

 # … fancy code to build somepath … puts "cd #{somepath}" 

称之为:

 `ruby myscript.rb` 

使用别名使其成为一个简单的命令:

 alias myscript='`ruby /path/to/myscript.rb`' 

不幸的是,这样你就无法将脚本输出文本发送给用户,因为脚本输出的任何文本都是由shell执行的(尽管还有更多的解决方法)。

Dir.chdir("/usr/bin")将更改ruby脚本中的pwd,但这不会更改shell的PWD,因为脚本在子进程中执行。

您将无法更改shell的工作目录。

当它执行ruby时,它会分叉,因此你会得到一个新的工作目录。

在寻找同样的事情时偶然发现了这一点。

我能够通过在反引号中运行多个语句来解决这个问题。

 'cd #{path} &&  && cd ..' 

您无法更改在ruby脚本(或任何其他类型的应用程序)中调用您的shell的工作目录(或相关的环境变量)。 唯一可以更改当前shell的pwd的命令是shell内置函数。

您可以尝试使用system而不是exec 。 这个对我有用。

system("cd #{new_path} && && cd #{original_path}")类似system("cd #{new_path} && && cd #{original_path}")