zsh函数只运行一次

时间:2016-10-16 05:12:53

标签: zsh oh-my-zsh

我对zsh(oh-my-zsh)相当新,并且我试图编写自定义主题。 我遇到了一个问题并将其缩减为以下测试用例

PROMPT='$RANDOM > '

按预期工作,它会在每个命令上生成一个随机数。 但是在使用函数时

PROMPT='$(my_random) > '

function my_random(){
    echo $RANDOM
}

即使source ~/.zshrc仍然是相同的数字,它总是返回相同的数字。只有当我关闭终端窗口并再次打开它时,我得到一个新的号码,在整个会话期间保持不变。

只有在我这样做的时候:

PROMPT='$RANDOM $(my_random) > '

function my_random(){
    echo $RANDOM
}

我按预期得到两个随机数...对此行为的任何解释?

不过,我正在使用kde的konsole进行全新的拱门安装。

修改

fwiw我发现使用/ dev / urandom直接运行良好。我仍然想知道最新情况。

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

2 个答案:

答案 0 :(得分:1)

$() - 扩展发生在子shell中,子shell中对$RANDOM的更改不会影响父级。来自zshparam(1):

  

RANDOM的值形成有意重复的伪随机序列; 引用RANDOM的子shell将导致相同的伪随机值,除非在子shell调用之间在父shell中引用或播种RANDOM的值。

您无需转到设置提示重现它:

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

bash不会在这里分享zsh的行为。

令人讨厌的一点是,快速扩展在子shell中发生,所以你不能通过引用$RANDOM来解决这个问题,比如precmd。我能找到的最好的方法是在空的扩展中做到这一点:

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

答案 1 :(得分:0)

正如 chepner 所说的 in a comment,您可以通过将 : $RANDOM; 放入 precmd 来解决此问题。这会导致采用 $RANDOM 的值并生成一个新的值。

例如

precmd() {
   : $RANDOM;
   ...
}