为单条 shell 命令使用不同的代理
当你想临时改变路由,又不想改动父 shell 或编辑启动文件时,可以在命令前加上代理变量。
你希望某一次下载使用另一个代理,之后一切恢复正常。不需要去改 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 可能会过滤环境;对外层命令可见的变量不会自动穿过每一道权限边界。临时作用域和真正的代理选择仍然是两个独立的问题。