我有一个Shell脚本,正在做一些繁重的工作,并使用计数器来跟踪它在做什么。大约30个案例需要完成繁重的工作,并且由于我在其上运行的计算机具有48个内核,因此很容易并行化:我只是在后台运行该函数,创建一个子外壳。但是,这意味着我无法增加全局变量:
$ cat mwe.sh
#!/bin/bash
counter1=0
counter2=0
counter3=0
func() {
# do some heavy work which may increase one counter
counter2=$((counter2 + 1))
}
func &
func &
func &
wait
echo $counter1 $counter2 $counter3
$ ./mwe.sh
0 0 0
Bash函数do not have return values as such。对 Counter increment in Bash loop not working 的答案建议先写入文件,然后再从中读取文件,这对于每个单独的调用都需要一个临时文件,这会产生一些开销。其他建议是使用echo
“返回”字符串,但是如果我为此使用stdout,则函数无法将其他任何内容写入stdout。
当在并行运行的子shell中完成繁重的工作时,如何在bash shell脚本中跟踪全局计数器?是否有某种方法可以为每个函数调用打开专用的流/管道,函数可以向其中写入数据,调用者可以从中读取数据?还是有其他方法可以跟踪此事件,而不必为每个调用编写文件?