while循环并联挂起

While loop hanging in parallel

试着思考为什么这不起作用以及我将如何解决它。使用 parallel.

的 while 循环的简单示例
set -eu

TOKEN='hello'

query() {
    while [ -z "$TOKEN" ];
    do
        echo "This is  and this is "
    done
}

export -f query

parallel query ::: 4 4 4 4 ::: 0 1 2 3

每当我从 CLI 中 运行 它就会无限期地挂起,我在这里错过了什么?

-z $TOKEN 永远不会为真,因为您已经对其进行了初始化。

[ -z "$TOKEN" ] 将始终为真,因为您没有导出变量。循环因此永远持续下去,导致挂起。

由于parallel 是一个外部命令,所以您希望它及其子项可以访问的所有变量都必须导出。

如果导出它,脚本将成功终止(但显然没有输出,因为永远不会进入 while 循环)。


注意:环境变量是每个进程的。一个进程中的更新不会被其他进程看到,因此您不能将它们用作信号量或 IPC。如果这是您想要做的,您将不得不使用其他东西(如文件或管道)。

@那个人的回答是正确的,但也许我可以引诱你尝试env_parallel,它会自动导出你的环境。