使用/ dev / urandom打破bash循环吗? (在循环中断的非编程术语中断开)

时间:2015-12-30 21:04:50

标签: bash

我的第一个bash脚本有点问题。

目的是使一个文件附加一个大小为x的数字,然后制作另一个具有相同基本名称的文件,每次加一个数字,直到满足MAXFILES ...

filename.something.r0
filename.something.r1
filename.something.r2
filename.something.r3
filename.something.r4
filename.something.r5
filename.something.r6
filename.something.r7

每个文件都有相同的标题,然后填充随机性,直到它达到500GB的文件大小...然后继续进行循环的下一次迭代。

#!/usr/bin/env bash
COUNT=0
MAXFILES=8
MAXSIZE=524288000
HEADER=$(cat header)

while [ $COUNT -lt $MAXFILES ]; do
{
        FILE="filename.something.r$COUNT"
        echo $HEADER > $FILE
        FILESIZE=$(stat -c%s $FILE)
        while [ $FILESIZE -lt $MAXSIZE ]; do
        {
            cat /dev/urandom >> $FILE
            FILESIZE=$(stat -c%s $FILE)
        }
        done
        ((++$COUNT))
        echo $COUNT
}
done

会发生什么:文件继续超过MAXSIZE值,直到键盘中断才循环。

我不知道为什么它没有工作,并怀疑它是/ dev / urandom正在无限运行,即使如此。我认为这是标准行为。

原因:我很无聊

我知道有更好的"这样做的方法,但是让我上班的方式很烦人。特别是当我使用它作为我的第一个bash脚本的项目时。

由于

1 个答案:

答案 0 :(得分:1)

是的,正如您所怀疑的那样,这条线路正在给您带来麻烦:

 cat /dev/urandom >> $FILE

如果你只是从shell提示符中运行它,你会看到它永远运行。这是因为/dev/urandom是一个没有结束的特殊文件,只要您从中读取它就会为您提供更多数据。

要使您的脚本正常工作,您需要从设备文件中读取特定数量的数据,通常这样做是dd,如下所示:

dd if=/dev/urandom bs=$NBYTES count=1 >> $FILE

其中$NBYTES是您希望一次读取的字节数。