改めて調べてみた。

標準入力とは、コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に標準的に利用するデータ入力元(通常はキーボード)のことである。

コマンドライン上で動くプログラムは標準入力、標準出力、標準エラー出力が存在し、それらは実行元のプロセスで標準をどこにするかが決定されている(例えば使用するシェルによって標準出力と標準エラーの使い分けが違ったりなど)。
標準入力も標準出力も標準ではターミナルに接続されているが、リダイレクト・パイプを利用することで接続先を変更できる。

標準出力と標準エラーは同じターミナル画面上で確認できるが、内部では使い分けられている(実装者側でその選択が可能で、標準出力と標準エラーで別のオプジェクトを使用したりする。俗に言う、stdin、stdout、stderr)。

例えば、標準出力をリダイレクト(後述)しようと下記のようなコマンドを実行しようとするもエラーが発生した場合は、なにも書き込まれない。

$ ls /sample > sample.txt
ls: エラーメッセージ(この文字列はターミナルに表示されう、sample.txtには書き込まれない)

一般的な傾向として下記のように使い分けられている。

標準入力:加工対象のデータの入力元や、ユーザからのパラメータ入力受付用
標準出力:加工済みデータの出力先や、ログ、メッセージ等情報出力用
標準エラー:確認メッセージや警告、エラーといった情報の出力用

リダイレクト・パイプライン

標準入力・標準出力を変更する方法はプログラムで提供されている以外に、リダイレクトやパイプラインという方法が提供されている。

リダイレクトには2種類あり、入力リダイレクトと出力リダイレクトがある。
入力リダイレクトは標準入力を指定のファイルにつなぎ替える機能であり、出力リダイレクトは標準出力を指定のファイルにつなぎ替える機能である。

パイプラインはパイプというスペシャルファイルを使用して一方の出力がそのままもう一方の入力に流れるようにする方法である。

なおパイプラインは標準出力だけを次のコマンドに送る。
標準エラーもまとめてパイプで送りたい場合は、標準出力をリダイレクトした後に「2>&1」という記述をすることで、標準出力と標準エラーをまとめることができる。
※ 2>で標準エラーを&1(標準出力)にリダイレクトするという意味
※ 標準入出力は数字で示され、&0は標準入力、&1は標準出力、&2は標準エラーという意味

// 出力リダイレクトを使用して標準出力の内容(source.txt)をcopy.txtファイルに書き込む
$ cat source.txt > copy.txt
// 出力リダイレクトを使用して標準出力の内容(source.txt)をcopy.txtファイルに書き込む(追記)
$ cat source.txt >> copy.txt
// 標準エラー出力をリダイレクト(使用するシェルによって異なる)
$ cat not-found.txt 2> copy.txt
// 標準エラー出力と標準出力の両方をリダイレクト(使用するシェルによって異なる)
$ cat not-found.txt &> copy.txt
// パイプラインを使用して、dnfパッケージのインストールされているもののなかから、testという文字を含む行を標準出力にて表示(grepはファイル名が指定されていない場合、標準入力から読み込むため、このような挙動となる)
$ dnf list --installed | grep test
// ~/.bash_historyの中身をlessコマンドで見る
$ history | less
// 標準エラーもパイプで送る場合
$ ls -la / /sample 2>&1 | less

フィルタについて

grepのように標準入力を入力として受け取り、標準出力に出力するコマンドをフィルタと呼ぶ。
例えば、grep、head、tail、cat、sort、uniq、tac、wcなどがある。

// ファイルサイズの大きい順上位5つを表示
$ du -b /bin/* | sort -n | tac | head -n 5
// du -b バイト単位で表示
// sort -n 数値順にソート
// tac 逆順に表示
// 上位5行を表示

出力を空にする

/dev/null というスペシャルファイルを使用する。

// 標準出力を出力しない
$ testcommand > /dev/null
// 標準エラーを出力しない
$ testcommand 2> /dev/null
// 標準出力と標準エラーの両方を非表示にする
$ testcommand > /dev/null 2>&1