zshで、readでn文字ずつ読み込みますです
zshはread
で入力を受け付けることができますですー>ω<
$ read line hello, world $ echo $line hello, world
このread
にはいくつかのオプションがありますでして、その中の一つに-k
というものがありますです。これは、k文字の入力を受け取るということで、このように使えますです。
$ while read -k 5 five; do echo "-> $five"; done xxxx-> xxxx hello-> hello ^C $
ちょうど5文字入力したところで反応してとても面白いのですー>ω<
しかし、このread -k
には重大な問題がありますです。それは、このままではパイプラインやリダイレクトを使って入力を指定したとしても、標準入力へ入力を受け付けに行ってしまうのです(`・ω・′)
$ cat hello.txt hello, world $ cat hello.txt | while read -k 5 five; do echo "-> $five"; done
諸事情(わたしの場合bf.zsh)で、n文字ずつ文字列を受け取らなくてはいけない場合、これでは大変困ったことになりますです。
()
で囲って別プロセスにしたり、別ファイルに記述したりしても上手くいかなかったので半ば諦めていたのですが……
man zshbuiltins
のread
を眺めていたら、-u
というオプションを見付けたのですー>ω<
どのファイルデスクリプタを入力に使用するかを明示的に指定するオプションなのですが、これに標準入力のファイルデスクリプタである0
を指定したところ、上手くいったのです>ω<
$ cat hello.txt | while read -n0 -k5 five; do echo "-> $five"; done hello , wor ld $
ちなみに、このオプションを指定すると-k
オプションのみの場合と違ってキーを押した瞬間に反応したりはしなくなる様子ですので、注意して欲しいのですー>ω<
(ところで、zshの組み込みコマンドでファイルをopenしてファイルディスクリプタを取得するにはどうしたらいいのです?? 現状は困らないのですけれど)
最後に、この話に教訓を残すなら「迷わずにman
を見ろ」ということです。ありがとうございましたのですー>ω<