为什么管道输出$ RANDOM会影响价值?

问题描述 投票:4回答:2

下面是一个脚本,我期望三次生成相同的数字对:

#! /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

我可以对后一个脚本进行哪些修改,以便每次运行时它的输出都相同?

bash random
2个回答
1
投票

由于@ 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

3
投票

管道中的命令在子壳中执行,子壳具有它们自己的独立环境变量。 $RANDOM在管道中更新,此更新不会传播到父shell,这就是为什么你从以下18499看到echo

在这种情况下,您可以通过使用<<<重定向来避免管道。重定向不会创建子进程。

cat <<< "?????? $RANDOM"

要么

(md5sum | cut -d' ' -f1) <<< "$RANDOM"
© www.soinside.com 2019 - 2024. All rights reserved.