zsh函数只运行一次
我对zsh(哦,我的zsh)还相当陌生,我正在尝试编写一个自定义主题。 我遇到了一个问题,并将其简化为以下测试用例zsh函数只运行一次,zsh,oh-my-zsh,Zsh,Oh My Zsh,我对zsh(哦,我的zsh)还相当陌生,我正在尝试编写一个自定义主题。 我遇到了一个问题,并将其简化为以下测试用例 PROMPT='$RANDOM > ' 按预期工作,它会在每个命令上生成一个随机数。 但是当使用函数时 PROMPT='$(my_random) > ' function my_random(){ echo $RANDOM } 它总是返回相同的数字,即使在source~/.zshrc之后仍然返回相同的数字。只有当我关闭终端窗口并再次打开它时,我才能得到一个
PROMPT='$RANDOM > '
按预期工作,它会在每个命令上生成一个随机数。
但是当使用函数时
PROMPT='$(my_random) > '
function my_random(){
echo $RANDOM
}
它总是返回相同的数字,即使在source~/.zshrc
之后仍然返回相同的数字。只有当我关闭终端窗口并再次打开它时,我才能得到一个新的号码,该号码在整个会话中保持不变
只有当我这样做的时候:
PROMPT='$RANDOM $(my_random) > '
function my_random(){
echo $RANDOM
}
我得到了预期的两个随机数。。。对这种行为有何解释
顺便说一句,我正在使用kde的konsole进行全新的arch安装
编辑
我发现直接使用/dev/uradom可以很好地工作。我还是想知道发生了什么事
function my_random() {
echo $(cat /dev/urandom | tr -dc '0-9' | head -c5)
}
$()
-扩展发生在子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) > '
正如chepner所说,您可以通过放置:$RANDOM代码>在您的precmd
中。这将导致获取$RANDOM
的值并生成一个新值
e、 g
precmd(){
:$RANDOM;
...
}
感谢您的澄清。这是一个很好的技巧,有空的exapnsion。我想我会同意的。谢谢precmd(){:$RANDOM;PS1=“$(my_RANDOM)>”;}
应按预期工作。