Moon? Shadow! - Misc Memo

Moon? Shadow!の記事にならない雑多なメモなのですー>ω<

  • Moon? Shadow! - 月影の本ブログなのですー>ω<(ソースコードを紛失したため更新停止中です)
  • Github kagamilove0707 - Githubのアカウントなのですー>ω<

zshで、readでn文字ずつ読み込みますです

zshreadで入力を受け付けることができますですー>ω<

$ 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 zshbuiltinsreadを眺めていたら、-uというオプションを見付けたのですー>ω<

どのファイルデスクリプタを入力に使用するかを明示的に指定するオプションなのですが、これに標準入力のファイルデスクリプタである0を指定したところ、上手くいったのです>ω<

$ cat hello.txt | while read -n0 -k5 five; do echo "-> $five"; done
hello
, wor
ld
$

ちなみに、このオプションを指定すると-kオプションのみの場合と違ってキーを押した瞬間に反応したりはしなくなる様子ですので、注意して欲しいのですー>ω<

(ところで、zshの組み込みコマンドでファイルをopenしてファイルディスクリプタを取得するにはどうしたらいいのです?? 現状は困らないのですけれど)

最後に、この話に教訓を残すなら「迷わずにmanを見ろ」ということです。ありがとうございましたのですー>ω<


CC0
To the extent possible under law, TSUKIKAGE Osana has waived all copyright and related or neighboring rights to Moon? Shadow! - Misc Memo. This work is published from: 日本.