我对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)
}
答案 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;
...
}