在 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