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