0

我在我的主父进程中使用协同进程将命令生成到否则无法解决的 shell(我在协同进程中打开的 shell 不是由我维护的,而是执行阻止我的“newgrp”和“exec”命令只需从我的脚本向该外壳发送命令......所以我需要协进程能够从脚本执行该外壳中的命令)。到目前为止,我一直在使用一个线程,即父进程将命令推送到协进程,但现在我也需要从多个子进程生成命令,因为有一个优化步骤。bash 文档说,文件描述符不被子进程继承,这实际上是真的,当我打开一个子 shell 时,我从 bash 收到以下错误消息:

[...]/automated_integration/clif_ai_common.sh:第 396 行:${!clifAi_sendCmdToCoproc_varName}:错误的文件描述符

使此消息出现的代码如下:

if [[ ${PARAM_NO_MOVING_VERIF_TB_TAGS} != true ]]; then
    (
        clifAi_log ${CLIFAI_LOGLEVEL_INFO} "" "clifAi_sanityRegression_callbackRunning" "Populating moving VERIF and TB tags in the background..."

        clifAi_popVerifTags "${clifAi_sanityRegression_callbackRunning_coproc}" "${clifAi_sanityRegression_callbackRunning_wslogfile}" "${PARAM_OPTLEVEL}" "${CONST_EXCLUDE_FILTER}" "${CONST_DIR_TO_OPT}" ${clifAi_sanityRegression_callbackRunning_excludeList}
        clifAi_popTbTags "${clifAi_sanityRegression_callbackRunning_coproc}" "${clifAi_sanityRegression_callbackRunning_wslogfile}"

        rm -rf ${VAR_VERIFTBTAG_SEMAPHORE_FILE}
    ) &
fi

如果我将这段代码移动到一个函数中并使用 & 不带 ( ) 调用它,那么 Bash 会报告相同的错误,因此没有子 shell。这也是可以理解的;它仍然会产生一个子进程,无论是否在子shell中运行它。

我的问题是,我如何也可以从子进程写入父进程拥有的协同进程?最佳做法是什么?

非常感谢, Geza Balazs

4

0 回答 0