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 字符串。

相关文章