如何在没有shell扩展的情况下替换当前进程,传递完整的ARGV数组

时间:2012-10-17 15:00:05

标签: ruby command-line-arguments env

什么是Bash

的简单等价物
exec $0 $*
在Ruby中

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-exec

修改

部分答案似乎是:

  exec( "/bin/ls", *ARGV)  # credits: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/13379

接下来,变量$0将保存当前脚本的完整名称和路径,还是Ruby二进制文件?在 irb 下只有“irb”返回,这意味着我至少需要找到并添加路径。

条纹上的另一个解决方案来自https://stackoverflow.com/a/2966988/1069375

cmd_line = "#{$0} #{ARGV.join( ' ' )}" 

但是,尝试exec cmd_line似乎需要进行shell扩展,如果它可以将命令与其参数分开。 ARGV.join本身会将所有参数整合为一个。

1 个答案:

答案 0 :(得分:2)

这应该在不调用子shell的情况下执行当前文件:

exec([ File.absolute_path(__FILE__), __FILE__ ], *ARGV)

编辑:当然,如果您要更改脚本中的当前工作目录,它会中断。不过,这很容易解决。