Как найти документацию для специальной переменной bash $RANDOM?
В Bash есть некоторые переменные (например, $RANDOM
) которые являются встроенными функциями. Я понимаю, что $RANDOM
использует функцию C random
(например man random
).
Но мне пришлось наткнуться на эту информацию. То, что я хотел быть в состоянии сделать, было что-то вроде man $RANDOM
или же type $RANDOM
(или даже help $RANDOM
).
Проблема с попыткой это $RANDOM
оценивается по фактическому случайному числу:-)
Так как же определить, что такое реализация для специальной встроенной переменной, такой как $RANDOM
? Кроме просеивания исходного кода Bash, для которого у меня просто нет мозгов.
Конечно, есть способ получить оболочку, чтобы указать, какую реализацию имеет специальная переменная (например, "это встроенная переменная, которая указывает на функцию C с именем
А может и нет? * пожимает плечами *
Любая помощь / информация по этому вопросу будет оценена:-)
Спасибо!
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 */
}