You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:15:03