从标准输入读取 n 个字符的 zsh 方法是什么?

mur*_*uru 5 zsh read

在 bash 中,如果我想从管道中读取 3 个字符,我可以这样做:

... | read -n3
Run Code Online (Sandbox Code Playgroud)

zsh 中read,最接近的选项似乎是-k

-k[ num ]
只读取一个(或num)个字符。所有都分配给 first name,没有分词。该标志在-q存在时被忽略。除非存在-u或之一,否则从终端读取输入-p。此选项也可以在 zle 小部件中使用。

请注意,尽管有助记符 'key',该选项确实会读取完整字符,如果MULTIBYTE设置了该选项,则这些字符可能包含多个字节 。

对于-u-p

-u n
输入是从文件描述符n 中读取的。

-p
从协进程读取输入。

echo foobar | (read -k3; echo $REPLY)等待输入的裸挂。-p失败 read: -p: no coprocess。只有以下工作:

echo foobar | (read -k3 -u0; echo $REPLY)
Run Code Online (Sandbox Code Playgroud)

这是我第一次看到在 zsh 中比在 bash 中更难实现的东西。

有没有比这更简单的方法来从标准输入(无论可能是什么)读取 N 个字符?

Gil*_*il' 2

这有点奇怪,但有记录

\n
\n

-k[编号]

\n

-u(\xe2\x80\xa6) 除非存在或之一,否则从终端读取输入-p

\n
\n

您的第一次尝试挂起的原因是它正在从终端读取。在终端上输入三个字符即可解除阻止。当您请求有限数量的字符而不是整行(使用-k-q)时,要从标准输入读取,您需要-u 0显式传递。

\n
echo foobar | ( read -u 0 -k 3; echo $REPLY )\n
Run Code Online (Sandbox Code Playgroud)\n