$ RANDOM行为异常

时间:2018-10-03 14:28:11

标签: bash cygwin babun

我正在尝试使用在网上找到的代码生成随机日期时间。此代码使用$ RANDOM。奇怪的是,我可以继续执行脚本,但是datetime结果永远不会改变。但是,当我添加“ echo $ Random”时,日期时间结果会更改。与随机变量的播种和执行“ echo”重置有关吗?

#echo $RANDOM // This causes desire output
x=$(date -d "$((RANDOM%1+2010))-$((RANDOM%12+1))-$((RANDOM%28+1)) $((RANDOM%23+1)):$((RANDOM%59+1)):$((RANDOM%59+1))" '+%d-%m-%Y %H:%M:%S')
echo $x

输出

INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test

1 个答案:

答案 0 :(得分:1)

有关echo的种子和效果的问题的答案,请参见$RANDOM: generate random integer中的Advanced Bash-Scripting Guide。简而言之,$RANDOM值(假设是)在每次Bash运行时自动播种为随机值,但是如果需要使其产生相同的序列,可以通过将其设置为恒定值来重新播种。数倍。运行echo $RANDOM不会重新设置$RANDOM的种子,但是如果已经播种,它将导致它移至下一个“随机”值。

据我所知,Babun只是Cygwin,具有一些附加的工具和配置。我还没有看到OP向Cygwin Bash报告问题的情况。假设OP运行的是Bash(而不是Babun似乎提供的Zsh),则最有可能导致此问题的原因是,$RANDOM的值重新变为常数。我建议仔细检查代码,以确保没有分配给RANDOM。一旦排除了该漏洞,下一个明显的可疑对象就是Bash的Babun启动文件之一,因为它声称可以进行shell自定义。

如果无法识别或修复正在播种的RANDOM,唯一想到的就是将其在代码中显式地重新种子化为某种随机的东西。以上引用的文章建议

RANDOM=$$

这很弱,但是在这种情况下可能就足够了。如果不是,则上面引用的文章中还有其他建议(例如,涉及/dev/urandom)。另请参见Why is Bash’s $RANDOM not seeded (?) on some machines?Unix $RANDOM function not random in Bash terminal$RANDOM in linux bash will alway be the same upon bootup