代码之家  ›  专栏  ›  技术社区  ›  MatrixManAtYrService

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

  •  4
  • MatrixManAtYrService  · 技术社区  · 7 年前

    下面是一个脚本,我希望它能三次生成同一对数字:

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

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Davisson    7 年前

    由于@johnkugelman的答案对我不起作用,这里有一个替代方案(它还有一个优点,就是它可以在不支持bash的非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
    
        2
  •  3
  •   John Kugelman Michael Hodel    7 年前

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

    在这种情况下,可以使用 <<< 改为重定向。重定向不会创建子进程。

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

    (md5sum | cut -d' ' -f1) <<< "$RANDOM"
    
    推荐文章