catは、ファイルを連結して表示する。
$ echo hello > hello.txt
$ cat hello.txt
hello
$ cat hello.txt hello.txt
hello
hello
ファイルを指定しない場合は標準入力から読む。ファイルとして-
を指定した場合も標準入力から読む。
$ cat
abc
abc
$ cat hello.txt -
hello
abc
abc
catの面白い使い方としては、プログラムのttyに対する特殊な処理を阻害することができる。
例えば、man
は出力先をttyだと判断するので、moreかlessによるページャーが実行される。パイプでcatにつなぐことにより、manからはttyとして見えなくなり、ページャーが起動されなくなる。
$ man cat
# ページャーが起動する
$ man cat | cat
# ページャーは起動されない
実はページャーもcatにパイプするとページャーとしての機能を自発的にやめてくれる。
$ echo hello | more | cat
hello
少なくとも、今のほとんどのOSに入っているページャーの実装はそうなっている。
POSIXではcatに唯一の引数として-u
が定められている。これは入力ファイルから標準出力までの間に遅延を挟まない。つまりバッファーしないという意味だ。
ただし、GNU coreutilsのcatでは-u
は無視される。
catにはその他の引数もあるが、POSIX標準では実装ごとの揺れが大きかったり、本質的に重要ではないとの理由で削られている。
catはUNIX Version 1から存在した。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html