如何在bash -c场景中仅设置一次HTTPS_PROXY满足双重代理需求?
在安装脚本中仅设置一次HTTPS_PROXY的方法
问题背景
我需要在安装脚本中配置HTTP代理,初始写法如下:
HTTPS_PROXY="http://1.2.3.4:4321" bash -c "$(curl -L https://my.script.com/install.sh)"
但存在两个必须满足的需求,原写法无法兼顾:
- 下载得到的
install.sh需要$HTTPS_PROXY环境变量来拉取二进制文件; - 命令替换中的
curl也需要走代理,但它无法读取bash -c之前设置的环境变量,因此只能重复设置HTTPS_PROXY或使用curl的-x参数:
HTTPS_PROXY="http://1.2.3.4:4321" bash -c "$(HTTPS_PROXY=http://1.2.3.4:4321 curl -L https://my.script.com/install.sh)" # 或者使用curl的-x参数指定代理 HTTPS_PROXY="http://1.2.3.4:4321" bash -c "$(curl -x http://1.2.3.4:4321 -L https://my.script.com/install.sh)"
我希望找到仅设置一次HTTPS_PROXY的实现方式,当前使用的bash版本为:
$ bash --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
可行方案
我提出一种仅需设置一次代理的写法,可在不同bash版本下验证:
HTTPS_PROXY="http://1.2.2.3:4321" bash -c "curl -L https://my.script.com/install.sh | bash"
方案原理
- 外层设置的
HTTPS_PROXY会被传递给bash -c启动的子shell,子shell中的curl可以直接读取该环境变量,无需额外配置; curl下载的install.sh通过管道交给后续的bash进程执行,这个bash会继承子shell的HTTPS_PROXY环境变量,满足install.sh拉取二进制文件时的代理需求。
内容的提问来源于stack exchange,提问作者coanor
相关产品推荐
相关产品推荐

