Linux 用zsh固定断裂的管道
正如这里所建议的,我尝试使用以下命令生成随机密码:Linux 用zsh固定断裂的管道,linux,pipe,zsh,oh-my-zsh,Linux,Pipe,Zsh,Oh My Zsh,正如这里所建议的,我尝试使用以下命令生成随机密码: < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
这在bash shell中可以顺利工作,但在zsh上会显示以下警告/错误消息:
a8vuFvMzDcV4E-vbbkvfgi1Gf3KYtYiC[1]40491断管tr-直流
_A-Z-A-Z-0-9
这个消息的来源是什么?我们如何调整它以使其在zsh上工作?很难说,因为它在我的两个工作站上的bash和zsh上都非常适合我 第一个进程(uradom…)产生无限量的输出并写入第二个进程,这可能没有什么大问题:“head-c${1:-32};echo;” 在第二个进程结束时,第一个进程仍继续写入管道,因此给出一个错误(因为第二个进程关闭了管道) 这里有更好的解释: 同一url中还有一个解决方案,类似于:
< /dev/urandom tr -dc _A-Z-a-z-0-9 | tail -n +1 | head -c${1:-32};echo;
但我无法检查它,因为对我来说,它已经工作得很好了。
您可以试一试吗?一种解决方法是使用
head
来读取/dev/uradom,而不是tr
,如下所示:
< /dev/urandom head -c 1000 | tr -dc _A-Z-a-z-0-9 | head -c 32; echo;
但不能保证我会得到一个32个字符的随机序列。增加1000到100000会再次导致管道破裂。如zsh邮件列表中所述,这是使用选项
setopt PRINT_EXIT_VALUE
时的预期行为
保留该选项集的解决方案(但不是针对单个命令)是在子shell中运行它,如下所示:
( < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo )
(
我认为问题不在于zsh
。在一个实例中,tr
发出错误消息,而在另一个实例中则没有。在两个shell中尝试which tr
。对于zsh和bashwhich tr
给我/usr/bin/tr
它在Ubuntu 20.04上,/usr/bin/tr
是从coreutils 8.30-3ubuntutu2安装的40491
和40492 done
表明您正在后台运行某些东西。你能演示一个最小的可重复的例子吗?我有。。。因为没有人能像我一样,所以我从零开始就在一个有zsh的VM中运行。输出来自zsh的选项(这对我的日常工作很重要)setopt PRINT\u EXIT\u VALUE
。设置此选项后,我会收到错误消息,如果未设置,我不会收到。谢谢您的回复。你的“建议”命令也不起作用。我试图禁用oh my zsh东西并打开一个新的终端。。。还是一样。嗯。。。奇怪的事情。顺便说一下,我认为你的命令是有效的,即使是在zsh。在您的示例中,“a8vuFvMzDcV4E-vbbkvfgi1Gf3KYtYiC”是生成的密码。所以我说我认为你的命令行得通,但只是给出一些关于管道关闭太快的消息。是的,你是对的,输出是预期的随机数据+关于一个坏管道的意外错误消息pipe@PaulZahkarov:我可以重现OPs问题(zsh版本5.8,在Cygwin下运行),以及行为取决于打印退出值的设置这一事实。