Как найти документацию для специальной переменной bash $RANDOM?

В Bash есть некоторые переменные (например, $RANDOM) которые являются встроенными функциями. Я понимаю, что $RANDOM использует функцию C random (например man random).

Но мне пришлось наткнуться на эту информацию. То, что я хотел быть в состоянии сделать, было что-то вроде man $RANDOM или же type $RANDOM (или даже help $RANDOM).

Проблема с попыткой это $RANDOM оценивается по фактическому случайному числу:-)

Так как же определить, что такое реализация для специальной встроенной переменной, такой как $RANDOM? Кроме просеивания исходного кода Bash, для которого у меня просто нет мозгов.

Конечно, есть способ получить оболочку, чтобы указать, какую реализацию имеет специальная переменная (например, "это встроенная переменная, которая указывает на функцию C с именем name")

А может и нет? * пожимает плечами *

Любая помощь / информация по этому вопросу будет оценена:-)

Спасибо!

1 ответ

Решение

От man bash, /RANDOM

RANDOM Each time this parameter is referenced, a random integer between 0 and 32767 is generated.  The sequence of random numbers may be initialized by assigning a value to RANDOM.  If RANDOM is unset, it loses its
       special properties, even if it is subsequently reset.

Руководство не говорит, как это реализовано.

В противном случае из источников: variables.c показывает, что RANDOM связан с функцией get_random

INIT_DYNAMIC_VAR ("RANDOM", (char *)NULL, get_random, assign_random);

какие звонки get_random_number, seedrand а также brand

/* A linear congruential random number generator based on the example
   one in the ANSI C standard.  This one isn't very good, but a more
   complicated one is overkill. */

/* Returns a pseudo-random number between 0 and 32767. */
static int
brand ()
{
  /* From "Random number generators: good ones are hard to find",
     Park and Miller, Communications of the ACM, vol. 31, no. 10,
     October 1988, p. 1195. filtered through FreeBSD */
  long h, l;

  /* Can't seed with 0. */
  if (rseed == 0)
    rseed = 123459876;
  h = rseed / 127773;
  l = rseed % 127773;
  rseed = 16807 * l - 2836 * h;
#if 0
  if (rseed < 0)
    rseed += 0x7fffffff;
#endif
  return ((unsigned int)(rseed & 32767));       /* was % 32768 */
}
Другие вопросы по тегам