晴耕雨読

working in the fields on fine days and reading books on rainy days

Bashでパイプからの入力があるかどうかを確認する方法

パイプから入力があるとはどういう状況かというと、 以下のようにパイプ「|」を通して一つ前のコマンドの結果を受け取ることを指す。

$ cat filename | ./myprogram

Bashでパイプからの入力もしくはリダイレクトによる入力があるかを調べるには、 testコマンドの -p オプションを使う。 p はパイプ(Pipe)を意味し、引数のファイルがパイプであるかどうかを調べることができる。

if [ -p /dev/stdin ]; then
  echo "Input from pipe"
  cat /dev/stdin
else
  echo "No input from pipe"
fi

パイプを通してデータが渡されると標準入力として使われる /dev/stdin というファイルはパイプになる。 なお、一般にパイプとして振る舞うファイルのことを FIFO という。 すなわち test -p /dev/stdin または [ -p /dev/stdin ] は与えられたファイルが FIFO であるかどうかを確認するコマンドである。

ちなみに、そのファイルがパイプかどうかを確認する別の方法としては、 ls -l をした時に表示されるファイルモードの頭文字が p となっているファイルは FIFO である 1


  1. d はディレクトリ、l はシンボリックリンク、- は普通のファイルの意味である