注目★★★★★Lobsters
パイプで入力を受け取りながらキーボード操作を可能にする仕組み
30秒で把握
- 1シェルが複数プロセスをパイプラインで起動すると全プロセスが同時に動作し、後段は前段がパイプを閉じるまで待機する
- 2各プロセスは is_terminal() で stdin/stdout の接続先を判定し自分の位置を認識、パイプからの入力を /dev/tty で端末から再取得
- 3キーボード入力は端末のキューで管理され、複数プロセスが競合しても先読みしたプロセスが行を消費する仕様
要約
シェルパイプラインで複数のプロセスが連鎖する場合、標準入力がパイプを通じて前段のプロセスからのデータになるにもかかわらず、各プロセスはキーボード入力を受け取れる。各プロセスは stdin/stdout が端末に接続しているかパイプに接続しているかを is_terminal() で判定し、自分がパイプラインの最初か途中か最後かを認識できる。パイプが閉じられるまでは後段プロセスはブロック状態のまま待機し、前段がデータを書き込み終えて退出するとパイプが閉じ、後段プロセスが起動する。キーボード入力を取り戻すため、パイプからデータを読み尽くした後のプロセスは /dev/tty を直接開くことで、標準入力とは別に端末へのファイルディスクリプタを取得し、キーボード操作を可能にする。
あなたへの影響
シェルパイプラインと端末制御の低レベルな動作を学べるため、CLI ツール開発やシェルスクリプトの詳細な挙動を理解したいエンジニアにとって参考になる。
推奨:/dev/tty を使うことで、stdin がパイプになった後も端末操作を復活させるテクニックはスクリプト記述やツール実装で応用できる。