当前位置: 首页 > news >正文

Linux readonly 命令详解|Shell 变量 / 函数设为只读,防止误改全攻略

1. 命令简介

readonly 是 Bash 和其他兼容 Shell 的内建命令,用于将 Shell 变量或函数标记为只读。一旦变量或函数被设置为只读,其值或定义就不能被修改或取消设置(unset),这有助于保护重要的配置或防止意外更改。


2. 语法格式

bash

运行

readonly [-aAf] [-p] [name[=value] ...]

语法说明

  • 直接定义并设置为只读:readonly [选项] name[=value] ...
  • 将已存在的变量 / 函数设为只读:readonly [选项] name ...
  • 显示已设置的只读项:readonly [-p]readonly(无参数)

3. 常用选项及说明

表格

选项说明
-a指定后面的 name 为索引数组(array)。在定义数组并设为只读时使用。
-A指定后面的 name 为关联数组(associative array)。在定义关联数组并设为只读时使用。
-f指定后面的 name 为函数(function)。为函数设置只读属性时必须使用此选项。
-p显示当前 Shell 环境中所有已设置的只读变量。如果不提供 name 参数,默认行为就是 -p。
--表示选项结束,其后所有参数均视为 name,即使它们以 - 开头。

参数说明

  • name(可选):要设置为只读的变量名或函数名。
  • value(可选):在定义变量时直接赋予的初始值。对于数组,值应为括号括起的列表。

返回值

  • 成功时返回 0(true)。
  • 如果提供了非法选项、非法名称(如无效的变量名)或尝试修改只读变量,则返回非零值(false)。

4. 示例用法

4.1 定义变量并立即设为只读

定义单个或多个只读变量。

bash

运行

# 定义单个只读变量 readonly PI=3.14159 # 定义多个只读变量 readonly APP_NAME="MyApp" VERSION="1.0" MAX_RETRIES=3

4.2 定义数组并设为只读

定义并设置只读的索引数组或关联数组。

bash

运行

# 定义并设置只读索引数组 readonly -a COLORS=("red" "green" "blue") # 定义并设置只读关联数组 readonly -A CONFIG=(["host"]="localhost" ["port"]="8080")

4.3 将已存在的变量设为只读

先定义普通变量或数组,再将其设为只读。

bash

运行

# 先定义变量 path="/usr/local/bin" count=10 declare -a files=("a.txt" "b.txt") declare -A settings=(["mode"]="debug") # 再将它们设为只读(注意:数组可省略 -a/-A) readonly path count files settings

4.4 将函数设为只读

定义函数后,必须使用 -f 选项将其设为只读。

bash

运行

# 先定义函数 log_message() { echo "[$(date)] $1" } # 将函数设为只读(必须使用 -f) readonly -f log_message # 此后尝试重新定义 log_message 会失败

4.5 显示只读变量和函数

查看当前 Shell 中已设置的只读项。

bash

运行

# 显示所有只读变量(两种方式等效) readonly readonly -p # 显示所有只读索引数组 readonly -a # 显示所有只读关联数组 readonly -A # 显示所有只读函数 readonly -f

4.6 尝试修改只读变量(错误示例)

演示修改或取消只读变量会引发的错误。

bash

运行

readonly SITE="example.com" SITE="newexample.com" # 错误:-bash: SITE: readonly variable unset SITE # 错误:-bash: unset: SITE: cannot unset: readonly variable

5. 注意事项

  • 永久性设置:readonly 属性在当前 Shell 会话中持续有效,且无法撤销。无法使用 declare +r 或 unset 移除只读属性或删除只读变量。
  • 子 Shell 继承:通过 export 导出的只读变量会传递给子进程(子 Shell),且在子 Shell 中同样为只读。
  • 函数只读限制:函数设为只读后,不能重新定义或取消定义,但函数内部的逻辑(如访问全局变量)不受只读属性限制。
  • 数组定义语法:使用 readonly -a 或 readonly -A 定义数组时,赋值语法必须正确(如 arr=(value1 value2))。
  • 脚本使用建议:在 Shell 脚本中,建议将重要的配置变量(如路径、常量)设为只读,以提高脚本的健壮性。
  • 检查只读状态:可通过 declare -p variable_name 查看变量属性,输出中包含 -r 则表示只读。

相关命令

  • declare /typeset:更通用的变量属性设置命令,也可设置只读属性(如 declare -r VAR=value)。
  • export:设置环境变量,常与 readonly 结合使用(如 export readonly DATABASE_URL)。

本命令是 Shell 内建命令,更多细节请参考 help readonly 或 Shell 手册。

http://www.jsqmd.com/news/1324182/

相关文章:

  • 从爱因斯坦求和到多维数组运算:einsum在NumPy、PyTorch与TensorFlow中的核心应用
  • 从BERT到RAG再到Agent-First搜索:AI搜索引擎架构演进图谱(附23家厂商技术栈拆解与兼容性矩阵表)
  • 2025-AAAI《Anchor Learning with Potential Cluster Constraints for Multi-view Clustering》
  • 极值点、驻点与拐点:概念辨析与判别方法全解析
  • 基于Docker部署AI客户端API网关:打破AI应用孤岛
  • MyBatis注解开发实战:从基础CRUD到动态SQL与混合使用策略
  • C#实战:从递归算法到可视化交互的汉诺塔游戏开发指南
  • 基于RAG与本地大模型的轻量级智能文档问答系统实践
  • 双擎并驱·全链路并行:KFS让TB级异构增量同步秒级到达
  • 2026精选:景区指示牌源头工厂怎么选——安徽思扬标识工程有限公司深度剖析 - 装修教育财税推荐2026
  • 《辣知化智》13来自远古的意识密码
  • FPGA驱动LCD:从HD44780时序到Verilog状态机实战
  • 生态旅游教学实训实验室技术架构:VR资源库+3DGS+人景合一+数字人四层工具链
  • Mermaid+AI:用自然语言生成流程图,提升技术文档与设计效率
  • Spring事务失效的15种常见场景与解决方案
  • PCB批量阻抗校准体系搭建,三级联动修正方案
  • 2025届毕业生推荐的十大降重复率方案解析与推荐
  • Claude Code记忆系统:AI编程助手的上下文持久化与智能召回实战
  • 2026 年现阶段,苏尼特右旗热门的1085无缝钢管源头厂家选哪家,别再乱买理财了,这款5年108倍收益的无门槛产品,真的能稳赚吗? - 鉴选官
  • 避开这七个坑,你的网络安全自学之路能少走三年弯路
  • 回溯算法精解:从N皇后问题掌握递归、剪枝与状态搜索
  • 英雄联盟海斗模式录播学习法:从高手对局中系统提升游戏技术
  • 技术博客创作指南:从第一篇到持续发布
  • Sunshine游戏串流服务器:打造家庭游戏云的终极指南
  • 统计显著性:从A/B测试到数据驱动决策的核心原理与实践
  • 企业AI落地:超越模型选型,构建分层架构的实战指南
  • 介绍生物素化转铁蛋白Biotin-Transferrin,生物素-转铁蛋白Biotin-Tf的制备方法
  • Sunshine游戏串流完整指南:5步搭建你的私人游戏云平台
  • AI视频生成框架LibTV本地部署与实战指南:从环境搭建到工作流调优
  • 【万有无界技术解析】阿里多角色Agent协作工作台如何交付复杂项目