在ruby脚本中执行cd命令

时间:2010-08-04 22:18:52

标签: ruby

我想从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)

对此有何解决方法?


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

感谢回复,伙计们。

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

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

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

'cd #{path} && <statement> && cd ..'

答案 3 :(得分:3)

正如其他答案已经指出的那样,您可以更改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执行的(尽管还有更多的解决方法)。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以尝试使用system代替exec。 它对我有用。

system("cd #{new_path} && <statement> && cd #{original_path}")

一样