Fish 与 Bash 中的全局变量 & 环境变量

在日常写脚本或配置 API Key 时,经常会遇到 全局变量 (global variable)环境变量 (environment variable)。 很多人会混淆它们的作用范围,这里用 fish shell 为例梳理清楚。


1. 概念区分

特性 全局变量 (-g) 环境变量 (-x)
当前 shell 可见
函数/脚本可见
子进程可见
生命周期 当前会话 当前会话

👉 记忆口诀:

  • 全局变量:只在当前鱼缸(fish shell)里有效。
  • 环境变量:不仅在鱼缸里有效,还会传递到外部溪流(子进程)。

2. 示例对比

仅设置全局变量

set -g FOO bar
echo $FOO
1. 输出: bar

python3 -c 'import os; print(os.getenv("FOO"))'
1. 输出: None  (子进程看不到)

设置环境变量

set -x FOO bar
echo $FOO
1. 输出: bar

python3 -c 'import os; print(os.getenv("FOO"))'
1. 输出: bar  (子进程能看到)

同时设置全局 + 环境变量(最常见)

set -gx FOO bar
echo $FOO
1. 输出: bar

python3 -c 'import os; print(os.getenv("FOO"))'
1. 输出: bar

3. 图解:父进程与子进程的可见范围

flowchart TD
    A[Fish Shell 会话] --> B[全局变量 -g]
    A --> C[环境变量 -x]

    B -.不可见.-> D[子进程 (Python/Node/curl...)]
    C --> D
  • 全局变量 -g:在 fish 自己的范围内可见,子进程不可见。
  • 环境变量 -x:既在 fish 内部可见,也会导出给子进程使用。

4. Bash 与 Fish 的对照表

操作 Bash 写法 Fish 写法
定义变量 FOO=bar set FOO bar
导出环境变量 export FOO=bar set -x FOO bar
全局变量 (无严格区分) set -g FOO bar
删除变量 unset FOO set -e FOO
取第一个参数 $1 $argv[1]
case 分支 case ... esac switch ... end

5. 实际应用场景

  • 配置 API Key:推荐 set -gx API_KEY xxx
  • 临时测试变量:可以用 set -g(不导出,避免影响子进程)
  • 清理变量:用 set -e

发表回复

Your email address will not be published. Required fields are marked *.

*
*