zsh 从 stdin 读取 n 个字符的方法是什么?

zsh 从 stdin 读取 n 个字符的方法是什么?

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

... | read -n3

兹什的read,最接近的选项似乎是-k

-k[编号]
只读一个(或编号) 人物。全部分配给第一个 姓名,无需分词。该标志-q存在时将被忽略。除非存在-u或之一,否则从终端读取输入-p。此选项也可以在 zle 小部件中使用。

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

对于-u-p

-u n
从文件描述符读取输入n

-p
输入是从协进程读取的。

裸露的echo foobar | (read -k3; echo $REPLY)挂起等待输入。-p失败并显示 read: -p: no coprocess.只有以下作品:

echo foobar | (read -k3 -u0; echo $REPLY)

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

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

答案1

这有点奇怪,但确实如此有记录的

-k[编号]

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

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

echo foobar | ( read -u 0 -k 3; echo $REPLY )

答案2

它在没有子外壳的情况下对我有用:

% echo foobar | read -k3 -u0; echo $REPLY
foo
% echo $ZSH_VERSION
5.5.1

相关内容