Bash 为什么$RANDOM的输出会影响值?
下面是一个脚本,我希望能三次生成同一对数字:Bash 为什么$RANDOM的输出会影响值?,bash,random,Bash,Random,下面是一个脚本,我希望能三次生成同一对数字: #! /usr/bin/env bash RANDOM=5 echo " first" $RANDOM echo "second" $RANDOM echo RANDOM=5 echo " first" $RANDOM echo "second" $RANDOM echo RANDOM=5 echo "??????" $RANDOM | cat echo " first" $RANDOM 相反,管道化输出会阻止随机种子得到尊重。为什么?
#! /usr/bin/env bash
RANDOM=5
echo " first" $RANDOM
echo "second" $RANDOM
echo
RANDOM=5
echo " first" $RANDOM
echo "second" $RANDOM
echo
RANDOM=5
echo "??????" $RANDOM | cat
echo " first" $RANDOM
相反,管道化输出会阻止随机种子得到尊重。为什么?
first 18499
second 9909
first 18499
second 9909
?????? 843
first 18499
最终,我希望能够做到以下几点:
#! /usr/bin/env bash
n=3
for i in $( seq $n) ; do
RANDOM=5
echo $RANDOM | md5sum | cut -d' ' -f1
done
我可以对后一个脚本进行哪些修改,使其输出在每次运行时都相同?管道中的命令在子shell中执行,子shell有自己独立的环境变量
$RANDOM
在管道中更新,此更新不会传播到父shell,这就是为什么您可以从下面的echo
中看到18499
在这种情况下,您可以通过使用
避免管道,因为@JohnKugelman的答案对我不起作用,这里有一个替代方案(这也有一个优点,就是它可以在不支持@zee的非bash shell中工作,而这是行不通的,因为我试过了,这个答案只对3.1和3.2.57有效。如果输出是随机的,为什么输出是可重复的?种子的含义是什么?@LuisMuñoz$random
将其输出基于先前的 $RANDOM
因此,如果让shell初始化它,将很难预测。如果您自己在某个点设置它,那么每次之后它的行为都会相同(除非您调用一个新的shell,这会为该shell创建一个新的不可预测的shell)。它仍然不是一个很好的随机性来源,因为一旦你在某个时间知道它的值,你就可以在以后的时间预测它的值。如果你需要真正的随机性,那么/dev/uradom是一个更好的方法。重定向不会创建子shell。但是这里是文档(和字符串)或者,至少他们可能会这样做。您将如何实现here文档?您可以将here文档中的文本写入一个临时文件,并将stdin重定向到该临时文件。或者您可以分叉bash进程,将stdin重定向到一个管道,孩子将here文档写入其中。Posix没有指定机制(顺便说一句,bash手册并没有对其进行记录),但很容易看出使用第二个的诱惑。对比i=0;echo$(++i));echo$i
与i=0;cat
cat <<< "?????? $RANDOM"
(md5sum | cut -d' ' -f1) <<< "$RANDOM"
#! /usr/bin/env bash
RANDOM=5
echo " first" $RANDOM
echo "second" $RANDOM
echo
RANDOM=5
tmprandom=$RANDOM
echo " first" $tmprandom | cat
echo "second" $RANDOM
first 18499
second 9909
first 18499
second 9909