为何多进程计算MD5的Bash脚本输出文件内容为空?
问题原因与解决办法
为什么变量值为空?
你给命令加&让它后台执行时,这个命令会在子进程里运行。Bash的子进程拥有独立的变量空间,完全无法修改父进程的变量——你用反引号捕获输出并赋值给md51/md52的操作,只在子进程内部生效,父进程里的这两个变量根本没被赋值,最后echo自然是空的。
正确的实现方式
可以用临时文件传递后台进程的计算结果,等所有后台任务完成后再读取结果写入目标文件:
#!/bin/bash # 创建临时文件存储每个进程的MD5结果 tmp_md51=$(mktemp) tmp_md52=$(mktemp) # 后台执行MD5计算,将结果写入对应临时文件 md5sum -b ./source/test1.mp4 | cut -b 1-32 > "$tmp_md51" & md5sum -b ./source/test2.mp4 | cut -b 1-32 > "$tmp_md52" & # 等待所有后台进程完成 wait # 从临时文件读取结果,写入目标文件 echo "md51=$(cat "$tmp_md51")" > ./test.txt echo "md52=$(cat "$tmp_md52")" >> ./test.txt # 清理临时文件 rm "$tmp_md51" "$tmp_md52"
这个方案里,后台进程把计算结果写入独立的临时文件,父进程等所有任务结束后再从文件里读取内容,就能正确获取到MD5值了。
内容的提问来源于stack exchange,提问作者TRANSISTOR
相关产品推荐
相关产品推荐

