定义全局只读系统变量需三步:赋值→export导出→readonly锁定;持久化须写入/etc/profile.d/或~/.bash_profile等初始化文件,并用echo、env、子shell等验证。

在 Linux Shell 中定义全局只读的系统配置变量,需要两个关键步骤:一是让变量对所有子进程可见(即“全局”),二是锁定其值不可修改(即“只读”)。这两步缺一不可,顺序也不能颠倒——必须先赋值并导出为环境变量,再设为只读;若先 readonly 再 export,export 会失败。
1. 正确的定义顺序:赋值 → 导出 → 锁定
以定义一个名为 APP_ENV、值为 production 的全局只读变量为例:
- APP_ENV="production" —— 先完成本地赋值(注意等号无空格)
- export APP_ENV —— 将其提升为环境变量,供子 shell 和后续命令继承
-
readonly APP_ENV —— 最后声明只读,此后任何重新赋值都会报错
bash: APP_ENV: readonly variable
三行可合并为一行写法:export APP_ENV="production"; readonly APP_ENV。但分步更清晰、便于调试。
2. 让变量持久生效:写入系统级配置文件
仅在当前终端执行上述命令,变量只在本次会话有效。要成为真正“系统级”的配置变量,需写入 Shell 初始化文件,并确保加载时机正确:
- 对所有用户生效 → 编辑 /etc/profile 或 /etc/profile.d/myconfig.sh(推荐后者,更模块化)
- 仅对当前用户生效 → 编辑 ~/.bash_profile(登录 shell)或 ~/.bashrc(交互非登录 shell)
例如,在 /etc/profile.d/app-env.sh 中写入:
export APP_ENV="production"readonly APP_ENV
保存后,新打开的终端会自动加载;已有终端可执行 source /etc/profile.d/app-env.sh 立即生效。
3. 验证是否成功
定义完成后,用以下方式验证:
-
echo $APP_ENV —— 应输出
production - env | grep APP_ENV —— 应出现在环境变量列表中(证明已全局导出)
-
APP_ENV="test" —— 应报错
bash: APP_ENV: readonly variable(证明已锁定) -
bash -c 'echo $APP_ENV' —— 子 shell 中也能输出
production(证明全局性)
4. 注意事项与常见错误
实际操作中容易忽略的关键细节:
- 变量名建议全大写(如 DB_HOST),符合 Linux 环境变量惯例,也避免与普通变量混淆
- 不能用 declare -r 替代 readonly 后再 export ——
declare -r定义的变量无法被 export,它只作用于当前 shell 层级 - 如果变量值含空格或特殊字符,赋值时必须用双引号包裹,例如:export LOG_PATH="/var/log/app"
- 不要在 /etc/environment 中使用
export或readonly—— 该文件不解析 Shell 语法,只接受KEY=VALUE格式,且不支持只读声明


















