ふとした思いつきで、シェルスクリプトでちょっとしたツールを作ろうかと思ったのだけど、標準入力をパイプから受け付けると同時にキーボードからの入力を受け付ける方法がわからなかったので調べてみた。 そもそも、パイプから受け付けている場合にキー入力を受け付けるには仮想端末が必要になるので、以下のように記述してreadする必要があるようだ。

bash
read ... </dev/tty

動くサンプルだとこんな感じかな。

bash
#!/bin/bash # stdinからデータを取得 DATA="$(</dev/stdin)" echo "$DATA" # キーボードからの入力を取得 read INPUT_KEY </dev/tty echo "${INPUT_KEY}"