用 zsh 修复破损的管道

问题描述

正如此处 https://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-from-the-command-line/ 所建议的,我正在尝试使用以下命令生成随机密码:

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;

这在 bash shell 中工作流畅,但在 zsh 上给出以下警告/错误消息:

a8vuFvMzDcV4E-vbbkvfgi1Gf3KYtYiC[1] 40491 断管 tr -dc _A-Z-a-z-0-9

此消息的来源是什么?我们如何调整它以使其在 zsh 上运行?

解决方法

如 zsh 邮件列表 https://www.zsh.org/mla/workers/2021/msg01171.html 中所述,这是使用选项 setopt PRINT_EXIT_VALUE 时的预期行为。

保持该选项设置但不适用于该单个命令的解决方案是在子shell中运行它:

( < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo )
,

很难说,因为它在我的两个工作站上的 bash 和 zsh 上非常适合我。

可能不是第一个进程(urandom ...)产生写入第二个进程的无限输出的问题那么大:“head -c${1:-32};echo;”

在第二个进程结束的那一刻,第一个仍然继续写入管道并因此出现错误(因为管道被第二个进程关闭)。

这里解释得更好:

https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error

同一个url也有解决办法,比如:

< /dev/urandom tr -dc _A-Z-a-z-0-9 | tail -n +1 | head -c${1:-32};echo;

但是我无法检查它,因为对我来说它已经很好用了。 可以试试吗?

,

一种解决方法是使用 import SiteLayout from '../../components/SiteLayout' import React from 'react' import dynamic from 'next/dynamic' const Viewer = dynamic(() => import('../resume/viewer.js'),{ ssr: false }) export default function Resume({ resume }) { return window ? ( <div> <SiteLayout> <div className="main w-screen"> <Viewer /> </div> </SiteLayout> </div> ) : null } 读取 /dev/urandom 而不是 head,如下所示:

tr

但不能保证我会得到一个 32 个字符的随机序列。而增加1000到100000又会导致断管。