Macos 如何在不暂停父进程的情况下派生/后台处理子进程
我在Mac OS X Yosemite上运行带有zsh/oh my zsh的bash shell 因此,我的目标是创建一个函数,它获取一些信息(如果存在)并返回这些信息,然后生成一个子进程,生成下次使用的信息。原因是这个生成信息的函数很慢(有时2-5秒),我不希望父shell在创建时挂起 我正在创建这个函数作为zsh主题的提示装饰器,所以每次它重新生成提示时挂起这么长时间是非常糟糕的。基本上,这个解决方案(或任何替代的无挂起解决方案)可以正常工作,或者该功能被废弃 现在我正在使用以下代码:Macos 如何在不暂停父进程的情况下派生/后台处理子进程,macos,bash,shell,zsh,Macos,Bash,Shell,Zsh,我在Mac OS X Yosemite上运行带有zsh/oh my zsh的bash shell 因此,我的目标是创建一个函数,它获取一些信息(如果存在)并返回这些信息,然后生成一个子进程,生成下次使用的信息。原因是这个生成信息的函数很慢(有时2-5秒),我不希望父shell在创建时挂起 我正在创建这个函数作为zsh主题的提示装饰器,所以每次它重新生成提示时挂起这么长时间是非常糟糕的。基本上,这个解决方案(或任何替代的无挂起解决方案)可以正常工作,或者该功能被废弃 现在我正在使用以下代码: de
decorations=""
getDecs () {
echo $decorations
( buildDecorationList & )
}
buildDecorationList () {
local RetStr=""
RetStr+=$(getList1) # Returns a list of stuff
local temp=$(getList2) # Returns a second list of stuff
if [[ $RetStr != "" && $temp != "" ]]; then
RetStr+=", "
fi
RetStr+=$temp
echo $RetStr # Return both lists concatenated
}
它非常接近于工作,并且实现了我想要的大部分功能,因为它不会暂停主进程,并且正确地生成所有信息。我只是无法将此函数的输出正确地定向回主shell中的变量中,在下一次函数调用时可以在该变量中检索它
我尝试过各种形式的重定向/变量赋值,但它们总是以a)无法返回到主shell和/或无法访问或b)导致父函数在等待输出时挂起而告终
我还研究了协过程,因为它们一开始听起来很有希望,但我不太确定它们与子shell有什么不同,而且对于这个特定用例,它们似乎有相同的限制。或者我没有正确使用它们。Idk
我还考虑过使用具有特定名称的外部文件,但如果用户决定打开多个会话,这将变得非常复杂…您可以做的是将结果放入tmp文件中(使用mktmp
)。
在main函数中创建tmp文件,并将其引用存储在全局变量中。因此,它可以从主函数和子函数进行访问,如果设置了变量,您可以将逻辑放入主函数中,不重新启动子进程
您最终可以使用一种.lock
或complete
文件来表示流程已完成
decoration_file=""
getDecs () {
if [ -z "$decoration_file" ] ;
then
decoration_file=`mktemp -t decoration`
( buildDecorationList & )
elif [ ! -f "$decoration_file.complete" ]
# non terminated, do the logic you want
else
cat $decoration_file
fi
}
buildDecorationList () {
local RetStr=""
RetStr+=$(getList1) # Returns a list of stuff
local temp=$(getList2) # Returns a second list of stuff
if [[ $RetStr != "" && $temp != "" ]]; then
RetStr+=", "
fi
RetStr+=$temp
echo $RetStr > $decoration_file # Return both lists concatenated
touch ${decoration_file}.complete
}
如果要多次进行计算,则可以调整此选项