Comportamento diferente de $ (…) nas funções zsh e bash

2

Isto:

woof() {
        /usr/bin/woof -p $(expr $RANDOM % 32768 + 1024) $@
}

Sempre retorna o mesmo número para parametr -p on zsh. No bash $(...) é avaliado em todas as chamadas. Substituir $( ... ) por $[ ... ] 'corrige' esse 'problema' em zsh para mim, mas qual é o problema ou a diferença que causa comportamento inesperado (pelo menos inesperado para mim)?

    
por korda 18.05.2017 / 11:29

1 resposta

3

$( ) realmente se comporta da mesma maneira, é o RNG que não faz isso.

Parece que o RNG do zsh só é avançado após referenciar o valor, mas não é propagado novamente ao bifurcar. Isso significa que os subshells continuarão herdando a semente antiga do pai, pois as alterações que ocorrem em um subshell não afetam o processo pai. Usar $[…] não tem esse problema, pois não cria um subnível.

De acordo com a página de manual zshall(1) :

   RANDOM <S>
          A pseudo-random integer from 0 to 32767, newly generated each time
          this  parameter is referenced.  The random number generator can be
          seeded by assigning a numeric value to RANDOM.

          The values of RANDOM form an intentionally-repeatable  pseudo-ran‐
          dom sequence; subshells that reference RANDOM will result in iden‐
          tical pseudo-random values unless the value of  RANDOM  is  refer‐
          enced  or  seeded  in the parent shell in between subshell invoca‐
          tions.

Teste:

% echo outer=$RANDOM; (echo inner=$RANDOM); (echo inner=$RANDOM);
outer=10246
inner=5606
inner=5606
    
por 18.05.2017 / 15:04

Tags