You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将异步子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:20:43