gpt4 book ai didi

bash:使用文件列表限制for循环中的子shell

转载 作者:行者123 更新时间:2023-11-29 09:01:56 31 4
gpt4 key购买 nike

我一直在尝试让 for 循环同时运行一堆命令,并试图通过子 shell 来完成。我设法拼凑了下面的脚本进行测试,它似乎工作正常。

#!/bin/bash
for i in {1..255}; do
(
#commands
)&

done
wait

唯一的问题是我的实际循环将是 for i in files* 然后它就崩溃了,我想是因为它启动了太多的子 shell 来处理。所以我加了

#!/bin/bash
for i in files*; do
(
#commands
)&
if (( $i % 10 == 0 )); then wait; fi
done
wait

现在失败了。有谁知道解决这个问题的方法吗?是使用不同的命令来限制子 shell 的数量还是为 $i 提供一个数字?

干杯

最佳答案

xargs/并行

另一种解决方案是使用专为并发设计的工具:

printf '%s\0' files* | xargs -0 -P6 -n1 yourScript

-P6xargs 将启动的最大并发进程数。如果您愿意,可以设为 10。

我建议使用 xargs,因为它可能已经在您的系统上了。如果您想要一个真正强大的解决方案,请查看 GNU Parallel .

数组中的文件名

对于您的问题的另一个明确答案:获取计数器作为数组索引?

files=( files* )
for i in "${!files[@]}"; do
commands "${files[i]}" &
(( i % 10 )) || wait
done

(复合命令周围的括号并不重要,因为后台作业与使用子 shell 具有相同的效果。)

函数

只是语义不同:

simultaneous() {
while [[ $1 ]]; do
for i in {1..11}; do
[[ ${@:i:1} ]] || break
commands "${@:i:1}" &
done
shift 10 || shift "$#"
wait
done
}
simultaneous files*

关于bash:使用文件列表限制for循环中的子shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565181/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com