下面是一个脚本,我期望三次生成相同的数字对:
#! /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
我可以对后一个脚本进行哪些修改,以便每次运行时它的输出都相同?
由于@ JohnKugelman的答案对我不起作用,这里有一个替代方案(它的优点还在于它可以在不支持<<<
的非bash shell中工作)。只需将一个临时变量赋值给$RANDOM
的结果,然后在子shell(或其他奇怪的上下文)中使用temp变量:
#! /usr/bin/env bash
RANDOM=5
echo " first" $RANDOM
echo "second" $RANDOM
echo
RANDOM=5
tmprandom=$RANDOM
echo " first" $tmprandom | cat
echo "second" $RANDOM
输出(在bash v4下; v3使用不同的随机数生成器):
first 18499
second 9909
first 18499
second 9909
管道中的命令在子壳中执行,子壳具有它们自己的独立环境变量。 $RANDOM
在管道中更新,此更新不会传播到父shell,这就是为什么你从以下18499
看到echo
。
在这种情况下,您可以通过使用<<<
重定向来避免管道。重定向不会创建子进程。
cat <<< "?????? $RANDOM"
要么
(md5sum | cut -d' ' -f1) <<< "$RANDOM"