Różne zachowanie $ (…) w funkcjach zsh i bash

2

To:

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

Zawsze zwraca tę samą liczbę dla parametru -p na zsh. W bash $(...)ocenia się przy każdym połączeniu. Wymiana $( ... )z $[ ... ]„naprawia” to „problem” w zsh dla mnie, ale to, co jest kwestia czy różnica, która powoduje nieoczekiwane zachowanie (nieoczekiwany dla mnie przynajmniej)?

korda
źródło
2
Bash i zsh to różne środowiska, dlaczego mają się zachowywać tak samo?
Seth
1
dlatego zacytowałem „poprawki” i „problem”. Chcę tylko wiedzieć, co się dzieje. Długo googlowałem i nie znalazłem wyjaśnienia, więc zadaję pytanie. mam nadzieję, że pomoże to także komuś, kto zmienił bash na zsh
korda
1
Sugeruję migrację do U&L osobiście ...
djsmiley2k
3
@ djsmiley2k Pytanie o powłoki * nix, w tym bash i zsh, nie jest tutaj tematem. To, że pytanie brzmiałoby „więcej na temat” gdzie indziej, nie jest powodem do migracji, chyba że faktycznie jest poza tematem tam, gdzie jest, a tak nie jest.
CVn

Odpowiedzi:

3

$( ) właściwie zachowuje się w ten sam sposób, to nie RNG.

Wydaje się, że zsh RNG jest zaawansowany dopiero po odwołaniu się do wartości, ale nie jest ponownie wprowadzany podczas rozwidlania. Oznacza to, że podpowłoki będą nadal dziedziczyć stare ziarno od rodzica, ponieważ wszelkie zmiany zachodzące w podpowłoce nie wpływają na proces nadrzędny. Używanie $[…]nie ma tego problemu, ponieważ nie tworzy podpowłoki.

Według strony zshall(1)podręcznika:

   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.

Test:

% echo outer=$RANDOM; (echo inner=$RANDOM); (echo inner=$RANDOM);
outer=10246
inner=5606
inner=5606
grawitacja
źródło
I rzeczywiście odwołanie się do $ RANDOM za każdym razem przed użyciem go $( )ma podobny efekt - w tym przypadku - do użycia$[ ]
korda