你希望某一次下载使用另一个代理,之后一切恢复正常。不需要去改 shell 的启动文件,再指望自己记得改回来。

在 POSIX 风格的 shell 中,对外部命令,把赋值放在命令前面:

https_proxy=http://proxy.example:8080 curl https://example.com/

请使用为那次下载准备的 HTTP 端点;HTTP 代理列表提供了可用于获准公共路由的候选。该赋值提供给这条命令的环境。它的子进程可以继承这个值,但命令退出后,赋值并不会替换父 shell 已有的值。

读什么仍然由客户端决定

shell 语法只创建一个环境,并不会强制网络路由。请使用应用所支持的变量名。现有的绕过变量、显式的命令选项或应用自身的配置仍可能影响结果。

Bash 环境文档说明了命令前缀的行为。shell 函数、特殊内建命令或 shell 语法作为命令时可能有额外的作用域规则,所以上面的简单示例刻意使用外部程序。

多条命令就用子 shell

(
  export http_proxy=http://proxy.example:8080
  export https_proxy=http://proxy.example:8080
  command-one
  command-two
)

括号中的命令组使用自己的 shell 环境运行。请把示例中的命令名换成你打算运行的程序。这种写法避免了先保存旧值、覆盖它、再在每次可能的失败之后手工恢复的脆弱流程。

别让秘密出现在会被复制进 shell 历史记录的示例里。还要记住 sudo 可能会过滤环境;对外层命令可见的变量不会自动穿过每一道权限边界。临时作用域和真正的代理选择仍然是两个独立的问题。

相关文章