如何在Bash多个Shell进程间共享频繁变更的变量?
Bash多Shell间共享动态更新值的解决方案
针对你需要在多个Shell间共享频繁变更的生产环境Git Tag的需求,这里有几个实用的方案:
1. 用共享文件存储值(最推荐)
这是最简单直接的方式,把当前的Git Tag写入一个固定路径的文件,所有需要访问的脚本/Shell都从这个文件读取最新值:
- 更新值:每次部署后,执行命令把新Tag写入文件:
(如果需要多个用户共享,可以放在echo "v2.1.0" > ~/.prod_main_app_tag/var目录下,注意设置合适的文件权限) - 读取值:在需要的脚本或Shell中,直接读取文件内容:
每次读取都会拿到最新的内容,不需要刷新任何Shell环境。PROD_APP_TAG=$(cat ~/.prod_main_app_tag)
2. 封装读取函数简化操作
如果觉得每次写cat命令麻烦,可以在~/.bashrc里定义一个简单的函数,之后所有Shell都能直接调用:
get_prod_tag() { cat ~/.prod_main_app_tag }
之后在任意Shell或脚本里,直接用PROD_APP_TAG=$(get_prod_tag)就能获取最新Tag。这个函数只需要在第一次编辑.bashrc后source一次,后续新开的Shell会自动加载。
3. 用命名管道实现实时通知(进阶需求)
如果需要在Tag更新时主动通知所有Shell,可以用命名管道(FIFO):
- 创建命名管道:
mkfifo ~/.prod_tag_fifo - 在每个需要监听的Shell里后台运行一个监听进程,当Tag更新时自动更新本地变量:
while read tag; do PROD_APP_TAG="$tag" echo "生产环境Tag已更新为: $PROD_APP_TAG" done < ~/.prod_tag_fifo & - 更新Tag时,把新值写入管道:
这种方式适合需要实时感知变更的场景,但比文件存储复杂一些,普通需求用文件就足够。echo "v2.1.0" > ~/.prod_tag_fifo
内容的提问来源于stack exchange,提问作者Tom Warner
相关产品推荐
相关产品推荐

