异步while循环中变量修改失效,如何让变量保留修改后的值?
解决异步while循环中变量修改不生效的问题
问题根源
你遇到的核心问题是:bash里用&启动的后台任务是独立子进程,子进程里修改的变量完全不会同步到父进程。你的代码里echo $a是在父进程执行的,此时后台的while循环可能还没跑完,就算跑完了,子进程里的a=1也传不到父进程,所以输出始终是初始值0。你之前试的那些输入重定向方法,是用来给循环传递输入内容的,和变量跨进程同步根本不是一回事,当然解决不了问题。
解决方案
根据你的需求(循环结束后变量a保持为1),给你几个可行的办法:
1. 等待后台进程结束后再读取变量
如果不需要循环真的一直后台运行,只是想让它执行完再获取结果,直接用wait命令等待后台进程结束即可:
a=0 while [condition]; do a=1 done & wait # 阻塞到后台循环执行完毕 echo $a # 此时a的值就是1
2. 用临时文件传递变量值
如果必须让循环后台运行,同时后续代码要随时获取最新的变量值,可以用临时文件存储变量内容:
# 创建临时文件 tmp_file=$(mktemp) a=0 while [condition]; do echo 1 > "$tmp_file" # 循环里把值写入文件 done & # 当需要用a的时候,从文件读取 wait # 可选,确保循环结束后再读取 a=$(cat "$tmp_file") echo $a # 用完删除临时文件 rm "$tmp_file"
3. 用命名管道(FIFO)传递
和临时文件类似,命名管道适合单向传递数据:
# 创建命名管道 mkfifo mypipe a=0 while [condition]; do echo 1 > mypipe # 循环结束前把值写入管道 done & # 从管道读取值到a a=$(cat mypipe) echo $a # 清理管道 rm mypipe
内容的提问来源于stack exchange,提问作者Lazerpie101
相关产品推荐
相关产品推荐

