Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么$RANDOM的输出会影响值?_Bash_Random - Fatal编程技术网

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