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

read ... </dev/tty

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

#!/bin/bash

# stdinからデータを取得
DATA="$(</dev/stdin)"
echo "$DATA"

# キーボードからの入力を取得
read INPUT_KEY </dev/tty
echo "${INPUT_KEY}"