diff --git a/content/posts/为单一命令设置代理环境变量的终端函数.md b/content/posts/为单一命令设置代理环境变量的终端函数.md index a2bea75..5d36ba9 100644 --- a/content/posts/为单一命令设置代理环境变量的终端函数.md +++ b/content/posts/为单一命令设置代理环境变量的终端函数.md @@ -33,11 +33,27 @@ function proxyenv { HTTPS_PROXY=${proxy_dest} export proxy http_proxy https_proxy PROXY HTTP_RPOXY HTTPS_PROXY - eval "$@" + "$@" ) } ``` +> Update: 注意最后一条命令现在是 `"$@"` 而不是以前的 `eval "$@"`,这样才能够避免括号产生额外的意义。 +> +> 在 Bash 下使用 `help eval` 可以看到 `eval` 的作用,其会将所有作为参数的字符串合并为一个,然后直接传递给 shell 运行,所以这些字符串会再一次经过变量代换、命令行代换、引号移除等**展开**过程。 +> +> ``` +> $ help eval +> eval: eval [arg ...] +> Execute arguments as a shell command. +> +> Combine ARGs into a single string, use the result as input to the shell, +> and execute the resulting commands. +> +> Exit Status: +> Returns exit status of command or success if command is null. +> ``` + ### 针对 sudo 命令 在使用 `sudo` 命令时,它的默认行为是不保留任何当前 shell 下的环境变量,因此即便使用 `proxyenv sudo wget` 命令,也无法在 `wget` 中使用这些环境变量。一个临时的解决方案是使用 `sudo` 的 `--preserve-env` 参数,像下面这样