Rake 的 shell 无法解除 Ruby 的代理
为后续任务修改 Ruby 的 ENV,或者为子进程单独提供环境哈希,而不是在隔离的 sh 调用里解除代理。
sh 'unset http_proxy' 只改变那次调用所启动的 shell。它退出后,Rake 的 Ruby 进程仍保留最初的环境,之后的 sh 调用又会继承这份环境。
要改变 Ruby 进程以影响后续工作:
ENV.delete('http_proxy')
ENV.delete('HTTP_PROXY')
这会影响之后启动的子进程以及读取这些键的 Ruby 代码。它不会重新配置最初启动 Rake 的终端。
对于单个子命令,直接提供它的环境:
sh(
{ 'http_proxy' => nil, 'HTTP_PROXY' => nil },
'ruby', 'download.rb'
)
Ruby 的进程启动接口会把 nil 值视为从该子进程的环境中删除。Rake 把参数列表交给这个接口,因此自己的 ENV 保持不变。
删除与实际客户端相关的键。HTTPS 操作也可能使用 https_proxy,而有些客户端会读取 ALL_PROXY 或另一个配置文件。只删除一个 HTTP 键并不是通用的直连指令。
多参数形式会让可执行文件的参数彼此分开。不需要构造包含解除命令和 URL 的 shell 字符串。