咨询:zsh中$RANDOM变量经管道输出后为何不变化?
关于zsh中$RANDOM变量在管道中重复输出的问题
现象十分明确:$RANDOM变量仅在输出不经过管道时才会生成新的随机值。请问这是zsh的Bug,还是存在理解误区?以下是命令执行结果:
┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM 14103 ┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM 30417 ┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM 3090 ┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM | md5sum | head -c 20 af5655b26ab87e81ef4f ┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM | md5sum | head -c 20 af5655b26ab87e81ef4f ┌──(root㉿linux)-[~/scripts] └─# echo $RANDOM | md5sum | head -c 20 af5655b26ab87e81ef4f
为何会出现这种情况?相同操作在bash中可正常运行。
这不是zsh的Bug,是zsh与bash在变量展开时机上的设计差异:
- bash中,管道的每个命令都会在独立子shell中执行,
$RANDOM会在echo所在的子shell里实时展开,每次执行都会生成新随机值。 - zsh默认会对整个管道命令做提前批量展开,也就是在执行管道前就把
$RANDOM解析成固定值,后续整个管道流程都复用这个值,所以多次执行结果完全一致。
如果要在zsh中实现和bash相同的效果,有两种可行方法:
- 强制让
echo在子shell中执行,用括号包裹命令:(echo $RANDOM) | md5sum | head -c 20 - 临时开启zsh的
SH_WORD_SPLIT选项(注意该选项会改变其他shell行为,需谨慎使用),执行命令:zsh -o shwordsplit -c 'echo $RANDOM | md5sum | head -c 20'
内容的提问来源于stack exchange,提问作者linuxhelpneeded
相关产品推荐
相关产品推荐

