在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} &&
类似system("cd #{new_path} &&