在 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 个字符?
这有点奇怪,但有记录:
\n\n\n\n
-k
[编号]\n
-u
(\xe2\x80\xa6) 除非存在或之一,否则从终端读取输入-p
。
您的第一次尝试挂起的原因是它正在从终端读取。在终端上输入三个字符即可解除阻止。当您请求有限数量的字符而不是整行(使用-k
或-q
)时,要从标准输入读取,您需要-u 0
显式传递。
echo foobar | ( read -u 0 -k 3; echo $REPLY )\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
2733 次 |
最近记录: |