如何将异步子shell或coproc的结果捕获到父进程变量中?
概述
我写了个脚本,用来获取文件列表并做验证,验证过程可能要好几秒。我想在验证的时候同时收集用户输入,别让用户干等着。最终要生成一个有效文件的数组,方便后续操作。
试过用coproc和子shell的各种写法,但除了让子shell把结果写到父进程管理的临时文件,再由父进程读进变量这种方法外,没找到别的可行方案。我觉得自己对zsh的用法还不够熟,所以来请教专业人士。
下面是两个示例脚本:一个是父脚本,另一个是用来做验证的独立可执行程序(子shell会调用它)。
父脚本
#!/usr/bin/env zsh # 生成测试文件 echo "one" > a.txt echo "two" >> a.txt echo "3" > b.txt echo "four" >> b.txt echo "five" > c.txt echo "6" >> c.txt echo "seven" > d.txt echo "eight" >> d.txt echo "9" > e.txt echo "10" >> e.txt # 这个列表是通过 `print -l **/*.{txt,csv}(Od)` 命令生成的 filesToValidate=($(print -l [abcde].txt)) echo "待验证文件:$filesToValidate" # 后续脚本需要用到这个有效文件列表,不过在验证完成前可以先处理其他事情 validFiles=() # 我想让这段代码异步执行 for file in $filesToValidate do ./has_numerals.sh $file >/dev/null 2>&1 && validFiles+("$file") done # 异步代码结束 read -q "REPLY?你考虑好答案了吗?" echo . # 如果验证是在子shell或coproc里执行的,这里要等所有任务完成(如果还没完成的话) wait for file in $validFiles do echo "有效文件 $file 的内容:" cat $file done
独立验证可执行程序示例(has_numerals.sh)
#!/usr/bin/env zsh echo "正在处理 $1" sleep 1 grep -l '[0-9]' $1
内容的提问来源于stack exchange,提问作者deinspanjer
相关产品推荐
相关产品推荐

