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和bash
which 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下运行),以及行为取决于打印退出值的设置这一事实。