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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么管道输出$ 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

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

答案

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

以上是关于为什么管道输出$ RANDOM会影响价值?的主要内容,如果未能解决你的问题,请参考以下文章

实用代码片段

一段 R 代码会影响 foreach 输出中的随机数吗?

Linux多命令执行 管道 和重定向

在这种情况下使用管道会导致 write() 失败吗?

从底部工作表对话框片段中获取价值

帧缓冲纹理出现白色(片段着色器不影响它)