shell $ RANDOM种子在管道中没有兑现

lqu*_*lqu 4 random bash shell pipe seed

这是一个我无法解释的奇怪行为.我想使用shell生成可预测的随机数序列.我使用带有种子的$ RANDOM.这是一个测试程序.

RANDOM=15
echo $RANDOM
Run Code Online (Sandbox Code Playgroud)

每次运行时都会给出相同的数字,这样可以正常工作.但是如果我在这个程序中添加一个管道,它每次都会给出不同的结果.尝试以下简化程序.

RANDOM=15
echo $RANDOM | cat
Run Code Online (Sandbox Code Playgroud)

我找到了2个问题的修复程序(使其可预测),但仍无法解释原因.

修复1

RANDOM=15
x=$RANDOM
echo $x | cat
Run Code Online (Sandbox Code Playgroud)

修复2

(RANDOM=15
echo $RANDOM) | cat
Run Code Online (Sandbox Code Playgroud)

我试过Linux和Mac.行为是一致的.有人可以解释一下吗?

Cha*_*ffy 7

管道,例如echo $RANDOM | cat,创建子shell - 从父级分叉的单独进程,但不使用exec() - 系列调用替换为不同的可执行映像.您正在观察RANDOM明确设置的shell与从中分叉的子shell 之间的行为差​​异.

您的解决方法是将$RANDOM子shell 的评估移动到父级(第一种情况),或将显式种子集移动到子shell(第二种情况).

  • +1; 明确可能是非直觉的:管道的两个部分`echo $ RANDOM | 猫`在子壳中运行. (2认同)