リダイレクトとパイプの使い方

標準出力のリダイレクト(> / >>)

標準出力のみをファイルに書き込みます。エラーはそのまま表示されます。

code
# 標準出力はファイルへ、エラーは画面へ
{
  echo 'これは標準出力です'
  echo 'これは標準エラー出力です' >&2
} > sample.log

# ファイルの中身を確認
cat sample.log
stdout
これは標準出力です
stderr
これは標準エラー出力です

標準入力のリダイレクト(<)

ファイルの内容をコマンドの入力として渡します。

code
echo 'apple' > list.txt
echo 'banana' >> list.txt

# tr コマンドで小文字を大文字に変換
tr 'a-z' 'A-Z' < list.txt
stdout
APPLE
BANANA

標準エラー出力のリダイレクト(2>)

標準エラー出力のみをファイルに書き込みます。正常な出力はそのまま表示されます。

code
# エラーだけをファイルに記録
{
  echo 'これは標準出力です'
  echo 'これは標準エラー出力です' >&2
} 2> sample.log

# ファイルの中身を確認
cat sample.log
stdout
これは標準出力です
これは標準エラー出力です

標準出力とエラーをまとめてリダイレクト(&>)

標準出力とエラーの両方を1つのファイルにまとめます。

code
# すべてファイルに記録
{
  echo 'これは標準出力です'
  echo 'これは標準エラー出力です' >&2
} &> sample.log

# ファイルの中身を確認
cat sample.log
stdout
これは標準出力です
これは標準エラー出力です

出力を捨てる(> /dev/null)

不要な出力を表示したくない場合に使います。

code
echo '消したいメッセージ' > /dev/null 2>&1

# Bash の短縮記法
echo '消したいメッセージ' &> /dev/null
stdout

パイプ(|)

前のコマンドの出力を次のコマンドの入力として渡します。

code
echo -e 'banana\napple\ncherry' | grep 'a' | sort
stdout
apple
banana

標準エラー出力をパイプに渡す(|&)

通常のパイプ「|」は標準出力のみを渡しますが、「|&」は標準エラー出力も次のコマンドに渡します。

code
# 通常のパイプ
{
  echo 'これは標準出力です'
  echo 'これは標準エラー出力です' >&2
} | wc -l

# |& を使ったパイプ
{
  echo 'これは標準出力です'
  echo 'これは標準エラー出力です' >&2
} |& wc -l
stdout
1
2
stderr
これは標準エラー出力です