如何在thor子任务中获取主调用脚本的原始工作目录PWD
解决方案
问题原因
你通过IO.popen启动的是独立的子Ruby进程,父子进程的内存空间完全隔离,父进程定义的全局变量无法直接传递到子进程,所以全局变量的方案会失效。
推荐实现方案(环境变量传递,侵入性最低)
环境变量会被子进程自动继承,非常适合传递这类全局配置值。
第一步:修改主脚本 script.rb
将初始工作目录写入环境变量,同时修正原代码中路径插值的写法问题:
# this works current_dir = Dir.getwd # 把初始工作目录写入环境变量 ENV['INITIAL_WORK_DIR'] = current_dir # 修正路径插值写法,用双引号包裹做字符串插值 Dir.chdir("#{current_dir}/tasks") { IO.popen("thor #{ARGV * ' '}") do |io| while (line = io.gets) do puts line end io.close end }
第二步:修改子任务脚本 tasks/example.rb
直接读取对应的环境变量即可获取初始工作目录:
require 'thor' class Git < Thor include Thor::Actions desc 'test', 'test' def test # 读取环境变量,增加降级逻辑避免环境变量丢失 initial_work_dir = ENV['INITIAL_WORK_DIR'] || Dir.getwd puts initial_work_dir end end
其他可选方案
如果不想使用环境变量,也可以把初始目录作为特殊参数追加到thor命令末尾,在子脚本中先从ARGV取出该值再移除,避免干扰thor的正常参数解析,不过该方案需要处理参数顺序、转义等问题,易用性不如环境变量方案。
内容的提问来源于stack exchange,提问作者user391986
相关产品推荐
相关产品推荐

