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
,它会自动导出你的环境。
试着思考为什么这不起作用以及我将如何解决它。使用 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
,它会自动导出你的环境。