Різна поведінка $ (…) у функціях zsh та bash


2

Це:

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

Завжди повертає те саме число для параметра -p на zsh. У баші $(...)оцінюється на кожен дзвінок. Заміна $( ... )з $[ ... ]«виправлення» це «проблема» в Zsh для мене , а в чому проблема або відмінність , яке призводить до несподіваного поведінки (несподіваний для мене принаймні)?


2
Bash і zsh - це різні середовища, чому вони повинні поводитися однаково?
Сет

1
тому я цитував "виправлення" та "проблема". Я просто хочу знати, що відбувається. Я довго гугла, і не знайшла пояснень, тому задаю питання. сподіваємось, це також допоможе комусь, хто перейшов з bash на zsh
korda

1
Я б запропонував перейти до U&L особисто ...
djsmiley2k

3
@ djsmiley2k Питання про * nix-оболонках, включаючи bash та zsh, тут не поза темою. Це питання було б "більше про тему" десь ще - це не привід мігрувати, якщо він насправді не є темою, де він є, а це не так.
CVn

Відповіді:


3

$( ) насправді поводиться так само, саме РНГ цього не робить.

Здається, що zsh RNG вдосконалюється лише після посилання на значення, але не повторно змінюється при розщепленні. Це означає, що допоміжні оболонки просто продовжуватимуть успадковувати старе насіння від материнського, оскільки будь-які зміни, що відбуваються в підшарпі, не впливають на процес батьків. Використання $[…]не має цієї проблеми, оскільки воно не створює підшару.

Відповідно до 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.

Тест:

% echo outer=$RANDOM; (echo inner=$RANDOM); (echo inner=$RANDOM);
outer=10246
inner=5606
inner=5606

І справді посилання на $ RANDOM кожного разу перед його використанням $( )має подібний ефект - в даному випадку - на використання$[ ]
korda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.