Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
zsh函数只运行一次_Zsh_Oh My Zsh - Fatal编程技术网

zsh函数只运行一次

zsh函数只运行一次,zsh,oh-my-zsh,Zsh,Oh My Zsh,我对zsh(哦,我的zsh)还相当陌生,我正在尝试编写一个自定义主题。 我遇到了一个问题,并将其简化为以下测试用例 PROMPT='$RANDOM > ' 按预期工作,它会在每个命令上生成一个随机数。 但是当使用函数时 PROMPT='$(my_random) > ' function my_random(){ echo $RANDOM } 它总是返回相同的数字,即使在source~/.zshrc之后仍然返回相同的数字。只有当我关闭终端窗口并再次打开它时,我才能得到一个

我对zsh(哦,我的zsh)还相当陌生,我正在尝试编写一个自定义主题。 我遇到了一个问题,并将其简化为以下测试用例

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)>”;}
应按预期工作。