MST
星途 面试题库

面试题:复杂场景下的Bash环境变量扩展与操作

在一个复杂的Bash脚本项目中,有多个子脚本和不同层级的环境变量设置。主脚本设置了环境变量`PROJECT_ROOT`表示项目根目录,并且通过`source`引入了多个子脚本,这些子脚本可能会对`PROJECT_ROOT`进行扩展或修改。现在要求:1. 设计一种机制确保在所有子脚本执行前后,`PROJECT_ROOT`的值能被正确记录和恢复,防止因子脚本异常修改而影响后续脚本逻辑;2. 当`PROJECT_ROOT`目录下有新文件创建时,能自动更新一个名为`PROJECT_FILE_HASH`的环境变量,其值为该目录下所有文件(递归)的MD5哈希值之和。请详细描述实现思路及关键代码片段。
29.6万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

1. 确保 PROJECT_ROOT 值正确记录和恢复

  1. 实现思路
    • 在主脚本引入子脚本之前,保存 PROJECT_ROOT 的初始值。
    • 为了保证即使子脚本异常退出,也能恢复 PROJECT_ROOT,可以使用 trap 命令捕获脚本退出信号(如 EXIT),在捕获到信号时恢复 PROJECT_ROOT 的初始值。
  2. 关键代码片段
# 保存初始的 PROJECT_ROOT
original_project_root=$PROJECT_ROOT

# 定义恢复函数
restore_project_root() {
    PROJECT_ROOT=$original_project_root
}

# 捕获EXIT信号,调用恢复函数
trap restore_project_root EXIT

# 引入子脚本
source sub_script1.sh
source sub_script2.sh
# 其他子脚本引入...

2. 自动更新 PROJECT_FILE_HASH 环境变量

  1. 实现思路
    • 使用 inotifywait 命令监控 PROJECT_ROOT 目录下的文件创建事件。
    • 当有新文件创建时,通过 find 命令递归获取该目录下所有文件,并使用 md5sum 计算每个文件的 MD5 值,然后求和得到 PROJECT_FILE_HASH 的新值。
  2. 关键代码片段
# 启动监控
while true; do
    inotifywait -e create -r $PROJECT_ROOT
    # 计算所有文件的MD5哈希值之和
    hash_sum=$(find $PROJECT_ROOT -type f -exec md5sum {} + | awk '{sum = sum $1} END {print sum}')
    export PROJECT_FILE_HASH=$hash_sum
done &

上述代码中,inotifywait -e create -r $PROJECT_ROOT 用于监控 PROJECT_ROOT 目录及其子目录下的文件创建事件。当有新文件创建时,find $PROJECT_ROOT -type f -exec md5sum {} + 递归查找所有文件并计算其 MD5 值,awk '{sum = sum $1} END {print sum}' 对这些 MD5 值进行求和,最后将和赋值给 PROJECT_FILE_HASH 环境变量。done & 表示将这个监控任务放到后台运行,不影响主脚本的其他逻辑。