Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在不暂停父进程的情况下派生/后台处理子进程_Macos_Bash_Shell_Zsh - Fatal编程技术网

Macos 如何在不暂停父进程的情况下派生/后台处理子进程

Macos 如何在不暂停父进程的情况下派生/后台处理子进程,macos,bash,shell,zsh,Macos,Bash,Shell,Zsh,我在Mac OS X Yosemite上运行带有zsh/oh my zsh的bash shell 因此,我的目标是创建一个函数,它获取一些信息(如果存在)并返回这些信息,然后生成一个子进程,生成下次使用的信息。原因是这个生成信息的函数很慢(有时2-5秒),我不希望父shell在创建时挂起 我正在创建这个函数作为zsh主题的提示装饰器,所以每次它重新生成提示时挂起这么长时间是非常糟糕的。基本上,这个解决方案(或任何替代的无挂起解决方案)可以正常工作,或者该功能被废弃 现在我正在使用以下代码: de

我在Mac OS X Yosemite上运行带有zsh/oh my zsh的bash shell

因此,我的目标是创建一个函数,它获取一些信息(如果存在)并返回这些信息,然后生成一个子进程,生成下次使用的信息。原因是这个生成信息的函数很慢(有时2-5秒),我不希望父shell在创建时挂起

我正在创建这个函数作为zsh主题的提示装饰器,所以每次它重新生成提示时挂起这么长时间是非常糟糕的。基本上,这个解决方案(或任何替代的无挂起解决方案)可以正常工作,或者该功能被废弃

现在我正在使用以下代码:

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
}
如果要多次进行计算,则可以调整此选项