Bash中使用&后台运行时数组追加失效问题及FIFO解决方案
Bash 后台运行时数组追加无输出问题
在Bash脚本中使用&实现后台运行场景下的数组数据追加时,初始同步版本代码如下:
#!/bin/bash declare -a llenar llen() { llenar+=("$1") return } for i in {1..10};do llen "$i" done wait echo "${llenar[@]}"
同步执行上述代码可正常输出:1 2 3 4 5 6 7 8 9 10
如果在调用llen函数时添加&将任务放入后台运行,修改的代码片段如下:
... llen "$i" & ...
修改后执行脚本,数组没有任何输出,不符合预期。
问题原因
通过&启动的后台任务会运行在独立fork出的子Shell进程中,父子进程的内存空间完全隔离,子进程内部对llenar数组的修改仅在自身进程范围内生效,无法同步修改父进程中的同名数组。所有后台任务执行完成后,父进程中的llenar数组仍为空,因此没有输出。
解决方案
使用FIFO命名管道做跨进程数据传递即可解决该问题:让后台运行的子进程把需要追加的数据写入管道,父进程统一从管道读取数据写入自身维护的数组,绕开跨进程直接修改变量的限制。完整实现代码如下:
#!/bin/bash declare -a llenar mkfifo pipe llen() { echo "$1" } > pipe for i in {1..100};do llen "$i" & done while read -r line;do llenar+=( "$line" ) done < pipe wait rm pipe echo "data : ${llenar[@]}" echo "data 1: ${llenar[1]}" echo "length : ${#llenar[@]}"
内容的提问来源于stack exchange,提问作者jhoss
相关产品推荐
相关产品推荐

