2016-10-16 3 views
1

Я довольно новичок в zsh (oh-my-zsh), и я пытаюсь написать собственную тему. я столкнулся с проблемой, и свел его к следующему TestCaseФункция zsh работает только один раз

PROMPT='$RANDOM > ' 

работает как и ожидалось, он производит случайное число на каждую команду. Но при использовании функции

PROMPT='$(my_random) > ' 

function my_random(){ 
    echo $RANDOM 
} 

она всегда возвращает один и тот же номер, даже после того, как source ~/.zshrc все тот же номер. только когда я закрываю окно терминала и снова открываю его, я получаю новый номер, который остается неизменным для всего сеанса.

только тогда, когда я делаю:

PROMPT='$RANDOM $(my_random) > ' 

function my_random(){ 
    echo $RANDOM 
} 

я получаю два случайных числа, как и ожидалось ... любое объяснение такого поведения?

btw, я использую konsole kde на новой установке арки.

Редактировать

FWIW я нашел с помощью/DEV/urandom непосредственно работает хорошо. Мне все равно хотелось бы знать, что происходит.

function my_random() { 
    echo $(cat /dev/urandom | tr -dc '0-9' | head -c5) 
} 

ответ

1

$() -разложении происходит в подоболочки, а также изменения в $RANDOM в субоболочке не влияют на родителей. Из zshparam (1):

Значения RANDOM образуют преднамеренно повторяемую псевдослучайную последовательность; подоболочки, которые ссылаются на RANDOM, приведут к идентичным псевдослучайным значениям, если значение RANDOM не указано или не заселоровано в родительской оболочке между вызовами подсхемы.

Вам не нужно обращаться к настройке приглашение воспроизвести его:

% echo $(echo $RANDOM) 
17454 
% echo $(echo $RANDOM) 
17454 

баш не разделяет поведение ЗШ здесь.

Раздражает бит, что оперативное расширение также происходит в подоболочки, так что вы не можете просто исправить это с помощью ссылки $RANDOM, скажем, precmd. Лучший способ, который я могу найти, - сделать это в пустом расширении:

PROMPT='${RANDOM##*}$(my_random) > ' 
+0

Спасибо за разъяснение. Приятный трюк с пустым расширением. Думаю, я поеду с этим. Благодаря! –

+0

'precmd() {: $ RANDOM; PS1 = "$ (my_random)>"; } 'должен работать по назначению. – chepner