我想从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到正确的目录。不像我希望的那样自成一体,但它完成了这项工作。
感谢回复,伙计们。
答案 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}")