gpt4 book ai didi

bash - Bash 中的 while 循环子 shell 困境

转载 作者:行者123 更新时间:2023-11-29 08:43:43 26 4
gpt4 key购买 nike

我想计算给定目录中的所有 *bin 文件。最初我使用的是 for-loop:

var=0
for i in *ls *bin
do
perform computations on $i ....
var+=1
done
echo $var

但是,在某些目录中,文件过多导致错误:Argument list too long

因此,我尝试使用管道 while-loop:

var=0
ls *.bin | while read i;
do
perform computations on $i
var+=1
done
echo $var

现在的问题是使用管道创建子 shell 。因此,echo $var 返回 0
我该如何处理这个问题?
原代码:

#!/bin/bash

function entropyImpl {
if [[ -n "$1" ]]
then
if [[ -e "$1" ]]
then
echo "scale = 4; $(gzip -c ${1} | wc -c) / $(cat ${1} | wc -c)" | bc
else
echo "file ($1) not found"
fi
else
datafile="$(mktemp entropy.XXXXX)"
cat - > "$datafile"
entropy "$datafile"
rm "$datafile"
fi

return 1
}
declare acc_entropy=0
declare count=0

ls *.bin | while read i ;
do
echo "Computing $i" | tee -a entropy.txt
curr_entropy=`entropyImpl $i`
curr_entropy=`echo $curr_entropy | bc`
echo -e "\tEntropy: $curr_entropy" | tee -a entropy.txt
acc_entropy=`echo $acc_entropy + $curr_entropy | bc`
let count+=1
done

echo "Out of function: $count | $acc_entropy"
acc_entropy=`echo "scale=4; $acc_entropy / $count" | bc`

echo -e "===================================================\n" | tee -a entropy.txt
echo -e "Accumulated Entropy:\t$acc_entropy ($count files processed)\n" | tee -a entropy.txt

最佳答案

问题在于 while 循环是管道的一部分。在 bash 管道中,管道的每个元素都在其自己的子 shell 中执行 [ref] .因此,在 while 循环终止后,while 循环子 shell 的 var 副本被丢弃,并回显父级的原始 var(其值未更改)。

解决此问题的一种方法是使用 Process Substitution如下图:

var=0
while read i;
do
# perform computations on $i
((var++))
done < <(find . -type f -name "*.bin" -maxdepth 1)

看看BashFAQ/024对于其他解决方法。

请注意,我还用 find 替换了 ls,因为这不是 parse ls 的好习惯。 .

关于bash - Bash 中的 while 循环子 shell 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726764/

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